@flowapt/flowiq-cli 0.7.1 → 0.7.2

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.
package/README.md CHANGED
@@ -188,6 +188,7 @@ flowiq ct list
188
188
  - **Always `--dry-run` first** on a production agent — it prints added/removed/changed tool names before you commit.
189
189
  - **Destructive pushes are blocked by default**: a push that removes a tool, disables one, or sends an empty `tools[]` (wiping everything) writes nothing and shows you exactly what it would strip — re-run with `--confirm` if intentional. Additive/no-op pushes are unaffected.
190
190
  - Server-side validation is strict: tool `name` (`^[a-zA-Z0-9_-]{1,64}$`, no duplicates or built-in collisions), non-empty `description`, `http(s)` `endpoint`, method `GET/POST/PUT/PATCH/DELETE`, scalar headers, object-typed `parameters`/`injected_parameters`, valid auth/channels, timeout and response caps. Recursive schemas support strict nested objects, typed arrays, enums and numeric/string/item limits. Unknown tool/schema keys are rejected before anything writes.
191
+ - **`display_name` (optional, 10 Sep 2026):** the label the TEAM sees on the inbox tool-activity card (e.g. `Checked loyalty points`) — plain string, ≤80 chars, never sent to the AI. Leave it out and the card derives a label from the tool name.
191
192
  - **Warnings (non-blocking):** an object with properties but no required fields. Unknown `{{placeholder}}` values are hard errors; injected parameters may additionally reference a declared top-level model parameter. Known runtime values include `organization_id`, `contact_id`, `agent_id`, `contact_whatsapp_id`, `contact_full_name`, `whatsapp_message_id`, `text`, `unique_message_id`, `unix_timestamp`, `operation_idempotency_key`, `supabase_anon_key`, and `openai_api_key`.
192
193
  - **Retailer gateway credential:** `{{retailer_tools_internal_key}}` is super-admin-only and resolves only as the `x-api-key` value for `https://express.chatcart.io/retailer-tools/*` (or loopback in local tests). Validation and runtime both reject putting it in a body or sending it to any other host.
193
194
  - `--agent` + filenames behave like `prompts`/`knowledge`; the file carries `agent_id`, so `push` targets the agent it was pulled from.
@@ -1054,7 +1055,9 @@ flowiq hours summary # every org with logged work this
1054
1055
 
1055
1056
  ### Client deck — `flowiq report deck status|build|narrate|generate|inputs|approve|unapprove|send|print|pull` (v0.6.5)
1056
1057
 
1057
- The monthly 10-slide client deck (`/reporting/deck` in the app), driven from the
1058
+ The monthly client deck (`/reporting/deck` in the app; 10 slides, 11 for a store
1059
+ org — slide 8 is store health: cart abandonment, returning buyers and opt-in
1060
+ growth, online store only), driven from the
1058
1061
  terminal. Everything runs server-side through the `flowiq-reporting-deck` edge
1059
1062
  function: the metrics are built from the FROZEN month snapshot, the copy is
1060
1063
  written by the model under the report rules and a numeric guard (every figure
@@ -1077,11 +1080,15 @@ flowiq report deck pull <org_id> 2026-08 # → ./.flowiq/repor
1077
1080
  ```
1078
1081
 
1079
1082
  - Months freeze on the 1st (cron 82); a month with no snapshot cannot be built.
1080
- Comparisons need the prior month's deck, which `build` creates on the fly.
1083
+ Comparisons need the prior month's deck, which `build` creates on the fly (and rebuilds when it
1084
+ predates the current build logic, unless it is approved, sent or held).
1085
+ - Send fees are estimated at the category each template had on its send day. A send whose category
1086
+ cannot be known shows no fee and is left out of the broadcast return (`totals.unpriced_sends`).
1081
1087
  - `inputs.json` shape: `{ "changes": { "<update_id>": { "hidden": false, "tag": "client_raised|flowapt_shipped", "title": "…", "description": "…" } }, "changes_reviewed": true, "action_points": { "<title>": "done|in_progress|waiting_on_you|ongoing|dropped" }, "waiting_on_you": [{ "title": "…", "unlocks": "…" }], "recipients_confirmed": true }`.
1082
1088
  Free text (milestone, the four plan fields) is edited in the app; it is stored as overrides that survive `narrate`.
1083
1089
  - `send --client` needs an approved deck AND `report.email.recipients` in the org's reporting config (Control center → Report delivery); it marks the deck `sent`. `--test-to` never changes status. Fees on the slides are the org's actual Meta billing when the token can read it, otherwise the rate-card estimate, and the footnote says which.
1084
1090
  - Non-store orgs need `config.deck.outcome` (`source: handover | ticket_status | tag | keyword`, labels) — the revenue slides become outcome slides. Every verb except `status` and `pull` is audited.
1091
+ - Store orgs get slide 8, "Store health": cart abandonment (online checkouts started, bought, abandoned), first-time vs returning buyers and opt-in growth, each with a twelve-month strip and measured on the online store checkout only (till and other channels are named in the footer). `status --json` carries the headline figures under `store`; `config.deck.channel_labels {"<source_name>": "Label"}` renames a sales channel on the slide.
1085
1092
 
1086
1093
  ### Insights — `flowiq insights status|enable|disable|run` (v0.7.0)
1087
1094
 
@@ -1435,7 +1442,10 @@ flowiq org flags keys --section "members"
1435
1442
  response prints before → after plus the exact undo command.
1436
1443
  - A key that is on the org but not in the registry is shown by `show` (and
1437
1444
  `--json`) but cannot be set here — it is DB-only by design; add it to the
1438
- Profile tab first.
1445
+ Profile tab first. **The registry is ONE shared file** (`api/_shared/feature-flag-registry.js`)
1446
+ that the Profile tab imports too, and every build checks the two agree — so a
1447
+ new Profile-tab switch is settable from the CLI the moment it deploys, with no
1448
+ npm publish.
1439
1449
 
1440
1450
  ### Agents — `flowiq agent list|create <org>`
1441
1451
 
package/TEAM-GUIDE.md CHANGED
@@ -81,6 +81,7 @@ When you see it, run `npm i -g @flowapt/flowiq-cli` — a stale version also mea
81
81
  | Edit the text knowledge sources (get_more_answers playbooks) | `flowiq kn pull <org_id>` → edit `sources[]` → `flowiq kn push <slug>` |
82
82
  | Edit the custom tools (API-call tools) | `flowiq ct pull <org_id>` → edit `tools[]` → `flowiq ct push <slug> --dry-run` → `flowiq ct push <slug>` |
83
83
  | Turn one custom tool on/off | `flowiq ct enable\|disable <org_id> <tool_name>` |
84
+ | Give a custom tool a friendly name on the inbox tool-activity card | add `"display_name": "Checked loyalty points"` to that tool in `tools[]` → `flowiq ct push` (≤80 chars, never shown to the AI; empty = derived from the tool name) |
84
85
  | Edit keyword auto-replies (incl. competition entry keywords, add/remove-tag, set-agent and delay actions) | `flowiq kw pull <org_id>` → edit → `flowiq kw push <slug> --dry-run` → `flowiq kw push <slug>` |
85
86
  | Send a **different auto-reply depending on the contact** (e.g. "we already have your email" vs "send us your email") | add `"when": {"field":"email","op":"is_not_empty"}` to one action and `is_empty` to the other — see *Keywords* in `flowiq guide --reference`. CLI-only, no dashboard field yet |
86
87
  | Make a follow-up button **close the customer's ticket** ("Query solved") or **re-alert the team** ("I still need help") | keyword action `{"type":"update_ticket_status","status":"resolved"}` / `{"type":"renotify_ticket"}` — see *Keywords* in `flowiq guide --reference`. CLI-only, no dashboard field yet |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowapt/flowiq-cli",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "description": "Command-line tool for FlowIQ staff: round-trip agent prompts, questionnaires, fine-tuning, pin-board tasks, webhooks, templates, agent-updates, chat exports, and live agent testing without ever touching service-role credentials.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/index.js CHANGED
@@ -411,7 +411,7 @@ export function run(argv) {
411
411
  .option("--model <model>", "settings.model (e.g. gpt-5.4-mini)")
412
412
  .option("--reasoning-effort <level>", "settings.reasoning_effort — low|medium|high (\"\" clears it); pairs with reasoning models (e.g. gpt-5.6-luna + high)")
413
413
  .option("--rename <name>", "rename the agent")
414
- .option("--tool <flag=bool>", "toggle a tool flag (repeatable): woo_order_build/woo_tip_field/woo_order_note_field/view_cart_tool/restock_tool/block_tool_status/postal_code_tool_status/shopify_products_web_chat/ticket_tool_status/collapse_product_variants", agentConfigCmd.collectTool, [])
414
+ .option("--tool <flag=bool>", "toggle a tool flag (repeatable): woo_order_build/woo_tip_field/woo_order_note_field/view_cart_tool/restock_tool/block_tool_status/postal_code_tool_status/shopify_products_web_chat/ticket_tool_status/product_lookup/email_request_tool/collapse_product_variants", agentConfigCmd.collectTool, [])
415
415
  .option("--discount [bool]", "agent.discount.enabled (true if bare)")
416
416
  .option("--test-contact-number <number>", "settings.test_contact_number — the contact `flowiq test` uses (use a FAKE number; \"\" clears it → synthetic fallback)")
417
417
  .option("--test-contact-name <name>", "settings.test_contact_name — display name for the test contact (\"\" clears it)")