taskwire 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- taskwire-0.1.0/.gitignore +35 -0
- taskwire-0.1.0/LICENSE +21 -0
- taskwire-0.1.0/PKG-INFO +138 -0
- taskwire-0.1.0/README.md +90 -0
- taskwire-0.1.0/conformance/README.md +10 -0
- taskwire-0.1.0/conformance/sequences/.gitkeep +0 -0
- taskwire-0.1.0/conformance/wire/aggregate-counts.json +20 -0
- taskwire-0.1.0/conformance/wire/aggregate-waiting-input-dominates.json +20 -0
- taskwire-0.1.0/conformance/wire/dialog-request-open.json +37 -0
- taskwire-0.1.0/conformance/wire/envelope-cancel.json +10 -0
- taskwire-0.1.0/conformance/wire/envelope-progress.json +34 -0
- taskwire-0.1.0/conformance/wire/envelope-snapshot.json +43 -0
- taskwire-0.1.0/conformance/wire/error-dispatch-failed.json +11 -0
- taskwire-0.1.0/conformance/wire/progress-percent-absent.json +27 -0
- taskwire-0.1.0/conformance/wire/progress-percent-null.json +28 -0
- taskwire-0.1.0/conformance/wire/progress-private.json +28 -0
- taskwire-0.1.0/conformance/wire/progress-shared-origins.json +28 -0
- taskwire-0.1.0/conformance/wire/progress-state-cancelled.json +28 -0
- taskwire-0.1.0/conformance/wire/progress-state-done.json +28 -0
- taskwire-0.1.0/conformance/wire/progress-state-failed.json +39 -0
- taskwire-0.1.0/conformance/wire/progress-state-queued.json +17 -0
- taskwire-0.1.0/conformance/wire/progress-state-running.json +28 -0
- taskwire-0.1.0/conformance/wire/progress-state-waiting-input.json +38 -0
- taskwire-0.1.0/conformance/wire/register-empty-null-aggregate.json +10 -0
- taskwire-0.1.0/conformance/wire/register-v1-with-aggregate.json +69 -0
- taskwire-0.1.0/conformance/wire/result-kind-and-params.json +10 -0
- taskwire-0.1.0/conformance/wire/result-label-and-value-no-ref.json +13 -0
- taskwire-0.1.0/conformance/wire/result-ref-with-expires-at.json +15 -0
- taskwire-0.1.0/conformance/wire/snapshot-v1-wall-clock-rev.json +37 -0
- taskwire-0.1.0/conformance/wire/snapshot-waiting-input-uncollected-result.json +47 -0
- taskwire-0.1.0/conformance/wire/text-key-and-text.json +7 -0
- taskwire-0.1.0/conformance/wire/text-key-only.json +6 -0
- taskwire-0.1.0/conformance/wire/text-key-params-and-text.json +10 -0
- taskwire-0.1.0/conformance/wire/text-text-only.json +6 -0
- taskwire-0.1.0/pyproject.toml +106 -0
- taskwire-0.1.0/taskwire/__init__.py +135 -0
- taskwire-0.1.0/taskwire/ambient.py +161 -0
- taskwire-0.1.0/taskwire/conformance.py +474 -0
- taskwire-0.1.0/taskwire/contrib/__init__.py +17 -0
- taskwire-0.1.0/taskwire/contrib/asgi.py +91 -0
- taskwire-0.1.0/taskwire/contrib/celery.py +352 -0
- taskwire-0.1.0/taskwire/contrib/fastapi.py +82 -0
- taskwire-0.1.0/taskwire/contrib/muxws.py +370 -0
- taskwire-0.1.0/taskwire/contrib/redis_store.py +575 -0
- taskwire-0.1.0/taskwire/contrib/schema.py +204 -0
- taskwire-0.1.0/taskwire/contrib/threads.py +43 -0
- taskwire-0.1.0/taskwire/contrib/viewsets.py +292 -0
- taskwire-0.1.0/taskwire/decorators.py +88 -0
- taskwire-0.1.0/taskwire/delivery.py +123 -0
- taskwire-0.1.0/taskwire/headers.py +36 -0
- taskwire-0.1.0/taskwire/models.py +683 -0
- taskwire-0.1.0/taskwire/py.typed +0 -0
- taskwire-0.1.0/taskwire/reader.py +120 -0
- taskwire-0.1.0/taskwire/register.py +182 -0
- taskwire-0.1.0/taskwire/reporter.py +1162 -0
- taskwire-0.1.0/taskwire/rest.py +312 -0
- taskwire-0.1.0/taskwire/settings.py +126 -0
- taskwire-0.1.0/taskwire/store.py +647 -0
- taskwire-0.1.0/taskwire/transport.py +95 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Claude Code session artefacts
|
|
2
|
+
.claude/
|
|
3
|
+
|
|
4
|
+
# Python
|
|
5
|
+
__pycache__/
|
|
6
|
+
*.py[cod]
|
|
7
|
+
*.egg-info/
|
|
8
|
+
build/
|
|
9
|
+
dist/
|
|
10
|
+
.venv/
|
|
11
|
+
.pytest_cache/
|
|
12
|
+
.ruff_cache/
|
|
13
|
+
.mypy_cache/
|
|
14
|
+
.coverage
|
|
15
|
+
coverage.xml
|
|
16
|
+
htmlcov/
|
|
17
|
+
|
|
18
|
+
# Node
|
|
19
|
+
node_modules/
|
|
20
|
+
*.tsbuildinfo
|
|
21
|
+
coverage/
|
|
22
|
+
# Not committed, matching the muxws repository's convention.
|
|
23
|
+
/package-lock.json
|
|
24
|
+
|
|
25
|
+
# VitePress
|
|
26
|
+
docs/.vitepress/cache/
|
|
27
|
+
docs/.vitepress/dist/
|
|
28
|
+
|
|
29
|
+
# Editors / OS
|
|
30
|
+
.idea/
|
|
31
|
+
.vscode/
|
|
32
|
+
.DS_Store
|
|
33
|
+
|
|
34
|
+
# Scratch drivers written while chasing something down
|
|
35
|
+
.scratch/
|
taskwire-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jure Erznožnik
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
taskwire-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: taskwire
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Progress reporting and awaitable dialogs for long-running server-side operations.
|
|
5
|
+
Project-URL: Homepage, https://github.com/velis74/taskwire
|
|
6
|
+
Project-URL: Repository, https://github.com/velis74/taskwire
|
|
7
|
+
Project-URL: Issues, https://github.com/velis74/taskwire/issues
|
|
8
|
+
Project-URL: Documentation, https://docs.velis.si/taskwire/
|
|
9
|
+
Author-email: Jure Erznožnik <jure.erznoznik@gmail.com>
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: celery,dialogs,dynamicforms,fastapi,progress,websocket
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
23
|
+
Classifier: Typing :: Typed
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Provides-Extra: celery
|
|
26
|
+
Requires-Dist: celery>=5.3; extra == 'celery'
|
|
27
|
+
Requires-Dist: nest-asyncio>=1.6; extra == 'celery'
|
|
28
|
+
Provides-Extra: demo
|
|
29
|
+
Requires-Dist: uvicorn>=0.27; extra == 'demo'
|
|
30
|
+
Provides-Extra: dev
|
|
31
|
+
Requires-Dist: coverage; extra == 'dev'
|
|
32
|
+
Requires-Dist: httpx; extra == 'dev'
|
|
33
|
+
Requires-Dist: hypothesis; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest; extra == 'dev'
|
|
35
|
+
Requires-Dist: pytest-asyncio; extra == 'dev'
|
|
36
|
+
Requires-Dist: pytest-cov; extra == 'dev'
|
|
37
|
+
Requires-Dist: ruff; extra == 'dev'
|
|
38
|
+
Provides-Extra: fastapi
|
|
39
|
+
Requires-Dist: fastapi>=0.100; extra == 'fastapi'
|
|
40
|
+
Provides-Extra: muxws
|
|
41
|
+
Requires-Dist: dynamicforms-fastapi-viewsets[muxws]>=0.5.4; extra == 'muxws'
|
|
42
|
+
Requires-Dist: muxws>=0.3.1; extra == 'muxws'
|
|
43
|
+
Provides-Extra: redis
|
|
44
|
+
Requires-Dist: redis>=5.0; extra == 'redis'
|
|
45
|
+
Provides-Extra: viewsets
|
|
46
|
+
Requires-Dist: dynamicforms-fastapi-viewsets>=0.5.4; extra == 'viewsets'
|
|
47
|
+
Description-Content-Type: text/markdown
|
|
48
|
+
|
|
49
|
+
# <img src="taskwire-icon.svg" alt="" style="width:2.5em; height: 2.5em; vertical-align: middle"> taskwire
|
|
50
|
+
|
|
51
|
+
Progress reporting and awaitable dialogs for long-running operations, in Python and TypeScript.
|
|
52
|
+
|
|
53
|
+
A long-running job — an import, a report, a batch — needs to tell whoever started it what it is
|
|
54
|
+
doing while it is doing it, and sometimes needs to ask them something before it can continue.
|
|
55
|
+
taskwire is that conversation, and the four things it carries:
|
|
56
|
+
|
|
57
|
+
- **progress**, with nested subtasks whose percentages compose correctly rather than overwriting
|
|
58
|
+
each other, and commits coalesced so a tight loop cannot flood anything;
|
|
59
|
+
- **awaitable dialogs** — the worker asks a question mid-job and blocks until the answer arrives,
|
|
60
|
+
with the first answer winning across every tab that is looking;
|
|
61
|
+
- **cancellation**, cooperative and sticky, which raises in the worker at its next progress call;
|
|
62
|
+
- **collectable results** — the job parks a file or a value for later collection and *exits*,
|
|
63
|
+
holding no worker while the record waits.
|
|
64
|
+
|
|
65
|
+
## The one idea worth knowing
|
|
66
|
+
|
|
67
|
+
**The store is the truth; a push is only an accelerator.** Every state change is written before
|
|
68
|
+
anything is sent anywhere, so a dropped, coalesced or suppressed push never changes what the next
|
|
69
|
+
read returns. There is no event log, no sequence numbers and no replay: a client is entitled to
|
|
70
|
+
current state, and asking for it is always enough.
|
|
71
|
+
|
|
72
|
+
## One protocol, three implementations
|
|
73
|
+
|
|
74
|
+
The layering is the shape of the source tree:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
protocol documents, envelopes, the six kinds, the state
|
|
78
|
+
│ machines, validation. Knows of no transport.
|
|
79
|
+
┌───────────┼───────────┐
|
|
80
|
+
local REST WS three independent implementations of it
|
|
81
|
+
│ │ │
|
|
82
|
+
(none) fastapi / asgi muxws one adapter each, to the world outside
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The **protocol** is specified once and depends on nothing. Each **implementation** carries it over
|
|
86
|
+
one medium and is written against the protocol layer alone, never against another implementation.
|
|
87
|
+
Each **adapter** is the thin piece that binds an implementation to a particular framework, and is
|
|
88
|
+
the only place that framework is imported.
|
|
89
|
+
|
|
90
|
+
| Implementation | Carries the protocol over | Adapter | Needs |
|
|
91
|
+
|---|---|---|---|
|
|
92
|
+
| **local** | the process itself — no wire, no socket, no serialization | none | nothing |
|
|
93
|
+
| **REST** | request/response polling; the baseline everywhere | `contrib.viewsets`, `contrib.fastapi`, `contrib.asgi` | nothing in core |
|
|
94
|
+
| **WS** | one push per envelope down, the six calls up, lowest latency | `contrib.muxws` | [muxws](https://docs.velis.si/muxws/) |
|
|
95
|
+
|
|
96
|
+
Swapping one for another changes latency and nothing else — no feature, no state, no document.
|
|
97
|
+
Both languages ship the protocol and the operating half, so a browser-only application runs
|
|
98
|
+
operations rather than only watching them; the adapters, the Redis store and the Celery entry are
|
|
99
|
+
Python's, and the polling client and the register are TypeScript's.
|
|
100
|
+
|
|
101
|
+
## Install
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
pip install taskwire # core: no runtime dependencies at all
|
|
105
|
+
pip install "taskwire[redis]" # cross-process store and backplane
|
|
106
|
+
pip install "taskwire[fastapi]" # the REST adapter
|
|
107
|
+
pip install "taskwire[viewsets]" # the REST API as a fastapi-viewsets viewset
|
|
108
|
+
pip install "taskwire[celery]" # the worker entry point
|
|
109
|
+
pip install "taskwire[muxws]" # the WebSocket transport
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
npm install taskwire
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## The demo
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
pip install -e ".[fastapi,viewsets,demo]" && npm install
|
|
120
|
+
python demo.py # then open http://127.0.0.1:5174
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
A night batch over one book: four back-office jobs that between them exercise progress, nested
|
|
124
|
+
progress, awaitable dialogs, cancellation and collectable results. See [`demo/README.md`](demo/README.md).
|
|
125
|
+
|
|
126
|
+
## Status
|
|
127
|
+
|
|
128
|
+
Pre-1.0 and under active construction. The wire format is versioned independently of the package
|
|
129
|
+
(`Envelope.v`), so package semver says nothing about it.
|
|
130
|
+
|
|
131
|
+
## Links
|
|
132
|
+
|
|
133
|
+
- [Documentation](https://docs.velis.si/taskwire/)
|
|
134
|
+
- [Repository](https://github.com/velis74/taskwire)
|
|
135
|
+
|
|
136
|
+
## License
|
|
137
|
+
|
|
138
|
+
MIT. Copyright (c) 2026 Jure Erznožnik.
|
taskwire-0.1.0/README.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# <img src="taskwire-icon.svg" alt="" style="width:2.5em; height: 2.5em; vertical-align: middle"> taskwire
|
|
2
|
+
|
|
3
|
+
Progress reporting and awaitable dialogs for long-running operations, in Python and TypeScript.
|
|
4
|
+
|
|
5
|
+
A long-running job — an import, a report, a batch — needs to tell whoever started it what it is
|
|
6
|
+
doing while it is doing it, and sometimes needs to ask them something before it can continue.
|
|
7
|
+
taskwire is that conversation, and the four things it carries:
|
|
8
|
+
|
|
9
|
+
- **progress**, with nested subtasks whose percentages compose correctly rather than overwriting
|
|
10
|
+
each other, and commits coalesced so a tight loop cannot flood anything;
|
|
11
|
+
- **awaitable dialogs** — the worker asks a question mid-job and blocks until the answer arrives,
|
|
12
|
+
with the first answer winning across every tab that is looking;
|
|
13
|
+
- **cancellation**, cooperative and sticky, which raises in the worker at its next progress call;
|
|
14
|
+
- **collectable results** — the job parks a file or a value for later collection and *exits*,
|
|
15
|
+
holding no worker while the record waits.
|
|
16
|
+
|
|
17
|
+
## The one idea worth knowing
|
|
18
|
+
|
|
19
|
+
**The store is the truth; a push is only an accelerator.** Every state change is written before
|
|
20
|
+
anything is sent anywhere, so a dropped, coalesced or suppressed push never changes what the next
|
|
21
|
+
read returns. There is no event log, no sequence numbers and no replay: a client is entitled to
|
|
22
|
+
current state, and asking for it is always enough.
|
|
23
|
+
|
|
24
|
+
## One protocol, three implementations
|
|
25
|
+
|
|
26
|
+
The layering is the shape of the source tree:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
protocol documents, envelopes, the six kinds, the state
|
|
30
|
+
│ machines, validation. Knows of no transport.
|
|
31
|
+
┌───────────┼───────────┐
|
|
32
|
+
local REST WS three independent implementations of it
|
|
33
|
+
│ │ │
|
|
34
|
+
(none) fastapi / asgi muxws one adapter each, to the world outside
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The **protocol** is specified once and depends on nothing. Each **implementation** carries it over
|
|
38
|
+
one medium and is written against the protocol layer alone, never against another implementation.
|
|
39
|
+
Each **adapter** is the thin piece that binds an implementation to a particular framework, and is
|
|
40
|
+
the only place that framework is imported.
|
|
41
|
+
|
|
42
|
+
| Implementation | Carries the protocol over | Adapter | Needs |
|
|
43
|
+
|---|---|---|---|
|
|
44
|
+
| **local** | the process itself — no wire, no socket, no serialization | none | nothing |
|
|
45
|
+
| **REST** | request/response polling; the baseline everywhere | `contrib.viewsets`, `contrib.fastapi`, `contrib.asgi` | nothing in core |
|
|
46
|
+
| **WS** | one push per envelope down, the six calls up, lowest latency | `contrib.muxws` | [muxws](https://docs.velis.si/muxws/) |
|
|
47
|
+
|
|
48
|
+
Swapping one for another changes latency and nothing else — no feature, no state, no document.
|
|
49
|
+
Both languages ship the protocol and the operating half, so a browser-only application runs
|
|
50
|
+
operations rather than only watching them; the adapters, the Redis store and the Celery entry are
|
|
51
|
+
Python's, and the polling client and the register are TypeScript's.
|
|
52
|
+
|
|
53
|
+
## Install
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pip install taskwire # core: no runtime dependencies at all
|
|
57
|
+
pip install "taskwire[redis]" # cross-process store and backplane
|
|
58
|
+
pip install "taskwire[fastapi]" # the REST adapter
|
|
59
|
+
pip install "taskwire[viewsets]" # the REST API as a fastapi-viewsets viewset
|
|
60
|
+
pip install "taskwire[celery]" # the worker entry point
|
|
61
|
+
pip install "taskwire[muxws]" # the WebSocket transport
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
npm install taskwire
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## The demo
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
pip install -e ".[fastapi,viewsets,demo]" && npm install
|
|
72
|
+
python demo.py # then open http://127.0.0.1:5174
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
A night batch over one book: four back-office jobs that between them exercise progress, nested
|
|
76
|
+
progress, awaitable dialogs, cancellation and collectable results. See [`demo/README.md`](demo/README.md).
|
|
77
|
+
|
|
78
|
+
## Status
|
|
79
|
+
|
|
80
|
+
Pre-1.0 and under active construction. The wire format is versioned independently of the package
|
|
81
|
+
(`Envelope.v`), so package semver says nothing about it.
|
|
82
|
+
|
|
83
|
+
## Links
|
|
84
|
+
|
|
85
|
+
- [Documentation](https://docs.velis.si/taskwire/)
|
|
86
|
+
- [Repository](https://github.com/velis74/taskwire)
|
|
87
|
+
|
|
88
|
+
## License
|
|
89
|
+
|
|
90
|
+
MIT. Copyright (c) 2026 Jure Erznožnik.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Conformance fixtures
|
|
2
|
+
|
|
3
|
+
Language-neutral JSON, read **in place** by both `pytest` and `vitest`. There is no copy step and
|
|
4
|
+
there must never be one (TW-PKG-002): a fixture that has to be copied is a fixture that can drift
|
|
5
|
+
between the two languages, and the whole point of this directory is that it cannot.
|
|
6
|
+
|
|
7
|
+
| Directory | Holds |
|
|
8
|
+
|---|---|
|
|
9
|
+
| `wire/` | One document per file, in the shapes of specification §3. |
|
|
10
|
+
| `sequences/` | Ordered envelope traces a client must apply, with the state expected afterwards. |
|
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "aggregate",
|
|
3
|
+
"document": {
|
|
4
|
+
"state": "running",
|
|
5
|
+
"title": {
|
|
6
|
+
"key": "taskwire.aggregate.title"
|
|
7
|
+
},
|
|
8
|
+
"data": {
|
|
9
|
+
"total": 4,
|
|
10
|
+
"queued": 1,
|
|
11
|
+
"running": 3,
|
|
12
|
+
"waiting_input": 0
|
|
13
|
+
},
|
|
14
|
+
"label": {
|
|
15
|
+
"key": "acme.importer.title",
|
|
16
|
+
"text": "Importing"
|
|
17
|
+
},
|
|
18
|
+
"updated_at": "2026-08-11T09:15:04.250Z"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "aggregate",
|
|
3
|
+
"document": {
|
|
4
|
+
"state": "waiting_input",
|
|
5
|
+
"title": {
|
|
6
|
+
"key": "taskwire.aggregate.title"
|
|
7
|
+
},
|
|
8
|
+
"data": {
|
|
9
|
+
"total": 10,
|
|
10
|
+
"queued": 0,
|
|
11
|
+
"running": 9,
|
|
12
|
+
"waiting_input": 1
|
|
13
|
+
},
|
|
14
|
+
"label": {
|
|
15
|
+
"key": "acme.importer.title",
|
|
16
|
+
"text": "Importing"
|
|
17
|
+
},
|
|
18
|
+
"updated_at": "2026-08-11T09:15:04.250Z"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "dialog_request",
|
|
3
|
+
"document": {
|
|
4
|
+
"id": "0d9c8b7a-6543-4210-9fed-cba987654321",
|
|
5
|
+
"dialog_id": "acme.import.conflict",
|
|
6
|
+
"buttons": [
|
|
7
|
+
{
|
|
8
|
+
"id": "overwrite",
|
|
9
|
+
"label": {
|
|
10
|
+
"key": "acme.import.overwrite"
|
|
11
|
+
},
|
|
12
|
+
"style": "primary"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "skip",
|
|
16
|
+
"label": {
|
|
17
|
+
"key": "acme.import.skip"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"inputs": [
|
|
22
|
+
{
|
|
23
|
+
"name": "comment",
|
|
24
|
+
"type": "string",
|
|
25
|
+
"required": false,
|
|
26
|
+
"label": {
|
|
27
|
+
"key": "acme.import.note"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"params": {
|
|
32
|
+
"file": "rows.csv"
|
|
33
|
+
},
|
|
34
|
+
"state": "open",
|
|
35
|
+
"created_at": "2026-08-11T09:15:00.000Z"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "envelope",
|
|
3
|
+
"document": {
|
|
4
|
+
"v": 1,
|
|
5
|
+
"token": "6b1f1c9e-0f2a-4a7d-9c2e-5f5b6a7c8d90",
|
|
6
|
+
"rev": 1786439700123,
|
|
7
|
+
"kind": "progress",
|
|
8
|
+
"body": {
|
|
9
|
+
"state": "running",
|
|
10
|
+
"percent": 42.5,
|
|
11
|
+
"data": {
|
|
12
|
+
"rows_done": 510,
|
|
13
|
+
"rows_total": 1200
|
|
14
|
+
},
|
|
15
|
+
"result_kind": "acme.import.report",
|
|
16
|
+
"origin_session": "account:42",
|
|
17
|
+
"origin_connection": "conn-7",
|
|
18
|
+
"created_at": "2026-08-11T09:15:00.000Z",
|
|
19
|
+
"updated_at": "2026-08-11T09:15:04.250Z",
|
|
20
|
+
"title": {
|
|
21
|
+
"key": "acme.importer.title",
|
|
22
|
+
"text": "Importing"
|
|
23
|
+
},
|
|
24
|
+
"label": {
|
|
25
|
+
"key": "acme.importer.rows",
|
|
26
|
+
"params": {
|
|
27
|
+
"rows": 1200
|
|
28
|
+
},
|
|
29
|
+
"text": "Importing 1200 rows"
|
|
30
|
+
},
|
|
31
|
+
"icon": "upload"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "envelope",
|
|
3
|
+
"document": {
|
|
4
|
+
"v": 1,
|
|
5
|
+
"token": "6b1f1c9e-0f2a-4a7d-9c2e-5f5b6a7c8d90",
|
|
6
|
+
"rev": 1786439700123,
|
|
7
|
+
"kind": "snapshot",
|
|
8
|
+
"body": {
|
|
9
|
+
"v": 1,
|
|
10
|
+
"token": "6b1f1c9e-0f2a-4a7d-9c2e-5f5b6a7c8d90",
|
|
11
|
+
"rev": 1786439700123,
|
|
12
|
+
"progress": {
|
|
13
|
+
"state": "running",
|
|
14
|
+
"percent": 42.5,
|
|
15
|
+
"data": {
|
|
16
|
+
"rows_done": 510,
|
|
17
|
+
"rows_total": 1200
|
|
18
|
+
},
|
|
19
|
+
"result_kind": "acme.import.report",
|
|
20
|
+
"origin_session": "account:42",
|
|
21
|
+
"origin_connection": "conn-7",
|
|
22
|
+
"created_at": "2026-08-11T09:15:00.000Z",
|
|
23
|
+
"updated_at": "2026-08-11T09:15:04.250Z",
|
|
24
|
+
"title": {
|
|
25
|
+
"key": "acme.importer.title",
|
|
26
|
+
"text": "Importing"
|
|
27
|
+
},
|
|
28
|
+
"label": {
|
|
29
|
+
"key": "acme.importer.rows",
|
|
30
|
+
"params": {
|
|
31
|
+
"rows": 1200
|
|
32
|
+
},
|
|
33
|
+
"text": "Importing 1200 rows"
|
|
34
|
+
},
|
|
35
|
+
"icon": "upload"
|
|
36
|
+
},
|
|
37
|
+
"dialogs": [],
|
|
38
|
+
"cancel_requested": false,
|
|
39
|
+
"server_time": "2026-08-11T09:15:04.317Z",
|
|
40
|
+
"poll_after_ms": 400
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "progress",
|
|
3
|
+
"document": {
|
|
4
|
+
"state": "running",
|
|
5
|
+
"data": {
|
|
6
|
+
"rows_done": 510,
|
|
7
|
+
"rows_total": 1200
|
|
8
|
+
},
|
|
9
|
+
"result_kind": "acme.import.report",
|
|
10
|
+
"origin_session": "account:42",
|
|
11
|
+
"origin_connection": "conn-7",
|
|
12
|
+
"created_at": "2026-08-11T09:15:00.000Z",
|
|
13
|
+
"updated_at": "2026-08-11T09:15:04.250Z",
|
|
14
|
+
"title": {
|
|
15
|
+
"key": "acme.importer.title",
|
|
16
|
+
"text": "Importing"
|
|
17
|
+
},
|
|
18
|
+
"label": {
|
|
19
|
+
"key": "acme.importer.rows",
|
|
20
|
+
"params": {
|
|
21
|
+
"rows": 1200
|
|
22
|
+
},
|
|
23
|
+
"text": "Importing 1200 rows"
|
|
24
|
+
},
|
|
25
|
+
"icon": "upload"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "progress",
|
|
3
|
+
"document": {
|
|
4
|
+
"state": "running",
|
|
5
|
+
"percent": null,
|
|
6
|
+
"data": {
|
|
7
|
+
"rows_done": 510,
|
|
8
|
+
"rows_total": 1200
|
|
9
|
+
},
|
|
10
|
+
"result_kind": "acme.import.report",
|
|
11
|
+
"origin_session": "account:42",
|
|
12
|
+
"origin_connection": "conn-7",
|
|
13
|
+
"created_at": "2026-08-11T09:15:00.000Z",
|
|
14
|
+
"updated_at": "2026-08-11T09:15:04.250Z",
|
|
15
|
+
"title": {
|
|
16
|
+
"key": "acme.importer.title",
|
|
17
|
+
"text": "Importing"
|
|
18
|
+
},
|
|
19
|
+
"label": {
|
|
20
|
+
"key": "acme.importer.rows",
|
|
21
|
+
"params": {
|
|
22
|
+
"rows": 1200
|
|
23
|
+
},
|
|
24
|
+
"text": "Importing 1200 rows"
|
|
25
|
+
},
|
|
26
|
+
"icon": "upload"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "progress",
|
|
3
|
+
"document": {
|
|
4
|
+
"state": "running",
|
|
5
|
+
"percent": 42.5,
|
|
6
|
+
"data": {
|
|
7
|
+
"rows_done": 510,
|
|
8
|
+
"rows_total": 1200
|
|
9
|
+
},
|
|
10
|
+
"result_kind": null,
|
|
11
|
+
"origin_session": "session:anon-9f",
|
|
12
|
+
"origin_connection": null,
|
|
13
|
+
"created_at": "2026-08-11T09:15:00.000Z",
|
|
14
|
+
"updated_at": "2026-08-11T09:15:04.250Z",
|
|
15
|
+
"title": {
|
|
16
|
+
"key": "acme.importer.title",
|
|
17
|
+
"text": "Importing"
|
|
18
|
+
},
|
|
19
|
+
"label": {
|
|
20
|
+
"key": "acme.importer.rows",
|
|
21
|
+
"params": {
|
|
22
|
+
"rows": 1200
|
|
23
|
+
},
|
|
24
|
+
"text": "Importing 1200 rows"
|
|
25
|
+
},
|
|
26
|
+
"icon": "upload"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "progress",
|
|
3
|
+
"document": {
|
|
4
|
+
"state": "running",
|
|
5
|
+
"percent": 42.5,
|
|
6
|
+
"data": {
|
|
7
|
+
"rows_done": 510,
|
|
8
|
+
"rows_total": 1200
|
|
9
|
+
},
|
|
10
|
+
"result_kind": "acme.import.report",
|
|
11
|
+
"origin_session": "account:42",
|
|
12
|
+
"origin_connection": "conn-7",
|
|
13
|
+
"created_at": "2026-08-11T09:15:00.000Z",
|
|
14
|
+
"updated_at": "2026-08-11T09:15:04.250Z",
|
|
15
|
+
"title": {
|
|
16
|
+
"key": "acme.importer.title",
|
|
17
|
+
"text": "Importing"
|
|
18
|
+
},
|
|
19
|
+
"label": {
|
|
20
|
+
"key": "acme.importer.rows",
|
|
21
|
+
"params": {
|
|
22
|
+
"rows": 1200
|
|
23
|
+
},
|
|
24
|
+
"text": "Importing 1200 rows"
|
|
25
|
+
},
|
|
26
|
+
"icon": "upload"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "progress",
|
|
3
|
+
"document": {
|
|
4
|
+
"state": "cancelled",
|
|
5
|
+
"percent": 51.0,
|
|
6
|
+
"data": {
|
|
7
|
+
"rows_done": 510,
|
|
8
|
+
"rows_total": 1200
|
|
9
|
+
},
|
|
10
|
+
"result_kind": "acme.import.report",
|
|
11
|
+
"origin_session": "account:42",
|
|
12
|
+
"origin_connection": "conn-7",
|
|
13
|
+
"created_at": "2026-08-11T09:15:00.000Z",
|
|
14
|
+
"updated_at": "2026-08-11T09:15:04.250Z",
|
|
15
|
+
"title": {
|
|
16
|
+
"key": "acme.importer.title",
|
|
17
|
+
"text": "Importing"
|
|
18
|
+
},
|
|
19
|
+
"label": {
|
|
20
|
+
"key": "acme.importer.rows",
|
|
21
|
+
"params": {
|
|
22
|
+
"rows": 1200
|
|
23
|
+
},
|
|
24
|
+
"text": "Importing 1200 rows"
|
|
25
|
+
},
|
|
26
|
+
"icon": "upload"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "progress",
|
|
3
|
+
"document": {
|
|
4
|
+
"state": "done",
|
|
5
|
+
"percent": 100.0,
|
|
6
|
+
"data": {
|
|
7
|
+
"rows_done": 510,
|
|
8
|
+
"rows_total": 1200
|
|
9
|
+
},
|
|
10
|
+
"result_kind": "acme.import.report",
|
|
11
|
+
"origin_session": "account:42",
|
|
12
|
+
"origin_connection": "conn-7",
|
|
13
|
+
"created_at": "2026-08-11T09:15:00.000Z",
|
|
14
|
+
"updated_at": "2026-08-11T09:15:04.250Z",
|
|
15
|
+
"title": {
|
|
16
|
+
"key": "acme.importer.title",
|
|
17
|
+
"text": "Importing"
|
|
18
|
+
},
|
|
19
|
+
"label": {
|
|
20
|
+
"key": "acme.importer.rows",
|
|
21
|
+
"params": {
|
|
22
|
+
"rows": 1200
|
|
23
|
+
},
|
|
24
|
+
"text": "Importing 1200 rows"
|
|
25
|
+
},
|
|
26
|
+
"icon": "upload"
|
|
27
|
+
}
|
|
28
|
+
}
|