autotouch-cli 0.2.103__tar.gz → 0.2.104__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 (60) hide show
  1. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/PKG-INFO +19 -5
  2. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/README.md +18 -4
  3. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/cli.py +25 -2
  4. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/list_build.py +68 -0
  5. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/data/CLI_REFERENCE.md +63 -12
  6. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/data/cli-manifest.json +353 -8
  7. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/parser.py +7 -5
  8. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/templates.py +101 -21
  9. autotouch_cli-0.2.104/autotouch_cli/workflows/__init__.py +5 -0
  10. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/workflows/registry.py +168 -6
  11. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli.egg-info/PKG-INFO +19 -5
  12. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli.egg-info/SOURCES.txt +1 -0
  13. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_shared/list_build_contract.py +24 -0
  14. autotouch_cli-0.2.104/autotouch_shared/product_lifecycle.py +98 -0
  15. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/pyproject.toml +1 -1
  16. autotouch_cli-0.2.103/autotouch_cli/workflows/__init__.py +0 -5
  17. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/MANIFEST.in +0 -0
  18. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/__init__.py +0 -0
  19. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/cli_contracts.py +0 -0
  20. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/__init__.py +0 -0
  21. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/agents.py +0 -0
  22. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/auth.py +0 -0
  23. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/cells.py +0 -0
  24. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/columns.py +0 -0
  25. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/integrations.py +0 -0
  26. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/jobs.py +0 -0
  27. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/leads.py +0 -0
  28. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/linkedin.py +0 -0
  29. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/prompts.py +0 -0
  30. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/rows.py +0 -0
  31. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/search.py +0 -0
  32. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/sequences.py +0 -0
  33. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/tables.py +0 -0
  34. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/tasks.py +0 -0
  35. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/webhooks.py +0 -0
  36. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/commands/workspace_secrets.py +0 -0
  37. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/core/__init__.py +0 -0
  38. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/core/auth.py +0 -0
  39. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/core/config.py +0 -0
  40. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/core/csv_import.py +0 -0
  41. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/core/http.py +0 -0
  42. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/core/io.py +0 -0
  43. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/core/output.py +0 -0
  44. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/core/polling.py +0 -0
  45. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/core/run.py +0 -0
  46. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/core/validation.py +0 -0
  47. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/exceptions.py +0 -0
  48. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/mongo_status.py +0 -0
  49. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/parser_groups.py +0 -0
  50. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli/sequence_support.py +0 -0
  51. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli.egg-info/dependency_links.txt +0 -0
  52. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli.egg-info/entry_points.txt +0 -0
  53. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli.egg-info/requires.txt +0 -0
  54. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_cli.egg-info/top_level.txt +0 -0
  55. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_shared/__init__.py +0 -0
  56. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_shared/linkedin_contract.py +0 -0
  57. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_shared/linkedin_filters.py +0 -0
  58. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_shared/provider_registry.py +0 -0
  59. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/autotouch_shared/search_contract.py +0 -0
  60. {autotouch_cli-0.2.103 → autotouch_cli-0.2.104}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autotouch-cli
3
- Version: 0.2.103
3
+ Version: 0.2.104
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
@@ -34,6 +34,19 @@ The CLI talks to the same API the product uses. For automation, prefer `--output
34
34
  For a machine-readable local command contract, use `autotouch cli-manifest --output json`.
35
35
  For a shipped human-readable reference generated from the installed parser, use `autotouch cli-reference`.
36
36
 
37
+ ## Product Model
38
+
39
+ Autotouch helps GTM teams source records, land them in Smart Table, research and operate on those rows, then turn qualified accounts/leads into outreach actions.
40
+
41
+ Use the lifecycle to choose commands:
42
+
43
+ 1. Source Records: use `autotouch list-build`, `autotouch search`, `autotouch agents`, imports, or webhooks.
44
+ 2. Land In Smart Table: use `autotouch list-build sync-to-table`, `autotouch tables`, `autotouch rows`, or import/webhook ingest.
45
+ 3. Research And Operate: use `autotouch columns recipe`, `autotouch columns run-next`, `autotouch jobs`, `autotouch rows`, and `autotouch cells`.
46
+ 4. Engage: use `to_leads`, `to_sequence`, `to_outreach`, `to_crm`, `autotouch sequences`, and `autotouch tasks`.
47
+
48
+ Smart Table is the operating layer. Most workflows should land records there before enrichment, dedupe, routing, or engagement. Run `autotouch workflows list --output json` for lifecycle-grouped plans.
49
+
37
50
  ## Install
38
51
 
39
52
  Released package:
@@ -180,7 +193,7 @@ Use `autotouch search similar-companies` as a convenience wrapper for Exa Compan
180
193
 
181
194
  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.
182
195
 
183
- 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.
196
+ 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, sync the records to a research table with `autotouch list-build sync-to-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.
184
197
 
185
198
  LinkedIn is an optional campaign channel, not the default for every outbound workflow. Use it when the user explicitly wants LinkedIn-sourced lists, profile visits, connection requests, or LinkedIn follow-up tasks. Prefer email/call/custom sequences or research-table workflows when LinkedIn would unnecessarily constrain output because of provider limits, cooldowns, missing profile URLs, or campaign fit.
186
199
 
@@ -203,7 +216,7 @@ discover -> plan -> scaffold -> run primitives -> inspect
203
216
  - `autotouch workflows scaffold --type <TYPE> --out-dir <DIR>` writes payload files and a command runbook.
204
217
  - `autotouch columns recipe` and `autotouch sequences recipe` remain leaf-level templates.
205
218
 
206
- Goal-level workflow types include `bulk-outreach`, `company-table-to-people`, `table-to-outreach`, `research-to-sequence`, `agent-to-sequence`, `account-research`, `signal-outreach`, `website-visitors`, and `list-build-to-table`. These keep CRM, outreach providers, Autotouch Leads, Autotouch Sequences, scheduled agents, webhooks, visitor sources, and external intent sources as sources/destinations inside one organized workflow layer instead of creating one-off top-level commands.
219
+ Goal-level workflow types include `bulk-outreach`, `company-table-to-people`, `table-to-outreach`, `research-to-sequence`, `agent-to-sequence`, `agent-to-leads`, `account-research`, `signal-outreach`, `website-visitors`, and `list-build-to-table`. These keep CRM, outreach providers, Autotouch Leads, Autotouch Sequences, scheduled agents, webhooks, visitor sources, and external intent sources as sources/destinations inside one organized workflow layer instead of creating one-off top-level commands.
207
220
 
208
221
  ## Sources And Destinations
209
222
 
@@ -273,16 +286,17 @@ For automation or agent-driven setup, use:
273
286
  - `autotouch cli-manifest --output json` for the local machine-readable command contract
274
287
  - `autotouch cli-reference` for the shipped parser-generated reference
275
288
  - `autotouch capabilities --output json` for provider/workflow contracts
276
- - `autotouch --version` should be `0.2.103` 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, scheduled agent `--target ACCOUNTS|LEADS`, `agents signals --target`, the `agent-to-sequence` workflow scaffold, paced HTTP Request column contracts, branch-aware LinkedIn sequence recipes, real agent soft-delete with associated-table handling, research-table sequence handoff assignee and active-sequence-conflict guard config, backend-owned directional source/destination helpers, goal-level workflow plans, website visitor/external intent webhook workflow guidance, and create-time agent assignment defaults
289
+ - `autotouch --version` should be `0.2.104` 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, scheduled agent `--target ACCOUNTS|LEADS`, `agents signals --target`, the `agent-to-sequence` and `agent-to-leads` workflow scaffolds, paced HTTP Request column contracts, branch-aware LinkedIn sequence recipes, real agent soft-delete with associated-table handling, research-table sequence handoff assignee and active-sequence-conflict guard config, backend-owned directional source/destination helpers, goal-level workflow plans, website visitor/external intent webhook workflow guidance, create-time agent assignment defaults, and company-page signal configuration guidance
277
290
  - `autotouch capabilities --output json --select list_builds` for documented list-build inputs such as geography IDs, company size buckets, profile language, and company IDs
278
291
  - `autotouch integrations list` and `autotouch integrations status --provider <provider>` before choosing source/destination workflows
279
292
  - `autotouch workflows plan --type bulk-outreach` and `autotouch workflows scaffold --type bulk-outreach --out-dir workflow` for goal-level workflow planning
293
+ - `autotouch workflows plan --type agent-to-leads` and `autotouch workflows scaffold --type agent-to-leads --out-dir workflow` for scheduled agent discovery into qualified Autotouch Leads without sequence tasks
280
294
  - `autotouch workflows plan --type agent-to-sequence` and `autotouch workflows scaffold --type agent-to-sequence --out-dir workflow` for scheduled agent discovery into Autotouch Sequence tasks
281
295
  - `autotouch workflows plan --type website-visitors` and `autotouch workflows scaffold --type website-visitors --out-dir workflow` for website visitor or external intent provider webhook workflows
282
296
  - `autotouch integrations recipe --type from_crm --provider hubspot` for CRM-to-research-table imports
283
297
  - `autotouch columns recipe --type to_crm|to_outreach|to_leads|to_sequence` for research-table destination workflows
284
298
  - `autotouch list-build inputs` and `autotouch list-build pricing` before creating durable list-build jobs
285
- - `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
299
+ - `autotouch list-build companies`, `autotouch list-build leads`, and `autotouch list-build sync-to-table` for durable LinkedIn-sourced company/lead list builds and the first-class Smart Table handoff
286
300
  - `autotouch linkedin status` and `autotouch linkedin limits` for connected-account diagnostics
287
301
  - `autotouch sequences recipe --type linkedin_outreach` only when the campaign should include LinkedIn touches; the emitted branch waits for connection acceptance before LinkedIn chat and uses email fallback after the wait window
288
302
  - `autotouch rows list` / `autotouch rows get` / `autotouch cells get` for read-back and audit
@@ -9,6 +9,19 @@ The CLI talks to the same API the product uses. For automation, prefer `--output
9
9
  For a machine-readable local command contract, use `autotouch cli-manifest --output json`.
10
10
  For a shipped human-readable reference generated from the installed parser, use `autotouch cli-reference`.
11
11
 
12
+ ## Product Model
13
+
14
+ Autotouch helps GTM teams source records, land them in Smart Table, research and operate on those rows, then turn qualified accounts/leads into outreach actions.
15
+
16
+ Use the lifecycle to choose commands:
17
+
18
+ 1. Source Records: use `autotouch list-build`, `autotouch search`, `autotouch agents`, imports, or webhooks.
19
+ 2. Land In Smart Table: use `autotouch list-build sync-to-table`, `autotouch tables`, `autotouch rows`, or import/webhook ingest.
20
+ 3. Research And Operate: use `autotouch columns recipe`, `autotouch columns run-next`, `autotouch jobs`, `autotouch rows`, and `autotouch cells`.
21
+ 4. Engage: use `to_leads`, `to_sequence`, `to_outreach`, `to_crm`, `autotouch sequences`, and `autotouch tasks`.
22
+
23
+ Smart Table is the operating layer. Most workflows should land records there before enrichment, dedupe, routing, or engagement. Run `autotouch workflows list --output json` for lifecycle-grouped plans.
24
+
12
25
  ## Install
13
26
 
14
27
  Released package:
@@ -155,7 +168,7 @@ Use `autotouch search similar-companies` as a convenience wrapper for Exa Compan
155
168
 
156
169
  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.
157
170
 
158
- 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.
171
+ 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, sync the records to a research table with `autotouch list-build sync-to-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.
159
172
 
160
173
  LinkedIn is an optional campaign channel, not the default for every outbound workflow. Use it when the user explicitly wants LinkedIn-sourced lists, profile visits, connection requests, or LinkedIn follow-up tasks. Prefer email/call/custom sequences or research-table workflows when LinkedIn would unnecessarily constrain output because of provider limits, cooldowns, missing profile URLs, or campaign fit.
161
174
 
@@ -178,7 +191,7 @@ discover -> plan -> scaffold -> run primitives -> inspect
178
191
  - `autotouch workflows scaffold --type <TYPE> --out-dir <DIR>` writes payload files and a command runbook.
179
192
  - `autotouch columns recipe` and `autotouch sequences recipe` remain leaf-level templates.
180
193
 
181
- Goal-level workflow types include `bulk-outreach`, `company-table-to-people`, `table-to-outreach`, `research-to-sequence`, `agent-to-sequence`, `account-research`, `signal-outreach`, `website-visitors`, and `list-build-to-table`. These keep CRM, outreach providers, Autotouch Leads, Autotouch Sequences, scheduled agents, webhooks, visitor sources, and external intent sources as sources/destinations inside one organized workflow layer instead of creating one-off top-level commands.
194
+ Goal-level workflow types include `bulk-outreach`, `company-table-to-people`, `table-to-outreach`, `research-to-sequence`, `agent-to-sequence`, `agent-to-leads`, `account-research`, `signal-outreach`, `website-visitors`, and `list-build-to-table`. These keep CRM, outreach providers, Autotouch Leads, Autotouch Sequences, scheduled agents, webhooks, visitor sources, and external intent sources as sources/destinations inside one organized workflow layer instead of creating one-off top-level commands.
182
195
 
183
196
  ## Sources And Destinations
184
197
 
@@ -248,16 +261,17 @@ For automation or agent-driven setup, use:
248
261
  - `autotouch cli-manifest --output json` for the local machine-readable command contract
249
262
  - `autotouch cli-reference` for the shipped parser-generated reference
250
263
  - `autotouch capabilities --output json` for provider/workflow contracts
251
- - `autotouch --version` should be `0.2.103` 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, scheduled agent `--target ACCOUNTS|LEADS`, `agents signals --target`, the `agent-to-sequence` workflow scaffold, paced HTTP Request column contracts, branch-aware LinkedIn sequence recipes, real agent soft-delete with associated-table handling, research-table sequence handoff assignee and active-sequence-conflict guard config, backend-owned directional source/destination helpers, goal-level workflow plans, website visitor/external intent webhook workflow guidance, and create-time agent assignment defaults
264
+ - `autotouch --version` should be `0.2.104` 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, scheduled agent `--target ACCOUNTS|LEADS`, `agents signals --target`, the `agent-to-sequence` and `agent-to-leads` workflow scaffolds, paced HTTP Request column contracts, branch-aware LinkedIn sequence recipes, real agent soft-delete with associated-table handling, research-table sequence handoff assignee and active-sequence-conflict guard config, backend-owned directional source/destination helpers, goal-level workflow plans, website visitor/external intent webhook workflow guidance, create-time agent assignment defaults, and company-page signal configuration guidance
252
265
  - `autotouch capabilities --output json --select list_builds` for documented list-build inputs such as geography IDs, company size buckets, profile language, and company IDs
253
266
  - `autotouch integrations list` and `autotouch integrations status --provider <provider>` before choosing source/destination workflows
254
267
  - `autotouch workflows plan --type bulk-outreach` and `autotouch workflows scaffold --type bulk-outreach --out-dir workflow` for goal-level workflow planning
268
+ - `autotouch workflows plan --type agent-to-leads` and `autotouch workflows scaffold --type agent-to-leads --out-dir workflow` for scheduled agent discovery into qualified Autotouch Leads without sequence tasks
255
269
  - `autotouch workflows plan --type agent-to-sequence` and `autotouch workflows scaffold --type agent-to-sequence --out-dir workflow` for scheduled agent discovery into Autotouch Sequence tasks
256
270
  - `autotouch workflows plan --type website-visitors` and `autotouch workflows scaffold --type website-visitors --out-dir workflow` for website visitor or external intent provider webhook workflows
257
271
  - `autotouch integrations recipe --type from_crm --provider hubspot` for CRM-to-research-table imports
258
272
  - `autotouch columns recipe --type to_crm|to_outreach|to_leads|to_sequence` for research-table destination workflows
259
273
  - `autotouch list-build inputs` and `autotouch list-build pricing` before creating durable list-build jobs
260
- - `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
274
+ - `autotouch list-build companies`, `autotouch list-build leads`, and `autotouch list-build sync-to-table` for durable LinkedIn-sourced company/lead list builds and the first-class Smart Table handoff
261
275
  - `autotouch linkedin status` and `autotouch linkedin limits` for connected-account diagnostics
262
276
  - `autotouch sequences recipe --type linkedin_outreach` only when the campaign should include LinkedIn touches; the emitted branch waits for connection acceptance before LinkedIn chat and uses email fallback after the wait window
263
277
  - `autotouch rows list` / `autotouch rows get` / `autotouch cells get` for read-back and audit
@@ -119,6 +119,7 @@ from autotouch_cli.commands.list_build import (
119
119
  cmd_list_build_pricing as cmd_list_build_pricing_impl,
120
120
  cmd_list_build_results as cmd_list_build_results_impl,
121
121
  cmd_list_build_status as cmd_list_build_status_impl,
122
+ cmd_list_build_sync_to_table as cmd_list_build_sync_to_table_impl,
122
123
  )
123
124
  from autotouch_cli.commands.rows import (
124
125
  RowCommandRuntime as RowCommandHandlerRuntime,
@@ -376,6 +377,7 @@ from autotouch_shared.list_build_contract import (
376
377
  list_build_capabilities_contract,
377
378
  list_build_endpoint_entries,
378
379
  )
380
+ from autotouch_shared.product_lifecycle import product_lifecycle_contract
379
381
  from autotouch_cli.exceptions import (
380
382
  AutotouchAPIError,
381
383
  AutotouchInputError,
@@ -1608,6 +1610,7 @@ _register("list_build_companies", cmd_list_build_companies_impl, _list_build_com
1608
1610
  _register("list_build_leads", cmd_list_build_leads_impl, _list_build_command_runtime)
1609
1611
  _register("list_build_status", cmd_list_build_status_impl, _list_build_command_runtime)
1610
1612
  _register("list_build_results", cmd_list_build_results_impl, _list_build_command_runtime)
1613
+ _register("list_build_sync_to_table", cmd_list_build_sync_to_table_impl, _list_build_command_runtime)
1611
1614
  _register("list_build_inputs", cmd_list_build_inputs_impl, _list_build_command_runtime)
1612
1615
  _register("list_build_pricing", cmd_list_build_pricing_impl, _list_build_command_runtime)
1613
1616
 
@@ -1954,7 +1957,7 @@ def cmd_context_resolved(args: argparse.Namespace) -> None:
1954
1957
  _print_json(data, compact=args.compact)
1955
1958
 
1956
1959
 
1957
- def _with_bundled_linkedin_capabilities(data: Any) -> Any:
1960
+ def _with_bundled_capabilities(data: Any) -> Any:
1958
1961
  if not isinstance(data, dict):
1959
1962
  return data
1960
1963
  merged = dict(data)
@@ -1962,6 +1965,7 @@ def _with_bundled_linkedin_capabilities(data: Any) -> Any:
1962
1965
  merged["endpoints"] = {**endpoints, **linkedin_endpoint_entries(), **list_build_endpoint_entries()}
1963
1966
  merged["linkedin"] = linkedin_capabilities_contract()
1964
1967
  merged["list_builds"] = list_build_capabilities_contract()
1968
+ merged["product_lifecycle"] = product_lifecycle_contract()
1965
1969
  return merged
1966
1970
 
1967
1971
 
@@ -1976,7 +1980,7 @@ def cmd_capabilities(args: argparse.Namespace) -> None:
1976
1980
  timeout=args.timeout,
1977
1981
  verbose=args.verbose,
1978
1982
  )
1979
- data = _with_bundled_linkedin_capabilities(data)
1983
+ data = _with_bundled_capabilities(data)
1980
1984
  if OUTPUT_MODE == "human" and isinstance(data, dict):
1981
1985
  execution = data.get("execution_policies") if isinstance(data.get("execution_policies"), dict) else {}
1982
1986
  llm = execution.get("llm") if isinstance(execution.get("llm"), dict) else {}
@@ -1994,6 +1998,25 @@ def cmd_capabilities(args: argparse.Namespace) -> None:
1994
1998
  if isinstance(scopes, list):
1995
1999
  print(f"Scopes : {', '.join(str(s) for s in scopes)}")
1996
2000
 
2001
+ lifecycle = data.get("product_lifecycle") if isinstance(data.get("product_lifecycle"), dict) else {}
2002
+ stages = lifecycle.get("stages") if isinstance(lifecycle.get("stages"), list) else []
2003
+ if lifecycle:
2004
+ print("")
2005
+ print("Product lifecycle")
2006
+ print("-----------------")
2007
+ summary = lifecycle.get("product_summary")
2008
+ if summary:
2009
+ print(str(summary))
2010
+ principle = lifecycle.get("operating_principle")
2011
+ if principle:
2012
+ print(str(principle))
2013
+ if stages:
2014
+ print("Stages:")
2015
+ for stage in stages:
2016
+ if not isinstance(stage, dict):
2017
+ continue
2018
+ print(f" - {stage.get('label', stage.get('key', 'stage'))}: {stage.get('description', '')}")
2019
+
1997
2020
  print("")
1998
2021
  print("LLM output modes")
1999
2022
  print("----------------")
@@ -86,6 +86,26 @@ def _wait(job_id: str, args: argparse.Namespace, *, runtime: ListBuildCommandRun
86
86
  time.sleep(max(1, int(getattr(args, "poll_interval", 5) or 5)))
87
87
 
88
88
 
89
+ def _wait_sync(sync_job_id: str, args: argparse.Namespace, *, runtime: ListBuildCommandRuntime, token: Optional[str]) -> Any:
90
+ started = time.time()
91
+ while True:
92
+ data = runtime.request_api(
93
+ "GET",
94
+ f"/api/list-builds/sync-jobs/{sync_job_id}",
95
+ base_url=args.base_url,
96
+ token=token,
97
+ use_x_api_key=args.use_x_api_key,
98
+ timeout=args.timeout,
99
+ verbose=args.verbose,
100
+ )
101
+ if str(data.get("status") or "").lower() in {"completed", "error", "cancelled"}:
102
+ return data
103
+ timeout = int(getattr(args, "wait_timeout", 0) or 0)
104
+ if timeout and time.time() - started >= timeout:
105
+ raise AutotouchTimeoutError(f"Timed out waiting for list-build sync {sync_job_id}")
106
+ time.sleep(max(1, int(getattr(args, "poll_interval", 5) or 5)))
107
+
108
+
89
109
  def _create(args: argparse.Namespace, *, runtime: ListBuildCommandRuntime, kind: str) -> None:
90
110
  token = runtime.resolve_token(args.token, required=True)
91
111
  data = runtime.request_api(
@@ -103,6 +123,34 @@ def _create(args: argparse.Namespace, *, runtime: ListBuildCommandRuntime, kind:
103
123
  runtime.print_json(data, args.compact)
104
124
 
105
125
 
126
+ def cmd_list_build_sync_to_table(args: argparse.Namespace, *, runtime: ListBuildCommandRuntime) -> None:
127
+ token = runtime.resolve_token(args.token, required=True)
128
+ payload: Dict[str, Any] = {
129
+ "identity_key": args.identity_key,
130
+ "dedupe_mode": args.dedupe_mode,
131
+ "merge_mode": args.merge_mode,
132
+ }
133
+ for attr in ("type", "table_id", "table_name", "table_mode"):
134
+ value = getattr(args, attr, None)
135
+ if value:
136
+ payload[attr] = value
137
+ if getattr(args, "allow_partial", False):
138
+ payload["allow_partial"] = True
139
+ data = runtime.request_api(
140
+ "POST",
141
+ f"/api/list-builds/{args.job_id}/sync-to-table",
142
+ base_url=args.base_url,
143
+ token=token,
144
+ use_x_api_key=args.use_x_api_key,
145
+ payload=payload,
146
+ timeout=args.timeout,
147
+ verbose=args.verbose,
148
+ )
149
+ if getattr(args, "wait", False) and data.get("sync_job_id"):
150
+ data = _wait_sync(str(data["sync_job_id"]), args, runtime=runtime, token=token)
151
+ runtime.print_json(data, args.compact)
152
+
153
+
106
154
  def cmd_list_build_companies(args: argparse.Namespace, *, runtime: ListBuildCommandRuntime) -> None:
107
155
  _create(args, runtime=runtime, kind="companies")
108
156
 
@@ -253,6 +301,26 @@ def register_list_build_subcommands(
253
301
  add_api_common_arguments(results)
254
302
  results.set_defaults(func=handlers["results"])
255
303
 
304
+ sync = sub.add_parser("sync-to-table", help="Sync list-build results into a Smart Table")
305
+ sync.add_argument("--job-id", required=True)
306
+ sync.add_argument("--type", choices=["items", "companies", "leads", "all"], help="Result type to sync; defaults to the job kind")
307
+ sync.add_argument("--table-id", help="Existing Smart Table id for append/upsert")
308
+ sync.add_argument("--table-name", help="New Smart Table name when creating a table")
309
+ sync.add_argument("--table-mode", choices=["create", "append"], help="Create a new table or append/upsert into --table-id")
310
+ sync.add_argument(
311
+ "--identity-key",
312
+ default="auto",
313
+ help="Dedupe identity key: auto, linkedin_url, linkedin_company_id, linkedin_company_url, or domain",
314
+ )
315
+ sync.add_argument("--dedupe-mode", choices=["allow", "skip", "upsert"], default="upsert", help="How to handle matching rows")
316
+ sync.add_argument("--merge-mode", choices=["fill_empty", "overwrite_mapped"], default="fill_empty", help="How upserts merge values")
317
+ sync.add_argument("--allow-partial", action="store_true", help="Allow syncing before the list-build job is completed")
318
+ sync.add_argument("--wait", action="store_true", help="Poll until sync completes")
319
+ sync.add_argument("--poll-interval", type=int, default=5, help="Polling interval seconds for --wait")
320
+ sync.add_argument("--wait-timeout", type=int, default=0, help="Max seconds to wait (0 = no timeout)")
321
+ add_api_common_arguments(sync)
322
+ sync.set_defaults(func=handlers["sync_to_table"])
323
+
256
324
  inputs = sub.add_parser("inputs", help="Show valid list-build filter IDs and values")
257
325
  inputs.add_argument("--type", choices=["geo", "industry", "service", "title_skill", "title-skills"], help="Search input type")
258
326
  inputs.add_argument("--query", help="Search text for input ID lookup")
@@ -1,6 +1,6 @@
1
1
  # Autotouch CLI Reference
2
2
 
3
- Generated from the installed parser for `autotouch-cli` `0.2.103`.
3
+ Generated from the installed parser for `autotouch-cli` `0.2.104`.
4
4
  Manifest schema version: `2`.
5
5
 
6
6
  ## Output Modes
@@ -2492,10 +2492,10 @@ Build durable LinkedIn-sourced company and lead lists
2492
2492
  - Auth: `varies_by_subcommand`
2493
2493
  - Stability: `stable`
2494
2494
  - Destructive: `no`
2495
- - Subcommands: `companies, leads, status, results, inputs, pricing`
2495
+ - Subcommands: `companies, leads, status, results, sync-to-table, inputs, pricing`
2496
2496
  - Example:
2497
2497
  - `autotouch list-build [-h]
2498
- {companies,leads,status,results,inputs,pricing} ...`
2498
+ {companies,leads,status,results,sync-to-table,inputs,pricing} ...`
2499
2499
 
2500
2500
  #### `autotouch list-build companies`
2501
2501
 
@@ -2724,6 +2724,57 @@ Get list-build job status
2724
2724
  - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
2725
2725
  - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
2726
2726
 
2727
+ #### `autotouch list-build sync-to-table`
2728
+
2729
+ Sync list-build results into a Smart Table
2730
+
2731
+ - Auth: `developer_key_or_user_session`
2732
+ - Stability: `stable`
2733
+ - Destructive: `no`
2734
+ - Required flags: `--job-id`
2735
+ - Output modes: `json, ndjson, human`
2736
+ - Example:
2737
+ - `autotouch list-build sync-to-table [-h] --job-id JOB_ID
2738
+ [--type {items,companies,leads,all}]
2739
+ [--table-id TABLE_ID]
2740
+ [--table-name TABLE_NAME]
2741
+ [--table-mode {create,append}]
2742
+ [--identity-key IDENTITY_KEY]
2743
+ [--dedupe-mode {allow,skip,upsert}]
2744
+ [--merge-mode {fill_empty,overwrite_mapped}]
2745
+ [--allow-partial] [--wait]
2746
+ [--poll-interval POLL_INTERVAL]
2747
+ [--wait-timeout WAIT_TIMEOUT]
2748
+ [--base-url BASE_URL]
2749
+ [--token TOKEN] [--use-x-api-key]
2750
+ [--timeout TIMEOUT]
2751
+ [--output {json,ndjson,human}]
2752
+ [--compact] [--select SELECT |
2753
+ --json-pointer JSON_POINTER]
2754
+ [--verbose]`
2755
+ - Options:
2756
+ - `--job-id` (required; kind=string)
2757
+ - `--type` (kind=string; choices=items,companies,leads,all): Result type to sync; defaults to the job kind
2758
+ - `--table-id` (kind=string): Existing Smart Table id for append/upsert
2759
+ - `--table-name` (kind=string): New Smart Table name when creating a table
2760
+ - `--table-mode` (kind=string; choices=create,append): Create a new table or append/upsert into --table-id
2761
+ - `--identity-key` (kind=string; default=auto): Dedupe identity key: auto, linkedin_url, linkedin_company_id, linkedin_company_url, or domain
2762
+ - `--dedupe-mode` (kind=string; choices=allow,skip,upsert; default=upsert): How to handle matching rows
2763
+ - `--merge-mode` (kind=string; choices=fill_empty,overwrite_mapped; default=fill_empty): How upserts merge values
2764
+ - `--allow-partial` (kind=boolean; when omitted=False; when present=True): Allow syncing before the list-build job is completed
2765
+ - `--wait` (kind=boolean; when omitted=False; when present=True): Poll until sync completes
2766
+ - `--poll-interval` (kind=integer; default=5): Polling interval seconds for --wait
2767
+ - `--wait-timeout` (kind=integer; default=0): Max seconds to wait (0 = no timeout)
2768
+ - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
2769
+ - `--token` (kind=string; sensitive): Developer API key / JWT token
2770
+ - `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
2771
+ - `--timeout` (kind=integer; default=30): HTTP timeout in seconds
2772
+ - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
2773
+ - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
2774
+ - `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
2775
+ - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
2776
+ - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
2777
+
2727
2778
  ### `onboarding`
2728
2779
 
2729
2780
  #### `autotouch onboarding`
@@ -6057,7 +6108,7 @@ Update a webhook subscription
6057
6108
 
6058
6109
  Goal-level workflow plans and scaffolds
6059
6110
 
6060
- Use workflows for full user goals. Recipes are leaf templates; workflow plans describe the ordered path across sourcing, research tables, enrichment, Leads, Sequences, and outreach destinations.
6111
+ Use workflows for full user goals. Autotouch workflows follow Source Records -> Land In Smart Table -> Research And Operate -> Engage. Recipes are leaf templates; workflow plans describe the ordered path across list building, imports/webhooks, Smart Table research, Leads, Sequences, CRM, and outreach destinations.
6061
6112
 
6062
6113
  - Auth: `varies_by_subcommand`
6063
6114
  - Stability: `stable`
@@ -6070,7 +6121,7 @@ Use workflows for full user goals. Recipes are leaf templates; workflow plans de
6070
6121
 
6071
6122
  #### `autotouch workflows list`
6072
6123
 
6073
- List common workflow blueprints
6124
+ List common workflow blueprints grouped by lifecycle stage
6074
6125
 
6075
6126
  - Auth: `none`
6076
6127
  - Stability: `stable`
@@ -6092,7 +6143,7 @@ List common workflow blueprints
6092
6143
 
6093
6144
  Emit one goal-level workflow plan
6094
6145
 
6095
- Plan the workflow before creating files or running side effects. Use this to choose a source, research, enrichment, and destination path for goals such as bulk outreach, account research, or signal outreach.
6146
+ Plan the workflow before creating files or running side effects. Use this to choose how records are sourced, landed in Smart Table, researched/operated on, and sent to the right engagement destination.
6096
6147
 
6097
6148
  - Auth: `none`
6098
6149
  - Stability: `stable`
@@ -6101,13 +6152,13 @@ Plan the workflow before creating files or running side effects. Use this to cho
6101
6152
  - Output modes: `json, ndjson, human`
6102
6153
  - Example:
6103
6154
  - `autotouch workflows plan [-h]
6104
- --type {bulk-outreach,company-table-to-people,table-to-outreach,research-to-sequence,agent-to-sequence,account-research,signal-outreach,website-visitors,list-build-to-table}
6155
+ --type {bulk-outreach,company-table-to-people,table-to-outreach,research-to-sequence,agent-to-sequence,agent-to-leads,account-research,signal-outreach,website-visitors,list-build-to-table}
6105
6156
  [--out-file OUT_FILE]
6106
6157
  [--output {json,ndjson,human}] [--compact]
6107
6158
  [--select SELECT |
6108
6159
  --json-pointer JSON_POINTER]`
6109
6160
  - Options:
6110
- - `--type` (required; kind=string; choices=bulk-outreach,company-table-to-people,table-to-outreach,research-to-sequence,agent-to-sequence,account-research,signal-outreach,website-visitors,list-build-to-table): Workflow blueprint type
6161
+ - `--type` (required; kind=string; choices=bulk-outreach,company-table-to-people,table-to-outreach,research-to-sequence,agent-to-sequence,agent-to-leads,account-research,signal-outreach,website-visitors,list-build-to-table): Workflow blueprint type
6111
6162
  - `--out-file` (kind=file; input=file): Save raw workflow payload to file
6112
6163
  - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
6113
6164
  - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
@@ -6125,13 +6176,13 @@ Alias for `workflows plan`
6125
6176
  - Output modes: `json, ndjson, human`
6126
6177
  - Example:
6127
6178
  - `autotouch workflows recipe [-h]
6128
- --type {bulk-outreach,company-table-to-people,table-to-outreach,research-to-sequence,agent-to-sequence,account-research,signal-outreach,website-visitors,list-build-to-table}
6179
+ --type {bulk-outreach,company-table-to-people,table-to-outreach,research-to-sequence,agent-to-sequence,agent-to-leads,account-research,signal-outreach,website-visitors,list-build-to-table}
6129
6180
  [--out-file OUT_FILE]
6130
6181
  [--output {json,ndjson,human}] [--compact]
6131
6182
  [--select SELECT |
6132
6183
  --json-pointer JSON_POINTER]`
6133
6184
  - Options:
6134
- - `--type` (required; kind=string; choices=bulk-outreach,company-table-to-people,table-to-outreach,research-to-sequence,agent-to-sequence,account-research,signal-outreach,website-visitors,list-build-to-table): Workflow blueprint type
6185
+ - `--type` (required; kind=string; choices=bulk-outreach,company-table-to-people,table-to-outreach,research-to-sequence,agent-to-sequence,agent-to-leads,account-research,signal-outreach,website-visitors,list-build-to-table): Workflow blueprint type
6135
6186
  - `--out-file` (kind=file; input=file): Save raw workflow payload to file
6136
6187
  - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
6137
6188
  - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
@@ -6149,13 +6200,13 @@ Emit ordered workflow files and commands for a blueprint
6149
6200
  - Output modes: `json, ndjson, human`
6150
6201
  - Example:
6151
6202
  - `autotouch workflows scaffold [-h]
6152
- --type {bulk-outreach,company-table-to-people,table-to-outreach,research-to-sequence,agent-to-sequence,account-research,signal-outreach,website-visitors,list-build-to-table}
6203
+ --type {bulk-outreach,company-table-to-people,table-to-outreach,research-to-sequence,agent-to-sequence,agent-to-leads,account-research,signal-outreach,website-visitors,list-build-to-table}
6153
6204
  [--out-dir OUT_DIR]
6154
6205
  [--output {json,ndjson,human}] [--compact]
6155
6206
  [--select SELECT |
6156
6207
  --json-pointer JSON_POINTER]`
6157
6208
  - Options:
6158
- - `--type` (required; kind=string; choices=bulk-outreach,company-table-to-people,table-to-outreach,research-to-sequence,agent-to-sequence,account-research,signal-outreach,website-visitors,list-build-to-table): Workflow blueprint type
6209
+ - `--type` (required; kind=string; choices=bulk-outreach,company-table-to-people,table-to-outreach,research-to-sequence,agent-to-sequence,agent-to-leads,account-research,signal-outreach,website-visitors,list-build-to-table): Workflow blueprint type
6159
6210
  - `--out-dir` (kind=string): Directory to save scaffold payload files
6160
6211
  - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
6161
6212
  - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON