
Security News
The Hidden Blast Radius of the Axios Compromise
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.
@chart-sg/node-red-task-package
Advanced tools
A workflow orchestrator that provides a higher-layer abstraction for managing task execution flows. It enables external users to trigger Node-RED flows via REST API calls or internal events, with built-in security, validation, and lifecycle management capabilities.
The node-red-task-package module provides:
/task-package/docscd ~/.node-red
npm install @chart-sg/node-red-task-package
The task package system organizes nodes into four distinct categories:
tp-configGlobal configuration for the task package system with settings for:
Purpose: Control the workflow lifecycle of task packages Color Theme: Dark red
tp-start (Entry Point)tp-cancel (Cancellation Handler)tp-end (Exit Point)tp-update (Event Update)Purpose: Direct programmatic control via REST API Color Theme: Light red (#FFCDD2)
tp-create-api (API - Create)tp-cancel-api (API - Cancel)tp-update-api (API - Update)Purpose: Handle data operations and utilities within task packages Color Theme: Green and Light red (#EF9A9A for delay/check nodes)
tp-update-user-status (Status Update)tp-data-get (Data Retrieval)tp-data-set (Data Storage)tp-delay (Cancellable Delay)tp-check-cancel (Cancellation Router)Purpose: Real-time sensor data processing and automated task management Color Theme: Blue
edt-state (Memory & Change Detection)edt-filter (Quality Control & Spam Prevention)edt-mode (Dynamic On/Off Control)GET /task-package/docs
GET /task-package/info
List available task package definitions OR get specific one with ?tp_id=
tp_allowed arraytp_id (optional)GET /task-package/status
Retrieve task instance status with optional filtering
tpc_id, tp_id, user, status (all optional)POST /task-package/start
Initialize a new task package execution
{
"tp_id": "tp01",
"custom_field": "value",
"another_field": 123,
"complex_data": {
"nested": "object"
}
}
tp_id and user extracted as control parameters, everything else becomes msg.payloadAuthorization: Bearer <token> (if OIDC configured)POST /task-package/cancel
Cancel a running task package with comprehensive validation
{
"tp_id": "tp01",
"tpc_id": "550e8400-e29b-41d4-a716-446655440000",
"reason": "User requested cancellation"
}
POST /task-package/edt/mode/enable
Enable monitoring for specific entities
{
"scope": "bed_monitoring",
"entity_id": "bed_1",
"reason": "Patient admitted"
}
POST /task-package/edt/mode/disable
Disable monitoring for specific entities (supports bulk operations)
{
"scope": "bed_monitoring",
"entity_ids": ["bed_1", "bed_2"],
"reason": "Night shift - reduce alerts"
}
GET /task-package/edt/mode/status
Get current monitoring status
scope, entity_id[tp-start] ──→ [business logic] ──→ [tp-end]
[tp-cancel] ──→ [cleanup logic] // Independent placement, auto-discovery
Flow 1: [tp-start:tp01] ──→ [business logic A] ──→ [tp-end]
Flow 2: [tp-start:tp02] ──→ [business logic B] ──→ [tp-end]
[tp-cancel] ──→ [cleanup logic] // Monitors both tasks automatically
[tp-start] ──→ [logic-1] ──→ [tp-delay] ──→ [logic-2] ──→ [tp-end]
│
└─→ [timeout cleanup] ──→ [tp-end]
[tp-cancel] ──────────────────────→ [global cleanup] ──→ [tp-end]
[tp-start] ──→ [step-1] ──→ [tp-update-user-status] ──→ [step-2] ──→ [tp-end]
│
└─→ (status: "processing step 1")
Flow 1: [tp-start] ──→ [business logic] ──→ [tp-data-set] ──→ [tp-end]
Flow 2: [tp-cancel] ──→ [tp-data-get] ──→ [cleanup with stored data] ──→ [tp-end]
│
└─→ enriched with original task data
[External Event] ──→ [tp-create-api] ──→ [process response]
[External Event] ──→ [tp-cancel-api] ──→ [handle cancellation result]
[Sensor Data]
↓
[edt-mode: Check if monitoring enabled] // On/off control per entity
↓ (enabled)
[edt-state: Track state changes] // Memory & change detection
↓ (changed)
[edt-filter: Block spam/duplicates] // Quality control
↓ (significant)
[Switch: "Event Type Routing"] // USER LOGIC: Route by event
↓ (bed_exit) → [Function: "Emergency Logic"] → [tp-create-api: "bed_exit_response"]
↓ (sit_up) → [Function: "Standby Logic"] → [tp-create-api: "standby_bed"]
↓ (medication_due) → [Function: "Med Logic"] → [tp-create-api: "medication"]
[tp-start] ──→ [custom logic] ──→ [tp-check-cancel] ──→ [normal flow] ──→ [tp-end]
│
└─→ [failure cleanup] ──→ [tp-end]
When configured, the system validates Bearer tokens against OIDC providers and checks the user's tp_allowed array for authorization.
Supported OIDC Providers:
/protocol/openid-connect/userinfo endpoint/userinfo endpoint/oidc/userinfo endpoint/v1/userinfo endpointhttps://www.googleapis.com/oauth2/v2/userinfo/oauth2/userInfo endpointAuthorization Flow:
preferred_username, email, name, or sub fieldstp_allowed array checked against requested tp_idWhen no OIDC URL is configured, security checks are bypassed for development scenarios (defaults to 'admin' user).
Registry of available task package definitions
id: Task package identifier (tp_id)name: Human-readable nameform_url: Form endpoint path as stored in databasecreated_at, updated_at: TimestampsExecution instances of task packages
id: Task instance identifier (tpc_id, UUID)tp_id: Reference to task packagetp_name: Cached from task_packagesuser: Requesting userstatus: System status (created, started, ongoing, completed, cancelling, cancelled, failed)user_status: Custom status from tp-update-user-status nodescreated_at, updated_at: TimestampsEvent-Driven Tasks mode control (for edt-mode nodes)
id: Auto-increment primary keyscope: Mode scope (e.g., "bed_monitoring")entity_id: Entity identifier (e.g., "bed_1")enabled: Boolean enabled/disabled statereason: Reason for last changeupdated_by: Who made the changecreated_at, updated_at: Timestampsnode-red-task-package/
├── package.json # NPM package configuration
├── index.js # Main entry point with dynamic loader
├── README.md # This documentation
├── lib/ # Shared modules
│ ├── task-package-events.js # Event handler
│ ├── task-package-api.js # REST API server
│ ├── task-package-db.js # Database integration
│ ├── edt-mode-db.js # EDT mode database operations
│ └── tp-node-utils.js # Shared utilities for business logic nodes
├── nodes/ # Node implementations
│ ├── tp-config.js/.html # Configuration node
│ ├── tp-start.js/.html # Start node
│ ├── tp-cancel.js/.html # Cancel node
│ ├── tp-end.js/.html # End node
│ ├── tp-create-api.js/.html # API create node
│ ├── tp-cancel-api.js/.html # API cancel node
│ ├── tp-update-user-status.js/.html # Update user status node
│ ├── tp-data-get.js/.html # Data retrieval node
│ ├── tp-data-set.js/.html # Data storage node
│ ├── tp-delay.js/.html # Delay node
│ ├── tp-check-cancel.js/.html # Cancellation router node
│ ├── tp-update.js/.html # Update event node
│ ├── tp-update-api.js/.html # Update API node
│ ├── edt-state.js/.html # EDT state tracking node
│ ├── edt-filter.js/.html # EDT event filtering node
│ └── edt-mode.js/.html # EDT mode control node
└── scripts/ # Automation tools
# Install in your local Node-RED
npm install . --prefix ~/.node-red
# Restart Node-RED to see the new nodes
# API will be available at http://localhost:2880 (Node-RED port + 1000)
# Interactive API documentation at http://localhost:2880/task-package/docs
oidc_url empty in tp-config to bypass securityISC
FAQs
CHART's Node-RED Task Package Orchestrator
We found that @chart-sg/node-red-task-package demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.