@rubytech/create-realagent 1.0.847 → 1.0.850
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/dist/__tests__/port-canonicalisation.test.js +1 -0
- package/dist/__tests__/snap-chromium.test.js +115 -0
- package/dist/index.js +201 -1
- package/dist/port-resolution.js +1 -1
- package/dist/snap-chromium.js +89 -0
- package/package.json +1 -1
- package/payload/platform/plugins/admin/skills/onboarding/SKILL.md +1 -1
- package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +2 -2
- package/payload/platform/plugins/cloudflare/PLUGIN.md +1 -1
- package/payload/platform/plugins/cloudflare/scripts/setup-tunnel.sh +25 -7
- package/payload/platform/plugins/cloudflare/skills/setup-tunnel/SKILL.md +1 -1
- package/payload/platform/plugins/docs/references/adherence.md +1 -1
- package/payload/platform/plugins/docs/references/deployment.md +8 -0
- package/payload/platform/plugins/docs/references/plugins-guide.md +4 -2
- package/payload/platform/plugins/docs/references/troubleshooting.md +33 -0
- package/payload/platform/plugins/linkedin-import/PLUGIN.md +2 -2
- package/payload/platform/plugins/linkedin-import/skills/linkedin-import/references/connections.md +2 -2
- package/payload/platform/plugins/memory/PLUGIN.md +1 -1
- package/payload/platform/plugins/memory/references/schema-base.md +1 -1
- package/payload/platform/scripts/test-laptop-vnc-boot.sh +81 -0
- package/payload/platform/scripts/vnc.sh +42 -2
- package/payload/platform/templates/agents/admin/AGENTS.md +6 -4
- package/payload/platform/templates/agents/admin/IDENTITY.md +6 -2
- package/payload/platform/templates/specialists/agents/content-producer.md +2 -2
- package/payload/premium-plugins/real-agency/BUNDLE.md +3 -3
- package/payload/premium-plugins/real-agency/agents/valuer.md +10 -0
- package/payload/premium-plugins/real-agency/plugins/buyers/skills/buyer-management/SKILL.md +42 -0
- package/payload/premium-plugins/real-agency/plugins/buyers/skills/buyer-management/references/buyer-qualification-questions.md +16 -0
- package/payload/premium-plugins/real-agency/plugins/buyers/skills/buyer-management/references/buyer-qualification.md +59 -0
- package/payload/premium-plugins/real-agency/plugins/buyers/skills/buyer-management/references/buyer-scripts.md +63 -0
- package/payload/premium-plugins/real-agency/plugins/buyers/skills/buyer-management/references/buyer-working-scripts.md +54 -0
- package/payload/premium-plugins/real-agency/plugins/buyers/skills/buyer-management/references/feedback-collection.md +42 -0
- package/payload/premium-plugins/real-agency/plugins/buyers/skills/buyer-management/references/offer-capture.md +38 -0
- package/payload/premium-plugins/real-agency/plugins/buyers/skills/buyer-management/references/viewing-booking.md +32 -0
- package/payload/premium-plugins/real-agency/plugins/buyers/skills/buyer-management/references/viewing-management.md +52 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/skills/negotiation/SKILL.md +35 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/skills/negotiation/references/deal-saving.md +47 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/skills/negotiation/references/negotiation-deep-guide.md +64 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/skills/negotiation/references/negotiation-prep-principles.md +29 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/skills/negotiation/references/negotiation-techniques.md +42 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/skills/negotiation/references/offer-presentation.md +43 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/skills/sales-negotiation/SKILL.md +29 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/skills/sales-negotiation/references/chris-voss-negotiation.md +70 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/skills/sales-negotiation/references/phil-jones-price-words.md +40 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/skills/sales-negotiation/references/serhant-negotiation-plus.md +55 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/skills/sales-negotiation/references/tom-panos-commission-pricing.md +57 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/skills/sales-negotiation/references/tony-morris-questioning.md +54 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts +6 -4
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +1 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js +82 -10
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js.map +1 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/src/lib/loop-api.ts +111 -15
- package/payload/server/chunk-DIRNBH7F.js +1603 -0
- package/payload/server/chunk-GOO2J3X7.js +10561 -0
- package/payload/server/chunk-LCAFHNZR.js +10420 -0
- package/payload/server/chunk-X3LVMXI5.js +10578 -0
- package/payload/server/client-pool-7Z6YRUQT.js +34 -0
- package/payload/server/maxy-edge.js +2 -2
- package/payload/server/public/assets/{admin-DFUet1XM.js → admin-Dyl8uNxX.js} +1 -1
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Bs5MjIKf.js → architectureDiagram-Q4EWVU46-BePoi8XC.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BVSXiX4T.js → blockDiagram-DXYQGD6D-BkiwLTtq.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-DBqsWCjl.js → c4Diagram-AHTNJAMY-bpjPj2Ln.js} +1 -1
- package/payload/server/public/assets/channel-D3U0_a1j.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-COUTB2TN.js → chunk-336JU56O-BpATJiGl.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-zKsTsXw6.js → chunk-426QAEUC-Wz6Bpsil.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-CI9i2J5g.js → chunk-4TB4RGXK-CLXL19Wd.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-DfchzZ2Y.js → chunk-5FUZZQ4R-BoTfWHuW.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-_iMyxz0C.js → chunk-5PVQY5BW-RhIfPCRB.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-Ddtw_ZHk.js → chunk-EDXVE4YY-utELKGQK.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-BrGMkslM.js → chunk-ENJZ2VHE-CNHjq5xK.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-DHInTpuR.js → chunk-ICPOFSXX-Di63NBur.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-mOQ4KZ9j.js → chunk-OYMX7WX6-BSPzqyxs.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-D5vGkUe9.js → chunk-U2HBQHQK-BZnA7c4T.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-CnNxZbqc.js → chunk-X2U36JSP-DpQ2OA_c.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-Cb7OSc_r.js → chunk-YZCP3GAM-BAkNXu0G.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-BipxpzL8.js → chunk-ZZ45TVLE-DBSm41oP.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-6EGGLDD_.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DfAV4tgE.js +1 -0
- package/payload/server/public/assets/clone-BoV8noAi.js +1 -0
- package/payload/server/public/assets/{dagre-KV5264BT-B91sXKT2.js → dagre-KV5264BT-BkvWofSp.js} +1 -1
- package/payload/server/public/assets/{dagre-lObrgXUJ.js → dagre-nvPNAunb.js} +1 -1
- package/payload/server/public/assets/{diagram-5BDNPKRD-DB2Kcx9r.js → diagram-5BDNPKRD-CMEgyt4E.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-Cq1J05SW.js → diagram-G4DWMVQ6-ChorrAF0.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-CwqXxUXd.js → diagram-MMDJMWI5-D_iD27po.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-Nmk38u6a.js → diagram-TYMM5635-8qXI1ioG.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-D2EfAdSD.js → erDiagram-SMLLAGMA-BFjtKDSB.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-CS98o6Jz.js → flowDiagram-DWJPFMVM-Bpd7IL9l.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-rWm6xQ8t.js → ganttDiagram-T4ZO3ILL-CwOozU85.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BuwECvwx.js → gitGraphDiagram-UUTBAWPF-CcPILiC9.js} +1 -1
- package/payload/server/public/assets/{graphlib-BXEED8qM.js → graphlib-B_mcXEVr.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-CEmJMuVh.js → infoDiagram-42DDH7IO-T2sn--WJ.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CAQMMx-Y.js → ishikawaDiagram-UXIWVN3A-DOP9-Q8H.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-toHrBGCq.js → journeyDiagram-VCZTEJTY-DGATg0WC.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DwXLkenV.js → kanban-definition-6JOO6SKY-C5PigmKg.js} +1 -1
- package/payload/server/public/assets/{line-BkM2KuUb.js → line-DlKKhwkO.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-CsaDWYZC.js → mermaid-parser.core-C8xGCa9p.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-CvICILSR.js → mermaid.core-CCUSwZB_.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-DQyCWpKS.js → mindmap-definition-QFDTVHPH-75k-IVhC.js} +1 -1
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-CVRIcK6b.js → pieDiagram-DEJITSTG-DN5RsDwZ.js} +1 -1
- package/payload/server/public/assets/preload-helper-qlgyTAkD.js +1 -0
- package/payload/server/public/assets/{public-CR_CX3K5.js → public-B_PNZUph.js} +1 -1
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CnfXm2xw.js → quadrantDiagram-34T5L4WZ-Sd9x6pNe.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-BntW6fnu.js → requirementDiagram-MS252O5E-BDgifYzj.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-Bt6AfgXn.js → sankeyDiagram-XADWPNL6-BX9VULNJ.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-D6s0kP6H.js → sequenceDiagram-FGHM5R23-z3vMxhgE.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-B9y9cOff.js → stateDiagram-FHFEXIEX-DlP0hBxF.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DSddQStC.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-DIFjQGfl.js → timeline-definition-GMOUNBTQ-DwQbhKCo.js} +1 -1
- package/payload/server/public/assets/{useVoiceRecorder-DWRtIHOw.js → useVoiceRecorder-fD0IWzJj.js} +3 -3
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-YRVHIBU9.js → vennDiagram-DHZGUBPP-WTqmZWWa.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-B20PPeAr.js → wardleyDiagram-NUSXRM2D-BUY50x5T.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-BztKw58Q.js → xychartDiagram-5P7HB3ND-Btdq-fDj.js} +1 -1
- package/payload/server/public/index.html +3 -3
- package/payload/server/public/public.html +3 -3
- package/payload/server/server.js +6 -3
- package/payload/server/public/assets/channel-lEc18pSi.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-rkW6IED-.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CRQJXpMG.js +0 -1
- package/payload/server/public/assets/clone-icRAjexu.js +0 -1
- package/payload/server/public/assets/preload-helper-bPV_ZjF3.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DH4gbGCS.js +0 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Tom Panos -- Commission & Pricing Scripts for Estate Agents
|
|
2
|
+
|
|
3
|
+
Source: Real Estate Gym (Tom Panos)
|
|
4
|
+
|
|
5
|
+
## Commission Accelerator Scheme
|
|
6
|
+
|
|
7
|
+
An accelerated/bonus commission scheme negotiated with the vendor at the time of listing.
|
|
8
|
+
|
|
9
|
+
**Script:**
|
|
10
|
+
> YOU: "Mr & Mrs Vendor, what's the number that's going to make you happy at the end of the day?"
|
|
11
|
+
> VENDOR: "£1.2m"
|
|
12
|
+
> YOU: "OK that's good. Our standard fee is 1.5%. Can I ask you this: if I get you an extra £100k, would you be happy to give me £10k?"
|
|
13
|
+
> VENDOR: "Yes"
|
|
14
|
+
> YOU: "OK well I'm going to back myself here. If you're agreeing to give me £10k if I get you another hundred, let's put in the scheme of 1.5% up to £1.2m and then 10% thereafter. Are you comfortable with that?"
|
|
15
|
+
|
|
16
|
+
## Buyer Negotiation Dialogue
|
|
17
|
+
|
|
18
|
+
> "Thanks for that offer. That price level has already been tested and is unlikely to be accepted. If it wasn't accepted, what would your next offer be?"
|
|
19
|
+
|
|
20
|
+
## The "What If" Script
|
|
21
|
+
|
|
22
|
+
**Giving an offer to vendors (e.g. £580k) and they reject:**
|
|
23
|
+
> "Can I ask you -- what if the buyer came back and went to £582k? What would happen then?"
|
|
24
|
+
|
|
25
|
+
**Setting the reserve with vendors (e.g. £600k):**
|
|
26
|
+
> "Can I ask you -- what if the bidding stops at £550k? What would happen next?"
|
|
27
|
+
|
|
28
|
+
**Negotiating with buyers (offer of £550k, asking price £575k):**
|
|
29
|
+
> "What if the vendors came down to £570k, what would you do then?"
|
|
30
|
+
|
|
31
|
+
**Why it's powerful:** By asking "what if...?" you bring forth hypothetical scenarios that reveal true expectations without any pressure.
|
|
32
|
+
|
|
33
|
+
## Hope-to-Get vs Expected Price
|
|
34
|
+
|
|
35
|
+
> "I have a buyer that's ready to go, they can sign a contract in the next 24 hours. Their limit is [market value]. Am I wasting my time bringing them around?"
|
|
36
|
+
|
|
37
|
+
Three responses reveal motivation level:
|
|
38
|
+
1. "Yes, you're wasting your time" -- unmotivated vendor
|
|
39
|
+
2. "Will the buyer come up a little?" -- positive, negotiable
|
|
40
|
+
3. "Yes, bring them around" -- motivated, ignore asking price
|
|
41
|
+
|
|
42
|
+
## Tom Ferry Objection Handling (Complementary)
|
|
43
|
+
|
|
44
|
+
### "Your commission is too high"
|
|
45
|
+
> "Totally fair question. Can I ask, compared to what?"
|
|
46
|
+
> [Let them answer]
|
|
47
|
+
> "Of course you want the best possible price. My job is to create demand so we attract multiple buyers and maximise your result. If I could show you how our marketing could potentially put tens of thousands more in your pocket, would the fee still be the main concern?"
|
|
48
|
+
|
|
49
|
+
### "We want to try a higher price"
|
|
50
|
+
> "I completely understand. Everyone wants the highest possible price."
|
|
51
|
+
> "If the market tells us in the first few weeks that buyers aren't responding at that level, would you be comfortable adjusting quickly so we don't lose momentum?"
|
|
52
|
+
|
|
53
|
+
### 4-Step Formula
|
|
54
|
+
1. Acknowledge the concern
|
|
55
|
+
2. Ask a question
|
|
56
|
+
3. Understand the real objection
|
|
57
|
+
4. Reframe the conversation
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Tony Morris -- Questioning Techniques for Sales
|
|
2
|
+
|
|
3
|
+
Source: "Coffees for Closers" by Tony Morris
|
|
4
|
+
|
|
5
|
+
## Core Philosophy
|
|
6
|
+
|
|
7
|
+
**The best salespeople listen more than they talk.** Every question should serve a purpose: to qualify, to understand, or to guide toward a decision.
|
|
8
|
+
|
|
9
|
+
> "A sale is not something you do to someone. It's something you do for someone."
|
|
10
|
+
|
|
11
|
+
## The Questioning Framework
|
|
12
|
+
|
|
13
|
+
### 1. Situation Questions
|
|
14
|
+
Establish the facts. Use early in discovery.
|
|
15
|
+
- "Tell me about your current situation."
|
|
16
|
+
- "How long have you been thinking about this?"
|
|
17
|
+
- "What prompted you to reach out?"
|
|
18
|
+
|
|
19
|
+
### 2. Problem Questions
|
|
20
|
+
Uncover pain points and challenges.
|
|
21
|
+
- "What's the biggest challenge you're facing right now?"
|
|
22
|
+
- "What's been holding you back?"
|
|
23
|
+
|
|
24
|
+
### 3. Implication Questions
|
|
25
|
+
Make the problem feel larger and more urgent.
|
|
26
|
+
- "How is that affecting your plans?"
|
|
27
|
+
- "If this continues, what happens next?"
|
|
28
|
+
|
|
29
|
+
### 4. Need-Payoff Questions
|
|
30
|
+
Get the prospect to articulate the value of solving the problem.
|
|
31
|
+
- "If we could solve that, what would that mean for you?"
|
|
32
|
+
- "What would change for you if this was handled?"
|
|
33
|
+
|
|
34
|
+
## Estate Agent Application
|
|
35
|
+
|
|
36
|
+
### For Vendors:
|
|
37
|
+
- "What prompted the decision to move?" (situation)
|
|
38
|
+
- "What concerns you most about the selling process?" (problem)
|
|
39
|
+
- "If the property doesn't sell in the timeline you need, what happens?" (implication)
|
|
40
|
+
- "If we could have you moved by [date], what would that mean for your family?" (need-payoff)
|
|
41
|
+
|
|
42
|
+
### For Fee Conversations:
|
|
43
|
+
- "What do you value most in an estate agent?" (situation)
|
|
44
|
+
- "What went wrong with your previous agent?" (problem)
|
|
45
|
+
- "What did that cost you in terms of time and money?" (implication)
|
|
46
|
+
- "If we could avoid all of that and get you a better result, would the fee be the deciding factor?" (need-payoff)
|
|
47
|
+
|
|
48
|
+
## Key Principles
|
|
49
|
+
|
|
50
|
+
1. **Never answer a question with a statement when you can answer with a question.**
|
|
51
|
+
2. **Silence is your friend.** After asking a question, wait. Don't fill the gap.
|
|
52
|
+
3. **The best close is a question, not a statement.**
|
|
53
|
+
4. **Preparation wins.** Know your questions before the conversation.
|
|
54
|
+
5. **Every conversation should have a purpose and a next step.**
|
|
@@ -11,12 +11,14 @@ export interface TeamResult<T> {
|
|
|
11
11
|
teamName: string;
|
|
12
12
|
data: T[];
|
|
13
13
|
}
|
|
14
|
+
export interface AggregationFailure {
|
|
15
|
+
teamName: string;
|
|
16
|
+
reason: string;
|
|
17
|
+
kind: "timeout" | "other";
|
|
18
|
+
}
|
|
14
19
|
export interface AggregationResult<T> {
|
|
15
20
|
results: TeamResult<T>[];
|
|
16
|
-
failures:
|
|
17
|
-
teamName: string;
|
|
18
|
-
reason: string;
|
|
19
|
-
}[];
|
|
21
|
+
failures: AggregationFailure[];
|
|
20
22
|
skipped: {
|
|
21
23
|
teamName: string;
|
|
22
24
|
reason: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-api.d.ts","sourceRoot":"","sources":["../../src/lib/loop-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loop-api.d.ts","sourceRoot":"","sources":["../../src/lib/loop-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,8 +17,18 @@ import { decrypt } from "./crypto.js";
|
|
|
17
17
|
// ─────────────────────────────────────────────────────────────────
|
|
18
18
|
const LOOP_BASE_URL = "https://api.loop.software";
|
|
19
19
|
const REQUEST_TIMEOUT_MS = 10_000;
|
|
20
|
+
const TIMEOUT_RETRY_BACKOFF_MS = 2_000;
|
|
20
21
|
const DEFAULT_LIMIT_PER_TEAM = 50;
|
|
21
22
|
const DEFAULT_LIMIT_TOTAL = 200;
|
|
23
|
+
// One bounded retry on transient timeout — recovers from intermittent
|
|
24
|
+
// Loop-API latency spikes that would otherwise drop a team from coverage.
|
|
25
|
+
function isTimeoutError(err) {
|
|
26
|
+
if (!(err instanceof Error))
|
|
27
|
+
return false;
|
|
28
|
+
return (err.name === "TimeoutError" ||
|
|
29
|
+
err.name === "AbortError" ||
|
|
30
|
+
/aborted due to timeout/i.test(err.message));
|
|
31
|
+
}
|
|
22
32
|
function isEnvelope(val) {
|
|
23
33
|
return (val !== null &&
|
|
24
34
|
typeof val === "object" &&
|
|
@@ -68,6 +78,15 @@ export async function loadTeamKeys(accountId) {
|
|
|
68
78
|
await session.close();
|
|
69
79
|
}
|
|
70
80
|
}
|
|
81
|
+
// Truncate to 200 chars, escape newlines, single line — `[loop] <tool> team=<t>
|
|
82
|
+
// status=<n> body="<...>"`. Emitted at the wrapper boundary before throwing so
|
|
83
|
+
// the body is visible regardless of how downstream catch sites format the error
|
|
84
|
+
// (the aggregator at line ~388 reduces LoopApiError to "HTTP <status>" and
|
|
85
|
+
// would otherwise discard the body).
|
|
86
|
+
function logErrorBody(toolName, teamName, status, body) {
|
|
87
|
+
const truncated = body.slice(0, 200).replace(/\n/g, "\\n");
|
|
88
|
+
console.error(`[loop] ${toolName} team=${teamName} status=${status} body="${truncated}"`);
|
|
89
|
+
}
|
|
71
90
|
/**
|
|
72
91
|
* Make a GET request to the Loop API V2.
|
|
73
92
|
*/
|
|
@@ -84,7 +103,9 @@ export async function loopGet(apiKey, path, toolName, teamName) {
|
|
|
84
103
|
return [];
|
|
85
104
|
}
|
|
86
105
|
if (!response.ok) {
|
|
87
|
-
|
|
106
|
+
const errorBody = await response.text().catch(() => "");
|
|
107
|
+
logErrorBody(toolName, teamName, response.status, errorBody);
|
|
108
|
+
throw new LoopApiError(response.status, teamName, path, errorBody);
|
|
88
109
|
}
|
|
89
110
|
const text = await response.text();
|
|
90
111
|
try {
|
|
@@ -124,6 +145,7 @@ export async function loopPost(apiKey, path, body, toolName, teamName) {
|
|
|
124
145
|
}
|
|
125
146
|
if (!response.ok) {
|
|
126
147
|
const errorBody = await response.text().catch(() => "");
|
|
148
|
+
logErrorBody(toolName, teamName, response.status, errorBody);
|
|
127
149
|
throw new LoopApiError(response.status, teamName, path, errorBody);
|
|
128
150
|
}
|
|
129
151
|
const text = await response.text();
|
|
@@ -163,6 +185,7 @@ export async function loopPut(apiKey, path, body, toolName, teamName) {
|
|
|
163
185
|
}
|
|
164
186
|
if (!response.ok) {
|
|
165
187
|
const errorBody = await response.text().catch(() => "");
|
|
188
|
+
logErrorBody(toolName, teamName, response.status, errorBody);
|
|
166
189
|
throw new LoopApiError(response.status, teamName, path, errorBody);
|
|
167
190
|
}
|
|
168
191
|
const text = await response.text();
|
|
@@ -218,7 +241,7 @@ export async function aggregateAcrossTeams(accountId, endpointGroup, toolName, b
|
|
|
218
241
|
if (keys.length === 0 && options?.teamName) {
|
|
219
242
|
return {
|
|
220
243
|
results: [],
|
|
221
|
-
failures: [{ teamName: options.teamName, reason: "Team not found" }],
|
|
244
|
+
failures: [{ teamName: options.teamName, reason: "Team not found", kind: "other" }],
|
|
222
245
|
skipped: [],
|
|
223
246
|
totalTeams: allKeys.length,
|
|
224
247
|
};
|
|
@@ -228,7 +251,8 @@ export async function aggregateAcrossTeams(accountId, endpointGroup, toolName, b
|
|
|
228
251
|
const results = [];
|
|
229
252
|
const failures = [];
|
|
230
253
|
const skipped = [];
|
|
231
|
-
// Check permissions and build request
|
|
254
|
+
// Check permissions and build per-team request thunks. Thunks (not stored
|
|
255
|
+
// promises) are required so a timed-out attempt can be re-invoked on retry.
|
|
232
256
|
const tasks = [];
|
|
233
257
|
for (const key of keys) {
|
|
234
258
|
if (!key.permissions.includes(endpointGroup)) {
|
|
@@ -246,13 +270,32 @@ export async function aggregateAcrossTeams(accountId, endpointGroup, toolName, b
|
|
|
246
270
|
catch (err) {
|
|
247
271
|
const msg = err instanceof Error ? err.message : String(err);
|
|
248
272
|
console.error(`[loop] decrypt failed for team=${key.teamName}: ${msg}`);
|
|
249
|
-
failures.push({
|
|
273
|
+
failures.push({
|
|
274
|
+
teamName: key.teamName,
|
|
275
|
+
reason: "Decryption failed",
|
|
276
|
+
kind: "other",
|
|
277
|
+
});
|
|
250
278
|
continue;
|
|
251
279
|
}
|
|
252
|
-
|
|
280
|
+
const teamName = key.teamName;
|
|
281
|
+
tasks.push({
|
|
282
|
+
key,
|
|
283
|
+
run: async () => {
|
|
284
|
+
try {
|
|
285
|
+
return await buildRequest(apiKey, teamName);
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
if (!isTimeoutError(err))
|
|
289
|
+
throw err;
|
|
290
|
+
console.error(`[loop] ${toolName} team=${teamName} timed out — retrying in ${TIMEOUT_RETRY_BACKOFF_MS}ms`);
|
|
291
|
+
await new Promise((resolve) => setTimeout(resolve, TIMEOUT_RETRY_BACKOFF_MS));
|
|
292
|
+
return await buildRequest(apiKey, teamName);
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
});
|
|
253
296
|
}
|
|
254
297
|
// Fan out concurrent requests
|
|
255
|
-
const settled = await Promise.allSettled(tasks.map((t) => t.
|
|
298
|
+
const settled = await Promise.allSettled(tasks.map((t) => t.run()));
|
|
256
299
|
for (let i = 0; i < settled.length; i++) {
|
|
257
300
|
const outcome = settled[i];
|
|
258
301
|
const teamName = tasks[i].key.teamName;
|
|
@@ -268,8 +311,11 @@ export async function aggregateAcrossTeams(accountId, endpointGroup, toolName, b
|
|
|
268
311
|
: outcome.reason instanceof Error
|
|
269
312
|
? outcome.reason.message
|
|
270
313
|
: String(outcome.reason);
|
|
314
|
+
const kind = isTimeoutError(outcome.reason)
|
|
315
|
+
? "timeout"
|
|
316
|
+
: "other";
|
|
271
317
|
console.error(`[loop] ${toolName} team=${teamName} failed: ${reason}`);
|
|
272
|
-
failures.push({ teamName, reason });
|
|
318
|
+
failures.push({ teamName, reason, kind });
|
|
273
319
|
}
|
|
274
320
|
}
|
|
275
321
|
// Apply total limit across all teams
|
|
@@ -284,8 +330,12 @@ export async function aggregateAcrossTeams(accountId, endpointGroup, toolName, b
|
|
|
284
330
|
}
|
|
285
331
|
totalItems += r.data.length;
|
|
286
332
|
}
|
|
333
|
+
const timedOutCount = failures.filter((f) => f.kind === "timeout").length;
|
|
334
|
+
const erroredCount = failures.length - timedOutCount;
|
|
287
335
|
console.error(`[loop] aggregate tool=${toolName} teams=${keys.length} ` +
|
|
288
336
|
`succeeded=${results.length} failed=${failures.length} skipped=${skipped.length}`);
|
|
337
|
+
console.error(`[loop] aggregate-coverage tool=${toolName} requested=${keys.length} ` +
|
|
338
|
+
`answered=${results.length} timed_out=${timedOutCount} errored=${erroredCount}`);
|
|
289
339
|
return { results, failures, skipped, totalTeams: allKeys.length };
|
|
290
340
|
}
|
|
291
341
|
/**
|
|
@@ -336,20 +386,42 @@ export function formatAggregationResult(result, formatItem, entityName) {
|
|
|
336
386
|
lines.push(formatItem(item, teamResult.teamName));
|
|
337
387
|
}
|
|
338
388
|
}
|
|
389
|
+
// Coverage = teams that had a chance to answer (succeeded + failed). Skipped
|
|
390
|
+
// teams are excluded from the denominator: they were configured-out, not lost.
|
|
391
|
+
const answered = result.results.length;
|
|
392
|
+
const failed = result.failures.length;
|
|
393
|
+
const totalCovered = answered + failed;
|
|
394
|
+
const coverageNote = formatCoverageNote(result.failures);
|
|
339
395
|
if (totalItems === 0) {
|
|
396
|
+
if (failed > 0) {
|
|
397
|
+
return `No ${entityName} found across ${answered} of ${totalCovered} teams (${coverageNote}).`;
|
|
398
|
+
}
|
|
340
399
|
const teamCount = result.results.length === 1
|
|
341
400
|
? result.results[0].teamName
|
|
342
401
|
: `${result.results.length} teams`;
|
|
343
402
|
return `No ${entityName} found across ${teamCount}.`;
|
|
344
403
|
}
|
|
345
|
-
|
|
404
|
+
const teamCountFragment = failed > 0 ? `${answered} of ${totalCovered} team(s)` : `${answered} team(s)`;
|
|
405
|
+
let header = `${totalItems} ${entityName} across ${teamCountFragment}:`;
|
|
346
406
|
const parts = [header, ...lines];
|
|
347
|
-
if (
|
|
348
|
-
parts.push(`\n---\nNote: ${
|
|
407
|
+
if (failed > 0) {
|
|
408
|
+
parts.push(`\n---\nNote: ${coverageNote}.`);
|
|
349
409
|
}
|
|
350
410
|
if (result.skipped.length > 0) {
|
|
351
411
|
parts.push(`Note: ${result.skipped.length} team(s) skipped (insufficient permissions).`);
|
|
352
412
|
}
|
|
353
413
|
return parts.join("\n");
|
|
354
414
|
}
|
|
415
|
+
function formatCoverageNote(failures) {
|
|
416
|
+
const timedOut = failures.filter((f) => f.kind === "timeout");
|
|
417
|
+
const errored = failures.filter((f) => f.kind !== "timeout");
|
|
418
|
+
const fragments = [];
|
|
419
|
+
if (timedOut.length > 0) {
|
|
420
|
+
fragments.push(`${timedOut.length} timed out: ${timedOut.map((f) => f.teamName).join(", ")}`);
|
|
421
|
+
}
|
|
422
|
+
if (errored.length > 0) {
|
|
423
|
+
fragments.push(`${errored.length} errored: ${errored.map((f) => f.teamName).join(", ")}`);
|
|
424
|
+
}
|
|
425
|
+
return fragments.join("; ");
|
|
426
|
+
}
|
|
355
427
|
//# sourceMappingURL=loop-api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-api.js","sourceRoot":"","sources":["../../src/lib/loop-api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"loop-api.js","sourceRoot":"","sources":["../../src/lib/loop-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,9 +19,21 @@ import { decrypt } from "./crypto.js";
|
|
|
19
19
|
|
|
20
20
|
const LOOP_BASE_URL = "https://api.loop.software";
|
|
21
21
|
const REQUEST_TIMEOUT_MS = 10_000;
|
|
22
|
+
const TIMEOUT_RETRY_BACKOFF_MS = 2_000;
|
|
22
23
|
const DEFAULT_LIMIT_PER_TEAM = 50;
|
|
23
24
|
const DEFAULT_LIMIT_TOTAL = 200;
|
|
24
25
|
|
|
26
|
+
// One bounded retry on transient timeout — recovers from intermittent
|
|
27
|
+
// Loop-API latency spikes that would otherwise drop a team from coverage.
|
|
28
|
+
function isTimeoutError(err: unknown): boolean {
|
|
29
|
+
if (!(err instanceof Error)) return false;
|
|
30
|
+
return (
|
|
31
|
+
err.name === "TimeoutError" ||
|
|
32
|
+
err.name === "AbortError" ||
|
|
33
|
+
/aborted due to timeout/i.test(err.message)
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
25
37
|
// ─── Loop API V2 Envelope ────────────────────────────────────────
|
|
26
38
|
//
|
|
27
39
|
// Every Loop API V2 response is wrapped in a status envelope:
|
|
@@ -91,9 +103,15 @@ export interface TeamResult<T> {
|
|
|
91
103
|
data: T[];
|
|
92
104
|
}
|
|
93
105
|
|
|
106
|
+
export interface AggregationFailure {
|
|
107
|
+
teamName: string;
|
|
108
|
+
reason: string;
|
|
109
|
+
kind: "timeout" | "other";
|
|
110
|
+
}
|
|
111
|
+
|
|
94
112
|
export interface AggregationResult<T> {
|
|
95
113
|
results: TeamResult<T>[];
|
|
96
|
-
failures:
|
|
114
|
+
failures: AggregationFailure[];
|
|
97
115
|
skipped: { teamName: string; reason: string }[];
|
|
98
116
|
totalTeams: number;
|
|
99
117
|
}
|
|
@@ -127,6 +145,23 @@ export async function loadTeamKeys(accountId: string): Promise<LoopTeamKey[]> {
|
|
|
127
145
|
}
|
|
128
146
|
}
|
|
129
147
|
|
|
148
|
+
// Truncate to 200 chars, escape newlines, single line — `[loop] <tool> team=<t>
|
|
149
|
+
// status=<n> body="<...>"`. Emitted at the wrapper boundary before throwing so
|
|
150
|
+
// the body is visible regardless of how downstream catch sites format the error
|
|
151
|
+
// (the aggregator at line ~388 reduces LoopApiError to "HTTP <status>" and
|
|
152
|
+
// would otherwise discard the body).
|
|
153
|
+
function logErrorBody(
|
|
154
|
+
toolName: string,
|
|
155
|
+
teamName: string,
|
|
156
|
+
status: number,
|
|
157
|
+
body: string
|
|
158
|
+
): void {
|
|
159
|
+
const truncated = body.slice(0, 200).replace(/\n/g, "\\n");
|
|
160
|
+
console.error(
|
|
161
|
+
`[loop] ${toolName} team=${teamName} status=${status} body="${truncated}"`
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
130
165
|
/**
|
|
131
166
|
* Make a GET request to the Loop API V2.
|
|
132
167
|
*/
|
|
@@ -154,7 +189,9 @@ export async function loopGet<T>(
|
|
|
154
189
|
}
|
|
155
190
|
|
|
156
191
|
if (!response.ok) {
|
|
157
|
-
|
|
192
|
+
const errorBody = await response.text().catch(() => "");
|
|
193
|
+
logErrorBody(toolName, teamName, response.status, errorBody);
|
|
194
|
+
throw new LoopApiError(response.status, teamName, path, errorBody);
|
|
158
195
|
}
|
|
159
196
|
|
|
160
197
|
const text = await response.text();
|
|
@@ -209,6 +246,7 @@ export async function loopPost<T>(
|
|
|
209
246
|
|
|
210
247
|
if (!response.ok) {
|
|
211
248
|
const errorBody = await response.text().catch(() => "");
|
|
249
|
+
logErrorBody(toolName, teamName, response.status, errorBody);
|
|
212
250
|
throw new LoopApiError(response.status, teamName, path, errorBody);
|
|
213
251
|
}
|
|
214
252
|
|
|
@@ -263,6 +301,7 @@ export async function loopPut<T>(
|
|
|
263
301
|
|
|
264
302
|
if (!response.ok) {
|
|
265
303
|
const errorBody = await response.text().catch(() => "");
|
|
304
|
+
logErrorBody(toolName, teamName, response.status, errorBody);
|
|
266
305
|
throw new LoopApiError(response.status, teamName, path, errorBody);
|
|
267
306
|
}
|
|
268
307
|
|
|
@@ -328,7 +367,7 @@ export async function aggregateAcrossTeams<T>(
|
|
|
328
367
|
if (keys.length === 0 && options?.teamName) {
|
|
329
368
|
return {
|
|
330
369
|
results: [],
|
|
331
|
-
failures: [{ teamName: options.teamName, reason: "Team not found" }],
|
|
370
|
+
failures: [{ teamName: options.teamName, reason: "Team not found", kind: "other" }],
|
|
332
371
|
skipped: [],
|
|
333
372
|
totalTeams: allKeys.length,
|
|
334
373
|
};
|
|
@@ -338,11 +377,12 @@ export async function aggregateAcrossTeams<T>(
|
|
|
338
377
|
const limitTotal = options?.limitTotal ?? DEFAULT_LIMIT_TOTAL;
|
|
339
378
|
|
|
340
379
|
const results: TeamResult<T>[] = [];
|
|
341
|
-
const failures:
|
|
380
|
+
const failures: AggregationFailure[] = [];
|
|
342
381
|
const skipped: { teamName: string; reason: string }[] = [];
|
|
343
382
|
|
|
344
|
-
// Check permissions and build request
|
|
345
|
-
|
|
383
|
+
// Check permissions and build per-team request thunks. Thunks (not stored
|
|
384
|
+
// promises) are required so a timed-out attempt can be re-invoked on retry.
|
|
385
|
+
const tasks: { key: LoopTeamKey; run: () => Promise<T[]> }[] = [];
|
|
346
386
|
|
|
347
387
|
for (const key of keys) {
|
|
348
388
|
if (!key.permissions.includes(endpointGroup)) {
|
|
@@ -362,15 +402,34 @@ export async function aggregateAcrossTeams<T>(
|
|
|
362
402
|
} catch (err) {
|
|
363
403
|
const msg = err instanceof Error ? err.message : String(err);
|
|
364
404
|
console.error(`[loop] decrypt failed for team=${key.teamName}: ${msg}`);
|
|
365
|
-
failures.push({
|
|
405
|
+
failures.push({
|
|
406
|
+
teamName: key.teamName,
|
|
407
|
+
reason: "Decryption failed",
|
|
408
|
+
kind: "other",
|
|
409
|
+
});
|
|
366
410
|
continue;
|
|
367
411
|
}
|
|
368
412
|
|
|
369
|
-
|
|
413
|
+
const teamName = key.teamName;
|
|
414
|
+
tasks.push({
|
|
415
|
+
key,
|
|
416
|
+
run: async () => {
|
|
417
|
+
try {
|
|
418
|
+
return await buildRequest(apiKey, teamName);
|
|
419
|
+
} catch (err) {
|
|
420
|
+
if (!isTimeoutError(err)) throw err;
|
|
421
|
+
console.error(
|
|
422
|
+
`[loop] ${toolName} team=${teamName} timed out — retrying in ${TIMEOUT_RETRY_BACKOFF_MS}ms`
|
|
423
|
+
);
|
|
424
|
+
await new Promise((resolve) => setTimeout(resolve, TIMEOUT_RETRY_BACKOFF_MS));
|
|
425
|
+
return await buildRequest(apiKey, teamName);
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
});
|
|
370
429
|
}
|
|
371
430
|
|
|
372
431
|
// Fan out concurrent requests
|
|
373
|
-
const settled = await Promise.allSettled(tasks.map((t) => t.
|
|
432
|
+
const settled = await Promise.allSettled(tasks.map((t) => t.run()));
|
|
374
433
|
|
|
375
434
|
for (let i = 0; i < settled.length; i++) {
|
|
376
435
|
const outcome = settled[i];
|
|
@@ -388,8 +447,11 @@ export async function aggregateAcrossTeams<T>(
|
|
|
388
447
|
: outcome.reason instanceof Error
|
|
389
448
|
? outcome.reason.message
|
|
390
449
|
: String(outcome.reason);
|
|
450
|
+
const kind: AggregationFailure["kind"] = isTimeoutError(outcome.reason)
|
|
451
|
+
? "timeout"
|
|
452
|
+
: "other";
|
|
391
453
|
console.error(`[loop] ${toolName} team=${teamName} failed: ${reason}`);
|
|
392
|
-
failures.push({ teamName, reason });
|
|
454
|
+
failures.push({ teamName, reason, kind });
|
|
393
455
|
}
|
|
394
456
|
}
|
|
395
457
|
|
|
@@ -405,10 +467,17 @@ export async function aggregateAcrossTeams<T>(
|
|
|
405
467
|
totalItems += r.data.length;
|
|
406
468
|
}
|
|
407
469
|
|
|
470
|
+
const timedOutCount = failures.filter((f) => f.kind === "timeout").length;
|
|
471
|
+
const erroredCount = failures.length - timedOutCount;
|
|
472
|
+
|
|
408
473
|
console.error(
|
|
409
474
|
`[loop] aggregate tool=${toolName} teams=${keys.length} ` +
|
|
410
475
|
`succeeded=${results.length} failed=${failures.length} skipped=${skipped.length}`
|
|
411
476
|
);
|
|
477
|
+
console.error(
|
|
478
|
+
`[loop] aggregate-coverage tool=${toolName} requested=${keys.length} ` +
|
|
479
|
+
`answered=${results.length} timed_out=${timedOutCount} errored=${erroredCount}`
|
|
480
|
+
);
|
|
412
481
|
|
|
413
482
|
return { results, failures, skipped, totalTeams: allKeys.length };
|
|
414
483
|
}
|
|
@@ -482,7 +551,17 @@ export function formatAggregationResult<T>(
|
|
|
482
551
|
}
|
|
483
552
|
}
|
|
484
553
|
|
|
554
|
+
// Coverage = teams that had a chance to answer (succeeded + failed). Skipped
|
|
555
|
+
// teams are excluded from the denominator: they were configured-out, not lost.
|
|
556
|
+
const answered = result.results.length;
|
|
557
|
+
const failed = result.failures.length;
|
|
558
|
+
const totalCovered = answered + failed;
|
|
559
|
+
const coverageNote = formatCoverageNote(result.failures);
|
|
560
|
+
|
|
485
561
|
if (totalItems === 0) {
|
|
562
|
+
if (failed > 0) {
|
|
563
|
+
return `No ${entityName} found across ${answered} of ${totalCovered} teams (${coverageNote}).`;
|
|
564
|
+
}
|
|
486
565
|
const teamCount =
|
|
487
566
|
result.results.length === 1
|
|
488
567
|
? result.results[0].teamName
|
|
@@ -490,13 +569,13 @@ export function formatAggregationResult<T>(
|
|
|
490
569
|
return `No ${entityName} found across ${teamCount}.`;
|
|
491
570
|
}
|
|
492
571
|
|
|
493
|
-
|
|
572
|
+
const teamCountFragment =
|
|
573
|
+
failed > 0 ? `${answered} of ${totalCovered} team(s)` : `${answered} team(s)`;
|
|
574
|
+
let header = `${totalItems} ${entityName} across ${teamCountFragment}:`;
|
|
494
575
|
const parts: string[] = [header, ...lines];
|
|
495
576
|
|
|
496
|
-
if (
|
|
497
|
-
parts.push(
|
|
498
|
-
`\n---\nNote: ${result.failures.length} team(s) failed — check server.log for details.`
|
|
499
|
-
);
|
|
577
|
+
if (failed > 0) {
|
|
578
|
+
parts.push(`\n---\nNote: ${coverageNote}.`);
|
|
500
579
|
}
|
|
501
580
|
if (result.skipped.length > 0) {
|
|
502
581
|
parts.push(
|
|
@@ -506,3 +585,20 @@ export function formatAggregationResult<T>(
|
|
|
506
585
|
|
|
507
586
|
return parts.join("\n");
|
|
508
587
|
}
|
|
588
|
+
|
|
589
|
+
function formatCoverageNote(failures: AggregationFailure[]): string {
|
|
590
|
+
const timedOut = failures.filter((f) => f.kind === "timeout");
|
|
591
|
+
const errored = failures.filter((f) => f.kind !== "timeout");
|
|
592
|
+
const fragments: string[] = [];
|
|
593
|
+
if (timedOut.length > 0) {
|
|
594
|
+
fragments.push(
|
|
595
|
+
`${timedOut.length} timed out: ${timedOut.map((f) => f.teamName).join(", ")}`
|
|
596
|
+
);
|
|
597
|
+
}
|
|
598
|
+
if (errored.length > 0) {
|
|
599
|
+
fragments.push(
|
|
600
|
+
`${errored.length} errored: ${errored.map((f) => f.teamName).join(", ")}`
|
|
601
|
+
);
|
|
602
|
+
}
|
|
603
|
+
return fragments.join("; ");
|
|
604
|
+
}
|