Metadata-Version: 2.4
Name: artis-automation-sdk
Version: 1.1.1
Summary: Artis RPA Activity SDK — base classes for building Artis activities
Keywords: artis,rpa,sdk,automation,workflow
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Software Development :: Libraries
Classifier: Typing :: Typed
Requires-Python: >=3.10
Description-Content-Type: text/markdown

# artis-sdk

Minimal SDK for building **Artis RPA** activity plugins.

Contains only what you need to write an activity — no engine, no server, no heavy dependencies.

## Installation

```bash
pip install artis-sdk
```

## Writing an activity

```python
from artis_sdk import BaseActivityExecutor, ExecutionContext, NodeResult

class HttpRequest(BaseActivityExecutor):
    async def execute(self, ctx: ExecutionContext) -> NodeResult:
        url     = ctx.get_property("url")
        method  = ctx.get_property("method", "GET")
        timeout = ctx.get_property("timeout", 30)

        ctx.log("info", f"Calling {method} {url}")

        import aiohttp
        async with aiohttp.ClientSession() as session:
            async with session.request(method, url, timeout=aiohttp.ClientTimeout(total=timeout)) as resp:
                body = await resp.json()

        return NodeResult(
            node_id=ctx.node_id,
            outputs={"output": {"statusCode": resp.status, "body": body}},
            activated_ports={"output"},
        )
```

## Error types

```python
from artis_sdk import TransientError, BusinessError, FatalError

# Retried automatically by artengine
raise TransientError("Connection timeout — will retry")

# Not retried, workflow continues to error port
raise BusinessError("File not found")

# Stops the workflow immediately
raise FatalError("Missing required configuration")
```

## NodeResult shortcuts

```python
# Explicit
return NodeResult(
    node_id=ctx.node_id,
    outputs={"output": {"result": value}},
    activated_ports={"output"},
)

# Shortcut — equivalent
return NodeResult.success(ctx.node_id, result=value)

# Conditional branching
port = "then" if condition else "else"
return NodeResult(node_id=ctx.node_id, activated_ports={port})
```

## What artis-sdk does NOT contain

- No workflow engine
- No scheduler
- No compiler
- No server code
- No I/O

This keeps your activity packages lightweight and independent of the Artis server version.
