tabc 0.2.3__tar.gz → 0.2.4__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.
Files changed (41) hide show
  1. {tabc-0.2.3 → tabc-0.2.4}/CHANGELOG.md +21 -0
  2. {tabc-0.2.3/tabc.egg-info → tabc-0.2.4}/PKG-INFO +12 -78
  3. {tabc-0.2.3 → tabc-0.2.4}/PYPI.md +10 -77
  4. {tabc-0.2.3 → tabc-0.2.4}/pyproject.toml +2 -1
  5. {tabc-0.2.3 → tabc-0.2.4/tabc.egg-info}/PKG-INFO +12 -78
  6. {tabc-0.2.3 → tabc-0.2.4}/tabus/bus.py +1 -1
  7. {tabc-0.2.3 → tabc-0.2.4}/tabus/cli.py +22 -1
  8. {tabc-0.2.3 → tabc-0.2.4}/GUIDE.md +0 -0
  9. {tabc-0.2.3 → tabc-0.2.4}/LICENSE +0 -0
  10. {tabc-0.2.3 → tabc-0.2.4}/MANIFEST.in +0 -0
  11. {tabc-0.2.3 → tabc-0.2.4}/MCP.md +0 -0
  12. {tabc-0.2.3 → tabc-0.2.4}/setup.cfg +0 -0
  13. {tabc-0.2.3 → tabc-0.2.4}/tabc.egg-info/SOURCES.txt +0 -0
  14. {tabc-0.2.3 → tabc-0.2.4}/tabc.egg-info/dependency_links.txt +0 -0
  15. {tabc-0.2.3 → tabc-0.2.4}/tabc.egg-info/entry_points.txt +0 -0
  16. {tabc-0.2.3 → tabc-0.2.4}/tabc.egg-info/requires.txt +0 -0
  17. {tabc-0.2.3 → tabc-0.2.4}/tabc.egg-info/top_level.txt +0 -0
  18. {tabc-0.2.3 → tabc-0.2.4}/tabus/__init__.py +0 -0
  19. {tabc-0.2.3 → tabc-0.2.4}/tabus/admin.py +0 -0
  20. {tabc-0.2.3 → tabc-0.2.4}/tabus/codex_queue.py +0 -0
  21. {tabc-0.2.3 → tabc-0.2.4}/tabus/compat_bcn.py +0 -0
  22. {tabc-0.2.3 → tabc-0.2.4}/tabus/compat_busd.py +0 -0
  23. {tabc-0.2.3 → tabc-0.2.4}/tabus/daemon.py +0 -0
  24. {tabc-0.2.3 → tabc-0.2.4}/tabus/doorbell.py +0 -0
  25. {tabc-0.2.3 → tabc-0.2.4}/tabus/doorbell_poll.py +0 -0
  26. {tabc-0.2.3 → tabc-0.2.4}/tabus/lang.py +0 -0
  27. {tabc-0.2.3 → tabc-0.2.4}/tabus/locales/en.json +0 -0
  28. {tabc-0.2.3 → tabc-0.2.4}/tabus/mcp_server.py +0 -0
  29. {tabc-0.2.3 → tabc-0.2.4}/tabus/nodekey.py +0 -0
  30. {tabc-0.2.3 → tabc-0.2.4}/tabus/paths.py +0 -0
  31. {tabc-0.2.3 → tabc-0.2.4}/tabus/process_argv.py +0 -0
  32. {tabc-0.2.3 → tabc-0.2.4}/tabus/route_capture.py +0 -0
  33. {tabc-0.2.3 → tabc-0.2.4}/tabus/send_refusal.py +0 -0
  34. {tabc-0.2.3 → tabc-0.2.4}/tabus/sent.py +0 -0
  35. {tabc-0.2.3 → tabc-0.2.4}/tabus/tac_identity.py +0 -0
  36. {tabc-0.2.3 → tabc-0.2.4}/tabus/tac_lookup.py +0 -0
  37. {tabc-0.2.3 → tabc-0.2.4}/tabus/tac_migration.py +0 -0
  38. {tabc-0.2.3 → tabc-0.2.4}/tabus/tac_refusal.py +0 -0
  39. {tabc-0.2.3 → tabc-0.2.4}/tabus/tac_search.py +0 -0
  40. {tabc-0.2.3 → tabc-0.2.4}/tabus/tac_store.py +0 -0
  41. {tabc-0.2.3 → tabc-0.2.4}/tabus/terminal_frontend.py +0 -0
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.4 — 2026-10-25
4
+
5
+ ### Added
6
+
7
+ - `tabc send --id <UUID>` sends with a caller-chosen message id, so a retry
8
+ after a lost response is not stored twice. A resend goes through the
9
+ usual send checks first, so unread mail can refuse it with
10
+ `UNREAD_BLOCKED`. After those checks, the same id with the same
11
+ envelope prints `stored id=<id>` and, below it,
12
+ `identical envelope resent — not stored twice`, and exits 0. With a
13
+ changed envelope it fails with `failed: conflict: …` and exits 1. The id
14
+ is checked before any request and written in canonical form. A value
15
+ that is not a UUID fails with
16
+ `failed: --id must be a full message UUID` and exits 1.
17
+
18
+ ### Unchanged
19
+
20
+ - Without `--id`, `send` uses a new random id as before. The daemon is
21
+ unchanged. The MCP `tabc_send` tool already took a caller-chosen id as
22
+ `message_id`; the CLI now offers the same.
23
+
3
24
  ## 0.2.3 — 2026-10-17
4
25
 
5
26
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tabc
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: A shared inbox for AI agents and programs on one machine
5
5
  License: MIT License
6
6
 
@@ -27,6 +27,7 @@ License: MIT License
27
27
  Project-URL: Homepage, https://tabc.sh
28
28
  Project-URL: Source, https://github.com/jultabc/tabc
29
29
  Project-URL: Documentation, https://github.com/jultabc/tabc/blob/main/GUIDE.md
30
+ Project-URL: Changelog, https://github.com/jultabc/tabc/blob/main/CHANGELOG.md
30
31
  Project-URL: Issues, https://github.com/jultabc/tabc/issues
31
32
  Keywords: agents,messaging,ipc,cli
32
33
  Classifier: Development Status :: 3 - Alpha
@@ -51,6 +52,16 @@ This is an experimental package. It is not a security boundary between agents
51
52
  using the same operating-system account. Message delivery does not imply that
52
53
  an agent read, understood, or completed a request.
53
54
 
55
+ ## Updates
56
+
57
+ See the [changelog](https://github.com/jultabc/tabc/blob/main/CHANGELOG.md)
58
+ for changes and compatibility notes, or
59
+ [GitHub releases](https://github.com/jultabc/tabc/releases) for published versions.
60
+
61
+ Before updating an existing installation, follow the
62
+ [installation and upgrade instructions](https://github.com/jultabc/tabc#readme).
63
+ Keep a backup and follow the stop, install, and restart sequence for your version.
64
+
54
65
  ## Install
55
66
 
56
67
  ```bash
@@ -105,83 +116,6 @@ from the `pull --mode full` detail block, or a unique prefix of it.
105
116
  Terminal notification is a separate process and does not start with the
106
117
  install; see the repository's guide before turning it on.
107
118
 
108
- ## Updating from 0.2.2
109
-
110
- The ledger schema is unchanged. Nodes, signing keys, messages, delivery states,
111
- TACs, routes, and Codex queue receipts are kept, and nodes do not register
112
- again. Stop `tabus.doorbell`, install, restart `tabd`, then start one
113
- `tabus.doorbell` from the same installation:
114
-
115
- ```bash
116
- python -m pip install --upgrade "tabc==0.2.3"
117
- # Or, when the local desktop MCP adapter is required:
118
- python -m pip install --upgrade "tabc[mcp]==0.2.3"
119
- ```
120
-
121
- The CLI now accepts the exact name of an open tac and lists candidates instead
122
- of guessing. Name lookup needs the restarted `tabd`; before that, a typed name
123
- is refused with `TAC_ID_INVALID` and UUIDs still work. The MCP adapter is
124
- unchanged. See the
125
- [changelog](https://github.com/jultabc/tabc/blob/main/CHANGELOG.md).
126
-
127
- ## Updating from 0.2.1
128
-
129
- The ledger schema is unchanged. Nodes, signing keys, messages, delivery states,
130
- TACs, routes, and Codex queue receipts are kept. Stop `tabus.doorbell`, install,
131
- restart `tabd`, then start one `tabus.doorbell` from the same installation:
132
-
133
- ```bash
134
- python -m pip install --upgrade "tabc==0.2.2"
135
- # Or, when the local desktop MCP adapter is required:
136
- python -m pip install --upgrade "tabc[mcp]==0.2.2"
137
- ```
138
-
139
- `--kind` is now case-insensitive; `--kind Codex` selects the same Codex queue
140
- route as `--kind codex`. A detached command no longer needs a recognized agent
141
- product: its immediate session-boundary parent qualifies when it owns the
142
- terminal foreground and reads standard input from it. The check proves terminal
143
- ownership, not that the program is an agent. Register again from the intended
144
- terminal and confirm one notification arrives. Codex queue rules are otherwise
145
- unchanged. See the
146
- [changelog](https://github.com/jultabc/tabc/blob/main/CHANGELOG.md).
147
-
148
- ## Updating from 0.2.0
149
-
150
- The ledger schema is unchanged. Nodes, signing keys, messages, delivery states,
151
- TACs, and routes are kept. Stop `tabus.doorbell`, install, restart `tabd`, then
152
- start one `tabus.doorbell` from the same installation:
153
-
154
- ```bash
155
- python -m pip install --upgrade "tabc==0.2.1"
156
- # Or, when the local desktop MCP adapter is required:
157
- python -m pip install --upgrade "tabc[mcp]==0.2.1"
158
- ```
159
-
160
- `register` now requires `--kind`. Update scripts that omit it. Codex agents
161
- register again from each conversation after the notifier is replaced. The
162
- notifier creates `codex_queue_receipts.db` in the tabc home directory on its
163
- first Codex queue submission. See the
164
- [changelog](https://github.com/jultabc/tabc/blob/main/CHANGELOG.md).
165
-
166
- ## Updating from 0.1.6
167
-
168
- The upgrade preserves nodes, messages, delivery states, TAC membership, names,
169
- and labels. Stop `tabus.doorbell` and `tabd`. Confirm that the ledger's `-wal`
170
- file is absent or empty (0 bytes), then keep a backup before installing. A
171
- remaining empty WAL or SHM file is safe. Do not continue while the WAL is
172
- non-empty:
173
-
174
- ```bash
175
- python -m pip install --upgrade "tabc==0.2.0"
176
- # Or, when the local desktop MCP adapter is required:
177
- python -m pip install --upgrade "tabc[mcp]==0.2.0"
178
- ```
179
-
180
- Existing string TAC IDs are not converted during installation. Follow the
181
- repository README's 0.2.0 ledger conversion procedure when converting TAC IDs
182
- to UUIDs. Without conversion, restart `tabd` first, then `tabus.doorbell`.
183
- Then follow "Updating from 0.2.0", "Updating from 0.2.1" and "Updating from 0.2.2".
184
-
185
119
  ## Commands
186
120
 
187
121
  - `tabc register --node alice --kind codex`: register an agent.
@@ -9,6 +9,16 @@ This is an experimental package. It is not a security boundary between agents
9
9
  using the same operating-system account. Message delivery does not imply that
10
10
  an agent read, understood, or completed a request.
11
11
 
12
+ ## Updates
13
+
14
+ See the [changelog](https://github.com/jultabc/tabc/blob/main/CHANGELOG.md)
15
+ for changes and compatibility notes, or
16
+ [GitHub releases](https://github.com/jultabc/tabc/releases) for published versions.
17
+
18
+ Before updating an existing installation, follow the
19
+ [installation and upgrade instructions](https://github.com/jultabc/tabc#readme).
20
+ Keep a backup and follow the stop, install, and restart sequence for your version.
21
+
12
22
  ## Install
13
23
 
14
24
  ```bash
@@ -63,83 +73,6 @@ from the `pull --mode full` detail block, or a unique prefix of it.
63
73
  Terminal notification is a separate process and does not start with the
64
74
  install; see the repository's guide before turning it on.
65
75
 
66
- ## Updating from 0.2.2
67
-
68
- The ledger schema is unchanged. Nodes, signing keys, messages, delivery states,
69
- TACs, routes, and Codex queue receipts are kept, and nodes do not register
70
- again. Stop `tabus.doorbell`, install, restart `tabd`, then start one
71
- `tabus.doorbell` from the same installation:
72
-
73
- ```bash
74
- python -m pip install --upgrade "tabc==0.2.3"
75
- # Or, when the local desktop MCP adapter is required:
76
- python -m pip install --upgrade "tabc[mcp]==0.2.3"
77
- ```
78
-
79
- The CLI now accepts the exact name of an open tac and lists candidates instead
80
- of guessing. Name lookup needs the restarted `tabd`; before that, a typed name
81
- is refused with `TAC_ID_INVALID` and UUIDs still work. The MCP adapter is
82
- unchanged. See the
83
- [changelog](https://github.com/jultabc/tabc/blob/main/CHANGELOG.md).
84
-
85
- ## Updating from 0.2.1
86
-
87
- The ledger schema is unchanged. Nodes, signing keys, messages, delivery states,
88
- TACs, routes, and Codex queue receipts are kept. Stop `tabus.doorbell`, install,
89
- restart `tabd`, then start one `tabus.doorbell` from the same installation:
90
-
91
- ```bash
92
- python -m pip install --upgrade "tabc==0.2.2"
93
- # Or, when the local desktop MCP adapter is required:
94
- python -m pip install --upgrade "tabc[mcp]==0.2.2"
95
- ```
96
-
97
- `--kind` is now case-insensitive; `--kind Codex` selects the same Codex queue
98
- route as `--kind codex`. A detached command no longer needs a recognized agent
99
- product: its immediate session-boundary parent qualifies when it owns the
100
- terminal foreground and reads standard input from it. The check proves terminal
101
- ownership, not that the program is an agent. Register again from the intended
102
- terminal and confirm one notification arrives. Codex queue rules are otherwise
103
- unchanged. See the
104
- [changelog](https://github.com/jultabc/tabc/blob/main/CHANGELOG.md).
105
-
106
- ## Updating from 0.2.0
107
-
108
- The ledger schema is unchanged. Nodes, signing keys, messages, delivery states,
109
- TACs, and routes are kept. Stop `tabus.doorbell`, install, restart `tabd`, then
110
- start one `tabus.doorbell` from the same installation:
111
-
112
- ```bash
113
- python -m pip install --upgrade "tabc==0.2.1"
114
- # Or, when the local desktop MCP adapter is required:
115
- python -m pip install --upgrade "tabc[mcp]==0.2.1"
116
- ```
117
-
118
- `register` now requires `--kind`. Update scripts that omit it. Codex agents
119
- register again from each conversation after the notifier is replaced. The
120
- notifier creates `codex_queue_receipts.db` in the tabc home directory on its
121
- first Codex queue submission. See the
122
- [changelog](https://github.com/jultabc/tabc/blob/main/CHANGELOG.md).
123
-
124
- ## Updating from 0.1.6
125
-
126
- The upgrade preserves nodes, messages, delivery states, TAC membership, names,
127
- and labels. Stop `tabus.doorbell` and `tabd`. Confirm that the ledger's `-wal`
128
- file is absent or empty (0 bytes), then keep a backup before installing. A
129
- remaining empty WAL or SHM file is safe. Do not continue while the WAL is
130
- non-empty:
131
-
132
- ```bash
133
- python -m pip install --upgrade "tabc==0.2.0"
134
- # Or, when the local desktop MCP adapter is required:
135
- python -m pip install --upgrade "tabc[mcp]==0.2.0"
136
- ```
137
-
138
- Existing string TAC IDs are not converted during installation. Follow the
139
- repository README's 0.2.0 ledger conversion procedure when converting TAC IDs
140
- to UUIDs. Without conversion, restart `tabd` first, then `tabus.doorbell`.
141
- Then follow "Updating from 0.2.0", "Updating from 0.2.1" and "Updating from 0.2.2".
142
-
143
76
  ## Commands
144
77
 
145
78
  - `tabc register --node alice --kind codex`: register an agent.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tabc"
7
- version = "0.2.3"
7
+ version = "0.2.4"
8
8
  description = "A shared inbox for AI agents and programs on one machine"
9
9
  readme = "PYPI.md"
10
10
  requires-python = ">=3.9"
@@ -40,6 +40,7 @@ mcp = ["mcp>=1.27.1,<2; python_version >= '3.10'"]
40
40
  Homepage = "https://tabc.sh"
41
41
  Source = "https://github.com/jultabc/tabc"
42
42
  Documentation = "https://github.com/jultabc/tabc/blob/main/GUIDE.md"
43
+ Changelog = "https://github.com/jultabc/tabc/blob/main/CHANGELOG.md"
43
44
  Issues = "https://github.com/jultabc/tabc/issues"
44
45
 
45
46
  [project.scripts]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tabc
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: A shared inbox for AI agents and programs on one machine
5
5
  License: MIT License
6
6
 
@@ -27,6 +27,7 @@ License: MIT License
27
27
  Project-URL: Homepage, https://tabc.sh
28
28
  Project-URL: Source, https://github.com/jultabc/tabc
29
29
  Project-URL: Documentation, https://github.com/jultabc/tabc/blob/main/GUIDE.md
30
+ Project-URL: Changelog, https://github.com/jultabc/tabc/blob/main/CHANGELOG.md
30
31
  Project-URL: Issues, https://github.com/jultabc/tabc/issues
31
32
  Keywords: agents,messaging,ipc,cli
32
33
  Classifier: Development Status :: 3 - Alpha
@@ -51,6 +52,16 @@ This is an experimental package. It is not a security boundary between agents
51
52
  using the same operating-system account. Message delivery does not imply that
52
53
  an agent read, understood, or completed a request.
53
54
 
55
+ ## Updates
56
+
57
+ See the [changelog](https://github.com/jultabc/tabc/blob/main/CHANGELOG.md)
58
+ for changes and compatibility notes, or
59
+ [GitHub releases](https://github.com/jultabc/tabc/releases) for published versions.
60
+
61
+ Before updating an existing installation, follow the
62
+ [installation and upgrade instructions](https://github.com/jultabc/tabc#readme).
63
+ Keep a backup and follow the stop, install, and restart sequence for your version.
64
+
54
65
  ## Install
55
66
 
56
67
  ```bash
@@ -105,83 +116,6 @@ from the `pull --mode full` detail block, or a unique prefix of it.
105
116
  Terminal notification is a separate process and does not start with the
106
117
  install; see the repository's guide before turning it on.
107
118
 
108
- ## Updating from 0.2.2
109
-
110
- The ledger schema is unchanged. Nodes, signing keys, messages, delivery states,
111
- TACs, routes, and Codex queue receipts are kept, and nodes do not register
112
- again. Stop `tabus.doorbell`, install, restart `tabd`, then start one
113
- `tabus.doorbell` from the same installation:
114
-
115
- ```bash
116
- python -m pip install --upgrade "tabc==0.2.3"
117
- # Or, when the local desktop MCP adapter is required:
118
- python -m pip install --upgrade "tabc[mcp]==0.2.3"
119
- ```
120
-
121
- The CLI now accepts the exact name of an open tac and lists candidates instead
122
- of guessing. Name lookup needs the restarted `tabd`; before that, a typed name
123
- is refused with `TAC_ID_INVALID` and UUIDs still work. The MCP adapter is
124
- unchanged. See the
125
- [changelog](https://github.com/jultabc/tabc/blob/main/CHANGELOG.md).
126
-
127
- ## Updating from 0.2.1
128
-
129
- The ledger schema is unchanged. Nodes, signing keys, messages, delivery states,
130
- TACs, routes, and Codex queue receipts are kept. Stop `tabus.doorbell`, install,
131
- restart `tabd`, then start one `tabus.doorbell` from the same installation:
132
-
133
- ```bash
134
- python -m pip install --upgrade "tabc==0.2.2"
135
- # Or, when the local desktop MCP adapter is required:
136
- python -m pip install --upgrade "tabc[mcp]==0.2.2"
137
- ```
138
-
139
- `--kind` is now case-insensitive; `--kind Codex` selects the same Codex queue
140
- route as `--kind codex`. A detached command no longer needs a recognized agent
141
- product: its immediate session-boundary parent qualifies when it owns the
142
- terminal foreground and reads standard input from it. The check proves terminal
143
- ownership, not that the program is an agent. Register again from the intended
144
- terminal and confirm one notification arrives. Codex queue rules are otherwise
145
- unchanged. See the
146
- [changelog](https://github.com/jultabc/tabc/blob/main/CHANGELOG.md).
147
-
148
- ## Updating from 0.2.0
149
-
150
- The ledger schema is unchanged. Nodes, signing keys, messages, delivery states,
151
- TACs, and routes are kept. Stop `tabus.doorbell`, install, restart `tabd`, then
152
- start one `tabus.doorbell` from the same installation:
153
-
154
- ```bash
155
- python -m pip install --upgrade "tabc==0.2.1"
156
- # Or, when the local desktop MCP adapter is required:
157
- python -m pip install --upgrade "tabc[mcp]==0.2.1"
158
- ```
159
-
160
- `register` now requires `--kind`. Update scripts that omit it. Codex agents
161
- register again from each conversation after the notifier is replaced. The
162
- notifier creates `codex_queue_receipts.db` in the tabc home directory on its
163
- first Codex queue submission. See the
164
- [changelog](https://github.com/jultabc/tabc/blob/main/CHANGELOG.md).
165
-
166
- ## Updating from 0.1.6
167
-
168
- The upgrade preserves nodes, messages, delivery states, TAC membership, names,
169
- and labels. Stop `tabus.doorbell` and `tabd`. Confirm that the ledger's `-wal`
170
- file is absent or empty (0 bytes), then keep a backup before installing. A
171
- remaining empty WAL or SHM file is safe. Do not continue while the WAL is
172
- non-empty:
173
-
174
- ```bash
175
- python -m pip install --upgrade "tabc==0.2.0"
176
- # Or, when the local desktop MCP adapter is required:
177
- python -m pip install --upgrade "tabc[mcp]==0.2.0"
178
- ```
179
-
180
- Existing string TAC IDs are not converted during installation. Follow the
181
- repository README's 0.2.0 ledger conversion procedure when converting TAC IDs
182
- to UUIDs. Without conversion, restart `tabd` first, then `tabus.doorbell`.
183
- Then follow "Updating from 0.2.0", "Updating from 0.2.1" and "Updating from 0.2.2".
184
-
185
119
  ## Commands
186
120
 
187
121
  - `tabc register --node alice --kind codex`: register an agent.
@@ -74,7 +74,7 @@ DB_PATH = os.environ.get(
74
74
  # drifted once already — 0.1.0.post1 shipped while this said 0.1.0. Bump
75
75
  # both together; tests/test_version_agreement.py fails the build otherwise.
76
76
  # Do not copy the number into documentation.
77
- __version__ = "0.2.3"
77
+ __version__ = "0.2.4"
78
78
  PROTOCOL_VERSION = "tabus.v1"
79
79
 
80
80
  # TTLs. Past these, a derived status counts as old.
@@ -437,6 +437,21 @@ def _refusal_line(r):
437
437
 
438
438
 
439
439
  def fn_send(a):
440
+ # 🔴 --id lets a caller retry without storing twice. The daemon treats the same id
441
+ # with the same envelope as a resend and the same id with a changed envelope as
442
+ # a conflict, so the caller keeps the id and the whole envelope from before the
443
+ # first attempt. The daemon does not compare the sending mode itself (tac or
444
+ # broadcast), only the resolved recipients, so the caller keeps that fixed too.
445
+ # Full UUIDs only, written in canonical form, so that one id typed two ways
446
+ # cannot become two messages. Checked first, before the tac lookup or any
447
+ # other request.
448
+ mid = str(uuid.uuid4())
449
+ if getattr(a, "id", None) is not None:
450
+ try:
451
+ mid = str(uuid.UUID(a.id))
452
+ except ValueError:
453
+ print("failed: --id must be a full message UUID")
454
+ sys.exit(1)
440
455
  body = a.body
441
456
  if a.body_file:
442
457
  body = open(a.body_file, encoding="utf-8").read()
@@ -454,7 +469,6 @@ def fn_send(a):
454
469
  # send is authenticated by the request signature (call() signs every request),
455
470
  # and the daemon requires `from` to equal the acting node, so no message-level
456
471
  # signature is sent — a forged sender cannot get past the request auth.
457
- mid = str(uuid.uuid4())
458
472
  payload = {
459
473
  "from": a.sender,
460
474
  "to": requested,
@@ -1216,6 +1230,13 @@ COMMANDS = {
1216
1230
  (("--body",), dict()),
1217
1231
  (("--body-file",), dict()),
1218
1232
  (("--priority",), dict(default="next", choices=["now", "next", "batch"])),
1233
+ (
1234
+ ("--id",),
1235
+ dict(
1236
+ default=None,
1237
+ help="message UUID for a retry-safe send. The same id with the same envelope is not stored twice; with a changed envelope it is refused as a conflict",
1238
+ ),
1239
+ ),
1219
1240
  ],
1220
1241
  ),
1221
1242
  "who": (fn_who, "who is present, and how much is pending", [(("--node",), dict(default=None, help="acting node; falls back to TABC_NODE"))]),
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes