@rubytech/create-realagent-code 0.1.384 → 0.1.387
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__/cron-heartbeat-registration.test.js +5 -0
- package/dist/cron-registration.js +1 -0
- package/dist/index.js +4 -0
- package/package.json +1 -1
- package/payload/platform/neo4j/schema.cypher +36 -1
- package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +73 -2
- package/payload/platform/plugins/docs/references/admin-ui.md +12 -1
- package/payload/platform/plugins/docs/references/graph.md +11 -0
- package/payload/platform/plugins/docs/references/plugins-guide.md +1 -0
- package/payload/platform/plugins/docs/references/sweep-guide.md +43 -0
- package/payload/platform/plugins/memory/references/schema-estate-agent.md +34 -0
- package/payload/platform/plugins/scheduling/PLUGIN.md +17 -1
- package/payload/platform/plugins/scheduling/mcp/dist/index.js +12 -0
- package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/agent-dispatch.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/agent-dispatch.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/agent-dispatch.test.js +101 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/agent-dispatch.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/agent-dispatch.d.ts +54 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/agent-dispatch.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/agent-dispatch.js +117 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/agent-dispatch.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-classify.d.ts +7 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-classify.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-classify.js +6 -3
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-classify.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +88 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/standing-audit.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/standing-audit.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/standing-audit.test.js +77 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/standing-audit.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +59 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +131 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +62 -15
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-agent.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-agent.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-agent.test.js +110 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-agent.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-get-agent.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-get-agent.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-get-agent.test.js +35 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-get-agent.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-agent.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-agent.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-agent.test.js +81 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-agent.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +7 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +21 -4
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.d.ts +4 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.js +6 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts +2 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +32 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
- package/payload/platform/plugins/sweep/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/sweep/PLUGIN.md +15 -0
- package/payload/platform/plugins/sweep/skills/sweep-workflow/SKILL.md +113 -0
- package/payload/platform/plugins/whatsapp/PLUGIN.md +1 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js +19 -4
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +7 -4
- package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +10 -0
- package/payload/platform/scripts/seed-neo4j.sh +38 -0
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +5 -0
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/server.js +1 -1
- package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
- package/payload/premium-plugins/real-agent/agents/negotiator.md +1 -1
- package/payload/premium-plugins/real-agent/plugins/estate-sales/PLUGIN.md +41 -8
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/index.d.ts +2 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/index.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/index.js +36 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/index.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/lib/chain-graph.d.ts +131 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/lib/chain-graph.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/lib/chain-graph.js +379 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/lib/chain-graph.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/lib/neo4j.d.ts +5 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/lib/neo4j.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/lib/neo4j.js +40 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/lib/neo4j.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-chain-read.d.ts +3 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-chain-read.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-chain-read.js +45 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-chain-read.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-chain-upsert.d.ts +3 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-chain-upsert.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-chain-upsert.js +94 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-chain-upsert.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-milestone-set.d.ts +3 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-milestone-set.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-milestone-set.js +40 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-milestone-set.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-party-lookup.d.ts +3 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-party-lookup.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-party-lookup.js +45 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-party-lookup.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-pipeline-list.d.ts +3 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-pipeline-list.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-pipeline-list.js +38 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/tools/progression-pipeline-list.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/package-lock.json +2587 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/package.json +21 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/src/__tests__/round-trip.test.ts +251 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/src/index.ts +43 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/src/lib/chain-graph.ts +555 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/src/lib/neo4j.ts +45 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/src/tools/progression-chain-read.ts +63 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/src/tools/progression-chain-upsert.ts +125 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/src/tools/progression-milestone-set.ts +56 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/src/tools/progression-party-lookup.ts +53 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/src/tools/progression-pipeline-list.ts +49 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/tsconfig.json +20 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/skills/negotiation/references/offer-presentation.md +2 -2
- package/payload/premium-plugins/real-agent/plugins/estate-sales/skills/progression-inbox/SKILL.md +35 -0
- package/payload/premium-plugins/real-agent/plugins/estate-sales/skills/sales-progression/SKILL.md +17 -6
- package/payload/premium-plugins/real-agent/plugins/estate-sales/skills/sales-progression/references/transaction-tracking.md +10 -6
- package/payload/premium-plugins/real-agent/plugins/leads/skills/chain-progression-tracker/SKILL.md +10 -1
- package/payload/server/public/assets/{AdminLoginScreens-C_h8V0Xs.js → AdminLoginScreens-BejIjbmU.js} +1 -1
- package/payload/server/public/assets/{AdminShell-Dqnxpn7U.js → AdminShell-D2-uBSB5.js} +1 -1
- package/payload/server/public/assets/{Checkbox-Bl1WRVGb.js → Checkbox-1F1tzqca.js} +1 -1
- package/payload/server/public/assets/Transcript-DkGa4CQH.js +2 -0
- package/payload/server/public/assets/{admin-ByoqNaSf.js → admin-DqQARkjy.js} +1 -1
- package/payload/server/public/assets/{browser-BXY1sNxv.js → browser-nDtEK6RC.js} +1 -1
- package/payload/server/public/assets/{calendar-CObRTPpU.js → calendar-CO4Bwmho.js} +1 -1
- package/payload/server/public/assets/chat-DeIge_bC.js +1 -0
- package/payload/server/public/assets/chevron-left-DhVdq0aN.js +1 -0
- package/payload/server/public/assets/data-B1GIdzHk.js +1 -0
- package/payload/server/public/assets/{graph-BCL0fVDH.js → graph-DFyicKd7.js} +1 -1
- package/payload/server/public/assets/{graph-labels-C0nn9nQi.js → graph-labels-D3BQdcpD.js} +1 -1
- package/payload/server/public/assets/{operator-B_1qYO7m.js → operator-BxrjWdT9.js} +1 -1
- package/payload/server/public/assets/{page-BQEl7aZO.js → page-ByDLq_o1.js} +1 -1
- package/payload/server/public/assets/page-D-Ep4bXd.js +32 -0
- package/payload/server/public/assets/{public-BzvwPHM0.js → public-DbdqfdYq.js} +1 -1
- package/payload/server/public/assets/{rotate-ccw-CHep9vl5.js → rotate-ccw-BkX8HODe.js} +1 -1
- package/payload/server/public/assets/{useSubAccountSwitcher-B1Kf32uG.js → useSubAccountSwitcher-DMbRhLPv.js} +1 -1
- package/payload/server/public/assets/{useSubAccountSwitcher-CfI3J2IX.css → useSubAccountSwitcher-DS0iqSkP.css} +1 -1
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +5 -5
- package/payload/server/public/chat.html +8 -8
- package/payload/server/public/data.html +8 -7
- package/payload/server/public/graph.html +8 -8
- package/payload/server/public/index.html +11 -10
- package/payload/server/public/operator.html +10 -10
- package/payload/server/public/public.html +8 -8
- package/payload/server/server.js +556 -273
- package/payload/server/public/assets/Transcript-C93Lifnb.js +0 -1
- package/payload/server/public/assets/chat-Dq-VHp7a.js +0 -1
- package/payload/server/public/assets/chevron-left-DjbK_wdQ.js +0 -1
- package/payload/server/public/assets/data-BXOoK8Ci.js +0 -1
- package/payload/server/public/assets/page-Dck23z9U.js +0 -32
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
// Chain graph I/O — the single responsibility of this file is reading and
|
|
2
|
+
// writing the sales-progression ontology (:Sale / :Chain / :ChainLink + party
|
|
3
|
+
// :Person) via raw parameterised cypher. Every write is account-scoped and
|
|
4
|
+
// attaches its parent edge in the same statement, so the account/adjacency
|
|
5
|
+
// write-gate holds by construction (a cross-account or adjacency-less write is
|
|
6
|
+
// structurally impossible). This is deliberately NOT writeNodeWithEdges: that
|
|
7
|
+
// primitive is CREATE-only and cannot express MERGE-on-natural-key upsert or
|
|
8
|
+
// the single-field milestone SET this domain needs.
|
|
9
|
+
import neo4j, { Integer } from "neo4j-driver";
|
|
10
|
+
/** The ten milestone stages → their :ChainLink date property names. */
|
|
11
|
+
export const MILESTONE_STAGES = {
|
|
12
|
+
"mortgage-valuation": "mortgageValuationDate",
|
|
13
|
+
survey: "surveyDate",
|
|
14
|
+
"draft-contract-issued": "draftContractIssuedDate",
|
|
15
|
+
"searches-requested": "searchesRequestedDate",
|
|
16
|
+
"searches-received": "searchesReceivedDate",
|
|
17
|
+
"mortgage-offer-received": "mortgageOfferReceivedDate",
|
|
18
|
+
"seller-signed": "sellerSignedDate",
|
|
19
|
+
"buyer-signed": "buyerSignedDate",
|
|
20
|
+
exchanged: "exchangedDate",
|
|
21
|
+
completed: "completedDate",
|
|
22
|
+
};
|
|
23
|
+
export const MILESTONE_STAGE_NAMES = Object.keys(MILESTONE_STAGES);
|
|
24
|
+
export const MILESTONE_DATE_PROPS = Object.values(MILESTONE_STAGES);
|
|
25
|
+
/** Party role → the :ChainLink→:Person edge type carrying that role. */
|
|
26
|
+
export const PARTY_ROLES = {
|
|
27
|
+
seller: "HAS_SELLER",
|
|
28
|
+
"seller-solicitor": "HAS_SELLER_SOLICITOR",
|
|
29
|
+
buyer: "HAS_BUYER",
|
|
30
|
+
"buyer-solicitor": "HAS_BUYER_SOLICITOR",
|
|
31
|
+
agent: "HAS_AGENT",
|
|
32
|
+
};
|
|
33
|
+
export const PARTY_ROLE_NAMES = Object.keys(PARTY_ROLES);
|
|
34
|
+
export const DEFAULT_STALLED_THRESHOLD_DAYS = 7;
|
|
35
|
+
// ---- helpers ----------------------------------------------------------------
|
|
36
|
+
/** Neo4j returns integers as `Integer`; normalise to a JS number for output. */
|
|
37
|
+
function toNum(v) {
|
|
38
|
+
if (v === null || v === undefined)
|
|
39
|
+
return null;
|
|
40
|
+
if (v instanceof Integer)
|
|
41
|
+
return v.toNumber();
|
|
42
|
+
if (typeof v === "number")
|
|
43
|
+
return v;
|
|
44
|
+
if (neo4j.isInt(v))
|
|
45
|
+
return v.toNumber();
|
|
46
|
+
return Number(v);
|
|
47
|
+
}
|
|
48
|
+
/** Drop undefined keys so `SET n += $map` only touches supplied fields. */
|
|
49
|
+
function definedOnly(obj) {
|
|
50
|
+
const out = {};
|
|
51
|
+
for (const [k, v] of Object.entries(obj))
|
|
52
|
+
if (v !== undefined)
|
|
53
|
+
out[k] = v;
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
/** Normalise a node's properties for JSON output: neo4j Integers → numbers.
|
|
57
|
+
* Without this, a stored int (salePrice, priority) serialises as `{low, high}`. */
|
|
58
|
+
function normalizeProps(props) {
|
|
59
|
+
const out = {};
|
|
60
|
+
for (const [k, v] of Object.entries(props)) {
|
|
61
|
+
out[k] = v instanceof Integer || neo4j.isInt(v) ? v.toNumber() : v;
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
/** Most recent date in a list, ignoring null/empty/unparseable. Compares by
|
|
66
|
+
* parsed timestamp (not lexically) so a mix of date-only and datetime strings
|
|
67
|
+
* orders correctly, and returns the original string of the newest. */
|
|
68
|
+
function newestDate(dates) {
|
|
69
|
+
let best = null;
|
|
70
|
+
let bestMs = -Infinity;
|
|
71
|
+
for (const d of dates) {
|
|
72
|
+
if (!d)
|
|
73
|
+
continue;
|
|
74
|
+
const ms = Date.parse(d);
|
|
75
|
+
if (Number.isNaN(ms))
|
|
76
|
+
continue;
|
|
77
|
+
if (ms > bestMs) {
|
|
78
|
+
bestMs = ms;
|
|
79
|
+
best = d;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return best;
|
|
83
|
+
}
|
|
84
|
+
function daysBetween(iso, nowMs) {
|
|
85
|
+
const then = Date.parse(iso);
|
|
86
|
+
if (Number.isNaN(then))
|
|
87
|
+
return 0;
|
|
88
|
+
return Math.floor((nowMs - then) / 86_400_000);
|
|
89
|
+
}
|
|
90
|
+
// ---- upsert -----------------------------------------------------------------
|
|
91
|
+
export async function upsertChain(session, accountId, input) {
|
|
92
|
+
const counters = { nodesCreated: 0, propertiesSet: 0, relationshipsCreated: 0 };
|
|
93
|
+
const add = (summary) => {
|
|
94
|
+
const u = summary.counters.updates();
|
|
95
|
+
counters.nodesCreated += u.nodesCreated;
|
|
96
|
+
counters.propertiesSet += u.propertiesSet;
|
|
97
|
+
counters.relationshipsCreated += u.relationshipsCreated;
|
|
98
|
+
};
|
|
99
|
+
const result = await session.executeWrite(async (tx) => {
|
|
100
|
+
// 1. Chain + OWNED_BY (mandatory adjacency).
|
|
101
|
+
const chainProps = definedOnly({
|
|
102
|
+
anticipatedExchangeDate: input.chain?.anticipatedExchangeDate,
|
|
103
|
+
desiredCompletionDate: input.chain?.desiredCompletionDate,
|
|
104
|
+
createdDate: input.chain?.createdDate,
|
|
105
|
+
owningTeam: input.chain?.owningTeam,
|
|
106
|
+
owningAgent: input.chain?.owningAgent,
|
|
107
|
+
isComplete: input.chain?.isComplete,
|
|
108
|
+
});
|
|
109
|
+
const chainRes = await tx.run(`MERGE (c:Chain {accountId: $accountId, chainId: $chainId})
|
|
110
|
+
SET c += $chainProps
|
|
111
|
+
WITH c
|
|
112
|
+
OPTIONAL MATCH (b:LocalBusiness {accountId: $accountId})
|
|
113
|
+
FOREACH (_ IN CASE WHEN b IS NULL THEN [] ELSE [1] END | MERGE (c)-[:OWNED_BY]->(b))
|
|
114
|
+
RETURN b IS NOT NULL AS hasBusiness`, { accountId, chainId: input.chainId, chainProps });
|
|
115
|
+
add(chainRes.summary);
|
|
116
|
+
// The Chain's only mandatory adjacency is OWNED_BY -> the account's own
|
|
117
|
+
// LocalBusiness singleton. If it is absent the MERGE above creates no edge
|
|
118
|
+
// and the Chain would land orphaned; throw to roll the whole upsert back
|
|
119
|
+
// rather than write an adjacency-less node the reconcile cannot see.
|
|
120
|
+
if (!chainRes.records[0]?.get("hasBusiness")) {
|
|
121
|
+
throw new Error(`no LocalBusiness for account ${accountId.slice(0, 8)} — cannot anchor chain ${input.chainId}. Seed the account before writing progression state.`);
|
|
122
|
+
}
|
|
123
|
+
// 2. Sale + IN_CHAIN (mandatory) + FOR_LISTING/FROM_OFFER (best-effort).
|
|
124
|
+
const saleProps = definedOnly({
|
|
125
|
+
status: input.sale.status,
|
|
126
|
+
sstcDate: input.sale.sstcDate,
|
|
127
|
+
isCompleteChain: input.sale.isCompleteChain,
|
|
128
|
+
salePrice: input.sale.salePrice === undefined || input.sale.salePrice === null
|
|
129
|
+
? undefined
|
|
130
|
+
: neo4j.int(input.sale.salePrice),
|
|
131
|
+
});
|
|
132
|
+
const saleRes = await tx.run(`MATCH (c:Chain {accountId: $accountId, chainId: $chainId})
|
|
133
|
+
MERGE (s:Sale {accountId: $accountId, sourceSystem: $sourceSystem, sourceId: $sourceId})
|
|
134
|
+
SET s += $saleProps, s.chainId = $chainId
|
|
135
|
+
MERGE (s)-[:IN_CHAIN]->(c)
|
|
136
|
+
WITH s
|
|
137
|
+
OPTIONAL MATCH (l:Listing {accountId: $accountId, sourceSystem: $sourceSystem, sourceId: $sourceId})
|
|
138
|
+
FOREACH (_ IN CASE WHEN l IS NULL THEN [] ELSE [1] END | MERGE (s)-[:FOR_LISTING]->(l))
|
|
139
|
+
WITH s, l
|
|
140
|
+
OPTIONAL MATCH (o:Offer {accountId: $accountId, sourceSystem: $sourceSystem, sourceId: $sourceId})
|
|
141
|
+
FOREACH (_ IN CASE WHEN o IS NULL THEN [] ELSE [1] END | MERGE (s)-[:FROM_OFFER]->(o))
|
|
142
|
+
RETURN l IS NOT NULL AS listingLinked, o IS NOT NULL AS offerLinked`, {
|
|
143
|
+
accountId,
|
|
144
|
+
chainId: input.chainId,
|
|
145
|
+
sourceSystem: input.sale.sourceSystem,
|
|
146
|
+
sourceId: input.sale.sourceId,
|
|
147
|
+
saleProps,
|
|
148
|
+
});
|
|
149
|
+
add(saleRes.summary);
|
|
150
|
+
const listingLinked = Boolean(saleRes.records[0]?.get("listingLinked"));
|
|
151
|
+
const offerLinked = Boolean(saleRes.records[0]?.get("offerLinked"));
|
|
152
|
+
// 3. Links + IS_PROPERTY + parties.
|
|
153
|
+
let partyCount = 0;
|
|
154
|
+
for (const link of input.links) {
|
|
155
|
+
const linkProps = definedOnly({
|
|
156
|
+
linkType: link.linkType,
|
|
157
|
+
address: link.address,
|
|
158
|
+
generalNotes: link.generalNotes,
|
|
159
|
+
proceedabilityNotes: link.proceedabilityNotes,
|
|
160
|
+
salePrice: link.salePrice === undefined || link.salePrice === null
|
|
161
|
+
? undefined
|
|
162
|
+
: neo4j.int(link.salePrice),
|
|
163
|
+
});
|
|
164
|
+
const milestoneProps = {};
|
|
165
|
+
for (const [stage, value] of Object.entries(link.milestones ?? {})) {
|
|
166
|
+
if (value === undefined)
|
|
167
|
+
continue;
|
|
168
|
+
milestoneProps[MILESTONE_STAGES[stage]] = value;
|
|
169
|
+
}
|
|
170
|
+
const isLoopProperty = link.linkType === "loop-property";
|
|
171
|
+
const linkRes = await tx.run(`MATCH (c:Chain {accountId: $accountId, chainId: $chainId})
|
|
172
|
+
MERGE (cl:ChainLink {accountId: $accountId, chainId: $chainId, priority: $priority})
|
|
173
|
+
SET cl += $linkProps, cl += $milestoneProps
|
|
174
|
+
MERGE (c)-[:HAS_LINK]->(cl)
|
|
175
|
+
WITH cl
|
|
176
|
+
OPTIONAL MATCH (p:Property {accountId: $accountId, slug: $propertySlug})
|
|
177
|
+
FOREACH (_ IN CASE WHEN $isLoopProperty AND $propertySlug IS NOT NULL AND p IS NOT NULL THEN [1] ELSE [] END |
|
|
178
|
+
MERGE (cl)-[:IS_PROPERTY]->(p))`, {
|
|
179
|
+
accountId,
|
|
180
|
+
chainId: input.chainId,
|
|
181
|
+
priority: neo4j.int(link.priority),
|
|
182
|
+
linkProps,
|
|
183
|
+
milestoneProps,
|
|
184
|
+
isLoopProperty,
|
|
185
|
+
propertySlug: link.propertySlug ?? null,
|
|
186
|
+
});
|
|
187
|
+
add(linkRes.summary);
|
|
188
|
+
for (const role of PARTY_ROLE_NAMES) {
|
|
189
|
+
const party = link.parties?.[role];
|
|
190
|
+
if (!party)
|
|
191
|
+
continue;
|
|
192
|
+
const partyProps = definedOnly({
|
|
193
|
+
name: party.name,
|
|
194
|
+
partyEmail: party.email,
|
|
195
|
+
partyPhone: party.phone,
|
|
196
|
+
});
|
|
197
|
+
const edge = PARTY_ROLES[role];
|
|
198
|
+
const partyRes = await tx.run(`MATCH (cl:ChainLink {accountId: $accountId, chainId: $chainId, priority: $priority})
|
|
199
|
+
MERGE (per:Person {accountId: $accountId, chainId: $chainId, priority: $priority, partyRole: $partyRole})
|
|
200
|
+
SET per += $partyProps
|
|
201
|
+
MERGE (cl)-[:\`${edge}\`]->(per)`, {
|
|
202
|
+
accountId,
|
|
203
|
+
chainId: input.chainId,
|
|
204
|
+
priority: neo4j.int(link.priority),
|
|
205
|
+
partyRole: role,
|
|
206
|
+
partyProps,
|
|
207
|
+
});
|
|
208
|
+
add(partyRes.summary);
|
|
209
|
+
partyCount += 1;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return { listingLinked, offerLinked, partyCount };
|
|
213
|
+
});
|
|
214
|
+
return {
|
|
215
|
+
...counters,
|
|
216
|
+
linkCount: input.links.length,
|
|
217
|
+
partyCount: result.partyCount,
|
|
218
|
+
listingLinked: result.listingLinked,
|
|
219
|
+
offerLinked: result.offerLinked,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
// ---- milestone set ----------------------------------------------------------
|
|
223
|
+
export async function setMilestone(session, accountId, chainId, priority, stage, date, source) {
|
|
224
|
+
const prop = MILESTONE_STAGES[stage];
|
|
225
|
+
const props = { [prop]: date };
|
|
226
|
+
if (source)
|
|
227
|
+
props[`${prop}Source`] = source;
|
|
228
|
+
const res = await session.executeWrite((tx) => tx.run(`MATCH (cl:ChainLink {accountId: $accountId, chainId: $chainId, priority: $priority})
|
|
229
|
+
SET cl += $props
|
|
230
|
+
RETURN count(cl) AS updated`, { accountId, chainId, priority: neo4j.int(priority), props }));
|
|
231
|
+
return { updated: toNum(res.records[0]?.get("updated")) ?? 0 };
|
|
232
|
+
}
|
|
233
|
+
// ---- read -------------------------------------------------------------------
|
|
234
|
+
export async function readChain(session, accountId, sel, nowMs, thresholdDays = DEFAULT_STALLED_THRESHOLD_DAYS) {
|
|
235
|
+
let chainId = sel.chainId ?? null;
|
|
236
|
+
if (!chainId && sel.address) {
|
|
237
|
+
const r = await session.run(`MATCH (cl:ChainLink {accountId: $accountId})
|
|
238
|
+
WHERE cl.address = $address
|
|
239
|
+
RETURN cl.chainId AS chainId LIMIT 1`, { accountId, address: sel.address });
|
|
240
|
+
chainId = r.records[0]?.get("chainId") ?? null;
|
|
241
|
+
}
|
|
242
|
+
if (!chainId)
|
|
243
|
+
return null;
|
|
244
|
+
const head = await session.run(`MATCH (c:Chain {accountId: $accountId, chainId: $chainId})
|
|
245
|
+
OPTIONAL MATCH (s:Sale {accountId: $accountId, chainId: $chainId})-[:IN_CHAIN]->(c)
|
|
246
|
+
RETURN c AS chain, s AS sale`, { accountId, chainId });
|
|
247
|
+
if (head.records.length === 0)
|
|
248
|
+
return null;
|
|
249
|
+
const chainNodeRaw = head.records[0].get("chain");
|
|
250
|
+
const saleNodeRaw = head.records[0].get("sale");
|
|
251
|
+
const chainProps = chainNodeRaw ? normalizeProps(chainNodeRaw.properties) : null;
|
|
252
|
+
const salePropsNorm = saleNodeRaw ? normalizeProps(saleNodeRaw.properties) : null;
|
|
253
|
+
const linkRes = await session.run(`MATCH (c:Chain {accountId: $accountId, chainId: $chainId})-[:HAS_LINK]->(cl:ChainLink)
|
|
254
|
+
OPTIONAL MATCH (cl)-[rel]->(per:Person)
|
|
255
|
+
WHERE type(rel) STARTS WITH 'HAS_'
|
|
256
|
+
WITH cl, collect({role: per.partyRole, name: per.name, email: per.partyEmail, phone: per.partyPhone}) AS parties
|
|
257
|
+
RETURN cl AS link, parties
|
|
258
|
+
ORDER BY cl.priority`, { accountId, chainId });
|
|
259
|
+
const links = [];
|
|
260
|
+
const priorities = [];
|
|
261
|
+
for (const rec of linkRes.records) {
|
|
262
|
+
const cl = rec.get("link").properties;
|
|
263
|
+
const priority = toNum(cl.priority) ?? 0;
|
|
264
|
+
priorities.push(priority);
|
|
265
|
+
const milestones = {};
|
|
266
|
+
for (const [stage, propName] of Object.entries(MILESTONE_STAGES)) {
|
|
267
|
+
milestones[stage] = cl[propName] ?? null;
|
|
268
|
+
}
|
|
269
|
+
const parties = rec.get("parties")
|
|
270
|
+
.filter((p) => p.role !== null && p.role !== undefined)
|
|
271
|
+
.map((p) => ({
|
|
272
|
+
role: p.role,
|
|
273
|
+
name: p.name ?? null,
|
|
274
|
+
email: p.email ?? null,
|
|
275
|
+
phone: p.phone ?? null,
|
|
276
|
+
}));
|
|
277
|
+
links.push({
|
|
278
|
+
priority,
|
|
279
|
+
linkType: cl.linkType ?? null,
|
|
280
|
+
address: cl.address ?? null,
|
|
281
|
+
salePrice: toNum(cl.salePrice),
|
|
282
|
+
generalNotes: cl.generalNotes ?? null,
|
|
283
|
+
proceedabilityNotes: cl.proceedabilityNotes ?? null,
|
|
284
|
+
milestones,
|
|
285
|
+
parties,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
// Stall: newest movement across all links' milestone dates and the sale's
|
|
289
|
+
// sstcDate is older than the threshold.
|
|
290
|
+
const allDates = [];
|
|
291
|
+
for (const l of links)
|
|
292
|
+
allDates.push(...Object.values(l.milestones));
|
|
293
|
+
if (salePropsNorm?.sstcDate)
|
|
294
|
+
allDates.push(salePropsNorm.sstcDate);
|
|
295
|
+
const lastMovement = newestDate(allDates);
|
|
296
|
+
const days = lastMovement ? daysBetween(lastMovement, nowMs) : null;
|
|
297
|
+
const stalled = days !== null && days > thresholdDays;
|
|
298
|
+
const cause = stalled
|
|
299
|
+
? `no milestone movement in ${days} days`
|
|
300
|
+
: lastMovement
|
|
301
|
+
? "moving"
|
|
302
|
+
: "no dates recorded yet";
|
|
303
|
+
// Structural flags: gaps or duplicates in the priority sequence.
|
|
304
|
+
const structuralFlags = [];
|
|
305
|
+
const sorted = [...priorities].sort((a, b) => a - b);
|
|
306
|
+
const seen = new Set();
|
|
307
|
+
for (const p of sorted) {
|
|
308
|
+
if (seen.has(p))
|
|
309
|
+
structuralFlags.push(`duplicate priority ${p}`);
|
|
310
|
+
seen.add(p);
|
|
311
|
+
}
|
|
312
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
313
|
+
if (sorted[i] - sorted[i - 1] > 1) {
|
|
314
|
+
structuralFlags.push(`priority gap between ${sorted[i - 1]} and ${sorted[i]}`);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return {
|
|
318
|
+
chainId,
|
|
319
|
+
chain: chainProps,
|
|
320
|
+
sale: salePropsNorm,
|
|
321
|
+
links,
|
|
322
|
+
stalled,
|
|
323
|
+
cause,
|
|
324
|
+
structuralFlags,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// ---- pipeline ---------------------------------------------------------------
|
|
328
|
+
export async function listPipeline(session, accountId, nowMs, thresholdDays = DEFAULT_STALLED_THRESHOLD_DAYS) {
|
|
329
|
+
const res = await session.run(`MATCH (s:Sale {accountId: $accountId, status: 'sale-agreed'})-[:IN_CHAIN]->(c:Chain)
|
|
330
|
+
OPTIONAL MATCH (c)-[:HAS_LINK]->(cl:ChainLink)
|
|
331
|
+
WITH s, c, collect(cl) AS links
|
|
332
|
+
RETURN s.chainId AS chainId, s.sourceId AS sourceId, s.salePrice AS salePrice,
|
|
333
|
+
s.sstcDate AS sstcDate, links,
|
|
334
|
+
head([l IN links WHERE l.priority = 1 | l.address]) AS firstAddress`, { accountId });
|
|
335
|
+
const rows = [];
|
|
336
|
+
for (const rec of res.records) {
|
|
337
|
+
const links = rec.get("links");
|
|
338
|
+
const dates = [];
|
|
339
|
+
for (const l of links) {
|
|
340
|
+
if (!l)
|
|
341
|
+
continue;
|
|
342
|
+
for (const propName of MILESTONE_DATE_PROPS) {
|
|
343
|
+
dates.push(l.properties[propName] ?? null);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
const sstc = rec.get("sstcDate");
|
|
347
|
+
if (sstc)
|
|
348
|
+
dates.push(sstc);
|
|
349
|
+
const lastMovement = newestDate(dates);
|
|
350
|
+
const days = lastMovement ? daysBetween(lastMovement, nowMs) : null;
|
|
351
|
+
rows.push({
|
|
352
|
+
chainId: rec.get("chainId"),
|
|
353
|
+
sourceId: rec.get("sourceId") ?? null,
|
|
354
|
+
address: rec.get("firstAddress") ?? null,
|
|
355
|
+
salePrice: toNum(rec.get("salePrice")),
|
|
356
|
+
lastMovement,
|
|
357
|
+
daysSinceMovement: days,
|
|
358
|
+
stalled: days !== null && days > thresholdDays,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
return rows;
|
|
362
|
+
}
|
|
363
|
+
// ---- party lookup -----------------------------------------------------------
|
|
364
|
+
export async function lookupParty(session, accountId, sel) {
|
|
365
|
+
const res = await session.run(`MATCH (per:Person {accountId: $accountId})<-[rel]-(cl:ChainLink {accountId: $accountId})
|
|
366
|
+
WHERE type(rel) STARTS WITH 'HAS_'
|
|
367
|
+
AND (($email IS NOT NULL AND per.partyEmail = $email)
|
|
368
|
+
OR ($phone IS NOT NULL AND per.partyPhone = $phone))
|
|
369
|
+
RETURN cl.chainId AS chainId, cl.priority AS priority, per.partyRole AS partyRole,
|
|
370
|
+
per.name AS name, cl.address AS address`, { accountId, email: sel.email ?? null, phone: sel.phone ?? null });
|
|
371
|
+
return res.records.map((rec) => ({
|
|
372
|
+
chainId: rec.get("chainId"),
|
|
373
|
+
priority: toNum(rec.get("priority")) ?? 0,
|
|
374
|
+
partyRole: rec.get("partyRole"),
|
|
375
|
+
name: rec.get("name") ?? null,
|
|
376
|
+
address: rec.get("address") ?? null,
|
|
377
|
+
}));
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=chain-graph.js.map
|
package/payload/premium-plugins/real-agent/plugins/estate-sales/mcp/dist/lib/chain-graph.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-graph.js","sourceRoot":"","sources":["../../src/lib/chain-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neo4j.d.ts","sourceRoot":"","sources":["../../src/lib/neo4j.ts"],"names":[],"mappings":"AAIA,OAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAmBtD,wBAAgB,SAAS,IAAI,MAAM,CAUlC;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAKjD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Neo4j driver/session helper — same pattern as buyers/mcp/src/lib/neo4j.ts.
|
|
2
|
+
// NEO4J_URI must be explicit; defaulting to localhost cross-pollinates
|
|
3
|
+
// Maxy and Real Agent databases on a shared dev host.
|
|
4
|
+
import neo4j from "neo4j-driver";
|
|
5
|
+
import { readFileSync } from "node:fs";
|
|
6
|
+
import { resolve } from "node:path";
|
|
7
|
+
let driver = null;
|
|
8
|
+
function readPassword() {
|
|
9
|
+
if (process.env.NEO4J_PASSWORD)
|
|
10
|
+
return process.env.NEO4J_PASSWORD;
|
|
11
|
+
const passwordFile = resolve(process.env.PLATFORM_ROOT ?? resolve(import.meta.dirname, "../../../.."), "config/.neo4j-password");
|
|
12
|
+
try {
|
|
13
|
+
return readFileSync(passwordFile, "utf-8").trim();
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new Error(`Neo4j password not found. Expected at ${passwordFile} or in NEO4J_PASSWORD env var.`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function getDriver() {
|
|
20
|
+
if (!driver) {
|
|
21
|
+
const uri = process.env.NEO4J_URI;
|
|
22
|
+
if (!uri)
|
|
23
|
+
throw new Error("[estate-sales] NEO4J_URI unset — refusing to default to bolt://localhost:7687");
|
|
24
|
+
const user = process.env.NEO4J_USER ?? "neo4j";
|
|
25
|
+
const password = readPassword();
|
|
26
|
+
console.error(`[estate-sales] resolved neo4j_uri=${uri}`);
|
|
27
|
+
driver = neo4j.driver(uri, neo4j.auth.basic(user, password));
|
|
28
|
+
}
|
|
29
|
+
return driver;
|
|
30
|
+
}
|
|
31
|
+
export function getSession() {
|
|
32
|
+
return getDriver().session();
|
|
33
|
+
}
|
|
34
|
+
export async function closeDriver() {
|
|
35
|
+
if (driver) {
|
|
36
|
+
await driver.close();
|
|
37
|
+
driver = null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=neo4j.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neo4j.js","sourceRoot":"","sources":["../../src/lib/neo4j.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,uEAAuE;AACvE,sDAAsD;AAEtD,OAAO,KAA0B,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,SAAS,YAAY;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAClE,MAAM,YAAY,GAAG,OAAO,CAC1B,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EACxE,wBAAwB,CACzB,CAAC;IACF,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,yCAAyC,YAAY,gCAAgC,CAAC,CAAC;IACzG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;QAC3G,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC;QAC/C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,qCAAqC,GAAG,EAAE,CAAC,CAAC;QAC1D,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progression-chain-read.d.ts","sourceRoot":"","sources":["../../src/tools/progression-chain-read.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAoD5E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// progression-chain-read — full state-of-chain for one deal, by chainId or
|
|
2
|
+
// address. Links are priority-ordered; a priority gap or duplicate is flagged
|
|
3
|
+
// at read time, not silently passed. Read-only.
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { lifelineTool } from "../../../../../lib/mcp-lifeline/dist/index.js";
|
|
6
|
+
import { getSession } from "../lib/neo4j.js";
|
|
7
|
+
import { readChain, DEFAULT_STALLED_THRESHOLD_DAYS } from "../lib/chain-graph.js";
|
|
8
|
+
export function registerChainRead(server, accountId) {
|
|
9
|
+
lifelineTool(server, "progression-chain-read", "Read the full state of one sale-agreed chain — the Sale, the Chain, every link ordered by priority with its ten milestone dates and party roles, plus a stall flag and any structural warnings (priority gap or duplicate). Select by chainId or by a link address. Read-only.", {
|
|
10
|
+
chainId: z.string().optional().describe("The chain to read."),
|
|
11
|
+
address: z.string().optional().describe("A link address to resolve the chain from (when chainId is unknown)."),
|
|
12
|
+
stalledThresholdDays: z
|
|
13
|
+
.number()
|
|
14
|
+
.int()
|
|
15
|
+
.positive()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe(`Days with no milestone movement before 'stalled' (default ${DEFAULT_STALLED_THRESHOLD_DAYS}).`),
|
|
18
|
+
}, async (params) => {
|
|
19
|
+
const { chainId, address, stalledThresholdDays } = params;
|
|
20
|
+
if (!chainId && !address) {
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: "text", text: "Error: one of chainId or address is required." }],
|
|
23
|
+
isError: true,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const session = getSession();
|
|
27
|
+
try {
|
|
28
|
+
const state = await readChain(session, accountId, { chainId, address }, Date.now(), stalledThresholdDays ?? DEFAULT_STALLED_THRESHOLD_DAYS);
|
|
29
|
+
if (!state) {
|
|
30
|
+
console.error(`[progression] op=chain-read chainId=${chainId ?? address} links=0 stalled=false cause=not-found`);
|
|
31
|
+
return { content: [{ type: "text", text: JSON.stringify({ ok: false, found: false }, null, 2) }] };
|
|
32
|
+
}
|
|
33
|
+
console.error(`[progression] op=chain-read chainId=${state.chainId} links=${state.links.length} stalled=${state.stalled} cause=${state.structuralFlags.length ? state.structuralFlags.join(";") : state.cause}`);
|
|
34
|
+
return { content: [{ type: "text", text: JSON.stringify({ ok: true, found: true, ...state }, null, 2) }] };
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
38
|
+
return { content: [{ type: "text", text: `Error: ${msg}` }], isError: true };
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await session.close();
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=progression-chain-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progression-chain-read.js","sourceRoot":"","sources":["../../src/tools/progression-chain-read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progression-chain-upsert.d.ts","sourceRoot":"","sources":["../../src/tools/progression-chain-upsert.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8CzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAwE9E"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// progression-chain-upsert — MERGE a Sale + Chain + ordered ChainLinks +
|
|
2
|
+
// party Persons in one transaction, mirroring Loop's chain object. Re-running
|
|
3
|
+
// over the same chain updates in place (natural-key MERGE, account-scoped,
|
|
4
|
+
// parent edge in the same statement).
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { lifelineTool } from "../../../../../lib/mcp-lifeline/dist/index.js";
|
|
7
|
+
import { getSession } from "../lib/neo4j.js";
|
|
8
|
+
import { upsertChain, MILESTONE_STAGE_NAMES, PARTY_ROLE_NAMES, } from "../lib/chain-graph.js";
|
|
9
|
+
const partyShape = z
|
|
10
|
+
.object({
|
|
11
|
+
name: z.string().optional(),
|
|
12
|
+
email: z.string().optional(),
|
|
13
|
+
phone: z.string().optional(),
|
|
14
|
+
})
|
|
15
|
+
.describe("A chain party: name plus contact (stored on partyEmail/partyPhone).");
|
|
16
|
+
const milestoneShape = z
|
|
17
|
+
.object(Object.fromEntries(MILESTONE_STAGE_NAMES.map((s) => [s, z.string().describe("ISO-8601 date").optional()])))
|
|
18
|
+
.describe("Milestone dates keyed by stage; any subset. ISO-8601 strings.");
|
|
19
|
+
const partiesShape = z
|
|
20
|
+
.object(Object.fromEntries(PARTY_ROLE_NAMES.map((r) => [r, partyShape.optional()])))
|
|
21
|
+
.describe("Parties keyed by role; any subset.");
|
|
22
|
+
const linkShape = z.object({
|
|
23
|
+
priority: z.number().int().describe("Position in the chain (1 = the subject sale)."),
|
|
24
|
+
linkType: z.enum(["loop-property", "external"]),
|
|
25
|
+
address: z.string().optional(),
|
|
26
|
+
salePrice: z.number().int().optional().describe("Sale price in pence."),
|
|
27
|
+
generalNotes: z.string().optional(),
|
|
28
|
+
proceedabilityNotes: z.string().optional(),
|
|
29
|
+
propertySlug: z.string().optional().describe("Property slug for IS_PROPERTY when linkType=loop-property."),
|
|
30
|
+
milestones: milestoneShape.optional(),
|
|
31
|
+
parties: partiesShape.optional(),
|
|
32
|
+
});
|
|
33
|
+
export function registerChainUpsert(server, accountId) {
|
|
34
|
+
lifelineTool(server, "progression-chain-upsert", "Create or update a sale-agreed deal's full chain state — the Sale, its Chain, every ChainLink with its ten milestone dates, and the five party roles per link. Idempotent on natural keys: re-running updates in place. The source of truth for chase-progression and progression-inbox; replaces the old markdown pipeline.", {
|
|
35
|
+
chainId: z.string().describe("Stable chain identifier (Loop chainId or a minted id)."),
|
|
36
|
+
sale: z.object({
|
|
37
|
+
sourceSystem: z.string().describe("e.g. loop-crm / manual."),
|
|
38
|
+
sourceId: z.string().describe("Natural key of the sale in the source system."),
|
|
39
|
+
salePrice: z.number().int().optional().describe("Agreed price in pence."),
|
|
40
|
+
status: z.enum(["sale-agreed", "exchanged", "completed", "fallen-through"]).optional(),
|
|
41
|
+
sstcDate: z.string().optional().describe("ISO-8601 date the sale was agreed (SSTC)."),
|
|
42
|
+
isCompleteChain: z.boolean().optional(),
|
|
43
|
+
}),
|
|
44
|
+
chain: z
|
|
45
|
+
.object({
|
|
46
|
+
anticipatedExchangeDate: z.string().optional(),
|
|
47
|
+
desiredCompletionDate: z.string().optional(),
|
|
48
|
+
createdDate: z.string().optional(),
|
|
49
|
+
owningTeam: z.string().optional(),
|
|
50
|
+
owningAgent: z.string().optional(),
|
|
51
|
+
isComplete: z.boolean().optional(),
|
|
52
|
+
})
|
|
53
|
+
.optional(),
|
|
54
|
+
links: z.array(linkShape).describe("Ordered chain links; each carries its milestones and parties."),
|
|
55
|
+
}, async (params) => {
|
|
56
|
+
const input = params;
|
|
57
|
+
const partyTotal = input.links.reduce((n, l) => n + Object.keys(l.parties ?? {}).length, 0);
|
|
58
|
+
console.error(`[progression] op=chain-upsert chainId=${input.chainId} sale=${input.sale.sourceId} links=${input.links.length} parties=${partyTotal}`);
|
|
59
|
+
const argProps = [
|
|
60
|
+
...Object.keys(input.sale).map((k) => `sale.${k}`),
|
|
61
|
+
...Object.keys(input.chain ?? {}).map((k) => `chain.${k}`),
|
|
62
|
+
...input.links.flatMap((l, i) => [
|
|
63
|
+
...Object.keys(l.milestones ?? {}).map((m) => `link[${l.priority ?? i}].${m}`),
|
|
64
|
+
...Object.keys(l.parties ?? {}).map((p) => `link[${l.priority ?? i}].party.${p}`),
|
|
65
|
+
]),
|
|
66
|
+
];
|
|
67
|
+
console.error(`[progression] op=args chainId=${input.chainId} props=${argProps.join(",")}`);
|
|
68
|
+
const session = getSession();
|
|
69
|
+
try {
|
|
70
|
+
const r = await upsertChain(session, accountId, input);
|
|
71
|
+
console.error(`[progression] op=write-result chainId=${input.chainId} nodes=created:${r.nodesCreated}/props:${r.propertiesSet}/edges:${r.relationshipsCreated} links=${r.linkCount} parties=${r.partyCount} listingLinked=${r.listingLinked} offerLinked=${r.offerLinked} rejected=none`);
|
|
72
|
+
return {
|
|
73
|
+
content: [
|
|
74
|
+
{
|
|
75
|
+
type: "text",
|
|
76
|
+
text: JSON.stringify({ ok: true, chainId: input.chainId, ...r }, null, 2),
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
83
|
+
console.error(`[progression] op=write-result chainId=${input.chainId} rejected=${msg}`);
|
|
84
|
+
return {
|
|
85
|
+
content: [{ type: "text", text: `Error: ${msg}` }],
|
|
86
|
+
isError: true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
await session.close();
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=progression-chain-upsert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progression-chain-upsert.js","sourceRoot":"","sources":["../../src/tools/progression-chain-upsert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progression-milestone-set.d.ts","sourceRoot":"","sources":["../../src/tools/progression-milestone-set.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA6C/E"}
|