autotouch-cli 0.2.86__tar.gz → 0.2.88__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.86 → autotouch_cli-0.2.88}/PKG-INFO +24 -6
  2. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/README.md +23 -5
  3. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/agents.py +36 -19
  4. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/search.py +13 -7
  5. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/data/CLI_REFERENCE.md +18 -16
  6. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/data/cli-manifest.json +33 -16
  7. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/templates.py +69 -1
  8. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli.egg-info/PKG-INFO +24 -6
  9. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_shared/linkedin_contract.py +2 -0
  10. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_shared/provider_registry.py +32 -1
  11. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_shared/search_contract.py +25 -22
  12. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/pyproject.toml +1 -1
  13. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/MANIFEST.in +0 -0
  14. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/__init__.py +0 -0
  15. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/cli.py +0 -0
  16. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/cli_contracts.py +0 -0
  17. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/__init__.py +0 -0
  18. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/auth.py +0 -0
  19. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/cells.py +0 -0
  20. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/columns.py +0 -0
  21. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/jobs.py +0 -0
  22. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/leads.py +0 -0
  23. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/linkedin.py +0 -0
  24. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/list_build.py +0 -0
  25. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/prompts.py +0 -0
  26. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/rows.py +0 -0
  27. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/sequences.py +0 -0
  28. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/tables.py +0 -0
  29. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/tasks.py +0 -0
  30. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/webhooks.py +0 -0
  31. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/workspace_secrets.py +0 -0
  32. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/__init__.py +0 -0
  33. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/auth.py +0 -0
  34. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/config.py +0 -0
  35. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/csv_import.py +0 -0
  36. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/http.py +0 -0
  37. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/io.py +0 -0
  38. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/output.py +0 -0
  39. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/polling.py +0 -0
  40. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/run.py +0 -0
  41. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/validation.py +0 -0
  42. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/exceptions.py +0 -0
  43. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/mongo_status.py +0 -0
  44. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/parser.py +0 -0
  45. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/parser_groups.py +0 -0
  46. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/sequence_support.py +0 -0
  47. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli.egg-info/SOURCES.txt +0 -0
  48. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli.egg-info/dependency_links.txt +0 -0
  49. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli.egg-info/entry_points.txt +0 -0
  50. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli.egg-info/requires.txt +0 -0
  51. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli.egg-info/top_level.txt +0 -0
  52. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_shared/__init__.py +0 -0
  53. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_shared/linkedin_filters.py +0 -0
  54. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_shared/list_build_contract.py +0 -0
  55. {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autotouch-cli
3
- Version: 0.2.86
3
+ Version: 0.2.88
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
@@ -36,6 +36,8 @@ For a shipped human-readable reference generated from the installed parser, use
36
36
 
37
37
  ## Install
38
38
 
39
+ Released package:
40
+
39
41
  ```bash
40
42
  pipx install autotouch-cli
41
43
  # or
@@ -44,6 +46,16 @@ pip install autotouch-cli
44
46
  pip install -U autotouch-cli
45
47
  ```
46
48
 
49
+ Unreleased branch or pre-publish build:
50
+
51
+ ```bash
52
+ pipx install --force "git+ssh://git@github.com/nicolonic/autotouch_main.git@<branch-or-sha>"
53
+ # or
54
+ python -m pip install -U "git+ssh://git@github.com/nicolonic/autotouch_main.git@<branch-or-sha>"
55
+ ```
56
+
57
+ The `autotouch-cli` package name installs the latest published package from the configured package index. Use the git/source install form when testing a version bump before the release tag has published.
58
+
47
59
  ## First Run
48
60
 
49
61
  Existing developer key:
@@ -132,7 +144,7 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
132
144
  - Inspect rows: `autotouch rows list`, `autotouch rows get`
133
145
  - Inspect one cell: `autotouch cells get`
134
146
  - Create a workflow column: `autotouch columns recipe`, `autotouch columns create`
135
- - Run neural search for niche/specific company or people discovery: `autotouch search companies`, `autotouch search people`
147
+ - Run Exa Company Search for basic company discovery, competitors, and lookalikes: `autotouch search companies`, `autotouch search similar-companies`
136
148
  - Inspect list-build inputs: `autotouch list-build inputs`
137
149
  - Build durable company and lead lists on Smart Table workers: `autotouch list-build companies`, `autotouch list-build leads`
138
150
  - Check connected LinkedIn account status/limits: `autotouch linkedin status`, `autotouch linkedin limits`
@@ -146,13 +158,19 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
146
158
 
147
159
  Autotouch has two different company/people discovery paths.
148
160
 
149
- Use `autotouch search companies` and `autotouch search people` for neural search when the target is niche, semantic, or hard to express with structured filters. Examples: "AI workflow platforms for healthcare", "AI workflow startups selling to law firms", or "RevOps operators at PLG SaaS companies". Neural company/people search returns at most 10 results per API call and costs 1 credit per API call.
161
+ Use `autotouch search companies` for Exa Company Search when the target is basic company discovery, competitors, lookalikes, or a semantic company search. Put company constraints directly in natural language: industry, geography, funding, headcount, technology, founded date, and similarity. Examples: "AI workflow platforms for healthcare", "US education software startups focused on AI math tutoring with 1-50 employees", or "companies like Rippling for HR and workforce management". Exa company search returns up to 100 results per API call and costs 1 credit per 10 returned results.
162
+
163
+ Use `autotouch search similar-companies` as a convenience wrapper for Exa Company Search similarity. Prefer `--query` for Exa's documented semantic patterns, such as "companies like Notion", "competitors of Stripe", or "companies working on making space travel cheaper". The older seed fields `company_name`, `company_domain`, and `company_description` remain available when you want the CLI/API to compose that query; it does not use Exa `/findSimilar`.
150
164
 
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.
165
+ Use `autotouch search people` for provider-hidden people search when the target is niche, semantic, or hard to express with structured filters. People search currently returns at most 10 results per API call and costs 1 credit per API call.
166
+
167
+ Use `autotouch list-build companies` and `autotouch list-build leads` for structured, repeatable LinkedIn/Sales Navigator 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
168
 
153
169
  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
170
 
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.
171
+ For account-first prospecting from LinkedIn/Sales Navigator, build companies/accounts first, inspect the returned company IDs, then pass those IDs to `autotouch list-build leads --current-company-id ...`. Do not use Exa company search as a default pre-step for every LinkedIn list build; use it when the user's target is genuinely semantic, niche, competitor-based, or not meant to be LinkedIn-sourced.
172
+
173
+ Use `autotouch agents ...` for recurring signal-based discovery. Scheduled agents support `--target ACCOUNTS` for company/account output and `--target LEADS` for people output. Every agent writes a source/signal table for the evidence it used; lead agents then write `candidate_research.candidates[]` on source rows and list-sync those candidates into the lead/candidate output table. See the agent playbook for the full source-table and candidate-sync contract.
156
174
 
157
175
  ## More
158
176
 
@@ -160,7 +178,7 @@ For automation or agent-driven setup, use:
160
178
  - `autotouch cli-manifest --output json` for the local machine-readable command contract
161
179
  - `autotouch cli-reference` for the shipped parser-generated reference
162
180
  - `autotouch capabilities --output json` for provider/workflow contracts
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
181
+ - `autotouch --version` should be `0.2.88` or newer for structured company list builds without user-supplied keywords, stored list-build input lookup, research-workspace list-build guidance, the cleaned single LinkedIn-sourced list-build path, Exa Company Search up to 100 results, and scheduled agent `--target ACCOUNTS|LEADS`
164
182
  - `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
183
  - `autotouch list-build inputs` and `autotouch list-build pricing` before creating durable list-build jobs
166
184
  - `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
@@ -11,6 +11,8 @@ For a shipped human-readable reference generated from the installed parser, use
11
11
 
12
12
  ## Install
13
13
 
14
+ Released package:
15
+
14
16
  ```bash
15
17
  pipx install autotouch-cli
16
18
  # or
@@ -19,6 +21,16 @@ pip install autotouch-cli
19
21
  pip install -U autotouch-cli
20
22
  ```
21
23
 
24
+ Unreleased branch or pre-publish build:
25
+
26
+ ```bash
27
+ pipx install --force "git+ssh://git@github.com/nicolonic/autotouch_main.git@<branch-or-sha>"
28
+ # or
29
+ python -m pip install -U "git+ssh://git@github.com/nicolonic/autotouch_main.git@<branch-or-sha>"
30
+ ```
31
+
32
+ The `autotouch-cli` package name installs the latest published package from the configured package index. Use the git/source install form when testing a version bump before the release tag has published.
33
+
22
34
  ## First Run
23
35
 
24
36
  Existing developer key:
@@ -107,7 +119,7 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
107
119
  - Inspect rows: `autotouch rows list`, `autotouch rows get`
108
120
  - Inspect one cell: `autotouch cells get`
109
121
  - Create a workflow column: `autotouch columns recipe`, `autotouch columns create`
110
- - Run neural search for niche/specific company or people discovery: `autotouch search companies`, `autotouch search people`
122
+ - Run Exa Company Search for basic company discovery, competitors, and lookalikes: `autotouch search companies`, `autotouch search similar-companies`
111
123
  - Inspect list-build inputs: `autotouch list-build inputs`
112
124
  - Build durable company and lead lists on Smart Table workers: `autotouch list-build companies`, `autotouch list-build leads`
113
125
  - Check connected LinkedIn account status/limits: `autotouch linkedin status`, `autotouch linkedin limits`
@@ -121,13 +133,19 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
121
133
 
122
134
  Autotouch has two different company/people discovery paths.
123
135
 
124
- Use `autotouch search companies` and `autotouch search people` for neural search when the target is niche, semantic, or hard to express with structured filters. Examples: "AI workflow platforms for healthcare", "AI workflow startups selling to law firms", or "RevOps operators at PLG SaaS companies". Neural company/people search returns at most 10 results per API call and costs 1 credit per API call.
136
+ Use `autotouch search companies` for Exa Company Search when the target is basic company discovery, competitors, lookalikes, or a semantic company search. Put company constraints directly in natural language: industry, geography, funding, headcount, technology, founded date, and similarity. Examples: "AI workflow platforms for healthcare", "US education software startups focused on AI math tutoring with 1-50 employees", or "companies like Rippling for HR and workforce management". Exa company search returns up to 100 results per API call and costs 1 credit per 10 returned results.
137
+
138
+ Use `autotouch search similar-companies` as a convenience wrapper for Exa Company Search similarity. Prefer `--query` for Exa's documented semantic patterns, such as "companies like Notion", "competitors of Stripe", or "companies working on making space travel cheaper". The older seed fields `company_name`, `company_domain`, and `company_description` remain available when you want the CLI/API to compose that query; it does not use Exa `/findSimilar`.
125
139
 
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.
140
+ Use `autotouch search people` for provider-hidden people search when the target is niche, semantic, or hard to express with structured filters. People search currently returns at most 10 results per API call and costs 1 credit per API call.
141
+
142
+ Use `autotouch list-build companies` and `autotouch list-build leads` for structured, repeatable LinkedIn/Sales Navigator 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
143
 
128
144
  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
145
 
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.
146
+ For account-first prospecting from LinkedIn/Sales Navigator, build companies/accounts first, inspect the returned company IDs, then pass those IDs to `autotouch list-build leads --current-company-id ...`. Do not use Exa company search as a default pre-step for every LinkedIn list build; use it when the user's target is genuinely semantic, niche, competitor-based, or not meant to be LinkedIn-sourced.
147
+
148
+ Use `autotouch agents ...` for recurring signal-based discovery. Scheduled agents support `--target ACCOUNTS` for company/account output and `--target LEADS` for people output. Every agent writes a source/signal table for the evidence it used; lead agents then write `candidate_research.candidates[]` on source rows and list-sync those candidates into the lead/candidate output table. See the agent playbook for the full source-table and candidate-sync contract.
131
149
 
132
150
  ## More
133
151
 
@@ -135,7 +153,7 @@ For automation or agent-driven setup, use:
135
153
  - `autotouch cli-manifest --output json` for the local machine-readable command contract
136
154
  - `autotouch cli-reference` for the shipped parser-generated reference
137
155
  - `autotouch capabilities --output json` for provider/workflow contracts
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
156
+ - `autotouch --version` should be `0.2.88` or newer for structured company list builds without user-supplied keywords, stored list-build input lookup, research-workspace list-build guidance, the cleaned single LinkedIn-sourced list-build path, Exa Company Search up to 100 results, and scheduled agent `--target ACCOUNTS|LEADS`
139
157
  - `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
158
  - `autotouch list-build inputs` and `autotouch list-build pricing` before creating durable list-build jobs
141
159
  - `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
@@ -10,6 +10,9 @@ from dataclasses import dataclass
10
10
  from typing import Any, Callable, Dict, Optional, Sequence
11
11
 
12
12
 
13
+ AGENT_TARGET_CHOICES = ["LEADS", "ACCOUNTS"]
14
+
15
+
13
16
  @dataclass(frozen=True)
14
17
  class AgentCommandRuntime:
15
18
  resolve_token: Callable[[Optional[str], bool], Optional[str]]
@@ -50,7 +53,12 @@ def cmd_agents_create(args: argparse.Namespace, *, runtime: AgentCommandRuntime)
50
53
  token = runtime.resolve_token(args.token, required=True)
51
54
 
52
55
  if getattr(args, "from_file", None):
53
- payload = runtime.load_json_input(args.from_file)
56
+ payload = runtime.load_json_input(
57
+ inline_json=None,
58
+ file_path=args.from_file,
59
+ context="agent",
60
+ default={},
61
+ )
54
62
  else:
55
63
  payload: Dict[str, Any] = {}
56
64
  if args.name:
@@ -106,7 +114,7 @@ def cmd_agents_create(args: argparse.Namespace, *, runtime: AgentCommandRuntime)
106
114
 
107
115
  # AI generation: generate persona, signals, and create in one shot
108
116
  if getattr(args, "generate", False) and "personaConfig" not in payload:
109
- target = payload.get("targetType", "LEADS")
117
+ target = str(payload.get("targetType") or "LEADS").upper()
110
118
  sys.stderr.write(f"Generating persona for {target}...\n")
111
119
  persona_data = runtime.request_api(
112
120
  "POST", "/api/agents/generate-persona",
@@ -119,17 +127,21 @@ def cmd_agents_create(args: argparse.Namespace, *, runtime: AgentCommandRuntime)
119
127
  payload["personaConfig"] = persona
120
128
  sys.stderr.write(f" Persona generated: {json.dumps(persona, ensure_ascii=False)[:200]}...\n")
121
129
 
122
- # Generate topics
123
- sys.stderr.write("Generating topic suggestions...\n")
124
- topic_data = runtime.request_api(
125
- "POST", "/api/agents/generate-signal-topics",
126
- base_url=args.base_url, token=token,
127
- use_x_api_key=args.use_x_api_key,
128
- payload={"targetType": target, "personaConfig": persona},
129
- timeout=args.timeout, verbose=args.verbose,
130
- )
131
- topics = topic_data.get("topics") or []
132
- sys.stderr.write(f" Topics: {topics}\n")
130
+ topics = []
131
+ if target == "LEADS":
132
+ # LinkedIn topic engagement is a people-output signal. Account
133
+ # agents should stick to company-compatible signals such as jobs
134
+ # and news until a company-output topic signal exists.
135
+ sys.stderr.write("Generating topic suggestions...\n")
136
+ topic_data = runtime.request_api(
137
+ "POST", "/api/agents/generate-signal-topics",
138
+ base_url=args.base_url, token=token,
139
+ use_x_api_key=args.use_x_api_key,
140
+ payload={"targetType": target, "personaConfig": persona},
141
+ timeout=args.timeout, verbose=args.verbose,
142
+ )
143
+ topics = topic_data.get("topics") or []
144
+ sys.stderr.write(f" Topics: {topics}\n")
133
145
 
134
146
  # Generate job signal
135
147
  sys.stderr.write("Generating job signal config...\n")
@@ -146,7 +158,7 @@ def cmd_agents_create(args: argparse.Namespace, *, runtime: AgentCommandRuntime)
146
158
 
147
159
  # Assemble signals
148
160
  signals = []
149
- if topics:
161
+ if target == "LEADS" and topics:
150
162
  signals.append({
151
163
  "key": "linkedin-topic-post-engagement",
152
164
  "config": {"topics": [{"id": "", "label": t, "trackingMode": "all"} for t in topics[:5]]},
@@ -184,7 +196,12 @@ def cmd_agents_update(args: argparse.Namespace, *, runtime: AgentCommandRuntime)
184
196
  token = runtime.resolve_token(args.token, required=True)
185
197
 
186
198
  if getattr(args, "from_file", None):
187
- payload = runtime.load_json_input(args.from_file)
199
+ payload = runtime.load_json_input(
200
+ inline_json=None,
201
+ file_path=args.from_file,
202
+ context="agent",
203
+ default={},
204
+ )
188
205
  else:
189
206
  payload: Dict[str, Any] = {}
190
207
  if getattr(args, "name", None):
@@ -447,7 +464,7 @@ def register_agents_subcommands(
447
464
  # -- create --
448
465
  pac = agents_sub.add_parser("create", help="Create a new agent")
449
466
  pac.add_argument("--name", help="Agent name")
450
- pac.add_argument("--target", choices=["LEADS"], help="Target type")
467
+ pac.add_argument("--target", choices=AGENT_TARGET_CHOICES, help="Target type")
451
468
  pac.add_argument("--assigned-user", dest="assigned_user", help="Assigned user ID")
452
469
  pac.add_argument("--schedule-time", dest="schedule_time", help="Time of day (HH:MM) — used by daily/weekly")
453
470
  pac.add_argument("--schedule-tz", dest="schedule_tz", help="Timezone (default: UTC)")
@@ -585,14 +602,14 @@ def register_agents_subcommands(
585
602
 
586
603
  # -- generate-persona --
587
604
  pagp = agents_sub.add_parser("generate-persona", help="Generate ICP persona config via AI")
588
- pagp.add_argument("--target", choices=["LEADS"], default="LEADS", help="Target type")
605
+ pagp.add_argument("--target", choices=AGENT_TARGET_CHOICES, default="LEADS", help="Target type")
589
606
  pagp.add_argument("--current-config", dest="current_config", help="Path to current persona config JSON")
590
607
  add_api_common_arguments(pagp)
591
608
  pagp.set_defaults(func=handlers["generate_persona"])
592
609
 
593
610
  # -- generate-topics --
594
611
  pagt = agents_sub.add_parser("generate-topics", help="Generate signal topic suggestions via AI")
595
- pagt.add_argument("--target", choices=["LEADS"], default="LEADS", help="Target type")
612
+ pagt.add_argument("--target", choices=AGENT_TARGET_CHOICES, default="LEADS", help="Target type")
596
613
  pagt.add_argument("--persona", help="Path to persona config JSON")
597
614
  pagt.add_argument("--current-topics", dest="current_topics", help="Comma-separated current topics")
598
615
  add_api_common_arguments(pagt)
@@ -600,7 +617,7 @@ def register_agents_subcommands(
600
617
 
601
618
  # -- generate-job-signal --
602
619
  pagj = agents_sub.add_parser("generate-job-signal", help="Generate job signal config via AI")
603
- pagj.add_argument("--target", choices=["LEADS"], default="LEADS", help="Target type")
620
+ pagj.add_argument("--target", choices=AGENT_TARGET_CHOICES, default="LEADS", help="Target type")
604
621
  pagj.add_argument("--persona", help="Path to persona config JSON")
605
622
  pagj.add_argument("--current-titles", dest="current_titles", help="Comma-separated current job titles")
606
623
  pagj.add_argument("--current-keywords", dest="current_keywords", help="Comma-separated current keywords")
@@ -67,7 +67,7 @@ def cmd_search_companies(args: argparse.Namespace, *, runtime: SearchCommandRunt
67
67
  runtime=runtime,
68
68
  default_payload={
69
69
  "query": str(getattr(args, "query", "") or "").strip(),
70
- "limit": max(1, min(int(getattr(args, "limit", 10) or 10), 10)),
70
+ "limit": max(1, min(int(getattr(args, "limit", 10) or 10), 100)),
71
71
  },
72
72
  )
73
73
  data = runtime.request_api(
@@ -120,11 +120,16 @@ def cmd_search_people(args: argparse.Namespace, *, runtime: SearchCommandRuntime
120
120
  def cmd_search_similar_companies(args: argparse.Namespace, *, runtime: SearchCommandRuntime) -> None:
121
121
  token = runtime.resolve_token(args.token, required=True)
122
122
  payload: Dict[str, Any] = {
123
- "company_name": str(getattr(args, "company_name", "") or "").strip(),
124
- "limit": max(1, min(int(getattr(args, "limit", 10) or 10), 10)),
123
+ "limit": max(1, min(int(getattr(args, "limit", 10) or 10), 100)),
125
124
  }
125
+ query = str(getattr(args, "query", "") or "").strip()
126
+ company_name = str(getattr(args, "company_name", "") or "").strip()
126
127
  company_domain = str(getattr(args, "company_domain", "") or "").strip()
127
128
  company_description = str(getattr(args, "company_description", "") or "").strip()
129
+ if query:
130
+ payload["query"] = query
131
+ if company_name:
132
+ payload["company_name"] = company_name
128
133
  if company_domain:
129
134
  payload["company_domain"] = company_domain
130
135
  if company_description:
@@ -264,9 +269,9 @@ def register_search_subcommands(
264
269
  add_api_common_arguments(recipe_parser)
265
270
  recipe_parser.set_defaults(func=handlers["recipe"])
266
271
 
267
- companies_parser = search_sub.add_parser("companies", help="Find companies with provider-hidden neural search")
268
- companies_parser.add_argument("--query", help="Free-text company query")
269
- companies_parser.add_argument("--limit", type=int, default=10, help="Max results, 1-10 (default: 10)")
272
+ companies_parser = search_sub.add_parser("companies", help="Find companies with Exa Company Search")
273
+ companies_parser.add_argument("--query", help="Natural-language company query")
274
+ companies_parser.add_argument("--limit", type=int, default=10, help="Max results, 1-100 (default: 10)")
270
275
  companies_parser.add_argument("--data-json", help="Explicit request payload JSON")
271
276
  companies_parser.add_argument("--data-file", help="Path to request payload JSON file")
272
277
  add_api_common_arguments(companies_parser)
@@ -284,10 +289,11 @@ def register_search_subcommands(
284
289
  people_parser.set_defaults(func=handlers["people"])
285
290
 
286
291
  similar_parser = search_sub.add_parser("similar-companies", help="Find companies similar to a seed company")
292
+ similar_parser.add_argument("--query", help="Exa Company Search semantic similarity query, e.g. 'companies like Notion for enterprise knowledge management'")
287
293
  similar_parser.add_argument("--company-name", help="Seed company name")
288
294
  similar_parser.add_argument("--company-domain", help="Official company domain to ground similarity search")
289
295
  similar_parser.add_argument("--company-description", help="Short semantic company description to improve peer matching")
290
- similar_parser.add_argument("--limit", type=int, default=10, help="Max results, 1-10 (default: 10)")
296
+ similar_parser.add_argument("--limit", type=int, default=10, help="Max results, 1-100 (default: 10)")
291
297
  similar_parser.add_argument("--data-json", help="Explicit request payload JSON")
292
298
  similar_parser.add_argument("--data-file", help="Path to request payload JSON file")
293
299
  add_api_common_arguments(similar_parser)
@@ -1,6 +1,6 @@
1
1
  # Autotouch CLI Reference
2
2
 
3
- Generated from the installed parser for `autotouch-cli` `0.2.86`.
3
+ Generated from the installed parser for `autotouch-cli` `0.2.88`.
4
4
  Manifest schema version: `2`.
5
5
 
6
6
  ## Output Modes
@@ -34,7 +34,7 @@ Create a new agent
34
34
  - Destructive: `no`
35
35
  - Output modes: `json, ndjson, human`
36
36
  - Example:
37
- - `autotouch agents create [-h] [--name NAME] [--target {LEADS}]
37
+ - `autotouch agents create [-h] [--name NAME] [--target {LEADS,ACCOUNTS}]
38
38
  [--assigned-user ASSIGNED_USER]
39
39
  [--schedule-time SCHEDULE_TIME]
40
40
  [--schedule-tz SCHEDULE_TZ]
@@ -56,7 +56,7 @@ Create a new agent
56
56
  [--verbose]`
57
57
  - Options:
58
58
  - `--name` (kind=string): Agent name
59
- - `--target` (kind=string; choices=LEADS): Target type
59
+ - `--target` (kind=string; choices=LEADS,ACCOUNTS): Target type
60
60
  - `--assigned-user` (kind=string): Assigned user ID
61
61
  - `--schedule-time` (kind=string): Time of day (HH:MM) — used by daily/weekly
62
62
  - `--schedule-tz` (kind=string): Timezone (default: UTC)
@@ -118,7 +118,7 @@ Generate job signal config via AI
118
118
  - Destructive: `no`
119
119
  - Output modes: `json, ndjson, human`
120
120
  - Example:
121
- - `autotouch agents generate-job-signal [-h] [--target {LEADS}]
121
+ - `autotouch agents generate-job-signal [-h] [--target {LEADS,ACCOUNTS}]
122
122
  [--persona PERSONA]
123
123
  [--current-titles CURRENT_TITLES]
124
124
  [--current-keywords CURRENT_KEYWORDS]
@@ -130,7 +130,7 @@ Generate job signal config via AI
130
130
  --json-pointer JSON_POINTER]
131
131
  [--verbose]`
132
132
  - Options:
133
- - `--target` (kind=string; choices=LEADS; default=LEADS): Target type
133
+ - `--target` (kind=string; choices=LEADS,ACCOUNTS; default=LEADS): Target type
134
134
  - `--persona` (kind=string): Path to persona config JSON
135
135
  - `--current-titles` (kind=string; comma-separated): Comma-separated current job titles
136
136
  - `--current-keywords` (kind=string; comma-separated): Comma-separated current keywords
@@ -153,7 +153,7 @@ Generate ICP persona config via AI
153
153
  - Destructive: `no`
154
154
  - Output modes: `json, ndjson, human`
155
155
  - Example:
156
- - `autotouch agents generate-persona [-h] [--target {LEADS}]
156
+ - `autotouch agents generate-persona [-h] [--target {LEADS,ACCOUNTS}]
157
157
  [--current-config CURRENT_CONFIG]
158
158
  [--base-url BASE_URL] [--token TOKEN]
159
159
  [--use-x-api-key] [--timeout TIMEOUT]
@@ -162,7 +162,7 @@ Generate ICP persona config via AI
162
162
  --json-pointer JSON_POINTER]
163
163
  [--verbose]`
164
164
  - Options:
165
- - `--target` (kind=string; choices=LEADS; default=LEADS): Target type
165
+ - `--target` (kind=string; choices=LEADS,ACCOUNTS; default=LEADS): Target type
166
166
  - `--current-config` (kind=string): Path to current persona config JSON
167
167
  - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
168
168
  - `--token` (kind=string; sensitive): Developer API key / JWT token
@@ -183,7 +183,7 @@ Generate signal topic suggestions via AI
183
183
  - Destructive: `no`
184
184
  - Output modes: `json, ndjson, human`
185
185
  - Example:
186
- - `autotouch agents generate-topics [-h] [--target {LEADS}]
186
+ - `autotouch agents generate-topics [-h] [--target {LEADS,ACCOUNTS}]
187
187
  [--persona PERSONA]
188
188
  [--current-topics CURRENT_TOPICS]
189
189
  [--base-url BASE_URL] [--token TOKEN]
@@ -193,7 +193,7 @@ Generate signal topic suggestions via AI
193
193
  --json-pointer JSON_POINTER]
194
194
  [--verbose]`
195
195
  - Options:
196
- - `--target` (kind=string; choices=LEADS; default=LEADS): Target type
196
+ - `--target` (kind=string; choices=LEADS,ACCOUNTS; default=LEADS): Target type
197
197
  - `--persona` (kind=string): Path to persona config JSON
198
198
  - `--current-topics` (kind=string; comma-separated): Comma-separated current topics
199
199
  - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
@@ -1322,14 +1322,14 @@ Print copy-ready ColumnCreate payload templates
1322
1322
  - Output modes: `json, ndjson, human`
1323
1323
  - Example:
1324
1324
  - `autotouch columns recipe [-h]
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}]
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,sync_to_leads_array,add_to_leads_array}]
1326
1326
  [--research-mode {lite,heavy}]
1327
1327
  [--out-file OUT_FILE]
1328
1328
  [--output {json,ndjson,human}] [--compact]
1329
1329
  [--select SELECT |
1330
1330
  --json-pointer JSON_POINTER]`
1331
1331
  - Options:
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)
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,sync_to_leads_array,add_to_leads_array; default=all)
1333
1333
  - `--research-mode` (kind=string; choices=lite,heavy; default=lite): Research Agent depth for LLM recipes (default: lite; heavy costs more per row)
1334
1334
  - `--out-file` (kind=file; input=file): Write template JSON to file (single type writes payload only)
1335
1335
  - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
@@ -3559,7 +3559,7 @@ Provider-hidden search operations
3559
3559
 
3560
3560
  #### `autotouch search companies`
3561
3561
 
3562
- Find companies with provider-hidden neural search
3562
+ Find companies with Exa Company Search
3563
3563
 
3564
3564
  - Auth: `developer_key_or_user_session`
3565
3565
  - Stability: `stable`
@@ -3575,8 +3575,8 @@ Find companies with provider-hidden neural search
3575
3575
  [--select SELECT |
3576
3576
  --json-pointer JSON_POINTER] [--verbose]`
3577
3577
  - Options:
3578
- - `--query` (kind=string): Free-text company query
3579
- - `--limit` (kind=integer; default=10): Max results, 1-10 (default: 10)
3578
+ - `--query` (kind=string): Natural-language company query
3579
+ - `--limit` (kind=integer; default=10): Max results, 1-100 (default: 10)
3580
3580
  - `--data-json` (kind=json; input=json): Explicit request payload JSON
3581
3581
  - `--data-file` (kind=file; input=file): Path to request payload JSON file
3582
3582
  - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
@@ -3811,7 +3811,8 @@ Find companies similar to a seed company
3811
3811
  - Destructive: `no`
3812
3812
  - Output modes: `json, ndjson, human`
3813
3813
  - Example:
3814
- - `autotouch search similar-companies [-h] [--company-name COMPANY_NAME]
3814
+ - `autotouch search similar-companies [-h] [--query QUERY]
3815
+ [--company-name COMPANY_NAME]
3815
3816
  [--company-domain COMPANY_DOMAIN]
3816
3817
  [--company-description COMPANY_DESCRIPTION]
3817
3818
  [--limit LIMIT]
@@ -3825,10 +3826,11 @@ Find companies similar to a seed company
3825
3826
  --json-pointer JSON_POINTER]
3826
3827
  [--verbose]`
3827
3828
  - Options:
3829
+ - `--query` (kind=string): Exa Company Search semantic similarity query, e.g. 'companies like Notion for enterprise knowledge management'
3828
3830
  - `--company-name` (kind=string): Seed company name
3829
3831
  - `--company-domain` (kind=string): Official company domain to ground similarity search
3830
3832
  - `--company-description` (kind=string): Short semantic company description to improve peer matching
3831
- - `--limit` (kind=integer; default=10): Max results, 1-10 (default: 10)
3833
+ - `--limit` (kind=integer; default=10): Max results, 1-100 (default: 10)
3832
3834
  - `--data-json` (kind=json; input=json): Explicit request payload JSON
3833
3835
  - `--data-file` (kind=file; input=file): Path to request payload JSON file
3834
3836
  - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.2.86",
2
+ "version": "0.2.88",
3
3
  "manifest_schema_version": 2,
4
4
  "entry_points": {
5
5
  "autotouch": "autotouch_cli.cli:main",
@@ -6304,7 +6304,7 @@
6304
6304
  ],
6305
6305
  "aliases": [],
6306
6306
  "group": "search",
6307
- "help": "Find companies with provider-hidden neural search",
6307
+ "help": "Find companies with Exa Company Search",
6308
6308
  "description": null,
6309
6309
  "notes": null,
6310
6310
  "required_flags": [],
@@ -6313,7 +6313,7 @@
6313
6313
  {
6314
6314
  "dest": "query",
6315
6315
  "required": false,
6316
- "help": "Free-text company query",
6316
+ "help": "Natural-language company query",
6317
6317
  "kind": "string",
6318
6318
  "action": "store",
6319
6319
  "flags": [
@@ -6324,7 +6324,7 @@
6324
6324
  {
6325
6325
  "dest": "limit",
6326
6326
  "required": false,
6327
- "help": "Max results, 1-10 (default: 10)",
6327
+ "help": "Max results, 1-100 (default: 10)",
6328
6328
  "kind": "integer",
6329
6329
  "action": "store",
6330
6330
  "default_when_omitted": 10,
@@ -6785,6 +6785,17 @@
6785
6785
  "required_flags": [],
6786
6786
  "positionals": [],
6787
6787
  "options": [
6788
+ {
6789
+ "dest": "query",
6790
+ "required": false,
6791
+ "help": "Exa Company Search semantic similarity query, e.g. 'companies like Notion for enterprise knowledge management'",
6792
+ "kind": "string",
6793
+ "action": "store",
6794
+ "flags": [
6795
+ "--query"
6796
+ ],
6797
+ "takes_value": true
6798
+ },
6788
6799
  {
6789
6800
  "dest": "company_name",
6790
6801
  "required": false,
@@ -6821,7 +6832,7 @@
6821
6832
  {
6822
6833
  "dest": "limit",
6823
6834
  "required": false,
6824
- "help": "Max results, 1-10 (default: 10)",
6835
+ "help": "Max results, 1-100 (default: 10)",
6825
6836
  "kind": "integer",
6826
6837
  "action": "store",
6827
6838
  "default_when_omitted": 10,
@@ -7008,7 +7019,7 @@
7008
7019
  },
7009
7020
  "availability": null,
7010
7021
  "examples": [
7011
- "autotouch search similar-companies [-h] [--company-name COMPANY_NAME]\n [--company-domain COMPANY_DOMAIN]\n [--company-description COMPANY_DESCRIPTION]\n [--limit LIMIT]\n [--data-json DATA_JSON]\n [--data-file DATA_FILE]\n [--base-url BASE_URL]\n [--token TOKEN] [--use-x-api-key]\n [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
7022
+ "autotouch search similar-companies [-h] [--query QUERY]\n [--company-name COMPANY_NAME]\n [--company-domain COMPANY_DOMAIN]\n [--company-description COMPANY_DESCRIPTION]\n [--limit LIMIT]\n [--data-json DATA_JSON]\n [--data-file DATA_FILE]\n [--base-url BASE_URL]\n [--token TOKEN] [--use-x-api-key]\n [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
7012
7023
  ],
7013
7024
  "stability": "stable",
7014
7025
  "handler": "_fn"
@@ -17585,7 +17596,9 @@
17585
17596
  "add_to_sequence",
17586
17597
  "http_request",
17587
17598
  "add_to_leads",
17588
- "sync_to_leads"
17599
+ "sync_to_leads",
17600
+ "sync_to_leads_array",
17601
+ "add_to_leads_array"
17589
17602
  ],
17590
17603
  "default_when_omitted": "all",
17591
17604
  "default": "all",
@@ -17710,7 +17723,7 @@
17710
17723
  },
17711
17724
  "availability": null,
17712
17725
  "examples": [
17713
- "autotouch columns recipe [-h]\n [--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}]\n [--research-mode {lite,heavy}]\n [--out-file OUT_FILE]\n [--output {json,ndjson,human}] [--compact]\n [--select SELECT |\n --json-pointer JSON_POINTER]"
17726
+ "autotouch columns recipe [-h]\n [--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,sync_to_leads_array,add_to_leads_array}]\n [--research-mode {lite,heavy}]\n [--out-file OUT_FILE]\n [--output {json,ndjson,human}] [--compact]\n [--select SELECT |\n --json-pointer JSON_POINTER]"
17714
17727
  ],
17715
17728
  "stability": "stable",
17716
17729
  "handler": "_fn"
@@ -34783,7 +34796,8 @@
34783
34796
  "kind": "string",
34784
34797
  "action": "store",
34785
34798
  "choices": [
34786
- "LEADS"
34799
+ "LEADS",
34800
+ "ACCOUNTS"
34787
34801
  ],
34788
34802
  "flags": [
34789
34803
  "--target"
@@ -35163,7 +35177,7 @@
35163
35177
  },
35164
35178
  "availability": null,
35165
35179
  "examples": [
35166
- "autotouch agents create [-h] [--name NAME] [--target {LEADS}]\n [--assigned-user ASSIGNED_USER]\n [--schedule-time SCHEDULE_TIME]\n [--schedule-tz SCHEDULE_TZ]\n [--schedule-frequency {hourly,every_6h,every_12h,daily,weekly}]\n [--schedule-days {all,weekdays}]\n [--schedule-day-of-week 0-6]\n [--schedule-window-start SCHEDULE_WINDOW_START]\n [--schedule-window-end SCHEDULE_WINDOW_END]\n [--auto-find-email] [--auto-find-phone]\n [--auto-broaden]\n [--auto-create-lead-mode {qualified_only,everyone,manual_only}]\n [--auto-sequence-id AUTO_SEQUENCE_ID]\n [--status {DRAFT,ACTIVE,PAUSED}]\n [--from-file FROM_FILE] [--generate]\n [--base-url BASE_URL] [--token TOKEN]\n [--use-x-api-key] [--timeout TIMEOUT]\n [--output {json,ndjson,human}] [--compact]\n [--select SELECT | --json-pointer JSON_POINTER]\n [--verbose]"
35180
+ "autotouch agents create [-h] [--name NAME] [--target {LEADS,ACCOUNTS}]\n [--assigned-user ASSIGNED_USER]\n [--schedule-time SCHEDULE_TIME]\n [--schedule-tz SCHEDULE_TZ]\n [--schedule-frequency {hourly,every_6h,every_12h,daily,weekly}]\n [--schedule-days {all,weekdays}]\n [--schedule-day-of-week 0-6]\n [--schedule-window-start SCHEDULE_WINDOW_START]\n [--schedule-window-end SCHEDULE_WINDOW_END]\n [--auto-find-email] [--auto-find-phone]\n [--auto-broaden]\n [--auto-create-lead-mode {qualified_only,everyone,manual_only}]\n [--auto-sequence-id AUTO_SEQUENCE_ID]\n [--status {DRAFT,ACTIVE,PAUSED}]\n [--from-file FROM_FILE] [--generate]\n [--base-url BASE_URL] [--token TOKEN]\n [--use-x-api-key] [--timeout TIMEOUT]\n [--output {json,ndjson,human}] [--compact]\n [--select SELECT | --json-pointer JSON_POINTER]\n [--verbose]"
35167
35181
  ],
35168
35182
  "stability": "stable",
35169
35183
  "handler": "_fn"
@@ -36335,7 +36349,8 @@
36335
36349
  "kind": "string",
36336
36350
  "action": "store",
36337
36351
  "choices": [
36338
- "LEADS"
36352
+ "LEADS",
36353
+ "ACCOUNTS"
36339
36354
  ],
36340
36355
  "default_when_omitted": "LEADS",
36341
36356
  "default": "LEADS",
@@ -36508,7 +36523,7 @@
36508
36523
  },
36509
36524
  "availability": null,
36510
36525
  "examples": [
36511
- "autotouch agents generate-persona [-h] [--target {LEADS}]\n [--current-config CURRENT_CONFIG]\n [--base-url BASE_URL] [--token TOKEN]\n [--use-x-api-key] [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
36526
+ "autotouch agents generate-persona [-h] [--target {LEADS,ACCOUNTS}]\n [--current-config CURRENT_CONFIG]\n [--base-url BASE_URL] [--token TOKEN]\n [--use-x-api-key] [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
36512
36527
  ],
36513
36528
  "stability": "stable",
36514
36529
  "handler": "_fn"
@@ -36534,7 +36549,8 @@
36534
36549
  "kind": "string",
36535
36550
  "action": "store",
36536
36551
  "choices": [
36537
- "LEADS"
36552
+ "LEADS",
36553
+ "ACCOUNTS"
36538
36554
  ],
36539
36555
  "default_when_omitted": "LEADS",
36540
36556
  "default": "LEADS",
@@ -36719,7 +36735,7 @@
36719
36735
  },
36720
36736
  "availability": null,
36721
36737
  "examples": [
36722
- "autotouch agents generate-topics [-h] [--target {LEADS}]\n [--persona PERSONA]\n [--current-topics CURRENT_TOPICS]\n [--base-url BASE_URL] [--token TOKEN]\n [--use-x-api-key] [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
36738
+ "autotouch agents generate-topics [-h] [--target {LEADS,ACCOUNTS}]\n [--persona PERSONA]\n [--current-topics CURRENT_TOPICS]\n [--base-url BASE_URL] [--token TOKEN]\n [--use-x-api-key] [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
36723
36739
  ],
36724
36740
  "stability": "stable",
36725
36741
  "handler": "_fn"
@@ -36745,7 +36761,8 @@
36745
36761
  "kind": "string",
36746
36762
  "action": "store",
36747
36763
  "choices": [
36748
- "LEADS"
36764
+ "LEADS",
36765
+ "ACCOUNTS"
36749
36766
  ],
36750
36767
  "default_when_omitted": "LEADS",
36751
36768
  "default": "LEADS",
@@ -36942,7 +36959,7 @@
36942
36959
  },
36943
36960
  "availability": null,
36944
36961
  "examples": [
36945
- "autotouch agents generate-job-signal [-h] [--target {LEADS}]\n [--persona PERSONA]\n [--current-titles CURRENT_TITLES]\n [--current-keywords CURRENT_KEYWORDS]\n [--base-url BASE_URL]\n [--token TOKEN] [--use-x-api-key]\n [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
36962
+ "autotouch agents generate-job-signal [-h] [--target {LEADS,ACCOUNTS}]\n [--persona PERSONA]\n [--current-titles CURRENT_TITLES]\n [--current-keywords CURRENT_KEYWORDS]\n [--base-url BASE_URL]\n [--token TOKEN] [--use-x-api-key]\n [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
36946
36963
  ],
36947
36964
  "stability": "stable",
36948
36965
  "handler": "_fn"
@@ -51,6 +51,69 @@ COLUMN_RECIPE_ALIASES: Dict[str, Dict[str, Any]] = {
51
51
  "Emits the standard Sync to Leads payload. Internal provider/config names remain add_to_crm.",
52
52
  ],
53
53
  },
54
+ "sync_to_leads_array": {
55
+ "canonical": "add_to_crm",
56
+ "key": "sync_contact_list_to_leads",
57
+ "label": "Sync Contact List to Leads",
58
+ "payload": {
59
+ "key": "sync_contact_list_to_leads",
60
+ "label": "Sync Contact List to Leads",
61
+ "kind": "enrichment",
62
+ "dataType": "json",
63
+ "origin": "manual",
64
+ "autoRun": "onSourceUpdate",
65
+ "config": {
66
+ "provider": "add_to_crm",
67
+ "requireCompanyDomain": True,
68
+ "leadSource": "research_table_export",
69
+ "fieldMappings": {
70
+ "mode": "array",
71
+ "sourceColumn": "<CONTACT_LIST_COLUMN_KEY>",
72
+ "sourceArrayPath": "contacts",
73
+ "common": {
74
+ "companyDomain": "domain",
75
+ "companyName": "company_name",
76
+ },
77
+ "template": {
78
+ "linkedinUrl": "linkedin_url",
79
+ "firstName": "first_name",
80
+ "lastName": "last_name",
81
+ "title": "title",
82
+ "companyName": "company_name",
83
+ "companyDomain": "company_domain",
84
+ "emailAddresses": [
85
+ {"column": "work_email", "type": "work"},
86
+ {"column": "email", "type": "work"},
87
+ ],
88
+ "phoneNumbers": [
89
+ {"column": "mobile_phone", "type": "mobile"},
90
+ {"column": "phone", "type": "mobile"},
91
+ ],
92
+ },
93
+ },
94
+ "sourceColumns": [
95
+ "<CONTACT_LIST_COLUMN_KEY>",
96
+ "domain",
97
+ "company_name",
98
+ ],
99
+ },
100
+ },
101
+ "notes": [
102
+ "Use this when an upstream research column returns a contact/person array such as contacts[], people[], leads[], or items[] and the goal is to write Leads directly.",
103
+ "Set config.fieldMappings.sourceColumn to the upstream column key, for example key_buyer_leads.",
104
+ "Set config.fieldMappings.sourceArrayPath to the array path inside that JSON value; use contacts for key_buyer_leads.contacts[] or items for canonical items[].",
105
+ "Template fields are item-relative: linkedinUrl=linkedin_url reads each array item's linkedin_url.",
106
+ "Common fields are parent-row mappings used for every item, usually domain/company_name.",
107
+ "Prefer this over manual row extraction, local JSON files, and rows add/import when writing discovered contacts into Leads CRM.",
108
+ ],
109
+ },
110
+ "add_to_leads_array": {
111
+ "canonical": "add_to_crm",
112
+ "alias_of": "sync_to_leads_array",
113
+ "notes": [
114
+ "Legacy-friendly alias for sync_to_leads_array.",
115
+ ],
116
+ },
54
117
  }
55
118
  COLUMN_RECIPE_TYPES = tuple(dict.fromkeys([*COLUMN_RECIPE_BASE_TYPES, *COLUMN_RECIPE_ALIASES.keys()]))
56
119
  WORKFLOW_BLUEPRINT_TYPES = tuple(sorted(automation_workflow_blueprints().keys()))
@@ -103,11 +166,16 @@ def _build_column_recipe_catalog() -> Tuple[Dict[str, Dict[str, Any]], Dict[str,
103
166
  recipes[recipe_type] = payload
104
167
  notes[recipe_type] = contract.recipe_notes_list()
105
168
  for alias, metadata in COLUMN_RECIPE_ALIASES.items():
169
+ alias_of = str(metadata.get("alias_of") or "").strip()
170
+ if alias_of and alias_of in recipes:
171
+ recipes[alias] = json.loads(json.dumps(recipes[alias_of]))
172
+ notes[alias] = list(metadata.get("notes") or []) + list(notes.get(alias_of) or [])
173
+ continue
106
174
  canonical = str(metadata.get("canonical") or "").strip()
107
175
  canonical_payload = recipes.get(canonical)
108
176
  if not isinstance(canonical_payload, dict):
109
177
  continue
110
- alias_payload = json.loads(json.dumps(canonical_payload))
178
+ alias_payload = json.loads(json.dumps(metadata.get("payload") or canonical_payload))
111
179
  if metadata.get("key"):
112
180
  alias_payload["key"] = metadata["key"]
113
181
  if metadata.get("label"):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autotouch-cli
3
- Version: 0.2.86
3
+ Version: 0.2.88
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
@@ -36,6 +36,8 @@ For a shipped human-readable reference generated from the installed parser, use
36
36
 
37
37
  ## Install
38
38
 
39
+ Released package:
40
+
39
41
  ```bash
40
42
  pipx install autotouch-cli
41
43
  # or
@@ -44,6 +46,16 @@ pip install autotouch-cli
44
46
  pip install -U autotouch-cli
45
47
  ```
46
48
 
49
+ Unreleased branch or pre-publish build:
50
+
51
+ ```bash
52
+ pipx install --force "git+ssh://git@github.com/nicolonic/autotouch_main.git@<branch-or-sha>"
53
+ # or
54
+ python -m pip install -U "git+ssh://git@github.com/nicolonic/autotouch_main.git@<branch-or-sha>"
55
+ ```
56
+
57
+ The `autotouch-cli` package name installs the latest published package from the configured package index. Use the git/source install form when testing a version bump before the release tag has published.
58
+
47
59
  ## First Run
48
60
 
49
61
  Existing developer key:
@@ -132,7 +144,7 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
132
144
  - Inspect rows: `autotouch rows list`, `autotouch rows get`
133
145
  - Inspect one cell: `autotouch cells get`
134
146
  - Create a workflow column: `autotouch columns recipe`, `autotouch columns create`
135
- - Run neural search for niche/specific company or people discovery: `autotouch search companies`, `autotouch search people`
147
+ - Run Exa Company Search for basic company discovery, competitors, and lookalikes: `autotouch search companies`, `autotouch search similar-companies`
136
148
  - Inspect list-build inputs: `autotouch list-build inputs`
137
149
  - Build durable company and lead lists on Smart Table workers: `autotouch list-build companies`, `autotouch list-build leads`
138
150
  - Check connected LinkedIn account status/limits: `autotouch linkedin status`, `autotouch linkedin limits`
@@ -146,13 +158,19 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
146
158
 
147
159
  Autotouch has two different company/people discovery paths.
148
160
 
149
- Use `autotouch search companies` and `autotouch search people` for neural search when the target is niche, semantic, or hard to express with structured filters. Examples: "AI workflow platforms for healthcare", "AI workflow startups selling to law firms", or "RevOps operators at PLG SaaS companies". Neural company/people search returns at most 10 results per API call and costs 1 credit per API call.
161
+ Use `autotouch search companies` for Exa Company Search when the target is basic company discovery, competitors, lookalikes, or a semantic company search. Put company constraints directly in natural language: industry, geography, funding, headcount, technology, founded date, and similarity. Examples: "AI workflow platforms for healthcare", "US education software startups focused on AI math tutoring with 1-50 employees", or "companies like Rippling for HR and workforce management". Exa company search returns up to 100 results per API call and costs 1 credit per 10 returned results.
162
+
163
+ Use `autotouch search similar-companies` as a convenience wrapper for Exa Company Search similarity. Prefer `--query` for Exa's documented semantic patterns, such as "companies like Notion", "competitors of Stripe", or "companies working on making space travel cheaper". The older seed fields `company_name`, `company_domain`, and `company_description` remain available when you want the CLI/API to compose that query; it does not use Exa `/findSimilar`.
150
164
 
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.
165
+ Use `autotouch search people` for provider-hidden people search when the target is niche, semantic, or hard to express with structured filters. People search currently returns at most 10 results per API call and costs 1 credit per API call.
166
+
167
+ Use `autotouch list-build companies` and `autotouch list-build leads` for structured, repeatable LinkedIn/Sales Navigator 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
168
 
153
169
  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
170
 
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.
171
+ For account-first prospecting from LinkedIn/Sales Navigator, build companies/accounts first, inspect the returned company IDs, then pass those IDs to `autotouch list-build leads --current-company-id ...`. Do not use Exa company search as a default pre-step for every LinkedIn list build; use it when the user's target is genuinely semantic, niche, competitor-based, or not meant to be LinkedIn-sourced.
172
+
173
+ Use `autotouch agents ...` for recurring signal-based discovery. Scheduled agents support `--target ACCOUNTS` for company/account output and `--target LEADS` for people output. Every agent writes a source/signal table for the evidence it used; lead agents then write `candidate_research.candidates[]` on source rows and list-sync those candidates into the lead/candidate output table. See the agent playbook for the full source-table and candidate-sync contract.
156
174
 
157
175
  ## More
158
176
 
@@ -160,7 +178,7 @@ For automation or agent-driven setup, use:
160
178
  - `autotouch cli-manifest --output json` for the local machine-readable command contract
161
179
  - `autotouch cli-reference` for the shipped parser-generated reference
162
180
  - `autotouch capabilities --output json` for provider/workflow contracts
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
181
+ - `autotouch --version` should be `0.2.88` or newer for structured company list builds without user-supplied keywords, stored list-build input lookup, research-workspace list-build guidance, the cleaned single LinkedIn-sourced list-build path, Exa Company Search up to 100 results, and scheduled agent `--target ACCOUNTS|LEADS`
164
182
  - `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
183
  - `autotouch list-build inputs` and `autotouch list-build pricing` before creating durable list-build jobs
166
184
  - `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
@@ -63,6 +63,8 @@ _LINKEDIN_CAPABILITIES: Dict[str, Any] = {
63
63
  "autotouch linkedin status",
64
64
  "autotouch linkedin limits",
65
65
  "autotouch list-build inputs",
66
+ "autotouch list-build inputs --type geo --query 'United States'",
67
+ "autotouch list-build inputs --type industry --query 'software'",
66
68
  "autotouch list-build companies --geo-id 103644278 --industry-id <industry_id> --company-size 1-10 --num-results 100 --wait",
67
69
  ],
68
70
  }
@@ -837,16 +837,47 @@ _PROVIDER_CONTRACTS: Tuple[ResearchTableProviderContract, ...] = (
837
837
  {"linkedinUrl": {"column": "linkedin_lookup", "path": "linkedin_url"}},
838
838
  ],
839
839
  },
840
+ "array_mode": {
841
+ "mode": "config.fieldMappings.mode=array",
842
+ "source_column_field": "config.fieldMappings.sourceColumn",
843
+ "array_path_field": "config.fieldMappings.sourceArrayPath",
844
+ "default_array_path": "items",
845
+ "common_field": "config.fieldMappings.common",
846
+ "template_field": "config.fieldMappings.template",
847
+ "template_scope": "item-relative",
848
+ "recommended_recipe": "autotouch columns recipe --type sync_to_leads_array",
849
+ "example": {
850
+ "sourceColumn": "key_buyer_leads",
851
+ "sourceArrayPath": "contacts",
852
+ "template": {
853
+ "firstName": "first_name",
854
+ "lastName": "last_name",
855
+ "linkedinUrl": "linkedin_url",
856
+ },
857
+ },
858
+ },
840
859
  },
841
860
  composition_contract={
842
861
  "consumes": {
843
862
  "kind": "crm_export_inputs",
844
- "shape": "mapped source row values including company domain plus hard identity or, in single mode, provisional firstName/lastName fallback; structured source columns use explicit {column, path} mappings to identify the exact field",
863
+ "shape": "mapped source row values, multi-slot mappings, or array-mode contact/person items from a structured source column; strict mode requires company domain plus hard identity or, in single mode, provisional firstName/lastName fallback",
845
864
  },
846
865
  "produces": {
847
866
  "kind": "lead_ids",
848
867
  "shape": "lead creation/update result with CRM lead ids stored on the source row",
849
868
  },
869
+ "decision_hints": {
870
+ "prefer_when": [
871
+ "the target output is Leads CRM, not a separate contacts research table",
872
+ "an upstream research column already returns contacts[], people[], leads[], or items[]",
873
+ ],
874
+ "prefer_sync_to_table_when": [
875
+ "you need a destination contacts table for per-contact enrichment, review, export, or sequencing context before CRM sync",
876
+ ],
877
+ "avoid": [
878
+ "manual rows list -> local JSON transform -> rows add/import for contacts produced by an upstream column",
879
+ ],
880
+ },
850
881
  "common_next_steps": [
851
882
  "add_to_sequence using the column key that stores those lead IDs",
852
883
  ],
@@ -1,4 +1,4 @@
1
- """Shared provider-hidden search contract for API capabilities, CLI recipes, and docs."""
1
+ """Shared search contract for Exa company search, people search, and related API capabilities."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -15,8 +15,8 @@ _SEARCH_ENDPOINTS: Dict[str, Dict[str, Any]] = {
15
15
  "path": "/api/search/companies",
16
16
  "required_scope": SEARCH_SCOPE,
17
17
  "body": {
18
- "query": "required free-text company search query",
19
- "limit": "optional 1-10 (default 10)",
18
+ "query": "required Exa Company Search natural-language query; include industry, geography, funding, headcount, technology, and similarity constraints in the query",
19
+ "limit": "optional 1-100 (default 10)",
20
20
  },
21
21
  "response": {"items_field": "items", "item_type": "company"},
22
22
  },
@@ -38,10 +38,11 @@ _SEARCH_ENDPOINTS: Dict[str, Dict[str, Any]] = {
38
38
  "path": "/api/search/similar-companies",
39
39
  "required_scope": SEARCH_SCOPE,
40
40
  "body": {
41
- "company_name": "required seed company name",
42
- "company_domain": "optional official company domain",
43
- "company_description": "optional short semantic description to improve peer matching",
44
- "limit": "optional 1-10 (default 10)",
41
+ "query": "optional Exa Company Search semantic similarity query; use this for direct Exa query patterns like 'companies like Notion' or 'competitors of Stripe'",
42
+ "company_name": "optional seed company name used when query is omitted",
43
+ "company_domain": "optional official company domain used to disambiguate the seed in the Exa Company Search query",
44
+ "company_description": "optional semantic description appended to the Exa Company Search query",
45
+ "limit": "optional 1-100 (default 10)",
45
46
  },
46
47
  "response": {"items_field": "items", "item_type": "company"},
47
48
  },
@@ -108,13 +109,14 @@ _SEARCH_CAPABILITIES: Dict[str, Any] = {
108
109
  "use_company_search_when": [
109
110
  "you need to discover target accounts before looking for contacts",
110
111
  "the search criteria are market, product, or industry driven",
112
+ "the user wants basic company discovery, competitors, lookalikes, or a semantic company search",
111
113
  ],
112
114
  "use_people_search_when": [
113
115
  "you already know the target companies",
114
116
  "the search criteria are role, persona, or skill driven",
115
117
  ],
116
118
  "use_list_build_instead_when": [
117
- "the user wants a LinkedIn-sourced company or lead list",
119
+ "the user wants a LinkedIn/Sales Navigator-sourced company or lead list",
118
120
  "the search can be expressed with geography, industry, company size, title, or current-company filters",
119
121
  "the desired output is a durable background job with status/results",
120
122
  ],
@@ -122,9 +124,9 @@ _SEARCH_CAPABILITIES: Dict[str, Any] = {
122
124
  "pricing": {
123
125
  "charge_on": "api_call_or_actual_results_returned",
124
126
  "families": {
125
- "companies": {"credits_per_call": 1, "max_results_per_call": 10, "rule": "1 credit per neural search API call"},
127
+ "companies": {"credits_per_bucket": 1, "bucket_size": 10, "max_results_per_call": 100, "rule": "1 credit per 10 returned Exa company results"},
126
128
  "people": {"credits_per_call": 1, "max_results_per_call": 10, "rule": "1 credit per neural search API call"},
127
- "similar_companies": {"credits_per_call": 1, "max_results_per_call": 10, "rule": "1 credit per neural search API call"},
129
+ "similar_companies": {"credits_per_bucket": 1, "bucket_size": 10, "max_results_per_call": 100, "rule": "1 credit per 10 returned Exa company results"},
128
130
  "news": {"credits_per_bucket": 1, "bucket_size": 25, "rule": "1 credit per 25 results"},
129
131
  "local_businesses": {"credits_per_bucket": 1, "bucket_size": 25, "rule": "1 credit per 25 results"},
130
132
  "reviews": {"credits_per_bucket": 1, "bucket_size": 25, "rule": "1 credit per 25 results"},
@@ -132,8 +134,9 @@ _SEARCH_CAPABILITIES: Dict[str, Any] = {
132
134
  },
133
135
  },
134
136
  "recommended_cli": [
135
- "autotouch search companies --query 'remote IT asset management' --limit 25",
136
- "autotouch search people --query 'VP IT' --company 'Rippling' --limit 25",
137
+ "autotouch search companies --query 'remote IT asset management companies in the US with 50-200 employees' --limit 100",
138
+ "autotouch search companies --query 'companies like Rippling in HR software, based in the United States, with 50-500 employees' --limit 100",
139
+ "autotouch search people --query 'VP IT' --company 'Rippling' --limit 10",
137
140
  "autotouch search recipe --type companies --out-file companies.json",
138
141
  ],
139
142
  }
@@ -141,11 +144,12 @@ _SEARCH_CAPABILITIES: Dict[str, Any] = {
141
144
 
142
145
  _SEARCH_RECIPES: Dict[str, Dict[str, Any]] = {
143
146
  "companies": {
144
- "payload": {"query": "remote IT asset management", "limit": 10},
147
+ "payload": {"query": "remote IT asset management companies in the US with 50-200 employees", "limit": 100},
145
148
  "usage": "autotouch search companies --data-file <payload.json>",
146
149
  "notes": [
147
- "Use this when you need to discover target accounts first.",
148
- "Pricing: 1 credit per neural search API call. Max 10 returned companies per call.",
150
+ "Use this for basic Exa Company Search: company discovery, competitors, lookalikes, and semantic market scans.",
151
+ "Put Exa company constraints in natural language: industry, geography, funding, headcount, technology, founded date, and similarity.",
152
+ "Pricing: 1 credit per 10 returned Exa company results. Max 100 returned companies per call.",
149
153
  ],
150
154
  },
151
155
  "people": {
@@ -164,16 +168,15 @@ _SEARCH_RECIPES: Dict[str, Dict[str, Any]] = {
164
168
  },
165
169
  "similar_companies": {
166
170
  "payload": {
167
- "company_name": "Rippling",
168
- "company_domain": "rippling.com",
169
- "company_description": "Workforce management and HR software platform for businesses",
170
- "limit": 10,
171
+ "query": "companies like Rippling for workforce management, HR, payroll, IT, benefits, devices, and app access",
172
+ "limit": 100,
171
173
  },
172
174
  "usage": "autotouch search similar-companies --data-file <payload.json>",
173
175
  "notes": [
174
- "Good for expanding a seed account list.",
175
- "Best results come from providing company_domain and a short company_description when known.",
176
- "Pricing: 1 credit per neural search API call. Max 10 returned companies per call.",
176
+ "Convenience wrapper for Exa Company Search similarity queries, not Exa /findSimilar.",
177
+ "Prefer query for Exa's documented semantic patterns: companies like X, competitors of X, or companies working on Y.",
178
+ "Seed fields company_name, company_domain, and company_description remain available when you want the CLI/API to compose the query.",
179
+ "Pricing: 1 credit per 10 returned Exa company results. Max 100 returned companies per call.",
177
180
  ],
178
181
  },
179
182
  "news": {
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "autotouch-cli"
7
- version = "0.2.86"
7
+ version = "0.2.88"
8
8
  description = "Autotouch Smart Table CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
File without changes