autotouch-cli 0.2.18__tar.gz → 0.2.20__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.
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/PKG-INFO +99 -1
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/autotouch_cli.egg-info/PKG-INFO +99 -1
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/docs/research-table/reference/autotouch-cli-pypi.md +98 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/pyproject.toml +1 -1
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/smart_table_cli.py +7 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/autotouch_cli.egg-info/SOURCES.txt +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/autotouch_cli.egg-info/dependency_links.txt +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/autotouch_cli.egg-info/entry_points.txt +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/autotouch_cli.egg-info/requires.txt +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/autotouch_cli.egg-info/top_level.txt +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/__init__.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/add_column_unique_index.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/attach_csv_import_leads_to_research_table.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/bundle_sequences_backend.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/check_agent_traces.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/check_column_mode.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/exit_terminal_leads_from_sequences.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/fetch_lead.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/fix_lead_titles_from_csv.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250106_add_column_position.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250108_fix_legacy_column_fields.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250109_add_user_fields_to_tables.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250117_add_call_logs_webhook_indexes.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250117_rename_call_logs_collection.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250119_create_leads_unique_email_index.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250123_add_filter_indexes.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250123_add_llm_responses_collection.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250128_migrate_user_ids_to_objectid.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250208_backfill_task_research_values.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250604_add_origin_indexes.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250608_cleanup_agent_metadata.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250608_rename_agent_metadata_to_metadata.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250922_add_activity_indexes.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250926_migrate_single_to_arrays.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250928_add_missing_timestamp_fields.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250929_add_task_join_indexes.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250929_add_task_join_indexes_safe.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250929_create_shared_phone_cache.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20251007_add_rows_position_id_index.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20251109_add_ttl_for_llm_and_preview_traces.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20260113_normalize_table_filter_operators.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20260113_set_user_permissions_user_admin.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20260204_sync_lead_owner_from_tasks.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20260303_add_webhook_subscription_collections.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/migrate_org_user_credits.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/set_default_lead_status.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/update_lead_owner_from_tasks.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/reassign_sequence_owner.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/run_sidecar_orchestrator_demo.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/test_crm_company_policy.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/test_sequences_instantly_e2e.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/test_sequences_personal_e2e.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/test_task_error_logger.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/verify_azurite_voicemail.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/setup.cfg +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/tests/test_contactout_custom.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/tests/test_contactout_integration.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/tests/test_contactout_multi_titles.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/tests/test_contactout_pipeline.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/tests/test_contactout_simple.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/tests/test_contactout_v2_bulk.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/tests/test_lead_required_fields.py +0 -0
- {autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/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.
|
|
3
|
+
Version: 0.2.20
|
|
4
4
|
Summary: Autotouch Smart Table CLI
|
|
5
5
|
Requires-Python: >=3.9
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -163,6 +163,38 @@ Notes:
|
|
|
163
163
|
- `add_to_sequence` requires:
|
|
164
164
|
- `sequenceId`
|
|
165
165
|
- `sourceLeadColumn` pointing to a lead-id producing column (`add_to_crm` or `lead_finder` output)
|
|
166
|
+
- auto-attaches research context defaults during enrollment (`source_table_id`, plus optional table name); favorite fields resolve from current starred columns when explicit `fieldIds` are not provided
|
|
167
|
+
|
|
168
|
+
If you create custom `llm_enrichment` schemas:
|
|
169
|
+
- Use strict field-map schema shape (no root `type/properties` wrapper).
|
|
170
|
+
- Arrays must be explicit `{"type":"array","items":...}`.
|
|
171
|
+
- Avoid legacy/list schema values like `["string"]` or `[{...}]`.
|
|
172
|
+
- Prefer snake_case schema keys in payloads: `response_schema`, `user_schema`, `use_auto_schema`.
|
|
173
|
+
|
|
174
|
+
## Parse enrichment outputs safely (important for agents)
|
|
175
|
+
|
|
176
|
+
Use a layered rule:
|
|
177
|
+
|
|
178
|
+
1. Always inspect raw outputs first (sample at least 3 rows).
|
|
179
|
+
2. Parse by column `dataType`:
|
|
180
|
+
- `json`: use key precedence below.
|
|
181
|
+
- scalar types (`text`, `number`, `date`, `boolean`, `email`, `url`): parse direct value (no JSON key paths).
|
|
182
|
+
3. Only then publish found/missing counts.
|
|
183
|
+
|
|
184
|
+
Do not rely on a single key for JSON outputs.
|
|
185
|
+
|
|
186
|
+
- Phone extraction precedence: `mobile_number` -> `phone_numbers[0].number` -> `primary_phone`
|
|
187
|
+
- Email extraction precedence: `response` -> `email` -> `work_email`
|
|
188
|
+
|
|
189
|
+
If path A is missing, continue to B/C before declaring `not_found`.
|
|
190
|
+
|
|
191
|
+
JSON split note:
|
|
192
|
+
- Optional by default.
|
|
193
|
+
- Use only when downstream filters/mappings need stable flat keys.
|
|
194
|
+
|
|
195
|
+
Reference:
|
|
196
|
+
- `docs/research-table/guides/context-first-sequence-playbook.md`
|
|
197
|
+
- `docs/research-table/reference/runbooks/context-first-sequence.json`
|
|
166
198
|
|
|
167
199
|
## Recommended ICP buyer discovery pattern
|
|
168
200
|
|
|
@@ -195,6 +227,72 @@ Important:
|
|
|
195
227
|
- These workflow routes support `actorUserId` query parameter.
|
|
196
228
|
- External sequence validation rules (manual vs automated vs AI draft constraints) are documented in the workflow reference above.
|
|
197
229
|
|
|
230
|
+
### Sequence step types and rules (quick reference)
|
|
231
|
+
|
|
232
|
+
Supported step kinds:
|
|
233
|
+
- `EMAIL`
|
|
234
|
+
- `CALL`
|
|
235
|
+
- `LINKEDIN`
|
|
236
|
+
- `LINKEDIN_CONNECT`
|
|
237
|
+
- `LINKEDIN_MESSAGE`
|
|
238
|
+
- `CUSTOM`
|
|
239
|
+
|
|
240
|
+
Email send modes:
|
|
241
|
+
- `AUTOMATED`
|
|
242
|
+
- `MANUAL`
|
|
243
|
+
|
|
244
|
+
External API validation rules:
|
|
245
|
+
- First email step cannot be reply (`first_email_reply_not_allowed`).
|
|
246
|
+
- Bulk mode cannot include manual email steps (`bulk_manual_email_not_allowed`).
|
|
247
|
+
- `aiDraft` is only allowed on manual-capable steps:
|
|
248
|
+
- `CALL`, `CUSTOM`, `LINKEDIN`, `LINKEDIN_CONNECT`, `LINKEDIN_MESSAGE`
|
|
249
|
+
- `EMAIL` only when `emailSendMode=MANUAL`
|
|
250
|
+
- `defaultAppendSignature` (sequence-level, optional) sets default signature behavior for email steps.
|
|
251
|
+
- `steps[].appendSignature` (step-level, optional) overrides signature behavior per email step.
|
|
252
|
+
|
|
253
|
+
Runtime behavior:
|
|
254
|
+
- `EMAIL + AUTOMATED` is sent by scheduler/provider flow.
|
|
255
|
+
- Manual/non-automated steps are created as Tasks for rep execution.
|
|
256
|
+
|
|
257
|
+
Minimal mixed-step example:
|
|
258
|
+
|
|
259
|
+
```json
|
|
260
|
+
{
|
|
261
|
+
"name": "Outbound v1",
|
|
262
|
+
"sourceTableId": "tbl_123",
|
|
263
|
+
"defaultAppendSignature": true,
|
|
264
|
+
"steps": [
|
|
265
|
+
{
|
|
266
|
+
"id": "s1",
|
|
267
|
+
"kind": "EMAIL",
|
|
268
|
+
"emailSendMode": "AUTOMATED",
|
|
269
|
+
"emailIsReply": false,
|
|
270
|
+
"appendSignature": true,
|
|
271
|
+
"subjectTemplate": "Quick intro",
|
|
272
|
+
"bodyTemplate": "Hi {{first_name}}, ..."
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"id": "s2",
|
|
276
|
+
"kind": "CALL",
|
|
277
|
+
"waitDays": 2,
|
|
278
|
+
"aiDraft": true
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"id": "s3",
|
|
282
|
+
"kind": "EMAIL",
|
|
283
|
+
"waitDays": 4,
|
|
284
|
+
"emailSendMode": "MANUAL",
|
|
285
|
+
"emailIsReply": false,
|
|
286
|
+
"appendSignature": false,
|
|
287
|
+
"aiDraft": true
|
|
288
|
+
}
|
|
289
|
+
]
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
Canonical contract:
|
|
294
|
+
- `docs/platform/external-workflows-api.md`
|
|
295
|
+
|
|
198
296
|
## Outbound webhook subscriptions
|
|
199
297
|
|
|
200
298
|
Use webhook subscriptions to receive customer-facing event notifications.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: autotouch-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.20
|
|
4
4
|
Summary: Autotouch Smart Table CLI
|
|
5
5
|
Requires-Python: >=3.9
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -163,6 +163,38 @@ Notes:
|
|
|
163
163
|
- `add_to_sequence` requires:
|
|
164
164
|
- `sequenceId`
|
|
165
165
|
- `sourceLeadColumn` pointing to a lead-id producing column (`add_to_crm` or `lead_finder` output)
|
|
166
|
+
- auto-attaches research context defaults during enrollment (`source_table_id`, plus optional table name); favorite fields resolve from current starred columns when explicit `fieldIds` are not provided
|
|
167
|
+
|
|
168
|
+
If you create custom `llm_enrichment` schemas:
|
|
169
|
+
- Use strict field-map schema shape (no root `type/properties` wrapper).
|
|
170
|
+
- Arrays must be explicit `{"type":"array","items":...}`.
|
|
171
|
+
- Avoid legacy/list schema values like `["string"]` or `[{...}]`.
|
|
172
|
+
- Prefer snake_case schema keys in payloads: `response_schema`, `user_schema`, `use_auto_schema`.
|
|
173
|
+
|
|
174
|
+
## Parse enrichment outputs safely (important for agents)
|
|
175
|
+
|
|
176
|
+
Use a layered rule:
|
|
177
|
+
|
|
178
|
+
1. Always inspect raw outputs first (sample at least 3 rows).
|
|
179
|
+
2. Parse by column `dataType`:
|
|
180
|
+
- `json`: use key precedence below.
|
|
181
|
+
- scalar types (`text`, `number`, `date`, `boolean`, `email`, `url`): parse direct value (no JSON key paths).
|
|
182
|
+
3. Only then publish found/missing counts.
|
|
183
|
+
|
|
184
|
+
Do not rely on a single key for JSON outputs.
|
|
185
|
+
|
|
186
|
+
- Phone extraction precedence: `mobile_number` -> `phone_numbers[0].number` -> `primary_phone`
|
|
187
|
+
- Email extraction precedence: `response` -> `email` -> `work_email`
|
|
188
|
+
|
|
189
|
+
If path A is missing, continue to B/C before declaring `not_found`.
|
|
190
|
+
|
|
191
|
+
JSON split note:
|
|
192
|
+
- Optional by default.
|
|
193
|
+
- Use only when downstream filters/mappings need stable flat keys.
|
|
194
|
+
|
|
195
|
+
Reference:
|
|
196
|
+
- `docs/research-table/guides/context-first-sequence-playbook.md`
|
|
197
|
+
- `docs/research-table/reference/runbooks/context-first-sequence.json`
|
|
166
198
|
|
|
167
199
|
## Recommended ICP buyer discovery pattern
|
|
168
200
|
|
|
@@ -195,6 +227,72 @@ Important:
|
|
|
195
227
|
- These workflow routes support `actorUserId` query parameter.
|
|
196
228
|
- External sequence validation rules (manual vs automated vs AI draft constraints) are documented in the workflow reference above.
|
|
197
229
|
|
|
230
|
+
### Sequence step types and rules (quick reference)
|
|
231
|
+
|
|
232
|
+
Supported step kinds:
|
|
233
|
+
- `EMAIL`
|
|
234
|
+
- `CALL`
|
|
235
|
+
- `LINKEDIN`
|
|
236
|
+
- `LINKEDIN_CONNECT`
|
|
237
|
+
- `LINKEDIN_MESSAGE`
|
|
238
|
+
- `CUSTOM`
|
|
239
|
+
|
|
240
|
+
Email send modes:
|
|
241
|
+
- `AUTOMATED`
|
|
242
|
+
- `MANUAL`
|
|
243
|
+
|
|
244
|
+
External API validation rules:
|
|
245
|
+
- First email step cannot be reply (`first_email_reply_not_allowed`).
|
|
246
|
+
- Bulk mode cannot include manual email steps (`bulk_manual_email_not_allowed`).
|
|
247
|
+
- `aiDraft` is only allowed on manual-capable steps:
|
|
248
|
+
- `CALL`, `CUSTOM`, `LINKEDIN`, `LINKEDIN_CONNECT`, `LINKEDIN_MESSAGE`
|
|
249
|
+
- `EMAIL` only when `emailSendMode=MANUAL`
|
|
250
|
+
- `defaultAppendSignature` (sequence-level, optional) sets default signature behavior for email steps.
|
|
251
|
+
- `steps[].appendSignature` (step-level, optional) overrides signature behavior per email step.
|
|
252
|
+
|
|
253
|
+
Runtime behavior:
|
|
254
|
+
- `EMAIL + AUTOMATED` is sent by scheduler/provider flow.
|
|
255
|
+
- Manual/non-automated steps are created as Tasks for rep execution.
|
|
256
|
+
|
|
257
|
+
Minimal mixed-step example:
|
|
258
|
+
|
|
259
|
+
```json
|
|
260
|
+
{
|
|
261
|
+
"name": "Outbound v1",
|
|
262
|
+
"sourceTableId": "tbl_123",
|
|
263
|
+
"defaultAppendSignature": true,
|
|
264
|
+
"steps": [
|
|
265
|
+
{
|
|
266
|
+
"id": "s1",
|
|
267
|
+
"kind": "EMAIL",
|
|
268
|
+
"emailSendMode": "AUTOMATED",
|
|
269
|
+
"emailIsReply": false,
|
|
270
|
+
"appendSignature": true,
|
|
271
|
+
"subjectTemplate": "Quick intro",
|
|
272
|
+
"bodyTemplate": "Hi {{first_name}}, ..."
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"id": "s2",
|
|
276
|
+
"kind": "CALL",
|
|
277
|
+
"waitDays": 2,
|
|
278
|
+
"aiDraft": true
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"id": "s3",
|
|
282
|
+
"kind": "EMAIL",
|
|
283
|
+
"waitDays": 4,
|
|
284
|
+
"emailSendMode": "MANUAL",
|
|
285
|
+
"emailIsReply": false,
|
|
286
|
+
"appendSignature": false,
|
|
287
|
+
"aiDraft": true
|
|
288
|
+
}
|
|
289
|
+
]
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
Canonical contract:
|
|
294
|
+
- `docs/platform/external-workflows-api.md`
|
|
295
|
+
|
|
198
296
|
## Outbound webhook subscriptions
|
|
199
297
|
|
|
200
298
|
Use webhook subscriptions to receive customer-facing event notifications.
|
{autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/docs/research-table/reference/autotouch-cli-pypi.md
RENAMED
|
@@ -154,6 +154,38 @@ Notes:
|
|
|
154
154
|
- `add_to_sequence` requires:
|
|
155
155
|
- `sequenceId`
|
|
156
156
|
- `sourceLeadColumn` pointing to a lead-id producing column (`add_to_crm` or `lead_finder` output)
|
|
157
|
+
- auto-attaches research context defaults during enrollment (`source_table_id`, plus optional table name); favorite fields resolve from current starred columns when explicit `fieldIds` are not provided
|
|
158
|
+
|
|
159
|
+
If you create custom `llm_enrichment` schemas:
|
|
160
|
+
- Use strict field-map schema shape (no root `type/properties` wrapper).
|
|
161
|
+
- Arrays must be explicit `{"type":"array","items":...}`.
|
|
162
|
+
- Avoid legacy/list schema values like `["string"]` or `[{...}]`.
|
|
163
|
+
- Prefer snake_case schema keys in payloads: `response_schema`, `user_schema`, `use_auto_schema`.
|
|
164
|
+
|
|
165
|
+
## Parse enrichment outputs safely (important for agents)
|
|
166
|
+
|
|
167
|
+
Use a layered rule:
|
|
168
|
+
|
|
169
|
+
1. Always inspect raw outputs first (sample at least 3 rows).
|
|
170
|
+
2. Parse by column `dataType`:
|
|
171
|
+
- `json`: use key precedence below.
|
|
172
|
+
- scalar types (`text`, `number`, `date`, `boolean`, `email`, `url`): parse direct value (no JSON key paths).
|
|
173
|
+
3. Only then publish found/missing counts.
|
|
174
|
+
|
|
175
|
+
Do not rely on a single key for JSON outputs.
|
|
176
|
+
|
|
177
|
+
- Phone extraction precedence: `mobile_number` -> `phone_numbers[0].number` -> `primary_phone`
|
|
178
|
+
- Email extraction precedence: `response` -> `email` -> `work_email`
|
|
179
|
+
|
|
180
|
+
If path A is missing, continue to B/C before declaring `not_found`.
|
|
181
|
+
|
|
182
|
+
JSON split note:
|
|
183
|
+
- Optional by default.
|
|
184
|
+
- Use only when downstream filters/mappings need stable flat keys.
|
|
185
|
+
|
|
186
|
+
Reference:
|
|
187
|
+
- `docs/research-table/guides/context-first-sequence-playbook.md`
|
|
188
|
+
- `docs/research-table/reference/runbooks/context-first-sequence.json`
|
|
157
189
|
|
|
158
190
|
## Recommended ICP buyer discovery pattern
|
|
159
191
|
|
|
@@ -186,6 +218,72 @@ Important:
|
|
|
186
218
|
- These workflow routes support `actorUserId` query parameter.
|
|
187
219
|
- External sequence validation rules (manual vs automated vs AI draft constraints) are documented in the workflow reference above.
|
|
188
220
|
|
|
221
|
+
### Sequence step types and rules (quick reference)
|
|
222
|
+
|
|
223
|
+
Supported step kinds:
|
|
224
|
+
- `EMAIL`
|
|
225
|
+
- `CALL`
|
|
226
|
+
- `LINKEDIN`
|
|
227
|
+
- `LINKEDIN_CONNECT`
|
|
228
|
+
- `LINKEDIN_MESSAGE`
|
|
229
|
+
- `CUSTOM`
|
|
230
|
+
|
|
231
|
+
Email send modes:
|
|
232
|
+
- `AUTOMATED`
|
|
233
|
+
- `MANUAL`
|
|
234
|
+
|
|
235
|
+
External API validation rules:
|
|
236
|
+
- First email step cannot be reply (`first_email_reply_not_allowed`).
|
|
237
|
+
- Bulk mode cannot include manual email steps (`bulk_manual_email_not_allowed`).
|
|
238
|
+
- `aiDraft` is only allowed on manual-capable steps:
|
|
239
|
+
- `CALL`, `CUSTOM`, `LINKEDIN`, `LINKEDIN_CONNECT`, `LINKEDIN_MESSAGE`
|
|
240
|
+
- `EMAIL` only when `emailSendMode=MANUAL`
|
|
241
|
+
- `defaultAppendSignature` (sequence-level, optional) sets default signature behavior for email steps.
|
|
242
|
+
- `steps[].appendSignature` (step-level, optional) overrides signature behavior per email step.
|
|
243
|
+
|
|
244
|
+
Runtime behavior:
|
|
245
|
+
- `EMAIL + AUTOMATED` is sent by scheduler/provider flow.
|
|
246
|
+
- Manual/non-automated steps are created as Tasks for rep execution.
|
|
247
|
+
|
|
248
|
+
Minimal mixed-step example:
|
|
249
|
+
|
|
250
|
+
```json
|
|
251
|
+
{
|
|
252
|
+
"name": "Outbound v1",
|
|
253
|
+
"sourceTableId": "tbl_123",
|
|
254
|
+
"defaultAppendSignature": true,
|
|
255
|
+
"steps": [
|
|
256
|
+
{
|
|
257
|
+
"id": "s1",
|
|
258
|
+
"kind": "EMAIL",
|
|
259
|
+
"emailSendMode": "AUTOMATED",
|
|
260
|
+
"emailIsReply": false,
|
|
261
|
+
"appendSignature": true,
|
|
262
|
+
"subjectTemplate": "Quick intro",
|
|
263
|
+
"bodyTemplate": "Hi {{first_name}}, ..."
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"id": "s2",
|
|
267
|
+
"kind": "CALL",
|
|
268
|
+
"waitDays": 2,
|
|
269
|
+
"aiDraft": true
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"id": "s3",
|
|
273
|
+
"kind": "EMAIL",
|
|
274
|
+
"waitDays": 4,
|
|
275
|
+
"emailSendMode": "MANUAL",
|
|
276
|
+
"emailIsReply": false,
|
|
277
|
+
"appendSignature": false,
|
|
278
|
+
"aiDraft": true
|
|
279
|
+
}
|
|
280
|
+
]
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
Canonical contract:
|
|
285
|
+
- `docs/platform/external-workflows-api.md`
|
|
286
|
+
|
|
189
287
|
## Outbound webhook subscriptions
|
|
190
288
|
|
|
191
289
|
Use webhook subscriptions to receive customer-facing event notifications.
|
|
@@ -51,6 +51,7 @@ TERMINAL_JOB_STATUSES = {
|
|
|
51
51
|
"completed",
|
|
52
52
|
"partial",
|
|
53
53
|
"error",
|
|
54
|
+
"timed_out",
|
|
54
55
|
"cancelled",
|
|
55
56
|
"failed",
|
|
56
57
|
"completed_with_errors",
|
|
@@ -246,16 +247,22 @@ COLUMN_RECIPE_NOTES: Dict[str, List[str]] = {
|
|
|
246
247
|
RUN_SOP_GUIDE: Dict[str, Any] = {
|
|
247
248
|
"title": "Credit-safe enrichment SOP",
|
|
248
249
|
"rules": [
|
|
250
|
+
"Use --output json for automation; avoid parsing human-format output.",
|
|
249
251
|
"Filter first before running billable columns.",
|
|
250
252
|
"Estimate first with the same payload you plan to run.",
|
|
251
253
|
"Start with a small firstN pilot before scaling.",
|
|
252
254
|
"For exact bounded batches, prefer run-next with a small count.",
|
|
253
255
|
"For add_to_crm, generate payload from columns recipe before create/update.",
|
|
254
256
|
"Keep unprocessedOnly enabled unless you intentionally reprocess rows.",
|
|
257
|
+
"Treat bulk job state as source of truth: queued/distributing/processing are non-terminal; completed/partial/error/cancelled are terminal.",
|
|
258
|
+
"Always inspect raw outputs before summary counts; parse by column dataType (json vs scalar).",
|
|
259
|
+
"When summarizing enrichment outputs, parse by key precedence (phone: mobile_number -> phone_numbers[0].number -> primary_phone; email: response -> email -> work_email).",
|
|
255
260
|
],
|
|
256
261
|
"clarifications": [
|
|
257
262
|
"Email/phone enrichment does not require add_to_crm.",
|
|
258
263
|
"add_to_crm is an optional export action to Leads CRM (non-billable).",
|
|
264
|
+
"For custom LLM schemas, use strict field-map shape (no root type/properties wrapper; arrays must use {type:\"array\",items:...}).",
|
|
265
|
+
"Do not report not_found from a single missing key when fallback keys exist.",
|
|
259
266
|
],
|
|
260
267
|
"default_run_payload": {
|
|
261
268
|
"scope": "filtered",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/attach_csv_import_leads_to_research_table.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250106_add_column_position.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250123_add_filter_indexes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250604_add_origin_indexes.py
RENAMED
|
File without changes
|
{autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250608_cleanup_agent_metadata.py
RENAMED
|
File without changes
|
|
File without changes
|
{autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250922_add_activity_indexes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/20250929_add_task_join_indexes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/migrate_org_user_credits.py
RENAMED
|
File without changes
|
|
File without changes
|
{autotouch_cli-0.2.18 → autotouch_cli-0.2.20}/scripts/migrations/update_lead_owner_from_tasks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|