@seldonframe/mcp 1.1.5 → 1.1.6
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/package.json +2 -2
- package/src/welcome.js +176 -176
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seldonframe/mcp",
|
|
3
|
-
"version": "1.1.
|
|
4
|
-
"description": "MCP server for SeldonFrame — AI-native Business OS platform. One command creates a real, hosted workspace with a website, booking page, intake form, CRM, and AI agents. v1.1.5:
|
|
3
|
+
"version": "1.1.6",
|
|
4
|
+
"description": "MCP server for SeldonFrame — AI-native Business OS platform. One command creates a real, hosted workspace with a website, booking page, intake form, CRM, and AI agents. v1.1.5: Visual + auth completeness pass on top of v1.1.4's Personality-Driven Content Layer. (1) Service-card icons now resolve via per-vertical Lucide rules (dental→smile/tooth/baby for pediatric, hvac→wrench/snowflake/flame, legal→scale/gavel/briefcase) instead of every card collapsing to the generic 'sparkles' fallback. 23 new icons added; vertical-aware fallback when no keyword matches. (2) Hero sections now render with personality-curated Unsplash background photography (1600x900 with a dark scrim for legibility) and per-service-card images (800x600 round-robin from a 6-image bundle per vertical). Hand-curated URLs only — no auto-fetch. (3) Booking page now defaults the slot picker to the workspace's IANA timezone (organizations.timezone, inferred from city/state) instead of the visitor's browser TZ — a customer in NYC booking with a Texas dental practice now sees Central time. Visitor can still switch via the dropdown OR via a ?tz= URL override for shareable links. (4) Admin dashboard now works for admin-token sessions: getSoul + requireBillingUser branch on resolveAdminTokenContext so operators clicking the welcome-email admin URL don't hit Unauthorized when the dashboard tries to read soul/billing data via the synthetic nil-UUID user.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"seldonframe-mcp": "src/index.js"
|
package/src/welcome.js
CHANGED
|
@@ -1,176 +1,176 @@
|
|
|
1
|
-
// MCP server `instructions` payload — Claude Code surfaces this as a
|
|
2
|
-
// system-level briefing the moment the SeldonFrame MCP loads. Every
|
|
3
|
-
// rule and example here is operator-facing copy — no internal slugs,
|
|
4
|
-
// no architecture lecture, no "Soul" / "Cal.diy" / "Formbricks" /
|
|
5
|
-
// "Brain v2" jargon.
|
|
6
|
-
//
|
|
7
|
-
// v1.1.1 — every reference to the deprecated `create_workspace` tool
|
|
8
|
-
// stripped. `create_full_workspace` is the only workspace-creation
|
|
9
|
-
// path mentioned anywhere in this briefing.
|
|
10
|
-
|
|
11
|
-
export const VERSION = "1.1.
|
|
12
|
-
|
|
13
|
-
export const WELCOME_MARKDOWN = `# SeldonFrame — create a real Business OS in one conversation
|
|
14
|
-
|
|
15
|
-
SeldonFrame creates live, hosted business systems for service
|
|
16
|
-
businesses, agencies, coaches, and SaaS founders. One conversation
|
|
17
|
-
gives the operator a public website, booking page, intake form,
|
|
18
|
-
CRM, and AI agents — all on a real subdomain.
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## NEVER CREATE LOCAL FILES
|
|
23
|
-
|
|
24
|
-
SeldonFrame workspaces are created via the \`create_full_workspace\`
|
|
25
|
-
MCP tool. They are NOT created by writing files on disk. Specifically:
|
|
26
|
-
|
|
27
|
-
- Do NOT create a \`soul.json\` file or any other local file.
|
|
28
|
-
- Do NOT call \`loadSoulPackage\` or any local function.
|
|
29
|
-
- Do NOT scaffold a project directory.
|
|
30
|
-
- Do NOT modify files in the current working directory.
|
|
31
|
-
|
|
32
|
-
If you are running inside a SeldonFrame source-code repository and
|
|
33
|
-
the user asks for a workspace, IGNORE the local code — call the
|
|
34
|
-
\`create_full_workspace\` MCP tool. The tool returns live URLs on
|
|
35
|
-
\`<slug>.app.seldonframe.com\` that work in any browser within
|
|
36
|
-
seconds. There is no local-file path. This is the only correct
|
|
37
|
-
flow, regardless of what directory Claude Code is running from.
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## The full happy path — 4 steps, NO EXCEPTIONS
|
|
42
|
-
|
|
43
|
-
EVERY workspace creation flow has exactly these 4 steps, in order.
|
|
44
|
-
Step 4 is MANDATORY. A flow that ends after step 2 or 3 is broken
|
|
45
|
-
— the operator gets no welcome email, no admin login, and no
|
|
46
|
-
follow-up channel. Always finish with step 4.
|
|
47
|
-
|
|
48
|
-
1. **Ask for the business details.** When the user says "create a
|
|
49
|
-
workspace," gather these conversationally — one or two
|
|
50
|
-
questions per turn, not all at once:
|
|
51
|
-
- Business name
|
|
52
|
-
- Industry (HVAC, plumbing, dental, legal, coaching, real-estate, agency, …)
|
|
53
|
-
- City + state (US state code or full name; Canadian province also OK)
|
|
54
|
-
- Phone number (for local services — for SaaS skip)
|
|
55
|
-
- Top 3-5 services / products
|
|
56
|
-
- Brief description (1 sentence)
|
|
57
|
-
|
|
58
|
-
2. **Create the workspace atomically.** Call \`create_full_workspace\`.
|
|
59
|
-
One call → the entire workspace deploys server-side: org +
|
|
60
|
-
business profile + CRM with industry-specific pipeline + booking
|
|
61
|
-
page with availability + intake form + themed landing page.
|
|
62
|
-
Same input always produces the same output — no retries, no
|
|
63
|
-
404s, no Claude-Code orchestration.
|
|
64
|
-
\`\`\`
|
|
65
|
-
create_full_workspace({
|
|
66
|
-
business_name: "Pacific Coast Heating & Air",
|
|
67
|
-
city: "San Diego",
|
|
68
|
-
state: "CA",
|
|
69
|
-
phone: "(555) 123-4567",
|
|
70
|
-
services: ["AC Repair", "Heating Installation", "Indoor Air Quality"],
|
|
71
|
-
business_description: "Family-owned residential HVAC contractor — heating, cooling, AC repair in the San Diego area.",
|
|
72
|
-
// Optional but recommended — enrich the hero proof metrics:
|
|
73
|
-
review_count: 950,
|
|
74
|
-
review_rating: 4.7,
|
|
75
|
-
trust_signals: ["licensed", "bonded", "insured"],
|
|
76
|
-
emergency_service: true,
|
|
77
|
-
same_day: true,
|
|
78
|
-
service_area: ["San Diego", "Chula Vista", "Oceanside"]
|
|
79
|
-
})
|
|
80
|
-
\`\`\`
|
|
81
|
-
The response carries a guardrail (\`DO_NOT_DISPLAY_TO_USER\`) and
|
|
82
|
-
intentionally OMITS the admin dashboard URL — it does not exist
|
|
83
|
-
yet. Do NOT present anything from this response to the operator.
|
|
84
|
-
Move directly to step 3.
|
|
85
|
-
|
|
86
|
-
3. **Ask the operator for their email — VERBATIM.** Use exactly this
|
|
87
|
-
wording so the operator understands why it's needed:
|
|
88
|
-
> "What email should I use for your account? This is where
|
|
89
|
-
> you'll get your login link and any notifications."
|
|
90
|
-
If the operator declines or asks to skip, explain that the email
|
|
91
|
-
is required to keep their admin login alive past 7 days — then
|
|
92
|
-
ask again. Don't move on without an answer.
|
|
93
|
-
|
|
94
|
-
4. **MANDATORY: call \`finalize_workspace({ workspace_id, email })\`.**
|
|
95
|
-
This is the one tool call that closes the loop AND creates the
|
|
96
|
-
admin dashboard URL (which doesn't exist until this runs):
|
|
97
|
-
\`\`\`
|
|
98
|
-
finalize_workspace({
|
|
99
|
-
workspace_id: "<from-create_full_workspace-response>",
|
|
100
|
-
email: "max@pacificcoasthvac.com",
|
|
101
|
-
name: "Max"
|
|
102
|
-
})
|
|
103
|
-
\`\`\`
|
|
104
|
-
It mints the admin auth token, sends the welcome email (with
|
|
105
|
-
all the URLs and the admin link), captures the operator as a
|
|
106
|
-
lead in our CRM, and returns a \`summary\` field with the
|
|
107
|
-
formatted final output. PARAPHRASE that summary verbatim to the
|
|
108
|
-
operator — that's how they see what was configured (CRM
|
|
109
|
-
personality, pipeline stages, live URLs, admin link, email
|
|
110
|
-
confirmation).
|
|
111
|
-
|
|
112
|
-
Alternative: call \`collect_operator_email({ email })\` if you
|
|
113
|
-
want finer control without the formatted summary. Either tool
|
|
114
|
-
satisfies step 4; skipping both does not — and the operator
|
|
115
|
-
is left with NO admin access at all.
|
|
116
|
-
|
|
117
|
-
After step 4 the operator can customize their workspace through
|
|
118
|
-
further natural-language requests ("change the headline to …",
|
|
119
|
-
"add an FAQ section", "set up an industry template for plumbing")
|
|
120
|
-
— each routes to a typed MCP tool.
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
## What the tools do (operator language only)
|
|
125
|
-
|
|
126
|
-
- **\`create_full_workspace\`** — the ONE workspace-creation tool.
|
|
127
|
-
Atomic, server-side, deterministic. Always the first call for
|
|
128
|
-
new workspaces.
|
|
129
|
-
- **\`finalize_workspace\`** — MANDATORY closing call. Mints the
|
|
130
|
-
admin auth token (the admin URL doesn't exist until this runs),
|
|
131
|
-
bundles email collection (welcome email + lead capture), and
|
|
132
|
-
returns the formatted final summary Claude Code paraphrases
|
|
133
|
-
verbatim to the operator. Always the last call of every
|
|
134
|
-
workspace creation flow.
|
|
135
|
-
- **\`collect_operator_email\`** — narrower variant of
|
|
136
|
-
finalize_workspace that only sends the welcome email + captures
|
|
137
|
-
the lead. Doesn't return the formatted summary. Use either;
|
|
138
|
-
never skip both.
|
|
139
|
-
- **\`update_landing_content\`** / **\`update_landing_section\`** —
|
|
140
|
-
edit the website's headline, subhead, sections, copy.
|
|
141
|
-
- **\`update_theme\`** — change colors, fonts, dark/light mode.
|
|
142
|
-
- **\`update_form\`** — edit the intake form's questions.
|
|
143
|
-
- **\`update_appointment_type\`** — edit the booking page's slot length,
|
|
144
|
-
title, description.
|
|
145
|
-
- **\`install_vertical_pack\`** — set up an industry template
|
|
146
|
-
(real-estate, dental, legal, plumbing, …).
|
|
147
|
-
- **\`list_contacts\`** / **\`create_contact\`** / **\`update_contact\`** —
|
|
148
|
-
manage the CRM.
|
|
149
|
-
- **\`list_deals\`** / **\`create_deal\`** / **\`move_deal_stage\`** —
|
|
150
|
-
manage the pipeline.
|
|
151
|
-
- **\`send_email\`** / **\`send_sms\`** — send messages from the
|
|
152
|
-
workspace's connected channels.
|
|
153
|
-
|
|
154
|
-
The full tool list is available via the MCP \`tools/list\` request.
|
|
155
|
-
Use whatever fits the operator's natural-language request.
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## Pricing
|
|
160
|
-
|
|
161
|
-
- **Free** — first workspace, free forever, no credit card.
|
|
162
|
-
- **Growth ($29/mo)** — up to 3 workspaces, custom domains,
|
|
163
|
-
white-label, metered AI usage.
|
|
164
|
-
- **Scale ($99/mo)** — unlimited workspaces, advanced AI features,
|
|
165
|
-
priority support.
|
|
166
|
-
|
|
167
|
-
Operators can upgrade via \`/settings/billing\` once they're in the
|
|
168
|
-
admin dashboard. Pre-fills their email automatically.
|
|
169
|
-
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
**Docs:** <https://seldonframe.com/docs> · **Homepage:**
|
|
173
|
-
<https://seldonframe.com> · **Discord:** <https://discord.gg/sbVUu976NW>
|
|
174
|
-
`;
|
|
175
|
-
|
|
176
|
-
export const FIRST_CALL_BANNER = `🚀 SeldonFrame is connected. Ready to create a live business OS — every URL the create_full_workspace tool returns is real and works in any browser within seconds. NEVER create local files; always use the MCP tools. EVERY workspace creation flow must end with finalize_workspace({ workspace_id, email }) so the operator gets their welcome email + admin login — skipping it is a broken flow.`;
|
|
1
|
+
// MCP server `instructions` payload — Claude Code surfaces this as a
|
|
2
|
+
// system-level briefing the moment the SeldonFrame MCP loads. Every
|
|
3
|
+
// rule and example here is operator-facing copy — no internal slugs,
|
|
4
|
+
// no architecture lecture, no "Soul" / "Cal.diy" / "Formbricks" /
|
|
5
|
+
// "Brain v2" jargon.
|
|
6
|
+
//
|
|
7
|
+
// v1.1.1 — every reference to the deprecated `create_workspace` tool
|
|
8
|
+
// stripped. `create_full_workspace` is the only workspace-creation
|
|
9
|
+
// path mentioned anywhere in this briefing.
|
|
10
|
+
|
|
11
|
+
export const VERSION = "1.1.6";
|
|
12
|
+
|
|
13
|
+
export const WELCOME_MARKDOWN = `# SeldonFrame — create a real Business OS in one conversation
|
|
14
|
+
|
|
15
|
+
SeldonFrame creates live, hosted business systems for service
|
|
16
|
+
businesses, agencies, coaches, and SaaS founders. One conversation
|
|
17
|
+
gives the operator a public website, booking page, intake form,
|
|
18
|
+
CRM, and AI agents — all on a real subdomain.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## NEVER CREATE LOCAL FILES
|
|
23
|
+
|
|
24
|
+
SeldonFrame workspaces are created via the \`create_full_workspace\`
|
|
25
|
+
MCP tool. They are NOT created by writing files on disk. Specifically:
|
|
26
|
+
|
|
27
|
+
- Do NOT create a \`soul.json\` file or any other local file.
|
|
28
|
+
- Do NOT call \`loadSoulPackage\` or any local function.
|
|
29
|
+
- Do NOT scaffold a project directory.
|
|
30
|
+
- Do NOT modify files in the current working directory.
|
|
31
|
+
|
|
32
|
+
If you are running inside a SeldonFrame source-code repository and
|
|
33
|
+
the user asks for a workspace, IGNORE the local code — call the
|
|
34
|
+
\`create_full_workspace\` MCP tool. The tool returns live URLs on
|
|
35
|
+
\`<slug>.app.seldonframe.com\` that work in any browser within
|
|
36
|
+
seconds. There is no local-file path. This is the only correct
|
|
37
|
+
flow, regardless of what directory Claude Code is running from.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## The full happy path — 4 steps, NO EXCEPTIONS
|
|
42
|
+
|
|
43
|
+
EVERY workspace creation flow has exactly these 4 steps, in order.
|
|
44
|
+
Step 4 is MANDATORY. A flow that ends after step 2 or 3 is broken
|
|
45
|
+
— the operator gets no welcome email, no admin login, and no
|
|
46
|
+
follow-up channel. Always finish with step 4.
|
|
47
|
+
|
|
48
|
+
1. **Ask for the business details.** When the user says "create a
|
|
49
|
+
workspace," gather these conversationally — one or two
|
|
50
|
+
questions per turn, not all at once:
|
|
51
|
+
- Business name
|
|
52
|
+
- Industry (HVAC, plumbing, dental, legal, coaching, real-estate, agency, …)
|
|
53
|
+
- City + state (US state code or full name; Canadian province also OK)
|
|
54
|
+
- Phone number (for local services — for SaaS skip)
|
|
55
|
+
- Top 3-5 services / products
|
|
56
|
+
- Brief description (1 sentence)
|
|
57
|
+
|
|
58
|
+
2. **Create the workspace atomically.** Call \`create_full_workspace\`.
|
|
59
|
+
One call → the entire workspace deploys server-side: org +
|
|
60
|
+
business profile + CRM with industry-specific pipeline + booking
|
|
61
|
+
page with availability + intake form + themed landing page.
|
|
62
|
+
Same input always produces the same output — no retries, no
|
|
63
|
+
404s, no Claude-Code orchestration.
|
|
64
|
+
\`\`\`
|
|
65
|
+
create_full_workspace({
|
|
66
|
+
business_name: "Pacific Coast Heating & Air",
|
|
67
|
+
city: "San Diego",
|
|
68
|
+
state: "CA",
|
|
69
|
+
phone: "(555) 123-4567",
|
|
70
|
+
services: ["AC Repair", "Heating Installation", "Indoor Air Quality"],
|
|
71
|
+
business_description: "Family-owned residential HVAC contractor — heating, cooling, AC repair in the San Diego area.",
|
|
72
|
+
// Optional but recommended — enrich the hero proof metrics:
|
|
73
|
+
review_count: 950,
|
|
74
|
+
review_rating: 4.7,
|
|
75
|
+
trust_signals: ["licensed", "bonded", "insured"],
|
|
76
|
+
emergency_service: true,
|
|
77
|
+
same_day: true,
|
|
78
|
+
service_area: ["San Diego", "Chula Vista", "Oceanside"]
|
|
79
|
+
})
|
|
80
|
+
\`\`\`
|
|
81
|
+
The response carries a guardrail (\`DO_NOT_DISPLAY_TO_USER\`) and
|
|
82
|
+
intentionally OMITS the admin dashboard URL — it does not exist
|
|
83
|
+
yet. Do NOT present anything from this response to the operator.
|
|
84
|
+
Move directly to step 3.
|
|
85
|
+
|
|
86
|
+
3. **Ask the operator for their email — VERBATIM.** Use exactly this
|
|
87
|
+
wording so the operator understands why it's needed:
|
|
88
|
+
> "What email should I use for your account? This is where
|
|
89
|
+
> you'll get your login link and any notifications."
|
|
90
|
+
If the operator declines or asks to skip, explain that the email
|
|
91
|
+
is required to keep their admin login alive past 7 days — then
|
|
92
|
+
ask again. Don't move on without an answer.
|
|
93
|
+
|
|
94
|
+
4. **MANDATORY: call \`finalize_workspace({ workspace_id, email })\`.**
|
|
95
|
+
This is the one tool call that closes the loop AND creates the
|
|
96
|
+
admin dashboard URL (which doesn't exist until this runs):
|
|
97
|
+
\`\`\`
|
|
98
|
+
finalize_workspace({
|
|
99
|
+
workspace_id: "<from-create_full_workspace-response>",
|
|
100
|
+
email: "max@pacificcoasthvac.com",
|
|
101
|
+
name: "Max"
|
|
102
|
+
})
|
|
103
|
+
\`\`\`
|
|
104
|
+
It mints the admin auth token, sends the welcome email (with
|
|
105
|
+
all the URLs and the admin link), captures the operator as a
|
|
106
|
+
lead in our CRM, and returns a \`summary\` field with the
|
|
107
|
+
formatted final output. PARAPHRASE that summary verbatim to the
|
|
108
|
+
operator — that's how they see what was configured (CRM
|
|
109
|
+
personality, pipeline stages, live URLs, admin link, email
|
|
110
|
+
confirmation).
|
|
111
|
+
|
|
112
|
+
Alternative: call \`collect_operator_email({ email })\` if you
|
|
113
|
+
want finer control without the formatted summary. Either tool
|
|
114
|
+
satisfies step 4; skipping both does not — and the operator
|
|
115
|
+
is left with NO admin access at all.
|
|
116
|
+
|
|
117
|
+
After step 4 the operator can customize their workspace through
|
|
118
|
+
further natural-language requests ("change the headline to …",
|
|
119
|
+
"add an FAQ section", "set up an industry template for plumbing")
|
|
120
|
+
— each routes to a typed MCP tool.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## What the tools do (operator language only)
|
|
125
|
+
|
|
126
|
+
- **\`create_full_workspace\`** — the ONE workspace-creation tool.
|
|
127
|
+
Atomic, server-side, deterministic. Always the first call for
|
|
128
|
+
new workspaces.
|
|
129
|
+
- **\`finalize_workspace\`** — MANDATORY closing call. Mints the
|
|
130
|
+
admin auth token (the admin URL doesn't exist until this runs),
|
|
131
|
+
bundles email collection (welcome email + lead capture), and
|
|
132
|
+
returns the formatted final summary Claude Code paraphrases
|
|
133
|
+
verbatim to the operator. Always the last call of every
|
|
134
|
+
workspace creation flow.
|
|
135
|
+
- **\`collect_operator_email\`** — narrower variant of
|
|
136
|
+
finalize_workspace that only sends the welcome email + captures
|
|
137
|
+
the lead. Doesn't return the formatted summary. Use either;
|
|
138
|
+
never skip both.
|
|
139
|
+
- **\`update_landing_content\`** / **\`update_landing_section\`** —
|
|
140
|
+
edit the website's headline, subhead, sections, copy.
|
|
141
|
+
- **\`update_theme\`** — change colors, fonts, dark/light mode.
|
|
142
|
+
- **\`update_form\`** — edit the intake form's questions.
|
|
143
|
+
- **\`update_appointment_type\`** — edit the booking page's slot length,
|
|
144
|
+
title, description.
|
|
145
|
+
- **\`install_vertical_pack\`** — set up an industry template
|
|
146
|
+
(real-estate, dental, legal, plumbing, …).
|
|
147
|
+
- **\`list_contacts\`** / **\`create_contact\`** / **\`update_contact\`** —
|
|
148
|
+
manage the CRM.
|
|
149
|
+
- **\`list_deals\`** / **\`create_deal\`** / **\`move_deal_stage\`** —
|
|
150
|
+
manage the pipeline.
|
|
151
|
+
- **\`send_email\`** / **\`send_sms\`** — send messages from the
|
|
152
|
+
workspace's connected channels.
|
|
153
|
+
|
|
154
|
+
The full tool list is available via the MCP \`tools/list\` request.
|
|
155
|
+
Use whatever fits the operator's natural-language request.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Pricing
|
|
160
|
+
|
|
161
|
+
- **Free** — first workspace, free forever, no credit card.
|
|
162
|
+
- **Growth ($29/mo)** — up to 3 workspaces, custom domains,
|
|
163
|
+
white-label, metered AI usage.
|
|
164
|
+
- **Scale ($99/mo)** — unlimited workspaces, advanced AI features,
|
|
165
|
+
priority support.
|
|
166
|
+
|
|
167
|
+
Operators can upgrade via \`/settings/billing\` once they're in the
|
|
168
|
+
admin dashboard. Pre-fills their email automatically.
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
**Docs:** <https://seldonframe.com/docs> · **Homepage:**
|
|
173
|
+
<https://seldonframe.com> · **Discord:** <https://discord.gg/sbVUu976NW>
|
|
174
|
+
`;
|
|
175
|
+
|
|
176
|
+
export const FIRST_CALL_BANNER = `🚀 SeldonFrame is connected. Ready to create a live business OS — every URL the create_full_workspace tool returns is real and works in any browser within seconds. NEVER create local files; always use the MCP tools. EVERY workspace creation flow must end with finalize_workspace({ workspace_id, email }) so the operator gets their welcome email + admin login — skipping it is a broken flow.`;
|