autotouch-cli 0.2.83__tar.gz → 0.2.86__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 (55) hide show
  1. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/PKG-INFO +3 -3
  2. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/README.md +2 -2
  3. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/cli.py +1 -0
  4. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/columns.py +76 -0
  5. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/list_build.py +61 -16
  6. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/data/CLI_REFERENCE.md +48 -42
  7. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/data/cli-manifest.json +283 -245
  8. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/templates.py +28 -2
  9. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli.egg-info/PKG-INFO +3 -3
  10. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_shared/list_build_contract.py +34 -5
  11. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_shared/provider_registry.py +2 -0
  12. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/pyproject.toml +1 -1
  13. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/MANIFEST.in +0 -0
  14. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/__init__.py +0 -0
  15. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/cli_contracts.py +0 -0
  16. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/__init__.py +0 -0
  17. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/agents.py +0 -0
  18. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/auth.py +0 -0
  19. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/cells.py +0 -0
  20. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/jobs.py +0 -0
  21. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/leads.py +0 -0
  22. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/linkedin.py +0 -0
  23. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/prompts.py +0 -0
  24. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/rows.py +0 -0
  25. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/search.py +0 -0
  26. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/sequences.py +0 -0
  27. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/tables.py +0 -0
  28. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/tasks.py +0 -0
  29. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/webhooks.py +0 -0
  30. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/workspace_secrets.py +0 -0
  31. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/__init__.py +0 -0
  32. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/auth.py +0 -0
  33. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/config.py +0 -0
  34. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/csv_import.py +0 -0
  35. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/http.py +0 -0
  36. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/io.py +0 -0
  37. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/output.py +0 -0
  38. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/polling.py +0 -0
  39. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/run.py +0 -0
  40. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/validation.py +0 -0
  41. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/exceptions.py +0 -0
  42. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/mongo_status.py +0 -0
  43. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/parser.py +0 -0
  44. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/parser_groups.py +0 -0
  45. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/sequence_support.py +0 -0
  46. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli.egg-info/SOURCES.txt +0 -0
  47. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli.egg-info/dependency_links.txt +0 -0
  48. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli.egg-info/entry_points.txt +0 -0
  49. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli.egg-info/requires.txt +0 -0
  50. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli.egg-info/top_level.txt +0 -0
  51. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_shared/__init__.py +0 -0
  52. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_shared/linkedin_contract.py +0 -0
  53. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_shared/linkedin_filters.py +0 -0
  54. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_shared/search_contract.py +0 -0
  55. {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autotouch-cli
3
- Version: 0.2.83
3
+ Version: 0.2.86
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
@@ -150,7 +150,7 @@ Use `autotouch search companies` and `autotouch search people` for neural search
150
150
 
151
151
  Use `autotouch list-build companies` and `autotouch list-build leads` for structured, repeatable list construction. This is the only CLI path for building LinkedIn-sourced company and lead lists. Treat list builds as the sourcing step for the Smart Table research workspace: build company/account records first by default, add the records to a research table, then enrich, score, segment, find related leads, attach signals/notes, and continue downstream workflows from that table. Use lead builds directly when the request is explicitly person/contact focused. This path uses Autotouch-managed provider access, so users do not need to connect their own LinkedIn account. Use filters like geography IDs, company size, industry IDs, title/persona, and current company IDs; call `autotouch list-build inputs` for supported values. Durable list builds run as background jobs with status/results endpoints and cost 1 credit per successful non-empty result page.
152
152
 
153
- For structured company builds, start with industry IDs plus geo/company-size filters. Company builds still need a broad `keywords` anchor (for example, `software`), but keywords are less reliable because they depend on company/profile text; use them to refine, disambiguate, or recover hard-to-classify targets instead of carrying the whole target definition.
153
+ For structured company builds, start with industry IDs plus geo/company-size filters. User-supplied `keywords` are optional when structured filters are present; use them only to refine, disambiguate, or recover hard-to-classify targets instead of carrying the whole target definition.
154
154
 
155
155
  For account-first prospecting, build companies/accounts first, inspect the returned company IDs, then pass those IDs to `autotouch list-build leads --current-company-id ...`. Do not use neural search as a default pre-step for every list build; use it when the user's target is genuinely semantic or niche.
156
156
 
@@ -160,7 +160,7 @@ For automation or agent-driven setup, use:
160
160
  - `autotouch cli-manifest --output json` for the local machine-readable command contract
161
161
  - `autotouch cli-reference` for the shipped parser-generated reference
162
162
  - `autotouch capabilities --output json` for provider/workflow contracts
163
- - `autotouch --version` should be `0.2.83` or newer for the cleaned single LinkedIn-sourced list-build path, `list-build inputs/pricing`, research-workspace list-build guidance, and 10-result neural search cap
163
+ - `autotouch --version` should be `0.2.85` or newer for structured company list builds without user-supplied keywords, stored list-build input lookup, research-workspace list-build guidance, and the cleaned single LinkedIn-sourced list-build path
164
164
  - `autotouch capabilities --output json --select list_builds` for documented list-build inputs such as geography IDs, company size buckets, profile language, and company IDs
165
165
  - `autotouch list-build inputs` and `autotouch list-build pricing` before creating durable list-build jobs
166
166
  - `autotouch list-build companies` and `autotouch list-build leads` for durable LinkedIn-sourced company and lead list builds with Smart Table-owned background workers, visible progress, and no user-owned LinkedIn connection requirement
@@ -125,7 +125,7 @@ Use `autotouch search companies` and `autotouch search people` for neural search
125
125
 
126
126
  Use `autotouch list-build companies` and `autotouch list-build leads` for structured, repeatable list construction. This is the only CLI path for building LinkedIn-sourced company and lead lists. Treat list builds as the sourcing step for the Smart Table research workspace: build company/account records first by default, add the records to a research table, then enrich, score, segment, find related leads, attach signals/notes, and continue downstream workflows from that table. Use lead builds directly when the request is explicitly person/contact focused. This path uses Autotouch-managed provider access, so users do not need to connect their own LinkedIn account. Use filters like geography IDs, company size, industry IDs, title/persona, and current company IDs; call `autotouch list-build inputs` for supported values. Durable list builds run as background jobs with status/results endpoints and cost 1 credit per successful non-empty result page.
127
127
 
128
- For structured company builds, start with industry IDs plus geo/company-size filters. Company builds still need a broad `keywords` anchor (for example, `software`), but keywords are less reliable because they depend on company/profile text; use them to refine, disambiguate, or recover hard-to-classify targets instead of carrying the whole target definition.
128
+ For structured company builds, start with industry IDs plus geo/company-size filters. User-supplied `keywords` are optional when structured filters are present; use them only to refine, disambiguate, or recover hard-to-classify targets instead of carrying the whole target definition.
129
129
 
130
130
  For account-first prospecting, build companies/accounts first, inspect the returned company IDs, then pass those IDs to `autotouch list-build leads --current-company-id ...`. Do not use neural search as a default pre-step for every list build; use it when the user's target is genuinely semantic or niche.
131
131
 
@@ -135,7 +135,7 @@ For automation or agent-driven setup, use:
135
135
  - `autotouch cli-manifest --output json` for the local machine-readable command contract
136
136
  - `autotouch cli-reference` for the shipped parser-generated reference
137
137
  - `autotouch capabilities --output json` for provider/workflow contracts
138
- - `autotouch --version` should be `0.2.83` or newer for the cleaned single LinkedIn-sourced list-build path, `list-build inputs/pricing`, research-workspace list-build guidance, and 10-result neural search cap
138
+ - `autotouch --version` should be `0.2.85` or newer for structured company list builds without user-supplied keywords, stored list-build input lookup, research-workspace list-build guidance, and the cleaned single LinkedIn-sourced list-build path
139
139
  - `autotouch capabilities --output json --select list_builds` for documented list-build inputs such as geography IDs, company size buckets, profile language, and company IDs
140
140
  - `autotouch list-build inputs` and `autotouch list-build pricing` before creating durable list-build jobs
141
141
  - `autotouch list-build companies` and `autotouch list-build leads` for durable LinkedIn-sourced company and lead list builds with Smart Table-owned background workers, visible progress, and no user-owned LinkedIn connection requirement
@@ -2398,6 +2398,7 @@ cmd_auth_schema = _bound("auth_schema")
2398
2398
  cmd_auth_whoami = _bound("auth_whoami")
2399
2399
  cmd_cells_get = _bound("cells_get")
2400
2400
  cmd_columns_create = _bound("columns_create")
2401
+ cmd_columns_update = _bound("columns_update")
2401
2402
  cmd_columns_move = _bound("columns_move")
2402
2403
  cmd_columns_projections = _bound("columns_projections")
2403
2404
  cmd_columns_run_next = _bound("columns_run_next")
@@ -7,6 +7,16 @@ from typing import Any, Callable, Dict, Sequence
7
7
  from autotouch_cli.exceptions import AutotouchCreditError, AutotouchInputError
8
8
 
9
9
 
10
+ _RESEARCH_MODE_ALIASES = {
11
+ "lite": "lite",
12
+ "light": "lite",
13
+ "quick": "lite",
14
+ "heavy": "heavy",
15
+ "deep": "heavy",
16
+ "thorough": "heavy",
17
+ }
18
+
19
+
10
20
  @dataclass(frozen=True)
11
21
  class ColumnCommandRuntime:
12
22
  resolve_token: Callable[[str | None, bool], str | None]
@@ -52,6 +62,54 @@ def _apply_column_position_overrides(
52
62
  return merged
53
63
 
54
64
 
65
+ def _normalize_research_mode_option(value: Any) -> str:
66
+ normalized = str(value or "").strip().lower()
67
+ if normalized in _RESEARCH_MODE_ALIASES:
68
+ return _RESEARCH_MODE_ALIASES[normalized]
69
+ raise AutotouchInputError("--research-mode must be one of: lite, heavy")
70
+
71
+
72
+ def _apply_research_mode_overrides(
73
+ payload: Dict[str, Any],
74
+ args: argparse.Namespace,
75
+ *,
76
+ force_agent_on_explicit: bool,
77
+ ) -> Dict[str, Any]:
78
+ explicit_value = getattr(args, "research_mode", None)
79
+ config = payload.get("config")
80
+ if not isinstance(config, dict):
81
+ if explicit_value is None:
82
+ return payload
83
+ config = {}
84
+
85
+ current_mode = str(config.get("mode") or "").strip().lower()
86
+ has_research_mode = (
87
+ config.get("researchMode") is not None
88
+ or config.get("research_mode") is not None
89
+ )
90
+ should_default_agent_lite = current_mode == "agent" and not has_research_mode
91
+ should_clean_agent_config = current_mode == "agent" and has_research_mode
92
+ if explicit_value is None and not should_default_agent_lite and not should_clean_agent_config:
93
+ return payload
94
+
95
+ merged = dict(payload)
96
+ next_config = dict(config)
97
+ if explicit_value is not None:
98
+ if force_agent_on_explicit:
99
+ next_config["mode"] = "agent"
100
+ next_config["researchMode"] = _normalize_research_mode_option(explicit_value)
101
+ elif config.get("researchMode") is not None:
102
+ next_config["researchMode"] = _normalize_research_mode_option(config.get("researchMode"))
103
+ elif config.get("research_mode") is not None:
104
+ next_config["researchMode"] = _normalize_research_mode_option(config.get("research_mode"))
105
+ else:
106
+ next_config["researchMode"] = "lite"
107
+ next_config.pop("research_mode", None)
108
+ next_config.pop("lite", None)
109
+ merged["config"] = next_config
110
+ return merged
111
+
112
+
55
113
  def _normalize_http_request_test_payload(payload: Dict[str, Any]) -> Dict[str, Any]:
56
114
  candidate = payload
57
115
  config = payload.get("config")
@@ -111,6 +169,7 @@ def cmd_columns_create(args: argparse.Namespace, *, runtime: ColumnCommandRuntim
111
169
  allow_position=True,
112
170
  allow_neighbors=True,
113
171
  )
172
+ payload = _apply_research_mode_overrides(payload, args, force_agent_on_explicit=True)
114
173
  runtime.validate_column_contract_payload_or_exit(payload)
115
174
  runtime.validate_add_to_crm_create_payload(payload)
116
175
  data = runtime.request_api(
@@ -156,6 +215,7 @@ def cmd_columns_update(args: argparse.Namespace, *, runtime: ColumnCommandRuntim
156
215
  allow_position=True,
157
216
  allow_neighbors=False,
158
217
  )
218
+ payload = _apply_research_mode_overrides(payload, args, force_agent_on_explicit=False)
159
219
  runtime.validate_column_contract_payload_or_exit(payload)
160
220
  data = runtime.request_api(
161
221
  "PATCH",
@@ -401,6 +461,11 @@ def register_columns_subcommands(
401
461
  pcc.add_argument("--position", type=float, help="Explicit numeric position override")
402
462
  pcc.add_argument("--after-column-id", help="Place the new column after this existing column id")
403
463
  pcc.add_argument("--before-column-id", help="Place the new column before this existing column id")
464
+ pcc.add_argument(
465
+ "--research-mode",
466
+ choices=["lite", "heavy"],
467
+ help="For LLM Research Agent columns, set config.researchMode. Omitted agent columns default to lite.",
468
+ )
404
469
  add_api_common_arguments(pcc)
405
470
  pcc.set_defaults(func=handlers["create"])
406
471
 
@@ -417,6 +482,11 @@ def register_columns_subcommands(
417
482
  pcu.add_argument("--data-json", help="ColumnUpdate payload JSON")
418
483
  pcu.add_argument("--data-file", help="ColumnUpdate payload file path")
419
484
  pcu.add_argument("--position", type=float, help="Explicit numeric position override")
485
+ pcu.add_argument(
486
+ "--research-mode",
487
+ choices=["lite", "heavy"],
488
+ help="Set config.researchMode. Include config.mode=agent when switching a Quick LLM column to Research Agent.",
489
+ )
420
490
  add_api_common_arguments(pcu)
421
491
  pcu.set_defaults(func=handlers["update"])
422
492
 
@@ -545,6 +615,12 @@ def register_columns_subcommands(
545
615
 
546
616
  pcre = col_sub.add_parser("recipe", help="Print copy-ready ColumnCreate payload templates")
547
617
  pcre.add_argument("--type", choices=["all", *column_recipe_types], default="all")
618
+ pcre.add_argument(
619
+ "--research-mode",
620
+ choices=["lite", "heavy"],
621
+ default="lite",
622
+ help="Research Agent depth for LLM recipes (default: lite; heavy costs more per row)",
623
+ )
548
624
  pcre.add_argument("--out-file", help="Write template JSON to file (single type writes payload only)")
549
625
  add_output_formatting_arguments(pcre)
550
626
  pcre.set_defaults(func=handlers["recipe"])
@@ -5,6 +5,7 @@ import json
5
5
  import time
6
6
  from dataclasses import dataclass
7
7
  from typing import Any, Callable, Dict, Optional
8
+ from urllib.parse import urlencode
8
9
 
9
10
  from autotouch_cli.exceptions import AutotouchInputError, AutotouchTimeoutError
10
11
 
@@ -43,9 +44,15 @@ def _payload(args: argparse.Namespace, *, runtime: ListBuildCommandRuntime, kind
43
44
  filters[key] = values
44
45
  if getattr(args, "has_jobs", False):
45
46
  filters["has_jobs"] = True
46
- profile_language = str(getattr(args, "profile_language", "") or "").strip()
47
- if profile_language:
48
- filters["profile_language"] = profile_language
47
+ for attr, key in (
48
+ ("profile_language", "profile_language"),
49
+ ("service_category", "service_category"),
50
+ ("first_name", "first_name"),
51
+ ("last_name", "last_name"),
52
+ ):
53
+ value = str(getattr(args, attr, "") or "").strip()
54
+ if value:
55
+ filters[key] = value
49
56
  payload: Dict[str, Any] = {
50
57
  "kind": kind,
51
58
  "num_results": max(1, min(int(getattr(args, "num_results", 100) or 100), 10000)),
@@ -134,6 +141,29 @@ def cmd_list_build_results(args: argparse.Namespace, *, runtime: ListBuildComman
134
141
 
135
142
  def cmd_list_build_inputs(args: argparse.Namespace, *, runtime: ListBuildCommandRuntime) -> None:
136
143
  token = runtime.resolve_token(args.token, required=True)
144
+ input_type = str(getattr(args, "type", "") or "").strip()
145
+ query = str(getattr(args, "query", "") or "").strip()
146
+ if input_type or query:
147
+ if not input_type or not query:
148
+ raise AutotouchInputError("list-build inputs search requires both --type and --query")
149
+ params = urlencode(
150
+ {
151
+ "type": input_type,
152
+ "q": query,
153
+ "limit": max(1, min(int(getattr(args, "limit", 20) or 20), 50)),
154
+ }
155
+ )
156
+ data = runtime.request_api(
157
+ "GET",
158
+ f"/api/list-builds/inputs/search?{params}",
159
+ base_url=args.base_url,
160
+ token=token,
161
+ use_x_api_key=args.use_x_api_key,
162
+ timeout=args.timeout,
163
+ verbose=args.verbose,
164
+ )
165
+ runtime.print_json(data, args.compact)
166
+ return
137
167
  data = runtime.request_api(
138
168
  "GET",
139
169
  "/api/list-builds/inputs",
@@ -169,20 +199,10 @@ def register_list_build_subcommands(
169
199
  parser = subparsers.add_parser("list-build", help="Build durable LinkedIn-sourced company and lead lists")
170
200
  sub = parser.add_subparsers(dest="list_build_cmd", required=True)
171
201
 
172
- def add_create_args(p: argparse.ArgumentParser) -> None:
202
+ def add_common_create_args(p: argparse.ArgumentParser) -> None:
173
203
  p.add_argument("--data-json", help="Explicit list-build payload JSON")
174
204
  p.add_argument("--data-file", help="Path to list-build payload JSON file")
175
205
  p.add_argument("--list-name", help="Optional display name")
176
- p.add_argument("--keywords", help="Search keywords")
177
- p.add_argument("--title", help="Lead title/persona query")
178
- p.add_argument("--geo-id", action="append", help="Geography ID; repeat or comma-separate in JSON")
179
- p.add_argument("--industry-id", action="append", help="Industry ID; repeat or comma-separate in JSON")
180
- p.add_argument("--company-size", action="append", help="Company size bucket, e.g. 1-10 or 11-50")
181
- p.add_argument("--current-company-id", action="append", help="Company ID for lead search")
182
- p.add_argument("--past-company-id", action="append", help="Past company ID for lead search")
183
- p.add_argument("--school-id", action="append", help="School ID for lead search")
184
- p.add_argument("--profile-language", help="Profile language code, e.g. en")
185
- p.add_argument("--has-jobs", action="store_true", help="Only include companies with active job listings")
186
206
  p.add_argument("--num-results", type=int, default=100, help="Target result count, 1-10000")
187
207
  p.add_argument("--page-size", type=int, default=25, help="Provider page size")
188
208
  p.add_argument("--wait", action="store_true", help="Poll until terminal status")
@@ -190,12 +210,34 @@ def register_list_build_subcommands(
190
210
  p.add_argument("--wait-timeout", type=int, default=0, help="Max seconds to wait (0 = no timeout)")
191
211
  add_api_common_arguments(p)
192
212
 
213
+ def add_company_create_args(p: argparse.ArgumentParser) -> None:
214
+ add_common_create_args(p)
215
+ p.add_argument("--keywords", required=False, help="Optional company keyword anchor; structured filters can run without it")
216
+ p.add_argument("--geo-id", action="append", help="LinkedIn GeoURN ID; repeat or comma-separate in JSON")
217
+ p.add_argument("--industry-id", action="append", help="Industry ID from `autotouch list-build inputs`; repeat or comma-separate in JSON")
218
+ p.add_argument("--company-size", action="append", help="Company size bucket, e.g. 1-10 or 11-50")
219
+ p.add_argument("--has-jobs", action="store_true", help="Only include companies with active job listings")
220
+
221
+ def add_lead_create_args(p: argparse.ArgumentParser) -> None:
222
+ add_common_create_args(p)
223
+ p.add_argument("--keywords", help="Optional free-text profile keyword")
224
+ p.add_argument("--title", help="Lead title/persona query")
225
+ p.add_argument("--geo-id", action="append", help="LinkedIn GeoURN ID; repeat or comma-separate in JSON")
226
+ p.add_argument("--industry-id", action="append", help="Industry ID from `autotouch list-build inputs`; repeat or comma-separate in JSON")
227
+ p.add_argument("--current-company-id", action="append", help="Company ID returned by a company list build")
228
+ p.add_argument("--past-company-id", action="append", help="Past company ID for lead search")
229
+ p.add_argument("--school-id", action="append", help="School ID for lead search")
230
+ p.add_argument("--profile-language", help="Profile language code, e.g. en")
231
+ p.add_argument("--service-category", help="Service category string")
232
+ p.add_argument("--first-name", help="First-name filter")
233
+ p.add_argument("--last-name", help="Last-name filter")
234
+
193
235
  companies = sub.add_parser("companies", help="Build a company/account list")
194
- add_create_args(companies)
236
+ add_company_create_args(companies)
195
237
  companies.set_defaults(func=handlers["companies"])
196
238
 
197
239
  leads = sub.add_parser("leads", help="Build a lead/contact list")
198
- add_create_args(leads)
240
+ add_lead_create_args(leads)
199
241
  leads.set_defaults(func=handlers["leads"])
200
242
 
201
243
  status = sub.add_parser("status", help="Get list-build job status")
@@ -212,6 +254,9 @@ def register_list_build_subcommands(
212
254
  results.set_defaults(func=handlers["results"])
213
255
 
214
256
  inputs = sub.add_parser("inputs", help="Show valid list-build filter IDs and values")
257
+ inputs.add_argument("--type", choices=["geo", "industry", "service", "title_skill", "title-skills"], help="Search input type")
258
+ inputs.add_argument("--query", help="Search text for input ID lookup")
259
+ inputs.add_argument("--limit", type=int, default=20, help="Max lookup results, 1-50")
215
260
  add_api_common_arguments(inputs)
216
261
  inputs.set_defaults(func=handlers["inputs"])
217
262
 
@@ -1,6 +1,6 @@
1
1
  # Autotouch CLI Reference
2
2
 
3
- Generated from the installed parser for `autotouch-cli` `0.2.83`.
3
+ Generated from the installed parser for `autotouch-cli` `0.2.86`.
4
4
  Manifest schema version: `2`.
5
5
 
6
6
  ## Output Modes
@@ -1079,6 +1079,7 @@ For llm_enrichment, there are two valid authoring paths:
1079
1079
  [--data-file DATA_FILE] [--position POSITION]
1080
1080
  [--after-column-id AFTER_COLUMN_ID]
1081
1081
  [--before-column-id BEFORE_COLUMN_ID]
1082
+ [--research-mode {lite,heavy}]
1082
1083
  [--base-url BASE_URL] [--token TOKEN]
1083
1084
  [--use-x-api-key] [--timeout TIMEOUT]
1084
1085
  [--output {json,ndjson,human}] [--compact]
@@ -1100,6 +1101,7 @@ The runnable prompt is always config.advancedPrompt before execution.
1100
1101
  - `--position` (kind=number): Explicit numeric position override
1101
1102
  - `--after-column-id` (kind=string): Place the new column after this existing column id
1102
1103
  - `--before-column-id` (kind=string): Place the new column before this existing column id
1104
+ - `--research-mode` (kind=string; choices=lite,heavy): For LLM Research Agent columns, set config.researchMode. Omitted agent columns default to lite.
1103
1105
  - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
1104
1106
  - `--token` (kind=string; sensitive): Developer API key / JWT token
1105
1107
  - `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
@@ -1321,12 +1323,14 @@ Print copy-ready ColumnCreate payload templates
1321
1323
  - Example:
1322
1324
  - `autotouch columns recipe [-h]
1323
1325
  [--type {all,formatter,llm_enrichment,email_finder,phone_finder,lead_finder,add_to_crm,sync_to_table,add_to_sequence,http_request,add_to_leads,sync_to_leads}]
1326
+ [--research-mode {lite,heavy}]
1324
1327
  [--out-file OUT_FILE]
1325
1328
  [--output {json,ndjson,human}] [--compact]
1326
1329
  [--select SELECT |
1327
1330
  --json-pointer JSON_POINTER]`
1328
1331
  - Options:
1329
1332
  - `--type` (kind=string; choices=all,formatter,llm_enrichment,email_finder,phone_finder,lead_finder,add_to_crm,sync_to_table,add_to_sequence,http_request,add_to_leads,sync_to_leads; default=all)
1333
+ - `--research-mode` (kind=string; choices=lite,heavy; default=lite): Research Agent depth for LLM recipes (default: lite; heavy costs more per row)
1330
1334
  - `--out-file` (kind=file; input=file): Write template JSON to file (single type writes payload only)
1331
1335
  - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
1332
1336
  - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
@@ -1538,6 +1542,7 @@ Update a column definition. Nested config keys merge into the existing config, s
1538
1542
  - `autotouch columns update [-h] --table-id TABLE_ID --column-id COLUMN_ID
1539
1543
  [--data-json DATA_JSON]
1540
1544
  [--data-file DATA_FILE] [--position POSITION]
1545
+ [--research-mode {lite,heavy}]
1541
1546
  [--base-url BASE_URL] [--token TOKEN]
1542
1547
  [--use-x-api-key] [--timeout TIMEOUT]
1543
1548
  [--output {json,ndjson,human}] [--compact]
@@ -1549,6 +1554,7 @@ Update a column definition. Nested config keys merge into the existing config, s
1549
1554
  - `--data-json` (kind=json; input=json): ColumnUpdate payload JSON
1550
1555
  - `--data-file` (kind=file; input=file): ColumnUpdate payload file path
1551
1556
  - `--position` (kind=number): Explicit numeric position override
1557
+ - `--research-mode` (kind=string; choices=lite,heavy): Set config.researchMode. Include config.mode=agent when switching a Quick LLM column to Research Agent.
1552
1558
  - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
1553
1559
  - `--token` (kind=string; sensitive): Developer API key / JWT token
1554
1560
  - `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
@@ -2323,15 +2329,7 @@ Build a company/account list
2323
2329
  - `autotouch list-build companies [-h] [--data-json DATA_JSON]
2324
2330
  [--data-file DATA_FILE]
2325
2331
  [--list-name LIST_NAME]
2326
- [--keywords KEYWORDS] [--title TITLE]
2327
- [--geo-id GEO_ID]
2328
- [--industry-id INDUSTRY_ID]
2329
- [--company-size COMPANY_SIZE]
2330
- [--current-company-id CURRENT_COMPANY_ID]
2331
- [--past-company-id PAST_COMPANY_ID]
2332
- [--school-id SCHOOL_ID]
2333
- [--profile-language PROFILE_LANGUAGE]
2334
- [--has-jobs] [--num-results NUM_RESULTS]
2332
+ [--num-results NUM_RESULTS]
2335
2333
  [--page-size PAGE_SIZE] [--wait]
2336
2334
  [--poll-interval POLL_INTERVAL]
2337
2335
  [--wait-timeout WAIT_TIMEOUT]
@@ -2339,21 +2337,15 @@ Build a company/account list
2339
2337
  [--use-x-api-key] [--timeout TIMEOUT]
2340
2338
  [--output {json,ndjson,human}]
2341
2339
  [--compact] [--select SELECT |
2342
- --json-pointer JSON_POINTER] [--verbose]`
2340
+ --json-pointer JSON_POINTER] [--verbose]
2341
+ [--keywords KEYWORDS] [--geo-id GEO_ID]
2342
+ [--industry-id INDUSTRY_ID]
2343
+ [--company-size COMPANY_SIZE]
2344
+ [--has-jobs]`
2343
2345
  - Options:
2344
2346
  - `--data-json` (kind=json; input=json): Explicit list-build payload JSON
2345
2347
  - `--data-file` (kind=file; input=file): Path to list-build payload JSON file
2346
2348
  - `--list-name` (kind=string): Optional display name
2347
- - `--keywords` (kind=string): Search keywords
2348
- - `--title` (kind=string): Lead title/persona query
2349
- - `--geo-id` (kind=string; repeatable): Geography ID; repeat or comma-separate in JSON
2350
- - `--industry-id` (kind=string; repeatable): Industry ID; repeat or comma-separate in JSON
2351
- - `--company-size` (kind=string; repeatable): Company size bucket, e.g. 1-10 or 11-50
2352
- - `--current-company-id` (kind=string; repeatable): Company ID for lead search
2353
- - `--past-company-id` (kind=string; repeatable): Past company ID for lead search
2354
- - `--school-id` (kind=string; repeatable): School ID for lead search
2355
- - `--profile-language` (kind=string): Profile language code, e.g. en
2356
- - `--has-jobs` (kind=boolean; when omitted=False; when present=True): Only include companies with active job listings
2357
2349
  - `--num-results` (kind=integer; default=100): Target result count, 1-10000
2358
2350
  - `--page-size` (kind=integer; default=25): Provider page size
2359
2351
  - `--wait` (kind=boolean; when omitted=False; when present=True): Poll until terminal status
@@ -2368,6 +2360,11 @@ Build a company/account list
2368
2360
  - `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
2369
2361
  - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
2370
2362
  - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
2363
+ - `--keywords` (kind=string): Optional company keyword anchor; structured filters can run without it
2364
+ - `--geo-id` (kind=string; repeatable): LinkedIn GeoURN ID; repeat or comma-separate in JSON
2365
+ - `--industry-id` (kind=string; repeatable): Industry ID from `autotouch list-build inputs`; repeat or comma-separate in JSON
2366
+ - `--company-size` (kind=string; repeatable): Company size bucket, e.g. 1-10 or 11-50
2367
+ - `--has-jobs` (kind=boolean; when omitted=False; when present=True): Only include companies with active job listings
2371
2368
 
2372
2369
  #### `autotouch list-build inputs`
2373
2370
 
@@ -2378,12 +2375,18 @@ Show valid list-build filter IDs and values
2378
2375
  - Destructive: `no`
2379
2376
  - Output modes: `json, ndjson, human`
2380
2377
  - Example:
2381
- - `autotouch list-build inputs [-h] [--base-url BASE_URL] [--token TOKEN]
2378
+ - `autotouch list-build inputs [-h]
2379
+ [--type {geo,industry,service,title_skill,title-skills}]
2380
+ [--query QUERY] [--limit LIMIT]
2381
+ [--base-url BASE_URL] [--token TOKEN]
2382
2382
  [--use-x-api-key] [--timeout TIMEOUT]
2383
2383
  [--output {json,ndjson,human}] [--compact]
2384
2384
  [--select SELECT |
2385
2385
  --json-pointer JSON_POINTER] [--verbose]`
2386
2386
  - Options:
2387
+ - `--type` (kind=string; choices=geo,industry,service,title_skill,title-skills): Search input type
2388
+ - `--query` (kind=string): Search text for input ID lookup
2389
+ - `--limit` (kind=integer; default=20): Max lookup results, 1-50
2387
2390
  - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
2388
2391
  - `--token` (kind=string; sensitive): Developer API key / JWT token
2389
2392
  - `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
@@ -2406,15 +2409,7 @@ Build a lead/contact list
2406
2409
  - `autotouch list-build leads [-h] [--data-json DATA_JSON]
2407
2410
  [--data-file DATA_FILE]
2408
2411
  [--list-name LIST_NAME]
2409
- [--keywords KEYWORDS] [--title TITLE]
2410
- [--geo-id GEO_ID]
2411
- [--industry-id INDUSTRY_ID]
2412
- [--company-size COMPANY_SIZE]
2413
- [--current-company-id CURRENT_COMPANY_ID]
2414
- [--past-company-id PAST_COMPANY_ID]
2415
- [--school-id SCHOOL_ID]
2416
- [--profile-language PROFILE_LANGUAGE]
2417
- [--has-jobs] [--num-results NUM_RESULTS]
2412
+ [--num-results NUM_RESULTS]
2418
2413
  [--page-size PAGE_SIZE] [--wait]
2419
2414
  [--poll-interval POLL_INTERVAL]
2420
2415
  [--wait-timeout WAIT_TIMEOUT]
@@ -2422,21 +2417,21 @@ Build a lead/contact list
2422
2417
  [--use-x-api-key] [--timeout TIMEOUT]
2423
2418
  [--output {json,ndjson,human}] [--compact]
2424
2419
  [--select SELECT |
2425
- --json-pointer JSON_POINTER] [--verbose]`
2420
+ --json-pointer JSON_POINTER] [--verbose]
2421
+ [--keywords KEYWORDS] [--title TITLE]
2422
+ [--geo-id GEO_ID]
2423
+ [--industry-id INDUSTRY_ID]
2424
+ [--current-company-id CURRENT_COMPANY_ID]
2425
+ [--past-company-id PAST_COMPANY_ID]
2426
+ [--school-id SCHOOL_ID]
2427
+ [--profile-language PROFILE_LANGUAGE]
2428
+ [--service-category SERVICE_CATEGORY]
2429
+ [--first-name FIRST_NAME]
2430
+ [--last-name LAST_NAME]`
2426
2431
  - Options:
2427
2432
  - `--data-json` (kind=json; input=json): Explicit list-build payload JSON
2428
2433
  - `--data-file` (kind=file; input=file): Path to list-build payload JSON file
2429
2434
  - `--list-name` (kind=string): Optional display name
2430
- - `--keywords` (kind=string): Search keywords
2431
- - `--title` (kind=string): Lead title/persona query
2432
- - `--geo-id` (kind=string; repeatable): Geography ID; repeat or comma-separate in JSON
2433
- - `--industry-id` (kind=string; repeatable): Industry ID; repeat or comma-separate in JSON
2434
- - `--company-size` (kind=string; repeatable): Company size bucket, e.g. 1-10 or 11-50
2435
- - `--current-company-id` (kind=string; repeatable): Company ID for lead search
2436
- - `--past-company-id` (kind=string; repeatable): Past company ID for lead search
2437
- - `--school-id` (kind=string; repeatable): School ID for lead search
2438
- - `--profile-language` (kind=string): Profile language code, e.g. en
2439
- - `--has-jobs` (kind=boolean; when omitted=False; when present=True): Only include companies with active job listings
2440
2435
  - `--num-results` (kind=integer; default=100): Target result count, 1-10000
2441
2436
  - `--page-size` (kind=integer; default=25): Provider page size
2442
2437
  - `--wait` (kind=boolean; when omitted=False; when present=True): Poll until terminal status
@@ -2451,6 +2446,17 @@ Build a lead/contact list
2451
2446
  - `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
2452
2447
  - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
2453
2448
  - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
2449
+ - `--keywords` (kind=string): Optional free-text profile keyword
2450
+ - `--title` (kind=string): Lead title/persona query
2451
+ - `--geo-id` (kind=string; repeatable): LinkedIn GeoURN ID; repeat or comma-separate in JSON
2452
+ - `--industry-id` (kind=string; repeatable): Industry ID from `autotouch list-build inputs`; repeat or comma-separate in JSON
2453
+ - `--current-company-id` (kind=string; repeatable): Company ID returned by a company list build
2454
+ - `--past-company-id` (kind=string; repeatable): Past company ID for lead search
2455
+ - `--school-id` (kind=string; repeatable): School ID for lead search
2456
+ - `--profile-language` (kind=string): Profile language code, e.g. en
2457
+ - `--service-category` (kind=string): Service category string
2458
+ - `--first-name` (kind=string): First-name filter
2459
+ - `--last-name` (kind=string): Last-name filter
2454
2460
 
2455
2461
  #### `autotouch list-build pricing`
2456
2462