@rubytech/create-maxy-code 0.1.37 → 0.1.38
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 +1 -1
- package/payload/platform/package-lock.json +752 -512
- package/payload/platform/plugins/loop/PLUGIN.md +11 -0
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +10 -4
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts +4 -1
- package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/tool-surface.js +4 -1
- package/payload/platform/services/claude-session-manager/dist/tool-surface.js.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/loop/PLUGIN.md +11 -0
- package/dist/__tests__/onboarding-state-readback.test.js +0 -61
- package/dist/onboarding-readback.js +0 -27
- package/payload/platform/lib/anthropic-key/dist/index.d.ts +0 -22
- package/payload/platform/lib/anthropic-key/dist/index.d.ts.map +0 -1
- package/payload/platform/lib/anthropic-key/dist/index.js +0 -232
- package/payload/platform/lib/anthropic-key/dist/index.js.map +0 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.d.ts +0 -39
- package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.d.ts.map +0 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.js +0 -249
- package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/.claude-plugin/marketplace.json +0 -13
- package/payload/platform/plugins/real-agency/plugins/loop/.claude-plugin/plugin.json +0 -17
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/index.d.ts +0 -2
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/index.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/index.js +0 -293
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/index.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.d.ts +0 -10
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.js +0 -88
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts +0 -82
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js +0 -427
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts +0 -5
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js +0 -40
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.d.ts +0 -10
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.js +0 -24
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.d.ts +0 -16
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.js +0 -35
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.d.ts +0 -5
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.js +0 -19
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.d.ts +0 -4
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.js +0 -14
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.d.ts +0 -9
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.js +0 -60
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts +0 -13
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.js +0 -41
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts +0 -9
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.js +0 -16
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts +0 -15
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.js +0 -11
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.d.ts +0 -10
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.js +0 -39
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.d.ts +0 -9
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.js +0 -125
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.d.ts +0 -18
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.js +0 -87
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.d.ts +0 -10
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.js +0 -82
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.d.ts +0 -12
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.js +0 -32
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.d.ts +0 -15
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.js +0 -11
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.d.ts +0 -16
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.js +0 -41
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.d.ts +0 -13
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.js +0 -49
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.d.ts +0 -7
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.js +0 -19
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.d.ts +0 -5
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.js +0 -32
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.d.ts +0 -14
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.js +0 -11
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.d.ts +0 -9
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.js +0 -85
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.d.ts +0 -13
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.js +0 -44
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.js.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.d.ts +0 -14
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.d.ts.map +0 -1
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.js +0 -18
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/.claude-plugin/marketplace.json +0 -13
- package/payload/premium-plugins/real-agency/plugins/loop/.claude-plugin/plugin.json +0 -17
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/index.d.ts +0 -2
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/index.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/index.js +0 -293
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/index.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.d.ts +0 -10
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.js +0 -88
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts +0 -82
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js +0 -427
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts +0 -5
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js +0 -40
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.d.ts +0 -10
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.js +0 -24
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.d.ts +0 -16
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.js +0 -35
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.d.ts +0 -5
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.js +0 -19
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.d.ts +0 -4
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.js +0 -14
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.d.ts +0 -9
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.js +0 -60
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts +0 -13
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.js +0 -41
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts +0 -9
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.js +0 -16
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts +0 -15
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.js +0 -11
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.d.ts +0 -10
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.js +0 -39
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.d.ts +0 -9
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.js +0 -125
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.d.ts +0 -18
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.js +0 -87
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.d.ts +0 -10
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.js +0 -82
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.d.ts +0 -12
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.js +0 -32
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.d.ts +0 -15
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.js +0 -11
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.d.ts +0 -16
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.js +0 -41
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.d.ts +0 -13
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.js +0 -49
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.d.ts +0 -7
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.js +0 -19
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.d.ts +0 -5
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.js +0 -32
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.d.ts +0 -14
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.js +0 -11
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.d.ts +0 -9
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.js +0 -85
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.d.ts +0 -13
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.js +0 -44
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.js.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.d.ts +0 -14
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.d.ts.map +0 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.js +0 -18
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.js.map +0 -1
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
// Onboarding state management — graph-persisted workflow state.
|
|
2
|
-
// Purpose-built for Phase 0; migrates to a Workflow node with Task 13.
|
|
3
|
-
import { existsSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
const STEP_FIELDS = [
|
|
6
|
-
"step1CompletedAt",
|
|
7
|
-
"step2CompletedAt",
|
|
8
|
-
"step3CompletedAt",
|
|
9
|
-
"step4CompletedAt",
|
|
10
|
-
"step5CompletedAt",
|
|
11
|
-
"step6CompletedAt",
|
|
12
|
-
"step7CompletedAt",
|
|
13
|
-
"step8CompletedAt",
|
|
14
|
-
"step9CompletedAt",
|
|
15
|
-
];
|
|
16
|
-
// neo4j-driver v5 returns Integer objects for integer properties, not native
|
|
17
|
-
// JS numbers. This converts them safely (values 0–9 are well within range).
|
|
18
|
-
function toJsNumber(val) {
|
|
19
|
-
if (typeof val === "number")
|
|
20
|
-
return val;
|
|
21
|
-
if (val && typeof val === "object" && "toNumber" in val) {
|
|
22
|
-
return val.toNumber();
|
|
23
|
-
}
|
|
24
|
-
return 0;
|
|
25
|
-
}
|
|
26
|
-
function recordToState(record) {
|
|
27
|
-
return {
|
|
28
|
-
currentStep: toJsNumber(record.get("currentStep")),
|
|
29
|
-
step1CompletedAt: record.get("step1CompletedAt") ?? null,
|
|
30
|
-
step2CompletedAt: record.get("step2CompletedAt") ?? null,
|
|
31
|
-
step3CompletedAt: record.get("step3CompletedAt") ?? null,
|
|
32
|
-
step4CompletedAt: record.get("step4CompletedAt") ?? null,
|
|
33
|
-
step5CompletedAt: record.get("step5CompletedAt") ?? null,
|
|
34
|
-
step6CompletedAt: record.get("step6CompletedAt") ?? null,
|
|
35
|
-
step7CompletedAt: record.get("step7CompletedAt") ?? null,
|
|
36
|
-
step8CompletedAt: record.get("step8CompletedAt") ?? null,
|
|
37
|
-
step9CompletedAt: record.get("step9CompletedAt") ?? null,
|
|
38
|
-
createdAt: record.get("createdAt") ?? new Date().toISOString(),
|
|
39
|
-
updatedAt: record.get("updatedAt") ?? new Date().toISOString(),
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
function readMigrationStep(accountDir) {
|
|
43
|
-
try {
|
|
44
|
-
const raw = readFileSync(join(accountDir, "account.json"), "utf-8");
|
|
45
|
-
const config = JSON.parse(raw);
|
|
46
|
-
if (typeof config.onboardingStep === "number" && config.onboardingStep > 0) {
|
|
47
|
-
return config.onboardingStep;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
// File missing, unreadable, or malformed — no migration data
|
|
52
|
-
}
|
|
53
|
-
return 0;
|
|
54
|
-
}
|
|
55
|
-
function removeOnboardingStepFromFile(accountDir) {
|
|
56
|
-
try {
|
|
57
|
-
const configPath = join(accountDir, "account.json");
|
|
58
|
-
const raw = readFileSync(configPath, "utf-8");
|
|
59
|
-
const config = JSON.parse(raw);
|
|
60
|
-
if ("onboardingStep" in config) {
|
|
61
|
-
delete config.onboardingStep;
|
|
62
|
-
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
// Tolerate cleanup failure — graph is the authority now
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Task 562: consume the step-7 completion flag written by setup-tunnel.sh
|
|
71
|
-
* before the service restart. The script runs inside ${BRAND}.service's
|
|
72
|
-
* cgroup and cannot complete the MCP call after dispatching the restart —
|
|
73
|
-
* so it drops a filesystem marker instead. The first read of onboarding
|
|
74
|
-
* state after the restart picks it up, advances the graph via the same
|
|
75
|
-
* CASE-WHEN-NULL cypher as completeOnboardingStep, and deletes the marker.
|
|
76
|
-
*
|
|
77
|
-
* Idempotent at every layer: a missing flag is a no-op; a flag present
|
|
78
|
-
* against an already-completed step is a no-op on the graph (CASE-WHEN-NULL
|
|
79
|
-
* preserves the existing timestamp); a crash between graph write and flag
|
|
80
|
-
* delete re-consumes on the next call with the same no-op outcome.
|
|
81
|
-
*/
|
|
82
|
-
export async function consumeStep7Flag(session, accountId, accountDir) {
|
|
83
|
-
const flagPath = join(accountDir, "onboarding", "step7-complete");
|
|
84
|
-
if (!existsSync(flagPath))
|
|
85
|
-
return false;
|
|
86
|
-
let completedAt = new Date().toISOString();
|
|
87
|
-
try {
|
|
88
|
-
const raw = readFileSync(flagPath, "utf-8").trim();
|
|
89
|
-
if (raw) {
|
|
90
|
-
const parsed = JSON.parse(raw);
|
|
91
|
-
if (typeof parsed.completedAt === "string") {
|
|
92
|
-
completedAt = parsed.completedAt;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
// Malformed flag content still advances state — the flag's presence
|
|
98
|
-
// alone is the authoritative signal; the embedded timestamp is forensic.
|
|
99
|
-
}
|
|
100
|
-
// RETURN count(o) so we can detect the "no OnboardingState node" case
|
|
101
|
-
// where SET is a silent no-op. Without this check, rmSync below would
|
|
102
|
-
// delete the flag against a graph that never applied the write, silently
|
|
103
|
-
// losing the step-7 completion signal forever.
|
|
104
|
-
const result = await session.run(`MATCH (o:OnboardingState {accountId: $accountId})
|
|
105
|
-
SET o.step7CompletedAt = CASE WHEN o.step7CompletedAt IS NULL THEN $completedAt ELSE o.step7CompletedAt END,
|
|
106
|
-
o.currentStep = CASE WHEN 7 > o.currentStep THEN 7 ELSE o.currentStep END,
|
|
107
|
-
o.updatedAt = $completedAt
|
|
108
|
-
RETURN count(o) AS updated`, { accountId, completedAt });
|
|
109
|
-
const updatedRaw = result.records[0]?.get("updated");
|
|
110
|
-
const updated = toJsNumber(updatedRaw);
|
|
111
|
-
if (updated === 0) {
|
|
112
|
-
// No OnboardingState node yet — leave the flag in place so the next
|
|
113
|
-
// reader (after node creation via MERGE in this function's migration
|
|
114
|
-
// branch below) can still consume it.
|
|
115
|
-
console.log(`[onboarding-flag-consumed] accountId=${accountId.slice(0, 8)}… step=7 ` +
|
|
116
|
-
`source=filesystem flagPath=${flagPath} skipped=no-node`);
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
console.log(`[onboarding-flag-consumed] accountId=${accountId.slice(0, 8)}… step=7 ` +
|
|
120
|
-
`source=filesystem flagPath=${flagPath} completedAt=${completedAt}`);
|
|
121
|
-
try {
|
|
122
|
-
rmSync(flagPath);
|
|
123
|
-
}
|
|
124
|
-
catch (err) {
|
|
125
|
-
console.error(`[onboarding-flag-consumed] warn: failed to delete ${flagPath}: ` +
|
|
126
|
-
`${err instanceof Error ? err.message : String(err)}`);
|
|
127
|
-
}
|
|
128
|
-
return true;
|
|
129
|
-
}
|
|
130
|
-
const READ_STATE_QUERY = `MATCH (o:OnboardingState {accountId: $accountId})
|
|
131
|
-
RETURN o.currentStep AS currentStep,
|
|
132
|
-
o.step1CompletedAt AS step1CompletedAt,
|
|
133
|
-
o.step2CompletedAt AS step2CompletedAt,
|
|
134
|
-
o.step3CompletedAt AS step3CompletedAt,
|
|
135
|
-
o.step4CompletedAt AS step4CompletedAt,
|
|
136
|
-
o.step5CompletedAt AS step5CompletedAt,
|
|
137
|
-
o.step6CompletedAt AS step6CompletedAt,
|
|
138
|
-
o.step7CompletedAt AS step7CompletedAt,
|
|
139
|
-
o.step8CompletedAt AS step8CompletedAt,
|
|
140
|
-
o.step9CompletedAt AS step9CompletedAt,
|
|
141
|
-
o.createdAt AS createdAt,
|
|
142
|
-
o.updatedAt AS updatedAt`;
|
|
143
|
-
export async function getOnboardingState(sessionFactory, accountId, accountDir) {
|
|
144
|
-
const session = sessionFactory();
|
|
145
|
-
try {
|
|
146
|
-
// Check for existing graph node
|
|
147
|
-
const existing = await session.run(READ_STATE_QUERY, { accountId });
|
|
148
|
-
const nodeExisted = existing.records.length > 0;
|
|
149
|
-
if (nodeExisted) {
|
|
150
|
-
// Task 562: consume setup-tunnel.sh step-7 flag against the existing
|
|
151
|
-
// node. loadOnboardingStep (UI side) usually does this first at session
|
|
152
|
-
// start; this call is defensive in case this read precedes it.
|
|
153
|
-
//
|
|
154
|
-
// Always re-read after the consume attempt. If a concurrent caller
|
|
155
|
-
// consumed the flag between our initial read and our consumeStep7Flag
|
|
156
|
-
// call, consumeStep7Flag returns false (flag gone) but the graph still
|
|
157
|
-
// advanced — returning `existing.records[0]` would hand back the stale
|
|
158
|
-
// pre-consumption record. One extra indexed MATCH is negligible and
|
|
159
|
-
// guarantees the caller sees the authoritative state.
|
|
160
|
-
await consumeStep7Flag(session, accountId, accountDir);
|
|
161
|
-
const refreshed = await session.run(READ_STATE_QUERY, { accountId });
|
|
162
|
-
return recordToState(refreshed.records[0]);
|
|
163
|
-
}
|
|
164
|
-
// No graph node — check for migration from account.json
|
|
165
|
-
const migratedStep = readMigrationStep(accountDir);
|
|
166
|
-
const now = new Date().toISOString();
|
|
167
|
-
// Build step completion timestamps for migrated steps.
|
|
168
|
-
// account.json only stored a step counter, not per-step timestamps,
|
|
169
|
-
// so migrated steps all get the current time — the original times
|
|
170
|
-
// were never recorded.
|
|
171
|
-
const stepProps = {};
|
|
172
|
-
for (let i = 0; i < STEP_FIELDS.length; i++) {
|
|
173
|
-
stepProps[STEP_FIELDS[i]] = i < migratedStep ? now : null;
|
|
174
|
-
}
|
|
175
|
-
// Create the node via MERGE (idempotent under concurrent access)
|
|
176
|
-
const result = await session.run(`MERGE (o:OnboardingState {accountId: $accountId})
|
|
177
|
-
ON CREATE SET
|
|
178
|
-
o.currentStep = $currentStep,
|
|
179
|
-
o.step1CompletedAt = $step1CompletedAt,
|
|
180
|
-
o.step2CompletedAt = $step2CompletedAt,
|
|
181
|
-
o.step3CompletedAt = $step3CompletedAt,
|
|
182
|
-
o.step4CompletedAt = $step4CompletedAt,
|
|
183
|
-
o.step5CompletedAt = $step5CompletedAt,
|
|
184
|
-
o.step6CompletedAt = $step6CompletedAt,
|
|
185
|
-
o.step7CompletedAt = $step7CompletedAt,
|
|
186
|
-
o.step8CompletedAt = $step8CompletedAt,
|
|
187
|
-
o.step9CompletedAt = $step9CompletedAt,
|
|
188
|
-
o.createdAt = $now,
|
|
189
|
-
o.updatedAt = $now
|
|
190
|
-
RETURN o.currentStep AS currentStep,
|
|
191
|
-
o.step1CompletedAt AS step1CompletedAt,
|
|
192
|
-
o.step2CompletedAt AS step2CompletedAt,
|
|
193
|
-
o.step3CompletedAt AS step3CompletedAt,
|
|
194
|
-
o.step4CompletedAt AS step4CompletedAt,
|
|
195
|
-
o.step5CompletedAt AS step5CompletedAt,
|
|
196
|
-
o.step6CompletedAt AS step6CompletedAt,
|
|
197
|
-
o.step7CompletedAt AS step7CompletedAt,
|
|
198
|
-
o.step8CompletedAt AS step8CompletedAt,
|
|
199
|
-
o.step9CompletedAt AS step9CompletedAt,
|
|
200
|
-
o.createdAt AS createdAt,
|
|
201
|
-
o.updatedAt AS updatedAt`, { accountId, currentStep: migratedStep, now, ...stepProps });
|
|
202
|
-
// Clean up account.json if migration happened
|
|
203
|
-
if (migratedStep > 0) {
|
|
204
|
-
removeOnboardingStepFromFile(accountDir);
|
|
205
|
-
}
|
|
206
|
-
return recordToState(result.records[0]);
|
|
207
|
-
}
|
|
208
|
-
finally {
|
|
209
|
-
await session.close();
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
export async function completeOnboardingStep(sessionFactory, accountId, step) {
|
|
213
|
-
if (!Number.isInteger(step) || step < 1 || step > 9) {
|
|
214
|
-
throw new Error("Step must be between 1 and 9");
|
|
215
|
-
}
|
|
216
|
-
const session = sessionFactory();
|
|
217
|
-
try {
|
|
218
|
-
const stepField = STEP_FIELDS[step - 1];
|
|
219
|
-
const now = new Date().toISOString();
|
|
220
|
-
// Single query: MATCH + SET. If no node exists, MATCH returns zero
|
|
221
|
-
// records and we detect that from the result — no separate check needed.
|
|
222
|
-
const result = await session.run(`MATCH (o:OnboardingState {accountId: $accountId})
|
|
223
|
-
SET o.${stepField} = CASE WHEN o.${stepField} IS NULL THEN $now ELSE o.${stepField} END,
|
|
224
|
-
o.currentStep = CASE WHEN $step > o.currentStep THEN $step ELSE o.currentStep END,
|
|
225
|
-
o.updatedAt = $now
|
|
226
|
-
RETURN o.currentStep AS currentStep,
|
|
227
|
-
o.step1CompletedAt AS step1CompletedAt,
|
|
228
|
-
o.step2CompletedAt AS step2CompletedAt,
|
|
229
|
-
o.step3CompletedAt AS step3CompletedAt,
|
|
230
|
-
o.step4CompletedAt AS step4CompletedAt,
|
|
231
|
-
o.step5CompletedAt AS step5CompletedAt,
|
|
232
|
-
o.step6CompletedAt AS step6CompletedAt,
|
|
233
|
-
o.step7CompletedAt AS step7CompletedAt,
|
|
234
|
-
o.step8CompletedAt AS step8CompletedAt,
|
|
235
|
-
o.step9CompletedAt AS step9CompletedAt,
|
|
236
|
-
o.createdAt AS createdAt,
|
|
237
|
-
o.updatedAt AS updatedAt`, { accountId, step, now });
|
|
238
|
-
if (result.records.length === 0) {
|
|
239
|
-
throw new Error("No onboarding state found for this account. Call onboarding-get first.");
|
|
240
|
-
}
|
|
241
|
-
console.log(`[onboarding-step-complete] accountId=${accountId.slice(0, 8)}… ` +
|
|
242
|
-
`step=${step} completedAt=${now}`);
|
|
243
|
-
return recordToState(result.records[0]);
|
|
244
|
-
}
|
|
245
|
-
finally {
|
|
246
|
-
await session.close();
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
//# sourceMappingURL=onboarding.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/lib/onboarding.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "loop",
|
|
3
|
-
"description": "loop plugin",
|
|
4
|
-
"version": "0.1.0",
|
|
5
|
-
"author": {
|
|
6
|
-
"name": "Rubytech LLC"
|
|
7
|
-
},
|
|
8
|
-
"mcpServers": {
|
|
9
|
-
"loop": {
|
|
10
|
-
"type": "stdio",
|
|
11
|
-
"command": "node",
|
|
12
|
-
"args": [
|
|
13
|
-
"${CLAUDE_PLUGIN_ROOT}/mcp/dist/index.js"
|
|
14
|
-
]
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
import { initStderrTee } from "../../../../lib/mcp-stderr-tee/dist/index.js";
|
|
2
|
-
initStderrTee("loop");
|
|
3
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
-
import { z } from "zod";
|
|
6
|
-
import { keyRegister } from "./tools/key-register.js";
|
|
7
|
-
import { keyDeregister } from "./tools/key-deregister.js";
|
|
8
|
-
import { keyList } from "./tools/key-list.js";
|
|
9
|
-
import { propertySearch } from "./tools/property-search.js";
|
|
10
|
-
import { propertyDetail } from "./tools/property-detail.js";
|
|
11
|
-
import { propertyListed } from "./tools/property-listed.js";
|
|
12
|
-
import { propertyRequest } from "./tools/property-request.js";
|
|
13
|
-
import { peopleSearch } from "./tools/people-search.js";
|
|
14
|
-
import { peopleDetail } from "./tools/people-detail.js";
|
|
15
|
-
import { viewingSearch } from "./tools/viewing-search.js";
|
|
16
|
-
import { viewingDetail } from "./tools/viewing-detail.js";
|
|
17
|
-
import { viewingCreate } from "./tools/viewing-create.js";
|
|
18
|
-
import { viewingUpdate } from "./tools/viewing-update.js";
|
|
19
|
-
import { feedbackGet, feedbackSubmit } from "./tools/feedback.js";
|
|
20
|
-
import { teamInfo } from "./tools/team-info.js";
|
|
21
|
-
import { teamAvailability } from "./tools/team-availability.js";
|
|
22
|
-
import { marketingMatchDetail } from "./tools/marketing-match.js";
|
|
23
|
-
import { marketingMatchBatch } from "./tools/marketing-match-batch.js";
|
|
24
|
-
import { marketingMatchRequest } from "./tools/marketing-match-request.js";
|
|
25
|
-
import { marketingEnquiry } from "./tools/marketing-enquiry.js";
|
|
26
|
-
import { customerPreferences } from "./tools/customer-preferences.js";
|
|
27
|
-
import { supplier } from "./tools/supplier.js";
|
|
28
|
-
import { closeDriver } from "./lib/neo4j.js";
|
|
29
|
-
const accountId = process.env.ACCOUNT_ID;
|
|
30
|
-
if (!accountId) {
|
|
31
|
-
throw new Error("ACCOUNT_ID environment variable is required");
|
|
32
|
-
}
|
|
33
|
-
const server = new McpServer({
|
|
34
|
-
name: "maxy-loop",
|
|
35
|
-
version: "0.2.0",
|
|
36
|
-
});
|
|
37
|
-
const ALL_PERMISSIONS = z.enum([
|
|
38
|
-
"properties", "people", "viewings", "feedback", "team",
|
|
39
|
-
"marketing", "customer", "supplier",
|
|
40
|
-
]);
|
|
41
|
-
console.error(`[loop] server started, account=${accountId}`);
|
|
42
|
-
// Helper: wrap a tool function in standard error handling
|
|
43
|
-
function toolHandler(fn) {
|
|
44
|
-
return async (params) => {
|
|
45
|
-
try {
|
|
46
|
-
const text = await fn({ ...params, accountId });
|
|
47
|
-
return { content: [{ type: "text", text }] };
|
|
48
|
-
}
|
|
49
|
-
catch (err) {
|
|
50
|
-
return {
|
|
51
|
-
content: [{
|
|
52
|
-
type: "text",
|
|
53
|
-
text: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
54
|
-
}],
|
|
55
|
-
isError: true,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
// ─────────────────────────────────────────────────────────────────
|
|
61
|
-
// Key Management Tools (3)
|
|
62
|
-
// ─────────────────────────────────────────────────────────────────
|
|
63
|
-
server.tool("loop-key-register", "Register a Loop CRM API key for a team. Validates the key against Loop's API, encrypts it, and stores it in the graph. Each key maps to one team.", {
|
|
64
|
-
teamName: z.string().min(1).describe("Human-readable name for this team (e.g. 'Muvin Main Office')"),
|
|
65
|
-
apiKey: z.string().min(10).describe("Loop API key (X-Api-Key header value)"),
|
|
66
|
-
permissions: z
|
|
67
|
-
.array(ALL_PERMISSIONS)
|
|
68
|
-
.optional()
|
|
69
|
-
.describe("Endpoint groups this key can access (default: all 8 groups)"),
|
|
70
|
-
}, async (params) => {
|
|
71
|
-
try {
|
|
72
|
-
const result = await keyRegister({ ...params, accountId });
|
|
73
|
-
let text = `Team "${params.teamName}" registered successfully.`;
|
|
74
|
-
if (result.warning)
|
|
75
|
-
text += `\n\nWarning: ${result.warning}`;
|
|
76
|
-
return { content: [{ type: "text", text }] };
|
|
77
|
-
}
|
|
78
|
-
catch (err) {
|
|
79
|
-
return {
|
|
80
|
-
content: [{
|
|
81
|
-
type: "text",
|
|
82
|
-
text: `Failed to register key: ${err instanceof Error ? err.message : String(err)}`,
|
|
83
|
-
}],
|
|
84
|
-
isError: true,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
server.tool("loop-key-deregister", "Remove a registered Loop CRM team key. The key is permanently deleted from the graph.", { teamName: z.string().min(1).describe("Name of the team to remove") }, async ({ teamName }) => {
|
|
89
|
-
try {
|
|
90
|
-
await keyDeregister({ teamName, accountId });
|
|
91
|
-
return { content: [{ type: "text", text: `Team "${teamName}" deregistered.` }] };
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
return {
|
|
95
|
-
content: [{
|
|
96
|
-
type: "text",
|
|
97
|
-
text: `Failed to deregister: ${err instanceof Error ? err.message : String(err)}`,
|
|
98
|
-
}],
|
|
99
|
-
isError: true,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
server.tool("loop-key-list", "List all registered Loop CRM teams for this account. Shows team names, addresses, and permissions. Never reveals API key values.", {}, toolHandler(async (p) => keyList({ accountId: p.accountId })));
|
|
104
|
-
// ─────────────────────────────────────────────────────────────────
|
|
105
|
-
// People Tools (2) — permission: people
|
|
106
|
-
// ─────────────────────────────────────────────────────────────────
|
|
107
|
-
server.tool("loop-people-search", "Search people in Loop CRM. Without a role, searches all contacts. With a role (buyers/sellers/renters/landlords), returns role-specific results with rich filters.", {
|
|
108
|
-
role: z.enum(["buyers", "sellers", "renters", "landlords"]).optional().describe("Role to search (omit for all people)"),
|
|
109
|
-
searchTerm: z.string().optional().describe("Name or contact search"),
|
|
110
|
-
maxPrice: z.number().optional().describe("Max price (buyers) or max price filter (sellers)"),
|
|
111
|
-
minPrice: z.number().optional().describe("Min price (sellers)"),
|
|
112
|
-
minBeds: z.number().optional().describe("Min bedrooms (buyers/renters)"),
|
|
113
|
-
maxRent: z.number().optional().describe("Max rent (renters only)"),
|
|
114
|
-
searchAreas: z.string().optional().describe("Comma-separated outcodes e.g. 'SN7,OX12' (buyers/renters)"),
|
|
115
|
-
propertyTypes: z.string().optional().describe("Comma-separated property types (buyers/renters)"),
|
|
116
|
-
startDate: z.string().optional().describe("Start date filter (sellers/landlords)"),
|
|
117
|
-
endDate: z.string().optional().describe("End date filter (sellers/landlords)"),
|
|
118
|
-
teamName: z.string().optional().describe("Query a specific team only"),
|
|
119
|
-
limit: z.number().int().optional().describe("Max results (default 200)"),
|
|
120
|
-
}, toolHandler(async (p) => peopleSearch(p)));
|
|
121
|
-
server.tool("loop-people-detail", "Get full details for a specific person by ID. Optionally specify a role (buyers/sellers/renters/landlords) for role-specific detail.", {
|
|
122
|
-
personId: z.number().int().describe("Person ID"),
|
|
123
|
-
role: z.enum(["buyers", "sellers", "renters", "landlords"]).optional().describe("Role for role-specific detail view"),
|
|
124
|
-
teamName: z.string().optional().describe("Query a specific team only"),
|
|
125
|
-
}, toolHandler(async (p) => peopleDetail(p)));
|
|
126
|
-
// ─────────────────────────────────────────────────────────────────
|
|
127
|
-
// Property Tools (4) — permission: properties
|
|
128
|
-
// ─────────────────────────────────────────────────────────────────
|
|
129
|
-
server.tool("loop-property-search", "Search properties in Loop CRM. Queries /property/residential/sales and /property/residential/lettings. Use department to narrow to one type.", {
|
|
130
|
-
department: z.enum(["sales", "lettings", "both"]).optional().describe("Department (default: both)"),
|
|
131
|
-
searchTerm: z.string().optional().describe("Address or keyword search"),
|
|
132
|
-
minPrice: z.number().optional().describe("Minimum price"),
|
|
133
|
-
maxPrice: z.number().optional().describe("Maximum price"),
|
|
134
|
-
minBedrooms: z.number().int().optional().describe("Minimum bedrooms"),
|
|
135
|
-
maxBedrooms: z.number().int().optional().describe("Maximum bedrooms"),
|
|
136
|
-
propertyStatuses: z.string().optional().describe("Comma-separated statuses (e.g. 'forSale,underOffer')"),
|
|
137
|
-
propertyTypes: z.string().optional().describe("Comma-separated property types"),
|
|
138
|
-
teamName: z.string().optional().describe("Query a specific team only"),
|
|
139
|
-
limit: z.number().int().optional().describe("Max results (default 200)"),
|
|
140
|
-
}, toolHandler(async (p) => propertySearch(p)));
|
|
141
|
-
server.tool("loop-property-detail", "Get full details for a specific property by ID and department. Optionally include a preview hash for the public preview.", {
|
|
142
|
-
propertyId: z.number().int().describe("Property ID"),
|
|
143
|
-
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
144
|
-
previewHash: z.number().int().optional().describe("Preview hash for public preview URL"),
|
|
145
|
-
teamName: z.string().optional().describe("Query a specific team only"),
|
|
146
|
-
}, toolHandler(async (p) => propertyDetail(p)));
|
|
147
|
-
server.tool("loop-property-listed", "Get properties listed on a specific channel (Rightmove, Zoopla, OnTheMarket, website). Optionally include sold properties.", {
|
|
148
|
-
channel: z.enum(["rightmove", "onTheMarket", "zoopla", "website"]).describe("Listing channel"),
|
|
149
|
-
department: z.enum(["sales", "lettings", "both"]).optional().describe("Department (default: both)"),
|
|
150
|
-
includeSold: z.boolean().optional().describe("Include sold gallery (default: false)"),
|
|
151
|
-
teamName: z.string().optional().describe("Query a specific team only"),
|
|
152
|
-
limit: z.number().int().optional().describe("Max results (default 200)"),
|
|
153
|
-
}, toolHandler(async (p) => propertyListed(p)));
|
|
154
|
-
server.tool("loop-property-request", "Submit a viewing, callback, or information request for a property. Requires a specific team.", {
|
|
155
|
-
teamName: z.string().min(1).describe("Team to submit the request through"),
|
|
156
|
-
propertyId: z.number().int().describe("Property ID"),
|
|
157
|
-
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
158
|
-
action: z.enum(["viewing", "call-back", "information"]).describe("Request type"),
|
|
159
|
-
name: z.string().optional().describe("Requester name"),
|
|
160
|
-
email: z.string().optional().describe("Requester email"),
|
|
161
|
-
phone: z.string().optional().describe("Requester phone"),
|
|
162
|
-
message: z.string().optional().describe("Additional message"),
|
|
163
|
-
}, toolHandler(async (p) => propertyRequest(p)));
|
|
164
|
-
// ─────────────────────────────────────────────────────────────────
|
|
165
|
-
// Viewing Tools (4) — permission: viewings
|
|
166
|
-
// ─────────────────────────────────────────────────────────────────
|
|
167
|
-
server.tool("loop-viewing-search", "Search viewings in Loop CRM. Queries /residential/sales/viewings and /residential/lettings/viewings.", {
|
|
168
|
-
department: z.enum(["sales", "lettings", "both"]).optional().describe("Department (default: both)"),
|
|
169
|
-
searchTerm: z.string().optional().describe("Search viewings"),
|
|
170
|
-
appointmentStartDate: z.string().optional().describe("Filter from date (ISO format)"),
|
|
171
|
-
appointmentEndDate: z.string().optional().describe("Filter to date (ISO format)"),
|
|
172
|
-
status: z.string().optional().describe("Viewing status filter"),
|
|
173
|
-
teamName: z.string().optional().describe("Query a specific team only"),
|
|
174
|
-
limit: z.number().int().optional().describe("Max results (default 200)"),
|
|
175
|
-
}, toolHandler(async (p) => viewingSearch(p)));
|
|
176
|
-
server.tool("loop-viewing-detail", "Get full details for a specific viewing by ID and department.", {
|
|
177
|
-
viewingId: z.number().int().describe("Viewing ID"),
|
|
178
|
-
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
179
|
-
teamName: z.string().optional().describe("Query a specific team only"),
|
|
180
|
-
}, toolHandler(async (p) => viewingDetail(p)));
|
|
181
|
-
server.tool("loop-viewing-create", "Create a new viewing in Loop CRM. Creates the viewing and associated buyer/renter record.", {
|
|
182
|
-
teamName: z.string().min(1).describe("Team to create the viewing for"),
|
|
183
|
-
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
184
|
-
propertyId: z.number().int().describe("Property ID"),
|
|
185
|
-
date: z.string().describe("Viewing date (YYYY-MM-DD)"),
|
|
186
|
-
time: z.string().describe("Viewing time (HH:mm)"),
|
|
187
|
-
attendeeName: z.string().describe("Attendee full name"),
|
|
188
|
-
attendeeEmail: z.string().optional().describe("Attendee email"),
|
|
189
|
-
attendeePhone: z.string().optional().describe("Attendee phone"),
|
|
190
|
-
}, toolHandler(async (p) => viewingCreate(p)));
|
|
191
|
-
server.tool("loop-viewing-update", "Add a note or record feedback for a viewing. For feedback, specify the party: buyer/seller (sales) or renter/landlord (lettings).", {
|
|
192
|
-
teamName: z.string().min(1).describe("Team that owns the viewing"),
|
|
193
|
-
viewingId: z.number().int().describe("Viewing ID"),
|
|
194
|
-
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
195
|
-
action: z.enum(["note", "feedback"]).describe("note or feedback"),
|
|
196
|
-
text: z.string().describe("Note text or feedback content"),
|
|
197
|
-
feedbackParty: z.enum(["buyer", "seller", "renter", "landlord"]).optional().describe("Required for feedback: whose feedback"),
|
|
198
|
-
}, toolHandler(async (p) => viewingUpdate(p)));
|
|
199
|
-
// ─────────────────────────────────────────────────────────────────
|
|
200
|
-
// Feedback Tools (2) — permission: feedback
|
|
201
|
-
// ─────────────────────────────────────────────────────────────────
|
|
202
|
-
server.tool("loop-feedback-get", "Get feedback for a specific viewing. Reads from /feedback/residential/{department}/viewings/{id}.", {
|
|
203
|
-
teamName: z.string().min(1).describe("Team that owns the viewing"),
|
|
204
|
-
viewingId: z.number().int().describe("Viewing ID"),
|
|
205
|
-
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
206
|
-
}, toolHandler(async (p) => feedbackGet(p)));
|
|
207
|
-
server.tool("loop-feedback-submit", "Submit feedback for a viewing. Writes to /feedback/residential/{department}/viewings/{id}/feedback.", {
|
|
208
|
-
teamName: z.string().min(1).describe("Team that owns the viewing"),
|
|
209
|
-
viewingId: z.number().int().describe("Viewing ID"),
|
|
210
|
-
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
211
|
-
feedback: z.string().describe("Feedback text"),
|
|
212
|
-
}, toolHandler(async (p) => feedbackSubmit(p)));
|
|
213
|
-
// ─────────────────────────────────────────────────────────────────
|
|
214
|
-
// Team Tools (2) — permission: team
|
|
215
|
-
// ─────────────────────────────────────────────────────────────────
|
|
216
|
-
server.tool("loop-team-info", "Get team details from Loop CRM. Returns team name, address, phone, and email.", {
|
|
217
|
-
teamName: z.string().optional().describe("Query a specific team only (omit for all teams)"),
|
|
218
|
-
}, toolHandler(async (p) => teamInfo(p)));
|
|
219
|
-
server.tool("loop-team-availability", "Get available time slots for a specific agent on a given date.", {
|
|
220
|
-
agentId: z.string().describe("Agent GUID identifier"),
|
|
221
|
-
searchDate: z.string().describe("Date to check availability (YYYY-MM-DD)"),
|
|
222
|
-
teamName: z.string().optional().describe("Query a specific team only"),
|
|
223
|
-
}, toolHandler(async (p) => teamAvailability(p)));
|
|
224
|
-
// ─────────────────────────────────────────────────────────────────
|
|
225
|
-
// Marketing Tools (4) — permission: marketing
|
|
226
|
-
// ─────────────────────────────────────────────────────────────────
|
|
227
|
-
server.tool("loop-marketing-match", "Get matching property detail and optionally the team profile for that match.", {
|
|
228
|
-
propertyId: z.number().int().describe("Property ID"),
|
|
229
|
-
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
230
|
-
includeTeamProfile: z.boolean().optional().describe("Include the team profile for this match (default: false)"),
|
|
231
|
-
teamName: z.string().optional().describe("Query a specific team only"),
|
|
232
|
-
}, toolHandler(async (p) => marketingMatchDetail(p)));
|
|
233
|
-
server.tool("loop-marketing-match-batch", "Get batch matching results for multiple property IDs.", {
|
|
234
|
-
propertyIds: z.array(z.number().int()).describe("Array of property IDs to match"),
|
|
235
|
-
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
236
|
-
teamName: z.string().optional().describe("Query a specific team only"),
|
|
237
|
-
}, toolHandler(async (p) => marketingMatchBatch(p)));
|
|
238
|
-
server.tool("loop-marketing-match-request", "Submit a viewing, information, or callback request for a matching property.", {
|
|
239
|
-
teamName: z.string().min(1).describe("Team to submit the request through"),
|
|
240
|
-
propertyId: z.number().int().describe("Matching property ID"),
|
|
241
|
-
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
242
|
-
action: z.enum(["viewing", "information", "callback"]).describe("Request type"),
|
|
243
|
-
name: z.string().optional().describe("Requester name"),
|
|
244
|
-
email: z.string().optional().describe("Requester email"),
|
|
245
|
-
phone: z.string().optional().describe("Requester phone"),
|
|
246
|
-
message: z.string().optional().describe("Additional message"),
|
|
247
|
-
}, toolHandler(async (p) => marketingMatchRequest(p)));
|
|
248
|
-
server.tool("loop-marketing-enquiry", "Marketing enquiry operations: submit seller enquiries, manage auto-responder interactions.", {
|
|
249
|
-
teamName: z.string().min(1).describe("Team to submit through"),
|
|
250
|
-
action: z.enum([
|
|
251
|
-
"seller-enquiry", "autoresponder-get", "autoresponder-answers",
|
|
252
|
-
"autoresponder-details", "autoresponder-refer",
|
|
253
|
-
]).describe("Enquiry action"),
|
|
254
|
-
sellerEnquiryData: z.record(z.string(), z.unknown()).optional().describe("Seller enquiry request body (for seller-enquiry)"),
|
|
255
|
-
autoResponderId: z.number().int().optional().describe("Auto-responder enquiry ID"),
|
|
256
|
-
autoResponderKey: z.string().optional().describe("Auto-responder key (UUID)"),
|
|
257
|
-
answers: z.array(z.unknown()).optional().describe("Auto-responder answers array"),
|
|
258
|
-
details: z.record(z.string(), z.unknown()).optional().describe("Auto-responder details object"),
|
|
259
|
-
}, toolHandler(async (p) => marketingEnquiry(p)));
|
|
260
|
-
// ─────────────────────────────────────────────────────────────────
|
|
261
|
-
// Customer Tools (1) — permission: customer
|
|
262
|
-
// ─────────────────────────────────────────────────────────────────
|
|
263
|
-
server.tool("loop-customer-preferences", "Read or write customer preferences for a person. Action 'read' returns current preferences, 'write' updates them.", {
|
|
264
|
-
teamName: z.string().min(1).describe("Team for this operation"),
|
|
265
|
-
personCode: z.number().int().describe("Person code (ID)"),
|
|
266
|
-
action: z.enum(["read", "write"]).describe("read or write"),
|
|
267
|
-
preferences: z.record(z.string(), z.unknown()).optional().describe("Preferences object (required for write)"),
|
|
268
|
-
}, toolHandler(async (p) => customerPreferences(p)));
|
|
269
|
-
// ─────────────────────────────────────────────────────────────────
|
|
270
|
-
// Supplier Tools (1) — permission: supplier
|
|
271
|
-
// ─────────────────────────────────────────────────────────────────
|
|
272
|
-
server.tool("loop-supplier", "Supplier operations: maintenance jobs, quotes, board contractor jobs. Supports listing, completing, and quoting.", {
|
|
273
|
-
teamName: z.string().min(1).describe("Team for this operation"),
|
|
274
|
-
action: z.enum([
|
|
275
|
-
"maintenance-jobs", "maintenance-complete", "maintenance-quotes",
|
|
276
|
-
"maintenance-submit-quote", "board-jobs", "board-complete",
|
|
277
|
-
]).describe("Supplier action"),
|
|
278
|
-
code: z.string().describe("Unique code assigned to the contractor"),
|
|
279
|
-
jobId: z.number().int().optional().describe("Job ID (required for all actions except maintenance-submit-quote)"),
|
|
280
|
-
quoteId: z.number().int().optional().describe("Quote ID (for maintenance-submit-quote)"),
|
|
281
|
-
quoteData: z.record(z.string(), z.unknown()).optional().describe("Quote data (for maintenance-submit-quote)"),
|
|
282
|
-
completionData: z.record(z.string(), z.unknown()).optional().describe("Completion data (for board-complete)"),
|
|
283
|
-
}, toolHandler(async (p) => supplier(p)));
|
|
284
|
-
// ─────────────────────────────────────────────────────────────────
|
|
285
|
-
// Lifecycle
|
|
286
|
-
// ─────────────────────────────────────────────────────────────────
|
|
287
|
-
process.on("SIGINT", async () => {
|
|
288
|
-
await closeDriver();
|
|
289
|
-
process.exit(0);
|
|
290
|
-
});
|
|
291
|
-
const transport = new StdioServerTransport();
|
|
292
|
-
await server.connect(transport);
|
|
293
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|