Skip to content

Latest commit

 

History

History
179 lines (138 loc) · 6.05 KB

File metadata and controls

179 lines (138 loc) · 6.05 KB

TV1 Instruction Offloader

Disclaimer: This project is provided as‑is and is intended only as a sample application to help you get started with building your own TeamViewer DEX instruction runner. No warranties, guarantees, or support are provided.

Automated scheduling and export engine for 1E / Tachyon instructions.

TV1 Instruction Offloader executes instructions on a schedule, enforces TTL-based export boundaries, and exports results using:

Pagination export - page by page parsing of the results 
Server-side export - sets export = true when executing the instruction 
Both (pagination + server)

It includes export queuing, retry handling, restart recovery, execution history tracking, and chart-based analytics. 📦 Requirements

    .NET 8
    Windows 11 (primary target) may work withj Mac and Linux as well
    Valid DEX platform access
    Export folder write permissions
    Non-Interactive authorization - cetificate based authentication 
            JWT Prinipal Mapping setup for a service account with execute and view access to the instructions that will be automated

✨ Core Features 🔹 Scheduled Instruction Execution Per-job scheduling Platform Alias + FQDN support Certificate authentication or interactive authentication Multiple concurrent platforms supported Per-execution isolation using ResponseId + ExecutionId tracking

🔹 Export Modes

Each job supports one of the following modes:
Mode	Name	Description
    0	PagingOnly	Exports using paginated API calls only
    1	ServerOnly	Waits for server-side export and downloads it
    2	PagingThenServer	Runs pagination export first, then performs server-side export once available

⏳ TTL-Based Export Model

Exports do not start immediately after instruction execution
Exports begin after Instruction TTL expiration:
Paging export runs after Instruction TTL ends
Server-side export polling begins after Instruction TTL ends
Response TTL is used only for expiration decisions (not export timing)
This sohuld ensure:
    Complete datasets
    No partial exports
Deterministic export windows
No race conditions between instruction execution and export

🔁 Retry & Fallback Logic

    PagingOnly
            Retries only on API failure or restart recovery
            Does not retry because file was not immediately visible
            Optional fallback to server-side export after configurable failure threshold
            Once paging succeeds, export is marked complete and does not retry
    ServerOnly
            Polls until server-side export becomes available
            Retries polling on timeout
            Stops after max retry window (default: 3)
    PagingThenServer
            Paging export runs once after TTL
            Server-side export runs independently after TTL
            Paging success does not block server export
            Each phase is isolated and tracked separately

📊 Execution History

History tracks per-execution (not per job):
    ExecutionId
    ResponseId
    Status
        (Exported, PagingExported, WaitingServerExport, NoData, Expired, etc.)
    Paging file path
    Server file path
    Server download URL
    Retry count
    Duration
    Platform alias / FQDN
    TTL values used
    History:
    Updates live
    Persists across restarts
    Deduplicates per execution
    Normalizes state after recovery

🔄 Recovery on Restart

On startup:
    In-flight exports are resumed
    Pending server exports are re-polled
    Paging exports are retried if incomplete
    Stale execution states are normalized
    Recovery should not:
        Re-run successful exports
        Duplicate completed paging exports
        Reset completed execution state

🗂 Export Output Structure

Generated files:
    {InstructionName}_{ResponseId}_P_yyyyMMdd_HHmmss.ext
    {InstructionName}_{ResponseId}_S_yyyyMMdd_HHmmss.tsv              

    Folder modes- Configured per platform per job via Export Options.:
            By Platform
            By Instruction
            By Date
            Instruction → Date

📈 History Charts

  The History tab includes visual analytics:
  Jobs per Day of Week
  Jobs per Hour
  Duration Buckets
  Heatmap / Concurrent Load
  Average Duration
  Charts are based on ExecutionHistory, not schedule definitions.

🕒 Local vs UTC

Toggle affects:
    History grid timestamps
    Chart grouping boundaries (hour/day bucketing)
    Charts recompute when toggled
    Duration values are timezone-neutral
        Note: Some visual adjustments may still be refined withn the charts.

🚀 Planned Enhancements

🔹 1. True Row Count Detection

    Detect zero results directly from paging API if it is available
    Mark NoData deterministically
    Avoid ambiguity from file existence checks

🔹 2. Per-Platform Execution Isolation

    Dedicated execution threads per platform
    Prevent token context switching issues
    Reduce concurrent authentication contention

🔹 3. Persistent Export Queue Store

    Save pending export queue to disk
    Resume export position across restarts
    Support large multi-page recoveries

🔹 4. Export Health Dashboard

    Retry count visualization
    Per-job export metrics
    Failure analytics

🔹 5. Configurable Retry Thresholds

    AppSettings support for:
            Paging fallback threshold
            Server polling interval
            Max retry window

🔹 6. Headless / Tray-Only Mode

    Optional background-only mode
    System tray controls
    Run at startup
    No full UI required
    Export orchestration logic lives inside:
    JobSchedulerService.QueueExport()
    Maybe create a service but not everyone will have admin access to do this so i left ti as a startup option