@agentled/cli 0.7.21 → 0.8.0

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.
@@ -47,7 +47,7 @@ Sender identity lives on a workflow-level `inputPages` entry with `contextKey: "
47
47
  "name": "Send Outreach Email",
48
48
  "pipelineStepPrompt": {
49
49
  "type": "email",
50
- "template": "Draft a personalized email to {{steps.enrich.contact.fullName}} at {{steps.enrich.company.name}} introducing our offering. Keep it warm, concise, and specific to their role.",
50
+ "template": "Draft a personalized email to {{steps.enrich.contact.fullName}} at {{steps.enrich.company.name}} introducing our offering. Keep it warm, concise, and specific to their role. Format the body as email-safe HTML with one <p> per visual paragraph.",
51
51
  "responseStructure": {
52
52
  "email": {
53
53
  "from": "{{context.outreachProfile.fromEmail}}",
@@ -109,6 +109,10 @@ pipelineStepPrompt:
109
109
 
110
110
  Email clients render HTML bodies literally if the wrapping element is missing. Always generate email-safe HTML (`<p>`, `<br>`, `<a>`, `<strong>` — no CSS blocks, no `<script>`). Don't use markdown — the approval UI won't convert it.
111
111
 
112
+ **Email body as one collapsed paragraph:**
113
+
114
+ Email clients collapse newline-only text, so a body like `Hi Alberto, Quick confirmation... Best, Ouadie` renders as one hard-to-read block. Use separate `<p>` blocks for the greeting, each paragraph, links/CTA, and sign-off. Prefer `<a href="...">descriptive link text</a>` for long URLs instead of pasting raw links into the middle of a sentence.
115
+
112
116
  **No `outreachProfile` input page:**
113
117
 
114
118
  `{{context.outreachProfile.fromEmail}}` resolves to an empty string. The email has no sender. It may still send (from the default connected account) but you lose per-workflow sender control.
@@ -124,6 +128,7 @@ Before wiring a composed-email step into a workflow:
124
128
  - [ ] `onApproval.action: "schedule-email"` is set
125
129
  - [ ] `next.conditions.approvalRequired: true` on the outgoing edge
126
130
  - [ ] Recipient and subject are derived from prior step output, not hardcoded
131
+ - [ ] `email.body` is readable email-safe HTML with separate paragraphs; it is not one plain-text block and does not rely on newline-only formatting
127
132
  - [ ] The output page has `displayConfig.executionNameTemplate` with the entity and outreach state. For single-entity outreach, use `{{entityName}} - Email Drafted` before approval and `{{entityName}} - Email Sent` or `{{entityName}} - Contacted` after the post-send status step, e.g. `Joe Dan - VC Firm Name - Email Drafted`; add `{{today}}` only when a short date helps. For batch runs, summarize counts instead, e.g. `26 May - 4 sourced - 3 contacted`.
128
133
 
129
134
  ## When to use a generic approval gate instead
@@ -27,6 +27,7 @@ them; that defeats the point.
27
27
  | Sourcing/collecting entities to act on later | `references/entity-pipeline.md` |
28
28
  | Adding cross-execution memory | `references/persistent-memory.md` |
29
29
  | Designing outbound / sales / investor / lead-gen at scale | `references/outreach-and-scale.md` |
30
+ | Designing a saved view of a list, funnel, queue, approvals surface, or multi-source workspace cockpit | `docs/WORKSPACE_VIEWS.md` |
30
31
  | Producing local artifacts, or seeding a templated workspace's sidebar | `references/workspace-folder.md` |
31
32
  | Picking apps, testing credit-efficiently, decoding a validation error | `references/credits-apps-and-errors.md` |
32
33
 
@@ -62,13 +63,34 @@ Before helping with any request, inspect the workspace. Use `agentled workspace
62
63
  4. **`list_knowledge_lists`** — KG lists: contacts, companies, scored leads, status machines. Shapes what a new workflow reads from or writes to.
63
64
  5. **`list_connections`** — Connected apps and integrations: know which enrichment, CRM, or email providers are already authed before designing steps that depend on them.
64
65
  6. **`list_agents`** — Existing agents and routines: understand what is already running autonomously before adding new agents.
66
+ 7. **`list_workspace_views`** — Saved operating surfaces: reuse or update a view before creating another dashboard/list/queue.
65
67
 
66
68
  The workspace inspection directly informs which integrations are connected, what KG lists exist, whether new workflows should chain from or replace existing ones, and what existing agents already cover.
69
+ When referring to KG lists or text entries in user-facing replies, include both the human-readable name/title and the stable key/id, not just the id. Example: `VC Contacts (gtm_vc_contacts)`.
67
70
 
68
71
  For existing workflow work, map the workflow back to its use case before making claims or edits: run `agentled workflows get <workflowId> --format json`, inspect `useCaseContext`, then run `agentled use-cases get <key-or-workflowGraphId> --format json` and read each `operatingGuides` knowledge text with the provided read command. If `agentGuidance.warnings` includes `MISSING_USE_CASE_OPERATING_GUIDE`, say the use-case README is missing and create/update the linked knowledge text before treating the context as complete.
69
72
 
70
73
  > **Shortcut:** `agentled workspace inspect --json` returns all six contexts as one consolidated response. Use it at session start to load the full picture in a single call.
71
74
 
75
+ ### Workspace views
76
+
77
+ When the user asks for a reusable view of a KG list, funnel, action queue,
78
+ approval inbox, workflow report, agent/routine state, or combined operating
79
+ surface, use `WorkspaceView`. It is a saved manifest over live workspace data,
80
+ not a KG-only report and not an action executor.
81
+
82
+ - Inspect existing views first: `list_workspace_views` or `agentled views list`.
83
+ - Create/update only the manifest: data sources, filters/transforms,
84
+ `ConfigLayout` layout, actions, refresh/safety metadata.
85
+ - Use `name` for the full view page title and `navLabel` for short sidebar
86
+ copy. Use `placement` to attach pinned views to a use case or workflow group.
87
+ - Creating a view must not read providers, run workflows, mutate KG rows, send
88
+ messages, make approval decisions, or spend credits.
89
+ - Mark write/send/destructive actions with `approvalRequired: true` and use the
90
+ normal approval-aware tool when the user later asks to execute them.
91
+ - Prefer `draft` unless the user clearly approved the view becoming active or
92
+ pinned.
93
+
72
94
  ### MCP-connected but no local scaffold: expected behavior
73
95
 
74
96
  If MCP tools are already connected and working, **do not block** on missing local folders.
@@ -119,6 +141,29 @@ agentled --workspace angelhive workspace inspect
119
141
  AGENTLED_WORKSPACE=angelhive agentled workflows list
120
142
  ```
121
143
 
144
+ ### CLI chat workflow handoffs
145
+
146
+ The web UI can call `monitorWorkflowExecution`, poll the resulting job, and
147
+ continue the assistant turn after the workflow becomes terminal. A CLI agent
148
+ must perform that continuation itself.
149
+
150
+ If `agentled chat` or `agentled chat-result` says a workflow was started, do
151
+ not treat the completed chat turn as the completed user request. Capture the
152
+ returned `sessionId`, `workflowId`, `executionId` or `executionInputId`, then:
153
+
154
+ 1. Resolve the execution with `agentled executions list <workflowId>` when
155
+ necessary.
156
+ 2. Poll `agentled executions get <workflowId> <executionId>` until `completed`,
157
+ `failed`, `stopped`, or `canceled`.
158
+ 3. Inspect the relevant output using `agentled executions step-output`.
159
+ 4. Continue the original conversation with `agentled chat --session-id
160
+ <sessionId> "...terminal result context..."` so the assistant reports the
161
+ verified result and does not restart the workflow.
162
+
163
+ Never resend the original request while its durable chat turn or workflow is
164
+ still running. A response such as `Run started` is a workflow handoff, not the
165
+ final answer.
166
+
122
167
  ### External builder setup
123
168
 
124
169
  When this session is acting as an external AI builder for Agentled work items,
@@ -73,7 +73,7 @@ When a workflow sends emails, add an outreach profile input page to `context.inp
73
73
  "name": "Send Email",
74
74
  "pipelineStepPrompt": {
75
75
  "type": "email",
76
- "template": "Draft a personalized email...\n{{steps.previous_step.data}}\nReturn JSON ONLY per schema.",
76
+ "template": "Draft a personalized email...\n{{steps.previous_step.data}}\nFormat the body as email-safe HTML with one <p> per visual paragraph.\nReturn JSON ONLY per schema.",
77
77
  "responseStructure": {
78
78
  "email": {
79
79
  "from": "{{context.outreachProfile.fromEmail}}",
@@ -118,5 +118,6 @@ When a workflow sends emails, add an outreach profile input page to `context.inp
118
118
  - `onApproval.action: "schedule-email"` — triggers the actual send; without it, approval does nothing
119
119
  - `next.conditions.approvalRequired: true` — blocks the pipeline until human approval
120
120
  - Email body must be email-safe HTML (`<p>`, `<br>`, `<a>`, `<strong>` — no CSS, no scripts)
121
+ - Preserve readable email structure in `email.body`: use separate `<p>` blocks for the greeting, each paragraph, links/CTA, and sign-off; do not return the whole email as one plain-text paragraph, and do not rely on newline-only formatting because email clients collapse it.
121
122
  - **Never** use separate "draft" + "gmail send" appAction steps for outreach
122
123
  - Set an output page `displayConfig.executionNameTemplate` that names the entity and the outreach state. For single-entity outreach, use `{{entityName}} - Email Drafted` before approval and `{{entityName}} - Email Sent` or `{{entityName}} - Contacted` after the post-send status step, e.g. `Joe Dan - VC Firm Name - Email Drafted`; add `{{today}}` only when a short date helps. For batch runs, summarize counts instead, e.g. `26 May - 4 sourced - 3 contacted`.
@@ -87,7 +87,7 @@ AI steps can optionally specify a model and provider via the `agent` field:
87
87
  | `anthropic` | `claude-4-6-sonnet`, `claude-4-5-haiku`, `claude-4-6-opus` |
88
88
  | `google` | `gemini-3-pro`, `gemini-3-flash`, `gemini-2.5-pro`, `gemini-2.5-flash` |
89
89
  | `mistral` | `mistral-large-latest`, `mistral-small-latest`, `codestral-latest` |
90
- | `deepseek` | `deepseek-chat`, `deepseek-reasoner` |
90
+ | `deepseek` | `deepseek-v4-flash`, `deepseek-v4-pro` (`deepseek-chat` and `deepseek-reasoner` are legacy aliases retiring 2026-07-24) |
91
91
  | `kimi` | `kimi-k2.5` |
92
92
  | `minimax` | `minimax-m2.5` |
93
93
  | `bytedance` | `doubao-seed-1.6-flash`, `seed-2.0-mini`, `doubao-seed-1.8-beta` |