autotouch-cli 0.2.28__tar.gz → 0.2.31__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 (21) hide show
  1. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/PKG-INFO +154 -23
  2. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/autotouch_cli/cli.py +924 -10
  3. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/autotouch_cli.egg-info/PKG-INFO +154 -23
  4. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/autotouch_cli.egg-info/SOURCES.txt +1 -0
  5. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/docs/research-table/reference/autotouch-cli.md +153 -22
  6. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/pyproject.toml +1 -1
  7. autotouch_cli-0.2.31/tests/test_column_prompt_compiler.py +178 -0
  8. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/autotouch_cli/__init__.py +0 -0
  9. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/autotouch_cli.egg-info/dependency_links.txt +0 -0
  10. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/autotouch_cli.egg-info/entry_points.txt +0 -0
  11. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/autotouch_cli.egg-info/requires.txt +0 -0
  12. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/autotouch_cli.egg-info/top_level.txt +0 -0
  13. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/setup.cfg +0 -0
  14. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/tests/test_contactout_custom.py +0 -0
  15. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/tests/test_contactout_integration.py +0 -0
  16. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/tests/test_contactout_multi_titles.py +0 -0
  17. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/tests/test_contactout_pipeline.py +0 -0
  18. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/tests/test_contactout_simple.py +0 -0
  19. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/tests/test_contactout_v2_bulk.py +0 -0
  20. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/tests/test_lead_required_fields.py +0 -0
  21. {autotouch_cli-0.2.28 → autotouch_cli-0.2.31}/tests/test_phone_provider_pipeline.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autotouch-cli
3
- Version: 0.2.28
3
+ Version: 0.2.31
4
4
  Summary: Autotouch Smart Table CLI
5
5
  Requires-Python: >=3.9
6
6
  Description-Content-Type: text/markdown
@@ -21,7 +21,7 @@ Use this order when you are orienting in the CLI:
21
21
  2. Use the API endpoint -> CLI command map when translating an existing API workflow.
22
22
  3. Use `autotouch columns recipe` before creating provider-backed workflow columns.
23
23
  4. Use `autotouch jobs get` as the source of truth for async run state.
24
- 5. Use `autotouch sequences ...` for sequence definitions, status changes, and direct enrollments; tasks still use raw HTTP.
24
+ 5. Use `autotouch sequences ...` for sequence definitions/enrollments and `autotouch tasks ...` for task queue work.
25
25
 
26
26
  ### Quick decision guide
27
27
 
@@ -39,17 +39,19 @@ Use this order when you are orienting in the CLI:
39
39
  | create/manage sequence definitions directly | `autotouch sequences recipe`, then `autotouch sequences create/update/activate` |
40
40
  | enroll leads directly into a sequence | `autotouch sequences enroll --sequence-id <SEQUENCE_ID> ...` |
41
41
  | enroll table rows into an existing sequence | `autotouch columns recipe --type add_to_sequence`, then `autotouch columns create` + `autotouch columns run` |
42
+ | seed org context from a company website | `autotouch onboarding submit-domain --website acme.com` |
43
+ | inspect or update org/personal value prop context | `autotouch org-context get/set`, `autotouch personal-context get/set`, `autotouch context resolved` |
42
44
  | create or update a CRM lead | `autotouch leads recipe --type create`, then `autotouch leads create` / `autotouch leads update` |
43
45
  | add email or phone contact info to a lead | `autotouch leads recipe --type contact_upsert`, then `autotouch leads upsert-contact-channels --lead-id <LEAD_ID> ...` |
44
46
  | bulk update lead status or owner | `autotouch leads update-status` / `autotouch leads reassign-owner` |
45
- | manage tasks directly | raw HTTP plus `docs/platform/external-workflows-api.md` |
47
+ | manage tasks directly | `autotouch tasks query`, `autotouch tasks get`, `autotouch tasks update`, `autotouch tasks draft` |
46
48
  | query/filter CRM leads and attached research | `autotouch leads query` then `autotouch leads research` |
47
49
 
48
50
  ### Operating model
49
51
 
50
52
  - This file is the full CLI reference and the package readme published to PyPI.
51
53
  - The installed package gives you CLI entrypoints and package metadata; do not assume there is a separate installed docs directory.
52
- - Research-table APIs, sequence commands, and lead create/query/update operations are the primary CLI surface today; direct task management is still HTTP-first.
54
+ - Research-table APIs, sequence commands, lead create/query/update operations, and public task-queue workflows are first-class CLI surface areas today.
53
55
  - For async operations, backend bulk-job state is authoritative; local terminal output is only a convenience layer.
54
56
  - For staged or cost-sensitive runs, estimate first and prefer filtered scopes plus `firstN` or `run-next`.
55
57
 
@@ -69,6 +71,13 @@ Developer keys and scopes are identical to raw API usage (`stk_...`, same scope
69
71
  autotouch auth set-key --api-key stk_... --base-url https://app.autotouch.ai
70
72
  autotouch auth check
71
73
  autotouch auth show
74
+ autotouch auth whoami
75
+ ```
76
+
77
+ For user/admin endpoints like onboarding, org context, and personal context, sign in with a user session too:
78
+
79
+ ```bash
80
+ autotouch auth login --email ada@yourcompany.com
72
81
  ```
73
82
 
74
83
  Credentials are stored in `~/.config/autotouch/config.json` by default.
@@ -82,28 +91,46 @@ Developer key scope reference (including workflow scopes like `sequences:*` and
82
91
  If an agent/user does not have an account + developer key yet, bootstrap both in one call:
83
92
 
84
93
  ```bash
85
- curl -X POST "https://app.autotouch.ai/api/auth/agent-bootstrap" \
86
- -H "Content-Type: application/json" \
87
- -d '{
88
- "first_name": "Ada",
89
- "last_name": "Lovelace",
90
- "email": "ada@yourcompany.com",
91
- "password": "use-a-strong-random-password",
92
- "organization_name": "Your Company",
93
- "key_name": "Agent bootstrap key"
94
- }'
94
+ autotouch auth bootstrap \
95
+ --first-name Ada \
96
+ --last-name Lovelace \
97
+ --email ada@yourcompany.com \
98
+ --password 'use-a-strong-random-password' \
99
+ --organization-name "Your Company" \
100
+ --save-key
95
101
  ```
96
102
 
97
- Then store the returned `apiKey`:
103
+ Or pass a full payload file:
98
104
 
99
105
  ```bash
100
- autotouch auth set-key --api-key stk_... --base-url https://app.autotouch.ai
101
- autotouch auth check
106
+ autotouch auth bootstrap --data-file bootstrap.json --save-key
102
107
  ```
103
108
 
104
109
  Notes:
105
110
  - New orgs created through signup/bootstrap start with `50` credits.
111
+ - `--save-key` stores the returned `apiKey` and also signs in the same user so the saved config has both the developer key and the user session.
106
112
  - Identity linking is email-based: later human sign-in with the same normalized email maps to the same user/org.
113
+ - `auth whoami` shows which user/org the saved session belongs to.
114
+
115
+ ## Onboarding and context
116
+
117
+ Recommended setup for agent-mode LLM enrichment:
118
+
119
+ ```bash
120
+ autotouch auth login --email ada@yourcompany.com
121
+ autotouch onboarding submit-domain --website yourcompany.com
122
+ autotouch org-context get
123
+ autotouch personal-context get
124
+ autotouch context resolved
125
+ ```
126
+
127
+ Notes:
128
+ - `submit-domain` seeds organization context from the company website.
129
+ - `org-context set` is where you refine value proposition, ideal titles, buyer persona, user persona, and voice profile.
130
+ - `personal-context set` is where you refine rep-specific title, territories, personal value proposition, and personal voice profile.
131
+ - `context resolved` shows the effective requester context the enrichment/runtime layer will actually use after org + personal overrides.
132
+ - Agent-mode prompt generation and compiled LLM enrichment prompts always include requester/company context.
133
+ - Basic mode stays manual-prompt-first; write the prompt directly based on the user goal/preferences and include explicit placeholders when row data should be referenced.
107
134
 
108
135
  ## API endpoint -> CLI command map
109
136
 
@@ -170,7 +197,26 @@ Notes:
170
197
  | `POST /api/webhook-subscriptions/{subscription_id}/resume` | `autotouch webhooks subscriptions resume --subscription-id <SUBSCRIPTION_ID>` |
171
198
  | `POST /api/webhook-subscriptions/{subscription_id}/rotate-secret` | `autotouch webhooks subscriptions rotate-secret --subscription-id <SUBSCRIPTION_ID>` |
172
199
  | `POST /api/webhook-subscriptions/{subscription_id}/test` | `autotouch webhooks subscriptions test --subscription-id <SUBSCRIPTION_ID>` |
173
- | `POST /api/auth/agent-bootstrap` | HTTP-only bootstrap (no direct CLI wrapper yet) |
200
+ | `POST /api/auth/agent-bootstrap` | `autotouch auth bootstrap --data-file bootstrap.json --save-key` |
201
+ | `POST /api/auth/login` | `autotouch auth login --email ada@yourcompany.com` |
202
+ | `POST /api/onboarding/submit-domain` | `autotouch onboarding submit-domain --website yourcompany.com` |
203
+ | `GET /api/org/context` | `autotouch org-context get` |
204
+ | `POST /api/org/context` | `autotouch org-context set --data-file org-context.json` |
205
+ | `GET /api/onboarding/personal-context` | `autotouch personal-context get` |
206
+ | `POST /api/onboarding/personal-context` | `autotouch personal-context set --data-file personal-context.json` |
207
+ | `GET /api/llm/company-context` | `autotouch context resolved` |
208
+ | `POST /api/task-queue/query` | `autotouch tasks query --data-file task-query.json` |
209
+ | `POST /api/task-queue/query/count` | `autotouch tasks count --data-file task-query.json` |
210
+ | `POST /api/task-queue/assignee-counts` | `autotouch tasks assignee-counts --data-file task-query.json` |
211
+ | `GET /api/task-queue/{task_id}` | `autotouch tasks get --task-id <TASK_ID>` |
212
+ | `GET /api/task-queue/stats/summary` | `autotouch tasks stats` |
213
+ | `POST /api/task-queue/create` | `autotouch tasks create --data-file task-create.json --actor-user-id <USER_ID>` |
214
+ | `PUT /api/task-queue/{task_id}` | `autotouch tasks update --task-id <TASK_ID> --data-file task-update.json --actor-user-id <USER_ID>` |
215
+ | `DELETE /api/task-queue/{task_id}` | `autotouch tasks delete --task-id <TASK_ID> --actor-user-id <USER_ID>` |
216
+ | `POST /api/task-queue/bulk-update` | `autotouch tasks bulk-update --data-file task-bulk-update.json --actor-user-id <USER_ID>` |
217
+ | `POST /api/task-queue/bulk-delete` | `autotouch tasks bulk-delete --data-file task-bulk-delete.json --actor-user-id <USER_ID>` |
218
+ | `POST /api/task-queue/{task_id}/draft` | `autotouch tasks draft --task-id <TASK_ID> --force --actor-user-id <USER_ID>` |
219
+ | `POST /api/task-queue/{task_id}/email/schedule` | `autotouch tasks schedule-email --task-id <TASK_ID> --data-file schedule.json --actor-user-id <USER_ID>` |
174
220
 
175
221
  ## Delete column
176
222
 
@@ -188,7 +234,6 @@ autotouch columns delete --table-id <TABLE_ID> --column-id <COLUMN_ID> --yes
188
234
  ## Sequence commands
189
235
 
190
236
  The CLI now exposes the public Sequences endpoints under `autotouch sequences`.
191
- Tasks still use raw HTTP plus `docs/platform/external-workflows-api.md`.
192
237
 
193
238
  Common commands:
194
239
  - `autotouch sequences recipe --type create --out-file sequence.json`
@@ -215,7 +260,6 @@ Important contract notes:
215
260
  - `autotouch sequences enroll --wait` polls `/api/bulk-jobs/{job_id}` and preserves the API response `task_id` as the bulk job id.
216
261
  - Research-table `add_to_sequence` is still available through `autotouch columns create/update/run` and still targets an existing sequence.
217
262
  - Real enrollment requires the target sequence to be `ACTIVE` unless direct enroll uses `reviewOnly=true`.
218
- - Tasks remain HTTP-only.
219
263
 
220
264
  AI draft outputs:
221
265
  - Manual new email: subject + body
@@ -379,6 +423,60 @@ autotouch leads filters-metadata
379
423
  autotouch leads research-tables
380
424
  ```
381
425
 
426
+ ## Task commands
427
+
428
+ The CLI now exposes the public task queue endpoints under `autotouch tasks`.
429
+
430
+ Use this pattern:
431
+
432
+ 1. `autotouch tasks query` to page through tasks with the same `TaskQueryRequest` payload used by the API.
433
+ 2. `autotouch tasks get` when you need one fully hydrated task by id.
434
+ 3. `autotouch tasks create` for direct task creation from a JSON payload.
435
+ 4. `autotouch tasks update` / `autotouch tasks bulk-update` for task status, owner, due date, and content changes.
436
+ 5. `autotouch tasks draft` when you need just-in-time AI generation for a manual-capable task.
437
+ 6. `autotouch tasks schedule-email` to schedule or immediately send a personal/manual email task.
438
+ 7. `autotouch tasks delete` / `autotouch tasks bulk-delete` to soft-delete tasks by marking them skipped.
439
+
440
+ Important contract notes:
441
+ - Mutating task commands accept `--actor-user-id` for developer-key actor resolution.
442
+ - Query/count/assignee-counts use the backend `TaskQueryRequest` JSON shape directly.
443
+ - `draft` supports `--force` if you want to re-generate content even when a task already has content.
444
+ - `schedule-email` expects the same payload as `POST /api/task-queue/{task_id}/email/schedule`.
445
+ - AI draft outputs follow the same step behavior as sequences:
446
+ - manual new email: subject + body
447
+ - manual reply email: reply body
448
+ - LinkedIn connect: connection note
449
+ - LinkedIn message: message copy
450
+ - call: call script
451
+
452
+ Examples:
453
+
454
+ ```bash
455
+ autotouch tasks query --data-file task-query.json
456
+ autotouch tasks count --data-file task-query.json
457
+ autotouch tasks assignee-counts --data-file task-query.json
458
+ ```
459
+
460
+ ```bash
461
+ autotouch tasks get --task-id <TASK_ID>
462
+ autotouch tasks stats
463
+ ```
464
+
465
+ ```bash
466
+ autotouch tasks create --data-file task-create.json --actor-user-id <USER_ID>
467
+ autotouch tasks update --task-id <TASK_ID> --data-file task-update.json --actor-user-id <USER_ID>
468
+ ```
469
+
470
+ ```bash
471
+ autotouch tasks draft --task-id <TASK_ID> --force --actor-user-id <USER_ID>
472
+ autotouch tasks schedule-email --task-id <TASK_ID> --data-file schedule.json --actor-user-id <USER_ID>
473
+ ```
474
+
475
+ ```bash
476
+ autotouch tasks bulk-update --data-file task-bulk-update.json --actor-user-id <USER_ID>
477
+ autotouch tasks bulk-delete --data-file task-bulk-delete.json --actor-user-id <USER_ID>
478
+ ```
479
+
382
480
  ## Bulk job status contract (authoritative run state)
383
481
 
384
482
  Use bulk jobs as the source of truth for run lifecycle:
@@ -496,6 +594,8 @@ Recommendation:
496
594
 
497
595
  ### 4) `llm_enrichment`
498
596
 
597
+ Recommended for `agent` mode: use `instructions` and let the API compile the runnable prompt. In `basic` mode, write the prompt directly and keep it tailored to the user goal/preferences.
598
+
499
599
  `llm-enrichment.json`:
500
600
 
501
601
  ```json
@@ -507,17 +607,48 @@ Recommendation:
507
607
  "origin": "ai",
508
608
  "autoRun": "never",
509
609
  "config": {
510
- "prompt": "Research this company and return JSON with icp_fit, summary, and risks.",
610
+ "instructions": "Research the company in this row and return JSON with icp_fit, summary, and risks.",
511
611
  "mode": "agent",
512
612
  "temperature": 0.7,
513
613
  "batchSize": 50,
514
- "promptSource": "manual",
614
+ "promptSource": "generated",
615
+ "useCompanyContext": true,
515
616
  "structuredOutput": true,
516
617
  "useAutoSchema": true
517
618
  }
518
619
  }
519
620
  ```
520
621
 
622
+ Notes:
623
+ - In `agent` mode, `instructions` is the recommended authoring surface.
624
+ - The API compiles those instructions into the stored runnable prompt on create/update.
625
+ - Company/requester context is always enabled for generated `agent`-mode prompts.
626
+ - In `basic` mode, the recommended path is a hand-authored prompt. Use explicit placeholders like `{{company_name}}`, `{{domain}}`, or requester context placeholders from `autotouch context resolved` when the prompt should reference row/requester data.
627
+
628
+ Prompt variables:
629
+ - Row variables come from the current table row, for example `{{company_name}}`, `{{domain}}`, `{{first_name}}`, `{{linkedin_url}}`.
630
+ - Requester/company-context variables come from onboarding + org/personal context, for example `{{user_company_name}}`, `{{user_value_proposition}}`, `{{buyer_persona}}`, `{{user_persona}}`.
631
+ - The runtime only injects variables that the prompt explicitly references. If the prompt needs row/context data, include those `{{...}}` placeholders directly.
632
+ - Use `autotouch context resolved` to inspect the requester/company-context variables available for the current user/session.
633
+
634
+ Basic-mode example:
635
+
636
+ ```json
637
+ {
638
+ "key": "fit_summary",
639
+ "label": "Fit Summary",
640
+ "kind": "enrichment",
641
+ "dataType": "text",
642
+ "origin": "ai",
643
+ "autoRun": "never",
644
+ "config": {
645
+ "mode": "basic",
646
+ "prompt": "Write a short fit summary for {{company_name}} (website {{domain}}) and explain why it matches {{user_value_proposition}}.",
647
+ "useCompanyContext": true
648
+ }
649
+ }
650
+ ```
651
+
521
652
  If you provide a custom schema, use strict Schema V2 field-map shape:
522
653
 
523
654
  ```json
@@ -738,7 +869,7 @@ Sequence creation note:
738
869
  - The CLI can create/update/activate sequence definitions directly with `autotouch sequences ...`.
739
870
  - Research-table `add_to_sequence` columns and direct `autotouch sequences enroll` both target an existing sequence.
740
871
  - Real enrollment still requires that sequence to be `ACTIVE` unless direct enroll uses `reviewOnly=true`.
741
- - Tasks still use raw HTTP.
872
+ - Downstream task queue work is available through `autotouch tasks ...`.
742
873
 
743
874
  ## Safe run patterns (`firstN` + `--unprocessed-only`)
744
875