A universal layer for agents to have real-time self-awareness across channels and sessions. ARTA enables an agent to know what it is doing in other channels...
In-memory self-awareness for agents.
⚠️ Current Limitation: This version provides awareness within a single agent process. True cross-instance/cross-agent awareness would require a shared backend (Redis, database, or OpenClaw global API) — not yet implemented.
ARTA gives agents awareness of their own activity across sessions within a single process.
Without ARTA:
With ARTA:
A single session of an agent.
{
"instanceId": "session-abc123",
"agent": "my-agent",
"channel": "telegram:CHAT_ID",
"human": "USER_NAME",
"task": "discussing ARTA",
"status": "active"
}
The state of agent instances:
{
"agents": {
"my-agent": {
"instances": [
{
"instanceId": "session-1",
"channel": "telegram:CHAT_ID_1",
"task": "discussing ARTA",
"status": "active"
},
{
"instanceId": "session-2",
"channel": "discord:CHANNEL_ID",
"task": "code review",
"status": "active"
}
]
}
}
}
The queryable API:
When running within OpenClaw, ARTA can access:
| Data | Example | Purpose |
|---|---|---|
| Channel type | telegram, discord | Identify channel |
| Chat ID | 123456789 | Unique channel identifier |
| Sender name | john_smith | Human identifier |
| Session ID | session-abc | Unique session identifier |
Note: ARTA reads metadata only — not message content, not credentials, not bot tokens.
// Auto-detect from OpenClaw context
const channel = process.env.OPENCLAW_CHANNEL || 'unknown';
const chatId = process.env.OPENCLAW_CHAT_ID || 'unknown';
const human = process.env.OPENCLAW_SENDER_NAME || 'unknown';
const channelId = `${channel}:${chatId}`;
# Optional - ARTA will auto-detect from OpenClaw if not set
export ARTA_AGENT_NAME="your-agent-name"
export ARTA_CHANNEL_TYPE="telegram"
export ARTA_CHAT_ID="123456789"
export ARTA_HUMAN_NAME="human-name"
ARTA does NOT require bot tokens. The skill works with metadata (channel IDs, user names) only. If you see references to bot tokens in documentation, they are for reference — not required.
arta.register({
instanceId: "session-abc",
channel: "telegram:CHAT_ID",
human: "USER_NAME",
task: "initial task"
});
arta.update({
instanceId: "session-abc",
task: "new task",
status: "active"
});
const otherInstances = arta.queryOtherThan("session-abc");
arta.leave({
instanceId: "session-abc"
});
class ARTA {
constructor(agentName) {
this.agentName = agentName;
this.instances = new Map();
}
register({ instanceId, channel, human, task = 'idle' }) {
this.instances.set(instanceId, {
instanceId,
channel,
human,
task,
status: 'active',
started: Date.now(),
lastHeartbeat: Date.now()
});
}
update({ instanceId, task, status = 'active' }) {
const instance = this.instances.get(instanceId);
if (instance) {
instance.task = task;
instance.status = status;
instance.lastHeartbeat = Date.now();
}
}
leave({ instanceId }) {
this.instances.delete(instanceId);
}
query() {
return Array.from(this.instances.values());
}
queryOtherThan(instanceId) {
return this.query().filter(i => i.instanceId !== instanceId);
}
queryByChannel(channel) {
return this.query().filter(i => i.channel === channel);
}
queryByHuman(human) {
return this.query().filter(i => i.human === human);
}
}
// In IBT Observe phase
const otherTasks = arta.queryOtherThan(currentSessionId);
if (otherTasks.length > 0) {
// Agent is active in other sessions
}
clawhub install arta
0.3.0 — Clarified in-memory only limitation, removed bot token requirements, specified metadata-only access
ZIP package — ready to use