autotouch-cli 0.2.58__tar.gz → 0.2.59__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 (51) hide show
  1. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/PKG-INFO +1 -1
  2. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/cli.py +10 -0
  3. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/sequences.py +123 -17
  4. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/tasks.py +98 -0
  5. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/core/http.py +8 -2
  6. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/data/CLI_REFERENCE.md +193 -11
  7. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/data/cli-manifest.json +1124 -15
  8. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/parser.py +5 -0
  9. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/parser_groups.py +56 -0
  10. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/sequence_support.py +36 -2
  11. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/templates.py +39 -0
  12. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli.egg-info/PKG-INFO +1 -1
  13. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_shared/provider_registry.py +20 -1
  14. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/pyproject.toml +1 -1
  15. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/MANIFEST.in +0 -0
  16. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/README.md +0 -0
  17. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/__init__.py +0 -0
  18. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/cli_contracts.py +0 -0
  19. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/__init__.py +0 -0
  20. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/auth.py +0 -0
  21. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/cells.py +0 -0
  22. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/columns.py +0 -0
  23. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/jobs.py +0 -0
  24. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/leads.py +0 -0
  25. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/linkedin.py +0 -0
  26. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/prompts.py +0 -0
  27. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/rows.py +0 -0
  28. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/search.py +0 -0
  29. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/tables.py +0 -0
  30. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/webhooks.py +0 -0
  31. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/commands/workspace_secrets.py +0 -0
  32. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/core/__init__.py +0 -0
  33. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/core/auth.py +0 -0
  34. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/core/config.py +0 -0
  35. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/core/csv_import.py +0 -0
  36. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/core/io.py +0 -0
  37. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/core/output.py +0 -0
  38. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/core/polling.py +0 -0
  39. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/core/run.py +0 -0
  40. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/core/validation.py +0 -0
  41. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/exceptions.py +0 -0
  42. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli/mongo_status.py +0 -0
  43. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli.egg-info/SOURCES.txt +0 -0
  44. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli.egg-info/dependency_links.txt +0 -0
  45. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli.egg-info/entry_points.txt +0 -0
  46. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli.egg-info/requires.txt +0 -0
  47. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_cli.egg-info/top_level.txt +0 -0
  48. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_shared/__init__.py +0 -0
  49. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_shared/linkedin_contract.py +0 -0
  50. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/autotouch_shared/search_contract.py +0 -0
  51. {autotouch_cli-0.2.58 → autotouch_cli-0.2.59}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autotouch-cli
3
- Version: 0.2.58
3
+ Version: 0.2.59
4
4
  Summary: Autotouch Smart Table CLI
5
5
  Project-URL: Homepage, https://app.autotouch.ai
6
6
  Project-URL: Documentation, https://github.com/nicolonic/autotouch_main/tree/main/docs/research-table/reference
@@ -158,9 +158,14 @@ from autotouch_cli.commands.tasks import (
158
158
  cmd_tasks_delete as cmd_tasks_delete_impl,
159
159
  cmd_tasks_draft as cmd_tasks_draft_impl,
160
160
  cmd_tasks_get as cmd_tasks_get_impl,
161
+ cmd_tasks_prioritize_email as cmd_tasks_prioritize_email_impl,
162
+ cmd_tasks_prioritize_linkedin as cmd_tasks_prioritize_linkedin_impl,
161
163
  cmd_tasks_query as cmd_tasks_query_impl,
162
164
  cmd_tasks_recipe as cmd_tasks_recipe_impl,
165
+ cmd_tasks_reschedule_email as cmd_tasks_reschedule_email_impl,
166
+ cmd_tasks_reschedule_linkedin as cmd_tasks_reschedule_linkedin_impl,
163
167
  cmd_tasks_schedule_email as cmd_tasks_schedule_email_impl,
168
+ cmd_tasks_schedule_linkedin as cmd_tasks_schedule_linkedin_impl,
164
169
  cmd_tasks_stats as cmd_tasks_stats_impl,
165
170
  cmd_tasks_update as cmd_tasks_update_impl,
166
171
  )
@@ -1460,6 +1465,11 @@ _register("tasks_bulk_update", cmd_tasks_bulk_update_impl, _task_command_runtime
1460
1465
  _register("tasks_bulk_delete", cmd_tasks_bulk_delete_impl, _task_command_runtime)
1461
1466
  _register("tasks_draft", cmd_tasks_draft_impl, _task_command_runtime)
1462
1467
  _register("tasks_schedule_email", cmd_tasks_schedule_email_impl, _task_command_runtime)
1468
+ _register("tasks_prioritize_email", cmd_tasks_prioritize_email_impl, _task_command_runtime)
1469
+ _register("tasks_reschedule_email", cmd_tasks_reschedule_email_impl, _task_command_runtime)
1470
+ _register("tasks_schedule_linkedin", cmd_tasks_schedule_linkedin_impl, _task_command_runtime)
1471
+ _register("tasks_prioritize_linkedin", cmd_tasks_prioritize_linkedin_impl, _task_command_runtime)
1472
+ _register("tasks_reschedule_linkedin", cmd_tasks_reschedule_linkedin_impl, _task_command_runtime)
1463
1473
  _register("tasks_recipe", cmd_tasks_recipe_impl, _task_command_runtime)
1464
1474
 
1465
1475
  # -- Webhook commands --
@@ -1,6 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import argparse
4
+ import json
5
+ import sys
4
6
  from dataclasses import dataclass
5
7
  from typing import Any, Callable, Dict, Optional, Sequence
6
8
 
@@ -30,6 +32,51 @@ class SequenceCommandRuntime:
30
32
  sequence_runtime_factory: Callable[[], SequenceRuntime]
31
33
 
32
34
 
35
+ def _sequence_enroll_research_context(payload: Dict[str, Any]) -> Optional[Dict[str, Any]]:
36
+ research_context = payload.get("researchContext")
37
+ return research_context if isinstance(research_context, dict) else None
38
+
39
+
40
+ def _sequence_enroll_output_hints(payload: Dict[str, Any]) -> Dict[str, Any]:
41
+ research_context = _sequence_enroll_research_context(payload) or {}
42
+ source_table_id = str(
43
+ research_context.get("sourceTableId")
44
+ or research_context.get("source_table_id")
45
+ or ""
46
+ ).strip() or None
47
+ attached = bool(research_context)
48
+
49
+ if attached:
50
+ context_hint = (
51
+ "Attached research context will follow later tasks, sidecar views, and AI drafts"
52
+ + (f" using table {source_table_id}." if source_table_id else ".")
53
+ )
54
+ else:
55
+ context_hint = (
56
+ "No research context is attached; later tasks and AI drafts will use lead/company context only."
57
+ )
58
+
59
+ return {
60
+ "research_context_attached": attached,
61
+ "research_context_table_id": source_table_id,
62
+ "context_hint": context_hint,
63
+ "workflow_hint": (
64
+ "Direct enroll is best for one-off/manual adds. Use add_to_sequence when rows should "
65
+ "auto-enroll from a research table over time."
66
+ ),
67
+ "personalization_hint": (
68
+ "Attached research context does not personalize copy by itself; static copy stays the same "
69
+ "unless the sequence uses variables or AI draft steps."
70
+ ),
71
+ }
72
+
73
+
74
+ def _attach_sequence_enroll_hints(output: Dict[str, Any], payload: Dict[str, Any]) -> Dict[str, Any]:
75
+ enriched = dict(output)
76
+ enriched.update(_sequence_enroll_output_hints(payload))
77
+ return enriched
78
+
79
+
33
80
  def _sequence_mutation_params(args: argparse.Namespace) -> Optional[Dict[str, Any]]:
34
81
  return sequence_mutation_params_impl(args)
35
82
 
@@ -148,17 +195,41 @@ def cmd_sequences_update(args: argparse.Namespace, *, runtime: SequenceCommandRu
148
195
  if not isinstance(payload, dict):
149
196
  raise AutotouchInputError("sequence update requires --data-json/--data-file with a JSON object")
150
197
 
151
- data = runtime.request_api(
152
- "PUT",
153
- f"/api/sequences/{args.sequence_id}",
154
- base_url=args.base_url,
155
- token=token,
156
- use_x_api_key=args.use_x_api_key,
157
- params=_sequence_mutation_params(args),
158
- payload=payload,
159
- timeout=args.timeout,
160
- verbose=args.verbose,
161
- )
198
+ try:
199
+ data = runtime.request_api(
200
+ "PUT",
201
+ f"/api/sequences/{args.sequence_id}",
202
+ base_url=args.base_url,
203
+ token=token,
204
+ use_x_api_key=args.use_x_api_key,
205
+ params=_sequence_mutation_params(args),
206
+ payload=payload,
207
+ timeout=args.timeout,
208
+ verbose=args.verbose,
209
+ )
210
+ except AutotouchAPIError as exc:
211
+ if exc.status_code == 409 and exc.response_body:
212
+ try:
213
+ body = json.loads(exc.response_body)
214
+ except Exception:
215
+ body = None
216
+ if isinstance(body, dict) and str(body.get("error") or "").strip() == "delivery_edit_locked":
217
+ message = str(body.get("message") or "Cannot change delivery backend because this sequence has in-flight email work.").strip()
218
+ policy = body.get("deliveryEditPolicy") if isinstance(body.get("deliveryEditPolicy"), dict) else {}
219
+ enrollment_count = int(policy.get("inFlightEnrollmentCount") or 0)
220
+ task_count = int(policy.get("activeEmailTaskCount") or 0)
221
+ outbox_count = int(policy.get("activeEmailOutboxCount") or 0)
222
+ print(f"ERROR: {message}", file=sys.stderr)
223
+ print(
224
+ f"Counts: active enrollments={enrollment_count}, email tasks={task_count}, queued email jobs={outbox_count}",
225
+ file=sys.stderr,
226
+ )
227
+ print(
228
+ f"Hint: clone the sequence with `autotouch sequences clone --sequence-id {args.sequence_id}` and apply the delivery change there.",
229
+ file=sys.stderr,
230
+ )
231
+ raise AutotouchAPIError(message, status_code=exc.status_code, response_body=exc.response_body) from exc
232
+ raise
162
233
  runtime.print_json(data, args.compact)
163
234
 
164
235
 
@@ -258,6 +329,7 @@ def cmd_sequences_enroll(args: argparse.Namespace, *, runtime: SequenceCommandRu
258
329
  output.setdefault("job_id", job_id)
259
330
  output["job_status_url"] = status_url
260
331
  output["watch_command"] = watch_command
332
+ output = _attach_sequence_enroll_hints(output, payload)
261
333
  runtime.print_json(output, args.compact)
262
334
  return
263
335
 
@@ -306,6 +378,7 @@ def cmd_sequences_enroll(args: argparse.Namespace, *, runtime: SequenceCommandRu
306
378
  "timed_out": timed_out,
307
379
  "polls": int(poll_result.get("polls") or 0),
308
380
  }
381
+ output = _attach_sequence_enroll_hints(output, payload)
309
382
  runtime.print_json(output, args.compact)
310
383
 
311
384
  if timed_out:
@@ -386,7 +459,10 @@ def register_sequences_subcommands(
386
459
  add_api_common_arguments(psqc)
387
460
  psqc.set_defaults(func=handlers["create"])
388
461
 
389
- psqu = sequences_sub.add_parser("update", help="Update a sequence from a JSON payload")
462
+ psqu = sequences_sub.add_parser(
463
+ "update",
464
+ help="Update a sequence from a JSON payload (schedule changes may rewindow unsent scheduled work)",
465
+ )
390
466
  psqu.add_argument("--sequence-id", required=True)
391
467
  psqu.add_argument("--data-json", help="Sequence update payload JSON")
392
468
  psqu.add_argument("--data-file", help="Sequence update payload file path")
@@ -432,10 +508,17 @@ def register_sequences_subcommands(
432
508
  add_api_common_arguments(psqar)
433
509
  psqar.set_defaults(func=handlers["status"], target_status="ARCHIVED")
434
510
 
435
- psqe = sequences_sub.add_parser("enroll", help="Enroll leads into a sequence")
511
+ psqe = sequences_sub.add_parser(
512
+ "enroll",
513
+ help="Enroll leads into a sequence (best for one-off/manual adds)",
514
+ description=(
515
+ "Direct enroll is best for one-off/manual adds. Use add_to_sequence when rows should "
516
+ "auto-enroll from a research table over time."
517
+ ),
518
+ )
436
519
  psqe.add_argument("--sequence-id", required=True)
437
- psqe.add_argument("--data-json", help="Full enroll payload JSON")
438
- psqe.add_argument("--data-file", help="Full enroll payload JSON file")
520
+ psqe.add_argument("--data-json", help="Full enroll payload JSON (advanced; overrides simpler flags)")
521
+ psqe.add_argument("--data-file", help="Full enroll payload JSON file (advanced; overrides simpler flags)")
439
522
  psqe.add_argument(
440
523
  "--lead-id",
441
524
  action="append",
@@ -445,8 +528,31 @@ def register_sequences_subcommands(
445
528
  psqe.add_argument("--lead-ids-file", help="Path to JSON/TXT/CSV file with lead ids")
446
529
  psqe.add_argument("--lead-ids-column", default="lead_id", help="CSV column for lead ids (default: lead_id)")
447
530
  psqe.add_argument("--start-date", help="Optional startDate ISO timestamp")
448
- psqe.add_argument("--research-context-json", help="researchContext JSON")
449
- psqe.add_argument("--research-context-file", help="researchContext JSON file")
531
+ psqe.add_argument(
532
+ "--research-context-json",
533
+ "--attach-research-context-json",
534
+ dest="research_context_json",
535
+ help="Advanced raw researchContext JSON for workflow-scoped table context",
536
+ )
537
+ psqe.add_argument(
538
+ "--research-context-file",
539
+ "--attach-research-context-file",
540
+ dest="research_context_file",
541
+ help="Advanced raw researchContext JSON file for workflow-scoped table context",
542
+ )
543
+ psqe.add_argument(
544
+ "--attach-research-table-id",
545
+ help="Attach research context from this table for later tasks, sidecar views, and AI drafts",
546
+ )
547
+ psqe.add_argument(
548
+ "--attach-research-table-name",
549
+ help="Optional source table name to store alongside attached research context",
550
+ )
551
+ psqe.add_argument(
552
+ "--attach-research-field-id",
553
+ action="append",
554
+ help="Optional research field id to keep in attached context (repeatable; comma-separated also supported)",
555
+ )
450
556
  psqe.add_argument("--variable-map-json", help="variableMap JSON")
451
557
  psqe.add_argument("--variable-map-file", help="variableMap JSON file")
452
558
  psqe.add_argument("--variable-overrides-json", help="variableOverrides JSON")
@@ -231,3 +231,101 @@ def cmd_tasks_schedule_email(args: argparse.Namespace, *, runtime: TaskCommandRu
231
231
  verbose=args.verbose,
232
232
  )
233
233
  runtime.print_json(data, args.compact)
234
+
235
+
236
+ def cmd_tasks_prioritize_email(args: argparse.Namespace, *, runtime: TaskCommandRuntime) -> None:
237
+ token = runtime.resolve_token(args.token, required=True)
238
+ data = runtime.request_api(
239
+ "POST",
240
+ f"/api/task-queue/{args.task_id}/email/prioritize",
241
+ base_url=args.base_url,
242
+ token=token,
243
+ use_x_api_key=args.use_x_api_key,
244
+ params=_task_mutation_params(args),
245
+ timeout=args.timeout,
246
+ verbose=args.verbose,
247
+ )
248
+ runtime.print_json(data, args.compact)
249
+
250
+
251
+ def cmd_tasks_reschedule_email(args: argparse.Namespace, *, runtime: TaskCommandRuntime) -> None:
252
+ token = runtime.resolve_token(args.token, required=True)
253
+ payload = runtime.load_required_object_payload(args, noun="task email reschedule")
254
+ data = runtime.request_api(
255
+ "POST",
256
+ f"/api/task-queue/{args.task_id}/email/reschedule",
257
+ base_url=args.base_url,
258
+ token=token,
259
+ use_x_api_key=args.use_x_api_key,
260
+ params=_task_mutation_params(args),
261
+ payload=payload,
262
+ timeout=args.timeout,
263
+ verbose=args.verbose,
264
+ )
265
+ runtime.print_json(data, args.compact)
266
+
267
+
268
+ def _load_optional_task_payload(
269
+ args: argparse.Namespace,
270
+ *,
271
+ runtime: TaskCommandRuntime,
272
+ noun: str,
273
+ ) -> Dict[str, Any]:
274
+ payload = runtime.load_json_input(
275
+ inline_json=getattr(args, "data_json", None),
276
+ file_path=getattr(args, "data_file", None),
277
+ context="data",
278
+ default={},
279
+ )
280
+ if not isinstance(payload, dict):
281
+ raise AutotouchInputError(f"{noun} payload must be a JSON object")
282
+ return payload
283
+
284
+
285
+ def cmd_tasks_schedule_linkedin(args: argparse.Namespace, *, runtime: TaskCommandRuntime) -> None:
286
+ token = runtime.resolve_token(args.token, required=True)
287
+ payload = _load_optional_task_payload(args, runtime=runtime, noun="task linkedin schedule")
288
+ data = runtime.request_api(
289
+ "POST",
290
+ f"/api/task-queue/{args.task_id}/linkedin/schedule",
291
+ base_url=args.base_url,
292
+ token=token,
293
+ use_x_api_key=args.use_x_api_key,
294
+ params=_task_mutation_params(args),
295
+ payload=payload,
296
+ timeout=args.timeout,
297
+ verbose=args.verbose,
298
+ )
299
+ runtime.print_json(data, args.compact)
300
+
301
+
302
+ def cmd_tasks_prioritize_linkedin(args: argparse.Namespace, *, runtime: TaskCommandRuntime) -> None:
303
+ token = runtime.resolve_token(args.token, required=True)
304
+ data = runtime.request_api(
305
+ "POST",
306
+ f"/api/task-queue/{args.task_id}/linkedin/prioritize",
307
+ base_url=args.base_url,
308
+ token=token,
309
+ use_x_api_key=args.use_x_api_key,
310
+ params=_task_mutation_params(args),
311
+ timeout=args.timeout,
312
+ verbose=args.verbose,
313
+ )
314
+ runtime.print_json(data, args.compact)
315
+
316
+
317
+ def cmd_tasks_reschedule_linkedin(args: argparse.Namespace, *, runtime: TaskCommandRuntime) -> None:
318
+ token = runtime.resolve_token(args.token, required=True)
319
+ payload = runtime.load_required_object_payload(args, noun="task linkedin reschedule")
320
+ data = runtime.request_api(
321
+ "POST",
322
+ f"/api/task-queue/{args.task_id}/linkedin/reschedule",
323
+ base_url=args.base_url,
324
+ token=token,
325
+ use_x_api_key=args.use_x_api_key,
326
+ params=_task_mutation_params(args),
327
+ payload=payload,
328
+ timeout=args.timeout,
329
+ verbose=args.verbose,
330
+ )
331
+ runtime.print_json(data, args.compact)
@@ -54,6 +54,12 @@ def _print_error_body(body: Any) -> None:
54
54
  print(str(body), file=sys.stderr)
55
55
 
56
56
 
57
+ def _serialize_error_body(body: Any) -> str:
58
+ if isinstance(body, (dict, list)):
59
+ return json.dumps(body, default=str)
60
+ return str(body)
61
+
62
+
57
63
  def request_api(
58
64
  method: str,
59
65
  path: str,
@@ -129,7 +135,7 @@ def request_api(
129
135
  raise AutotouchAPIError(
130
136
  f"API {response.status_code}",
131
137
  status_code=response.status_code,
132
- response_body=str(body),
138
+ response_body=_serialize_error_body(body),
133
139
  )
134
140
  return body
135
141
 
@@ -212,6 +218,6 @@ def request_multipart_api(
212
218
  raise AutotouchAPIError(
213
219
  f"API {response.status_code}",
214
220
  status_code=response.status_code,
215
- response_body=str(body),
221
+ response_body=_serialize_error_body(body),
216
222
  )
217
223
  return body
@@ -1,6 +1,6 @@
1
1
  # Autotouch CLI Reference
2
2
 
3
- Generated from the installed parser for `autotouch-cli` `0.2.58`.
3
+ Generated from the installed parser for `autotouch-cli` `0.2.59`.
4
4
  Manifest schema version: `2`.
5
5
 
6
6
  ## Output Modes
@@ -3590,7 +3590,9 @@ Check sequence email delivery readiness
3590
3590
 
3591
3591
  #### `autotouch sequences enroll`
3592
3592
 
3593
- Enroll leads into a sequence
3593
+ Enroll leads into a sequence (best for one-off/manual adds)
3594
+
3595
+ Direct enroll is best for one-off/manual adds. Use add_to_sequence when rows should auto-enroll from a research table over time.
3594
3596
 
3595
3597
  - Auth: `developer_key_or_user_session`
3596
3598
  - Stability: `stable`
@@ -3607,6 +3609,9 @@ Enroll leads into a sequence
3607
3609
  [--start-date START_DATE]
3608
3610
  [--research-context-json RESEARCH_CONTEXT_JSON]
3609
3611
  [--research-context-file RESEARCH_CONTEXT_FILE]
3612
+ [--attach-research-table-id ATTACH_RESEARCH_TABLE_ID]
3613
+ [--attach-research-table-name ATTACH_RESEARCH_TABLE_NAME]
3614
+ [--attach-research-field-id ATTACH_RESEARCH_FIELD_ID]
3610
3615
  [--variable-map-json VARIABLE_MAP_JSON]
3611
3616
  [--variable-map-file VARIABLE_MAP_FILE]
3612
3617
  [--variable-overrides-json VARIABLE_OVERRIDES_JSON]
@@ -3625,15 +3630,18 @@ Enroll leads into a sequence
3625
3630
  --json-pointer JSON_POINTER] [--verbose]`
3626
3631
  - Options:
3627
3632
  - `--sequence-id` (required; kind=string)
3628
- - `--data-json` (kind=json; input=json): Full enroll payload JSON
3629
- - `--data-file` (kind=file; input=file): Full enroll payload JSON file
3633
+ - `--data-json` (kind=json; input=json): Full enroll payload JSON (advanced; overrides simpler flags)
3634
+ - `--data-file` (kind=file; input=file): Full enroll payload JSON file (advanced; overrides simpler flags)
3630
3635
  - `--lead-id` (kind=string; repeatable; comma-separated): Lead id to enroll (repeatable; comma-separated also supported)
3631
3636
  - `--lead-ids-json` (kind=json; input=json): JSON array or object with leadIds[]
3632
3637
  - `--lead-ids-file` (kind=file; input=file): Path to JSON/TXT/CSV file with lead ids
3633
3638
  - `--lead-ids-column` (kind=string; default=lead_id): CSV column for lead ids (default: lead_id)
3634
3639
  - `--start-date` (kind=string): Optional startDate ISO timestamp
3635
- - `--research-context-json` (kind=json; input=json): researchContext JSON
3636
- - `--research-context-file` (kind=file; input=file): researchContext JSON file
3640
+ - `--research-context-json, --attach-research-context-json` (kind=json; input=json): Advanced raw researchContext JSON for workflow-scoped table context
3641
+ - `--research-context-file, --attach-research-context-file` (kind=file; input=file): Advanced raw researchContext JSON file for workflow-scoped table context
3642
+ - `--attach-research-table-id` (kind=string): Attach research context from this table for later tasks, sidecar views, and AI drafts
3643
+ - `--attach-research-table-name` (kind=string): Optional source table name to store alongside attached research context
3644
+ - `--attach-research-field-id` (kind=string; repeatable; comma-separated): Optional research field id to keep in attached context (repeatable; comma-separated also supported)
3637
3645
  - `--variable-map-json` (kind=json; input=json): variableMap JSON
3638
3646
  - `--variable-map-file` (kind=file; input=file): variableMap JSON file
3639
3647
  - `--variable-overrides-json` (kind=json; input=json): variableOverrides JSON
@@ -3869,7 +3877,7 @@ Set sequence status
3869
3877
 
3870
3878
  #### `autotouch sequences update`
3871
3879
 
3872
- Update a sequence from a JSON payload
3880
+ Update a sequence from a JSON payload (schedule changes may rewindow unsent scheduled work)
3873
3881
 
3874
3882
  - Auth: `developer_key_or_user_session`
3875
3883
  - Stability: `stable`
@@ -4229,10 +4237,10 @@ Task queue operations
4229
4237
  - Auth: `varies_by_subcommand`
4230
4238
  - Stability: `stable`
4231
4239
  - Destructive: `no`
4232
- - Subcommands: `recipe, query, count, assignee-counts, get, stats, create, update, delete, bulk-update, bulk-delete, draft, schedule-email`
4240
+ - Subcommands: `recipe, query, count, assignee-counts, get, stats, create, update, delete, bulk-update, bulk-delete, draft, schedule-email, prioritize-email, reschedule-email, schedule-linkedin, prioritize-linkedin, reschedule-linkedin`
4233
4241
  - Example:
4234
4242
  - `autotouch tasks [-h]
4235
- {recipe,query,count,assignee-counts,get,stats,create,update,delete,bulk-update,bulk-delete,draft,schedule-email,email-schedule} ...`
4243
+ {recipe,query,count,assignee-counts,get,stats,create,update,delete,bulk-update,bulk-delete,draft,schedule-email,email-schedule,prioritize-email,email-prioritize,reschedule-email,email-reschedule,schedule-linkedin,linkedin-schedule,prioritize-linkedin,linkedin-prioritize,reschedule-linkedin,linkedin-reschedule} ...`
4236
4244
 
4237
4245
  #### `autotouch tasks assignee-counts`
4238
4246
 
@@ -4477,6 +4485,71 @@ Get one task by id
4477
4485
  - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
4478
4486
  - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
4479
4487
 
4488
+ #### `autotouch tasks prioritize-email`
4489
+
4490
+ Move an email task to the earliest legal send slot
4491
+
4492
+ - Auth: `developer_key_or_user_session`
4493
+ - Stability: `stable`
4494
+ - Destructive: `no`
4495
+ - Aliases: `email-prioritize`
4496
+ - Required flags: `--task-id`
4497
+ - Output modes: `json, ndjson, human`
4498
+ - Example:
4499
+ - `autotouch tasks prioritize-email [-h] --task-id TASK_ID
4500
+ [--actor-user-id ACTOR_USER_ID]
4501
+ [--base-url BASE_URL] [--token TOKEN]
4502
+ [--use-x-api-key] [--timeout TIMEOUT]
4503
+ [--output {json,ndjson,human}]
4504
+ [--compact] [--select SELECT |
4505
+ --json-pointer JSON_POINTER]
4506
+ [--verbose]`
4507
+ - Options:
4508
+ - `--task-id` (required; kind=string)
4509
+ - `--actor-user-id` (kind=string): Optional actor override; must resolve to an active user in the same organization
4510
+ - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
4511
+ - `--token` (kind=string; sensitive): Developer API key / JWT token
4512
+ - `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
4513
+ - `--timeout` (kind=integer; default=30): HTTP timeout in seconds
4514
+ - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
4515
+ - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
4516
+ - `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
4517
+ - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
4518
+ - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
4519
+
4520
+ #### `autotouch tasks prioritize-linkedin`
4521
+
4522
+ Move a connected LinkedIn task to the earliest legal execution slot
4523
+
4524
+ - Auth: `developer_key_or_user_session`
4525
+ - Stability: `stable`
4526
+ - Destructive: `no`
4527
+ - Aliases: `linkedin-prioritize`
4528
+ - Required flags: `--task-id`
4529
+ - Output modes: `json, ndjson, human`
4530
+ - Example:
4531
+ - `autotouch tasks prioritize-linkedin [-h] --task-id TASK_ID
4532
+ [--actor-user-id ACTOR_USER_ID]
4533
+ [--base-url BASE_URL]
4534
+ [--token TOKEN] [--use-x-api-key]
4535
+ [--timeout TIMEOUT]
4536
+ [--output {json,ndjson,human}]
4537
+ [--compact] [--select SELECT |
4538
+ --json-pointer JSON_POINTER]
4539
+ [--verbose]`
4540
+ - Options:
4541
+ - `--task-id` (required; kind=string)
4542
+ - `--actor-user-id` (kind=string): Optional actor override; must resolve to an active user in the same organization
4543
+ - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
4544
+ - `--token` (kind=string; sensitive): Developer API key / JWT token
4545
+ - `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
4546
+ - `--timeout` (kind=integer; default=30): HTTP timeout in seconds
4547
+ - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
4548
+ - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
4549
+ - `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
4550
+ - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
4551
+ - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
4552
+
4480
4553
  #### `autotouch tasks query`
4481
4554
 
4482
4555
  Query tasks with a TaskQueryRequest payload
@@ -4516,7 +4589,7 @@ Print task payload recipes
4516
4589
  - Output modes: `json, ndjson, human`
4517
4590
  - Example:
4518
4591
  - `autotouch tasks recipe [-h]
4519
- [--type {all,query,query_linkedin,create,create_linkedin,update,bulk_update,bulk_delete,draft,schedule_email}]
4592
+ [--type {all,query,query_linkedin,create,create_linkedin,update,bulk_update,bulk_delete,draft,schedule_email,prioritize_email,reschedule_email,schedule_linkedin,prioritize_linkedin,reschedule_linkedin}]
4520
4593
  [--out-file OUT_FILE] [--base-url BASE_URL]
4521
4594
  [--token TOKEN] [--use-x-api-key]
4522
4595
  [--timeout TIMEOUT]
@@ -4524,7 +4597,7 @@ Print task payload recipes
4524
4597
  [--select SELECT | --json-pointer JSON_POINTER]
4525
4598
  [--verbose]`
4526
4599
  - Options:
4527
- - `--type` (kind=string; choices=all,query,query_linkedin,create,create_linkedin,update,bulk_update,bulk_delete,draft,schedule_email; default=all)
4600
+ - `--type` (kind=string; choices=all,query,query_linkedin,create,create_linkedin,update,bulk_update,bulk_delete,draft,schedule_email,prioritize_email,reschedule_email,schedule_linkedin,prioritize_linkedin,reschedule_linkedin; default=all)
4528
4601
  - `--out-file` (kind=file; input=file): Optional path to save the selected payload JSON
4529
4602
  - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
4530
4603
  - `--token` (kind=string; sensitive): Developer API key / JWT token
@@ -4536,6 +4609,79 @@ Print task payload recipes
4536
4609
  - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
4537
4610
  - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
4538
4611
 
4612
+ #### `autotouch tasks reschedule-email`
4613
+
4614
+ Move a scheduled email task to a requested send time
4615
+
4616
+ - Auth: `developer_key_or_user_session`
4617
+ - Stability: `stable`
4618
+ - Destructive: `no`
4619
+ - Aliases: `email-reschedule`
4620
+ - Required flags: `--task-id`
4621
+ - Output modes: `json, ndjson, human`
4622
+ - Example:
4623
+ - `autotouch tasks reschedule-email [-h] --task-id TASK_ID
4624
+ [--data-json DATA_JSON]
4625
+ [--data-file DATA_FILE]
4626
+ [--actor-user-id ACTOR_USER_ID]
4627
+ [--base-url BASE_URL] [--token TOKEN]
4628
+ [--use-x-api-key] [--timeout TIMEOUT]
4629
+ [--output {json,ndjson,human}]
4630
+ [--compact] [--select SELECT |
4631
+ --json-pointer JSON_POINTER]
4632
+ [--verbose]`
4633
+ - Options:
4634
+ - `--task-id` (required; kind=string)
4635
+ - `--data-json` (kind=json; input=json): TaskEmailRescheduleRequest payload JSON
4636
+ - `--data-file` (kind=file; input=file): Path to TaskEmailRescheduleRequest payload JSON file
4637
+ - `--actor-user-id` (kind=string): Optional actor override; must resolve to an active user in the same organization
4638
+ - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
4639
+ - `--token` (kind=string; sensitive): Developer API key / JWT token
4640
+ - `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
4641
+ - `--timeout` (kind=integer; default=30): HTTP timeout in seconds
4642
+ - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
4643
+ - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
4644
+ - `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
4645
+ - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
4646
+ - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
4647
+
4648
+ #### `autotouch tasks reschedule-linkedin`
4649
+
4650
+ Move a scheduled LinkedIn task to a requested execution time
4651
+
4652
+ - Auth: `developer_key_or_user_session`
4653
+ - Stability: `stable`
4654
+ - Destructive: `no`
4655
+ - Aliases: `linkedin-reschedule`
4656
+ - Required flags: `--task-id`
4657
+ - Output modes: `json, ndjson, human`
4658
+ - Example:
4659
+ - `autotouch tasks reschedule-linkedin [-h] --task-id TASK_ID
4660
+ [--data-json DATA_JSON]
4661
+ [--data-file DATA_FILE]
4662
+ [--actor-user-id ACTOR_USER_ID]
4663
+ [--base-url BASE_URL]
4664
+ [--token TOKEN] [--use-x-api-key]
4665
+ [--timeout TIMEOUT]
4666
+ [--output {json,ndjson,human}]
4667
+ [--compact] [--select SELECT |
4668
+ --json-pointer JSON_POINTER]
4669
+ [--verbose]`
4670
+ - Options:
4671
+ - `--task-id` (required; kind=string)
4672
+ - `--data-json` (kind=json; input=json): LinkedInTaskRescheduleRequest payload JSON
4673
+ - `--data-file` (kind=file; input=file): Path to LinkedInTaskRescheduleRequest payload JSON file
4674
+ - `--actor-user-id` (kind=string): Optional actor override; must resolve to an active user in the same organization
4675
+ - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
4676
+ - `--token` (kind=string; sensitive): Developer API key / JWT token
4677
+ - `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
4678
+ - `--timeout` (kind=integer; default=30): HTTP timeout in seconds
4679
+ - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
4680
+ - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
4681
+ - `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
4682
+ - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
4683
+ - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
4684
+
4539
4685
  #### `autotouch tasks schedule-email`
4540
4686
 
4541
4687
  Schedule or send an email task from a JSON payload
@@ -4571,6 +4717,42 @@ Schedule or send an email task from a JSON payload
4571
4717
  - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
4572
4718
  - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
4573
4719
 
4720
+ #### `autotouch tasks schedule-linkedin`
4721
+
4722
+ Queue a connected LinkedIn task at a requested execution time
4723
+
4724
+ - Auth: `developer_key_or_user_session`
4725
+ - Stability: `stable`
4726
+ - Destructive: `no`
4727
+ - Aliases: `linkedin-schedule`
4728
+ - Required flags: `--task-id`
4729
+ - Output modes: `json, ndjson, human`
4730
+ - Example:
4731
+ - `autotouch tasks schedule-linkedin [-h] --task-id TASK_ID
4732
+ [--data-json DATA_JSON]
4733
+ [--data-file DATA_FILE]
4734
+ [--actor-user-id ACTOR_USER_ID]
4735
+ [--base-url BASE_URL] [--token TOKEN]
4736
+ [--use-x-api-key] [--timeout TIMEOUT]
4737
+ [--output {json,ndjson,human}]
4738
+ [--compact] [--select SELECT |
4739
+ --json-pointer JSON_POINTER]
4740
+ [--verbose]`
4741
+ - Options:
4742
+ - `--task-id` (required; kind=string)
4743
+ - `--data-json` (kind=json; input=json): Optional LinkedInTaskScheduleRequest payload JSON
4744
+ - `--data-file` (kind=file; input=file): Optional LinkedInTaskScheduleRequest payload JSON file
4745
+ - `--actor-user-id` (kind=string): Optional actor override; must resolve to an active user in the same organization
4746
+ - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
4747
+ - `--token` (kind=string; sensitive): Developer API key / JWT token
4748
+ - `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
4749
+ - `--timeout` (kind=integer; default=30): HTTP timeout in seconds
4750
+ - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
4751
+ - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
4752
+ - `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
4753
+ - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
4754
+ - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
4755
+
4574
4756
  #### `autotouch tasks stats`
4575
4757
 
4576
4758
  Get task summary stats