@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,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Encrypt a plaintext string. Returns "iv:ciphertext:authTag" (hex-encoded).
|
|
3
|
-
*/
|
|
4
|
-
export declare function encrypt(plaintext: string): string;
|
|
5
|
-
/**
|
|
6
|
-
* Decrypt a value produced by encrypt(). Expects "iv:ciphertext:authTag" (hex-encoded).
|
|
7
|
-
* Throws on tampered/corrupt data or wrong key.
|
|
8
|
-
*/
|
|
9
|
-
export declare function decrypt(encryptedValue: string): string;
|
|
10
|
-
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/lib/crypto.ts"],"names":[],"mappings":"AA0DA;;GAEG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CA2BtD"}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { randomBytes, createCipheriv, createDecipheriv } from "node:crypto";
|
|
2
|
-
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
3
|
-
import { resolve } from "node:path";
|
|
4
|
-
import { homedir } from "node:os";
|
|
5
|
-
const ALGORITHM = "aes-256-gcm";
|
|
6
|
-
const KEY_LENGTH = 32; // 256 bits
|
|
7
|
-
const IV_LENGTH = 12; // 96 bits — recommended for GCM
|
|
8
|
-
const AUTH_TAG_LENGTH = 16; // 128 bits
|
|
9
|
-
/**
|
|
10
|
-
* Resolve the config directory from brand.json (same pattern as anthropic-key, email).
|
|
11
|
-
* Falls back to ".maxy" if brand.json is unreadable.
|
|
12
|
-
*/
|
|
13
|
-
function resolveConfigDir() {
|
|
14
|
-
try {
|
|
15
|
-
const platformRoot = process.env.PLATFORM_ROOT;
|
|
16
|
-
if (platformRoot) {
|
|
17
|
-
const brandPath = resolve(platformRoot, "config/brand.json");
|
|
18
|
-
const brand = JSON.parse(readFileSync(brandPath, "utf-8"));
|
|
19
|
-
if (brand.configDir)
|
|
20
|
-
return brand.configDir;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
// Fall back to default
|
|
25
|
-
}
|
|
26
|
-
return ".maxy";
|
|
27
|
-
}
|
|
28
|
-
function keyFilePath() {
|
|
29
|
-
return resolve(homedir(), resolveConfigDir(), ".loop-encryption-key");
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Load or generate the encryption key. Generated on first use,
|
|
33
|
-
* stored at ~/.{configDir}/.loop-encryption-key with mode 0o600.
|
|
34
|
-
*/
|
|
35
|
-
function loadOrGenerateKey() {
|
|
36
|
-
const path = keyFilePath();
|
|
37
|
-
if (existsSync(path)) {
|
|
38
|
-
const hex = readFileSync(path, "utf-8").trim();
|
|
39
|
-
const buf = Buffer.from(hex, "hex");
|
|
40
|
-
if (buf.length !== KEY_LENGTH) {
|
|
41
|
-
throw new Error(`Encryption key at ${path} is ${buf.length} bytes, expected ${KEY_LENGTH}. ` +
|
|
42
|
-
`Delete the file and re-register all Loop team keys.`);
|
|
43
|
-
}
|
|
44
|
-
return buf;
|
|
45
|
-
}
|
|
46
|
-
// First use — generate a new key
|
|
47
|
-
const key = randomBytes(KEY_LENGTH);
|
|
48
|
-
writeFileSync(path, key.toString("hex"), { mode: 0o600 });
|
|
49
|
-
console.error(`[loop] encryption key generated at ${path}`);
|
|
50
|
-
return key;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Encrypt a plaintext string. Returns "iv:ciphertext:authTag" (hex-encoded).
|
|
54
|
-
*/
|
|
55
|
-
export function encrypt(plaintext) {
|
|
56
|
-
const key = loadOrGenerateKey();
|
|
57
|
-
const iv = randomBytes(IV_LENGTH);
|
|
58
|
-
const cipher = createCipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });
|
|
59
|
-
let encrypted = cipher.update(plaintext, "utf-8", "hex");
|
|
60
|
-
encrypted += cipher.final("hex");
|
|
61
|
-
const authTag = cipher.getAuthTag().toString("hex");
|
|
62
|
-
return `${iv.toString("hex")}:${encrypted}:${authTag}`;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Decrypt a value produced by encrypt(). Expects "iv:ciphertext:authTag" (hex-encoded).
|
|
66
|
-
* Throws on tampered/corrupt data or wrong key.
|
|
67
|
-
*/
|
|
68
|
-
export function decrypt(encryptedValue) {
|
|
69
|
-
const parts = encryptedValue.split(":");
|
|
70
|
-
if (parts.length !== 3) {
|
|
71
|
-
throw new Error("Malformed encrypted value — expected iv:ciphertext:authTag");
|
|
72
|
-
}
|
|
73
|
-
const [ivHex, ciphertextHex, authTagHex] = parts;
|
|
74
|
-
const path = keyFilePath();
|
|
75
|
-
if (!existsSync(path)) {
|
|
76
|
-
throw new Error(`Encryption key not found at ${path}. ` +
|
|
77
|
-
`All stored Loop API keys are unrecoverable. Re-register keys.`);
|
|
78
|
-
}
|
|
79
|
-
const key = loadOrGenerateKey();
|
|
80
|
-
const iv = Buffer.from(ivHex, "hex");
|
|
81
|
-
const authTag = Buffer.from(authTagHex, "hex");
|
|
82
|
-
const decipher = createDecipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });
|
|
83
|
-
decipher.setAuthTag(authTag);
|
|
84
|
-
let decrypted = decipher.update(ciphertextHex, "hex", "utf-8");
|
|
85
|
-
decrypted += decipher.final("utf-8");
|
|
86
|
-
return decrypted;
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=crypto.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/lib/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,UAAU,GAAG,EAAE,CAAC,CAAC,WAAW;AAClC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,gCAAgC;AACtD,MAAM,eAAe,GAAG,EAAE,CAAC,CAAC,WAAW;AAEvC;;;GAGG;AACH,SAAS,gBAAgB;IACvB,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAC/C,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;YAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,IAAI,KAAK,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC,SAAS,CAAC;QAC9C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,EAAE,sBAAsB,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB;IACxB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAE3B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,OAAO,GAAG,CAAC,MAAM,oBAAoB,UAAU,IAAI;gBAC5E,qDAAqD,CACtD,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,iCAAiC;IACjC,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACpC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;IAC5D,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,SAAiB;IACvC,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC,CAAC;IAEtF,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACzD,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,cAAsB;IAC5C,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;IAEjD,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,IAAI;YACvC,+DAA+D,CAChE,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC,CAAC;IAC1F,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE7B,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/D,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
export interface LoopTeamKey {
|
|
2
|
-
teamName: string;
|
|
3
|
-
encryptedKey: string;
|
|
4
|
-
teamAddress: string;
|
|
5
|
-
agentId: string;
|
|
6
|
-
permissions: string[];
|
|
7
|
-
createdAt: string;
|
|
8
|
-
updatedAt: string;
|
|
9
|
-
}
|
|
10
|
-
export interface TeamResult<T> {
|
|
11
|
-
teamName: string;
|
|
12
|
-
data: T[];
|
|
13
|
-
}
|
|
14
|
-
export interface AggregationFailure {
|
|
15
|
-
teamName: string;
|
|
16
|
-
reason: string;
|
|
17
|
-
kind: "timeout" | "other";
|
|
18
|
-
}
|
|
19
|
-
export interface AggregationResult<T> {
|
|
20
|
-
results: TeamResult<T>[];
|
|
21
|
-
failures: AggregationFailure[];
|
|
22
|
-
skipped: {
|
|
23
|
-
teamName: string;
|
|
24
|
-
reason: string;
|
|
25
|
-
}[];
|
|
26
|
-
totalTeams: number;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Load all LoopTeamKey nodes for an account from Neo4j.
|
|
30
|
-
*/
|
|
31
|
-
export declare function loadTeamKeys(accountId: string): Promise<LoopTeamKey[]>;
|
|
32
|
-
/**
|
|
33
|
-
* Make a GET request to the Loop API V2.
|
|
34
|
-
*/
|
|
35
|
-
export declare function loopGet<T>(apiKey: string, path: string, toolName: string, teamName: string): Promise<T>;
|
|
36
|
-
/**
|
|
37
|
-
* Make a POST request to the Loop API V2.
|
|
38
|
-
* For write operations: create viewings, record feedback, submit enquiries, etc.
|
|
39
|
-
* Returns parsed JSON response. Treats 204 as success with empty result.
|
|
40
|
-
*/
|
|
41
|
-
export declare function loopPost<T>(apiKey: string, path: string, body: unknown, toolName: string, teamName: string): Promise<T>;
|
|
42
|
-
/**
|
|
43
|
-
* Make a PUT request to the Loop API V2.
|
|
44
|
-
* For update operations: batch matching, submit quotes, update preferences, etc.
|
|
45
|
-
*/
|
|
46
|
-
export declare function loopPut<T>(apiKey: string, path: string, body: unknown, toolName: string, teamName: string): Promise<T>;
|
|
47
|
-
export declare class LoopApiError extends Error {
|
|
48
|
-
readonly status: number;
|
|
49
|
-
readonly teamName: string;
|
|
50
|
-
readonly path: string;
|
|
51
|
-
readonly responseBody?: string | undefined;
|
|
52
|
-
constructor(status: number, teamName: string, path: string, responseBody?: string | undefined);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Fan out a request across all registered teams for an account, merging results.
|
|
56
|
-
*
|
|
57
|
-
* Each tool provides a `buildRequest` function that takes a decrypted API key
|
|
58
|
-
* and returns the data for that team. The aggregation engine handles:
|
|
59
|
-
* - Key loading and decryption
|
|
60
|
-
* - Permission checking
|
|
61
|
-
* - Concurrent fan-out via Promise.allSettled
|
|
62
|
-
* - Result merging with teamName tags
|
|
63
|
-
* - Aggregate logging
|
|
64
|
-
*
|
|
65
|
-
* When `teamName` is provided, only that team is queried (no fan-out).
|
|
66
|
-
*/
|
|
67
|
-
export declare function aggregateAcrossTeams<T>(accountId: string, endpointGroup: string, toolName: string, buildRequest: (apiKey: string, teamName: string) => Promise<T[]>, options?: {
|
|
68
|
-
teamName?: string;
|
|
69
|
-
limitPerTeam?: number;
|
|
70
|
-
limitTotal?: number;
|
|
71
|
-
}): Promise<AggregationResult<T>>;
|
|
72
|
-
/**
|
|
73
|
-
* Resolve a single team's API key with permission checking.
|
|
74
|
-
* Handles key loading, decryption, and permission validation.
|
|
75
|
-
* Used for both reads and writes that target a specific team — no fan-out.
|
|
76
|
-
*/
|
|
77
|
-
export declare function withTeamKey<T>(accountId: string, teamName: string, endpointGroup: string, toolName: string, execute: (apiKey: string) => Promise<T>): Promise<T>;
|
|
78
|
-
/**
|
|
79
|
-
* Format an aggregation result into a human-readable text response.
|
|
80
|
-
*/
|
|
81
|
-
export declare function formatAggregationResult<T>(result: AggregationResult<T>, formatItem: (item: T, teamName: string) => string, entityName: string): string;
|
|
82
|
-
//# sourceMappingURL=loop-api.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loop-api.d.ts","sourceRoot":"","sources":["../../src/lib/loop-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,427 +0,0 @@
|
|
|
1
|
-
import { getSession } from "./neo4j.js";
|
|
2
|
-
import { decrypt } from "./crypto.js";
|
|
3
|
-
// ─────────────────────────────────────────────────────────────────
|
|
4
|
-
// Loop API V2 HTTP Client + Cross-Team Aggregation Engine
|
|
5
|
-
//
|
|
6
|
-
// ┌─ Load LoopTeamKey nodes (Neo4j) ─┐
|
|
7
|
-
// │ │
|
|
8
|
-
// ▼ │
|
|
9
|
-
// For each key: │
|
|
10
|
-
// 1. Decrypt API key │
|
|
11
|
-
// 2. Check permissions │
|
|
12
|
-
// 3. HTTP GET/POST/PUT → Loop API V2 │
|
|
13
|
-
// │ │
|
|
14
|
-
// ▼ │
|
|
15
|
-
// Promise.allSettled → merge results │
|
|
16
|
-
// Log aggregate summary │
|
|
17
|
-
// ─────────────────────────────────────────────────────────────────
|
|
18
|
-
const LOOP_BASE_URL = "https://api.loop.software";
|
|
19
|
-
const REQUEST_TIMEOUT_MS = 10_000;
|
|
20
|
-
const TIMEOUT_RETRY_BACKOFF_MS = 2_000;
|
|
21
|
-
const DEFAULT_LIMIT_PER_TEAM = 50;
|
|
22
|
-
const DEFAULT_LIMIT_TOTAL = 200;
|
|
23
|
-
// One bounded retry on transient timeout — recovers from intermittent
|
|
24
|
-
// Loop-API latency spikes that would otherwise drop a team from coverage.
|
|
25
|
-
function isTimeoutError(err) {
|
|
26
|
-
if (!(err instanceof Error))
|
|
27
|
-
return false;
|
|
28
|
-
return (err.name === "TimeoutError" ||
|
|
29
|
-
err.name === "AbortError" ||
|
|
30
|
-
/aborted due to timeout/i.test(err.message));
|
|
31
|
-
}
|
|
32
|
-
function isEnvelope(val) {
|
|
33
|
-
return (val !== null &&
|
|
34
|
-
typeof val === "object" &&
|
|
35
|
-
!Array.isArray(val) &&
|
|
36
|
-
"statusCode" in val &&
|
|
37
|
-
"httpResponseCode" in val &&
|
|
38
|
-
"data" in val);
|
|
39
|
-
}
|
|
40
|
-
function unwrapEnvelope(parsed, toolName, teamName) {
|
|
41
|
-
if (!isEnvelope(parsed)) {
|
|
42
|
-
return parsed;
|
|
43
|
-
}
|
|
44
|
-
if (parsed.statusCode !== "success") {
|
|
45
|
-
const errMsg = parsed.errors?.length
|
|
46
|
-
? parsed.errors.join("; ")
|
|
47
|
-
: `statusCode=${parsed.statusCode}`;
|
|
48
|
-
throw new Error(`Loop API error for team=${teamName} tool=${toolName}: ${errMsg} (httpResponseCode=${parsed.httpResponseCode})`);
|
|
49
|
-
}
|
|
50
|
-
if (parsed.warnings?.length) {
|
|
51
|
-
console.error(`[loop] ${toolName} team=${teamName} warnings: ${parsed.warnings.join("; ")}`);
|
|
52
|
-
}
|
|
53
|
-
return parsed.data;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Load all LoopTeamKey nodes for an account from Neo4j.
|
|
57
|
-
*/
|
|
58
|
-
export async function loadTeamKeys(accountId) {
|
|
59
|
-
const session = getSession();
|
|
60
|
-
try {
|
|
61
|
-
const result = await session.run(`MATCH (k:LoopTeamKey {accountId: $accountId})
|
|
62
|
-
RETURN k.teamName AS teamName, k.encryptedKey AS encryptedKey,
|
|
63
|
-
k.teamAddress AS teamAddress, k.agentId AS agentId,
|
|
64
|
-
k.permissions AS permissions, k.createdAt AS createdAt,
|
|
65
|
-
k.updatedAt AS updatedAt
|
|
66
|
-
ORDER BY k.teamName`, { accountId });
|
|
67
|
-
return result.records.map((r) => ({
|
|
68
|
-
teamName: r.get("teamName"),
|
|
69
|
-
encryptedKey: r.get("encryptedKey"),
|
|
70
|
-
teamAddress: r.get("teamAddress") ?? "",
|
|
71
|
-
agentId: r.get("agentId") ?? "",
|
|
72
|
-
permissions: r.get("permissions") ?? [],
|
|
73
|
-
createdAt: r.get("createdAt") ?? "",
|
|
74
|
-
updatedAt: r.get("updatedAt") ?? "",
|
|
75
|
-
}));
|
|
76
|
-
}
|
|
77
|
-
finally {
|
|
78
|
-
await session.close();
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
// Truncate to 200 chars, escape newlines, single line — `[loop] <tool> team=<t>
|
|
82
|
-
// status=<n> body="<...>"`. Emitted at the wrapper boundary before throwing so
|
|
83
|
-
// the body is visible regardless of how downstream catch sites format the error
|
|
84
|
-
// (the aggregator at line ~388 reduces LoopApiError to "HTTP <status>" and
|
|
85
|
-
// would otherwise discard the body).
|
|
86
|
-
function logErrorBody(toolName, teamName, status, body) {
|
|
87
|
-
const truncated = body.slice(0, 200).replace(/\n/g, "\\n");
|
|
88
|
-
console.error(`[loop] ${toolName} team=${teamName} status=${status} body="${truncated}"`);
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Make a GET request to the Loop API V2.
|
|
92
|
-
*/
|
|
93
|
-
export async function loopGet(apiKey, path, toolName, teamName) {
|
|
94
|
-
const url = `${LOOP_BASE_URL}${path}`;
|
|
95
|
-
const start = Date.now();
|
|
96
|
-
const response = await fetch(url, {
|
|
97
|
-
headers: { "X-Api-Key": apiKey, "Accept": "application/json" },
|
|
98
|
-
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
99
|
-
});
|
|
100
|
-
const duration = Date.now() - start;
|
|
101
|
-
console.error(`[loop] ${toolName} team=${teamName} endpoint=GET ${path} status=${response.status} duration=${duration}ms`);
|
|
102
|
-
if (response.status === 204) {
|
|
103
|
-
return [];
|
|
104
|
-
}
|
|
105
|
-
if (!response.ok) {
|
|
106
|
-
const errorBody = await response.text().catch(() => "");
|
|
107
|
-
logErrorBody(toolName, teamName, response.status, errorBody);
|
|
108
|
-
throw new LoopApiError(response.status, teamName, path, errorBody);
|
|
109
|
-
}
|
|
110
|
-
const text = await response.text();
|
|
111
|
-
try {
|
|
112
|
-
const parsed = JSON.parse(text);
|
|
113
|
-
return unwrapEnvelope(parsed, toolName, teamName);
|
|
114
|
-
}
|
|
115
|
-
catch (err) {
|
|
116
|
-
if (err instanceof SyntaxError) {
|
|
117
|
-
throw new Error(`Loop returned non-JSON response for team=${teamName} path=${path} ` +
|
|
118
|
-
`(status=${response.status}, length=${text.length})`);
|
|
119
|
-
}
|
|
120
|
-
throw err;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Make a POST request to the Loop API V2.
|
|
125
|
-
* For write operations: create viewings, record feedback, submit enquiries, etc.
|
|
126
|
-
* Returns parsed JSON response. Treats 204 as success with empty result.
|
|
127
|
-
*/
|
|
128
|
-
export async function loopPost(apiKey, path, body, toolName, teamName) {
|
|
129
|
-
const url = `${LOOP_BASE_URL}${path}`;
|
|
130
|
-
const start = Date.now();
|
|
131
|
-
const response = await fetch(url, {
|
|
132
|
-
method: "POST",
|
|
133
|
-
headers: {
|
|
134
|
-
"X-Api-Key": apiKey,
|
|
135
|
-
"Accept": "application/json",
|
|
136
|
-
"Content-Type": "application/json",
|
|
137
|
-
},
|
|
138
|
-
body: JSON.stringify(body),
|
|
139
|
-
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
140
|
-
});
|
|
141
|
-
const duration = Date.now() - start;
|
|
142
|
-
console.error(`[loop] WRITE ${toolName} team=${teamName} endpoint=POST ${path} status=${response.status} duration=${duration}ms`);
|
|
143
|
-
if (response.status === 204) {
|
|
144
|
-
return { success: true };
|
|
145
|
-
}
|
|
146
|
-
if (!response.ok) {
|
|
147
|
-
const errorBody = await response.text().catch(() => "");
|
|
148
|
-
logErrorBody(toolName, teamName, response.status, errorBody);
|
|
149
|
-
throw new LoopApiError(response.status, teamName, path, errorBody);
|
|
150
|
-
}
|
|
151
|
-
const text = await response.text();
|
|
152
|
-
try {
|
|
153
|
-
const parsed = JSON.parse(text);
|
|
154
|
-
return unwrapEnvelope(parsed, toolName, teamName);
|
|
155
|
-
}
|
|
156
|
-
catch (err) {
|
|
157
|
-
if (err instanceof SyntaxError) {
|
|
158
|
-
throw new Error(`Loop returned non-JSON response for team=${teamName} path=${path} ` +
|
|
159
|
-
`(status=${response.status}, length=${text.length})`);
|
|
160
|
-
}
|
|
161
|
-
throw err;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Make a PUT request to the Loop API V2.
|
|
166
|
-
* For update operations: batch matching, submit quotes, update preferences, etc.
|
|
167
|
-
*/
|
|
168
|
-
export async function loopPut(apiKey, path, body, toolName, teamName) {
|
|
169
|
-
const url = `${LOOP_BASE_URL}${path}`;
|
|
170
|
-
const start = Date.now();
|
|
171
|
-
const response = await fetch(url, {
|
|
172
|
-
method: "PUT",
|
|
173
|
-
headers: {
|
|
174
|
-
"X-Api-Key": apiKey,
|
|
175
|
-
"Accept": "application/json",
|
|
176
|
-
"Content-Type": "application/json",
|
|
177
|
-
},
|
|
178
|
-
body: JSON.stringify(body),
|
|
179
|
-
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
180
|
-
});
|
|
181
|
-
const duration = Date.now() - start;
|
|
182
|
-
console.error(`[loop] WRITE ${toolName} team=${teamName} endpoint=PUT ${path} status=${response.status} duration=${duration}ms`);
|
|
183
|
-
if (response.status === 204) {
|
|
184
|
-
return { success: true };
|
|
185
|
-
}
|
|
186
|
-
if (!response.ok) {
|
|
187
|
-
const errorBody = await response.text().catch(() => "");
|
|
188
|
-
logErrorBody(toolName, teamName, response.status, errorBody);
|
|
189
|
-
throw new LoopApiError(response.status, teamName, path, errorBody);
|
|
190
|
-
}
|
|
191
|
-
const text = await response.text();
|
|
192
|
-
try {
|
|
193
|
-
const parsed = JSON.parse(text);
|
|
194
|
-
return unwrapEnvelope(parsed, toolName, teamName);
|
|
195
|
-
}
|
|
196
|
-
catch (err) {
|
|
197
|
-
if (err instanceof SyntaxError) {
|
|
198
|
-
throw new Error(`Loop returned non-JSON response for team=${teamName} path=${path} ` +
|
|
199
|
-
`(status=${response.status}, length=${text.length})`);
|
|
200
|
-
}
|
|
201
|
-
throw err;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
export class LoopApiError extends Error {
|
|
205
|
-
status;
|
|
206
|
-
teamName;
|
|
207
|
-
path;
|
|
208
|
-
responseBody;
|
|
209
|
-
constructor(status, teamName, path, responseBody) {
|
|
210
|
-
const detail = responseBody ? ` — ${responseBody.slice(0, 200)}` : "";
|
|
211
|
-
super(`Loop API returned ${status} for team=${teamName} path=${path}${detail}`);
|
|
212
|
-
this.status = status;
|
|
213
|
-
this.teamName = teamName;
|
|
214
|
-
this.path = path;
|
|
215
|
-
this.responseBody = responseBody;
|
|
216
|
-
this.name = "LoopApiError";
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Fan out a request across all registered teams for an account, merging results.
|
|
221
|
-
*
|
|
222
|
-
* Each tool provides a `buildRequest` function that takes a decrypted API key
|
|
223
|
-
* and returns the data for that team. The aggregation engine handles:
|
|
224
|
-
* - Key loading and decryption
|
|
225
|
-
* - Permission checking
|
|
226
|
-
* - Concurrent fan-out via Promise.allSettled
|
|
227
|
-
* - Result merging with teamName tags
|
|
228
|
-
* - Aggregate logging
|
|
229
|
-
*
|
|
230
|
-
* When `teamName` is provided, only that team is queried (no fan-out).
|
|
231
|
-
*/
|
|
232
|
-
export async function aggregateAcrossTeams(accountId, endpointGroup, toolName, buildRequest, options) {
|
|
233
|
-
const allKeys = await loadTeamKeys(accountId);
|
|
234
|
-
if (allKeys.length === 0) {
|
|
235
|
-
return { results: [], failures: [], skipped: [], totalTeams: 0 };
|
|
236
|
-
}
|
|
237
|
-
// Filter to specific team if requested
|
|
238
|
-
const keys = options?.teamName
|
|
239
|
-
? allKeys.filter((k) => k.teamName === options.teamName)
|
|
240
|
-
: allKeys;
|
|
241
|
-
if (keys.length === 0 && options?.teamName) {
|
|
242
|
-
return {
|
|
243
|
-
results: [],
|
|
244
|
-
failures: [{ teamName: options.teamName, reason: "Team not found", kind: "other" }],
|
|
245
|
-
skipped: [],
|
|
246
|
-
totalTeams: allKeys.length,
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
const limitPerTeam = options?.limitPerTeam ?? DEFAULT_LIMIT_PER_TEAM;
|
|
250
|
-
const limitTotal = options?.limitTotal ?? DEFAULT_LIMIT_TOTAL;
|
|
251
|
-
const results = [];
|
|
252
|
-
const failures = [];
|
|
253
|
-
const skipped = [];
|
|
254
|
-
// Check permissions and build per-team request thunks. Thunks (not stored
|
|
255
|
-
// promises) are required so a timed-out attempt can be re-invoked on retry.
|
|
256
|
-
const tasks = [];
|
|
257
|
-
for (const key of keys) {
|
|
258
|
-
if (!key.permissions.includes(endpointGroup)) {
|
|
259
|
-
console.error(`[loop] ${toolName} team=${key.teamName} — permission denied (requires: ${endpointGroup})`);
|
|
260
|
-
skipped.push({
|
|
261
|
-
teamName: key.teamName,
|
|
262
|
-
reason: `No ${endpointGroup} permission`,
|
|
263
|
-
});
|
|
264
|
-
continue;
|
|
265
|
-
}
|
|
266
|
-
let apiKey;
|
|
267
|
-
try {
|
|
268
|
-
apiKey = decrypt(key.encryptedKey);
|
|
269
|
-
}
|
|
270
|
-
catch (err) {
|
|
271
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
272
|
-
console.error(`[loop] decrypt failed for team=${key.teamName}: ${msg}`);
|
|
273
|
-
failures.push({
|
|
274
|
-
teamName: key.teamName,
|
|
275
|
-
reason: "Decryption failed",
|
|
276
|
-
kind: "other",
|
|
277
|
-
});
|
|
278
|
-
continue;
|
|
279
|
-
}
|
|
280
|
-
const teamName = key.teamName;
|
|
281
|
-
tasks.push({
|
|
282
|
-
key,
|
|
283
|
-
run: async () => {
|
|
284
|
-
try {
|
|
285
|
-
return await buildRequest(apiKey, teamName);
|
|
286
|
-
}
|
|
287
|
-
catch (err) {
|
|
288
|
-
if (!isTimeoutError(err))
|
|
289
|
-
throw err;
|
|
290
|
-
console.error(`[loop] ${toolName} team=${teamName} timed out — retrying in ${TIMEOUT_RETRY_BACKOFF_MS}ms`);
|
|
291
|
-
await new Promise((resolve) => setTimeout(resolve, TIMEOUT_RETRY_BACKOFF_MS));
|
|
292
|
-
return await buildRequest(apiKey, teamName);
|
|
293
|
-
}
|
|
294
|
-
},
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
// Fan out concurrent requests
|
|
298
|
-
const settled = await Promise.allSettled(tasks.map((t) => t.run()));
|
|
299
|
-
for (let i = 0; i < settled.length; i++) {
|
|
300
|
-
const outcome = settled[i];
|
|
301
|
-
const teamName = tasks[i].key.teamName;
|
|
302
|
-
if (outcome.status === "fulfilled") {
|
|
303
|
-
const data = Array.isArray(outcome.value)
|
|
304
|
-
? outcome.value.slice(0, limitPerTeam)
|
|
305
|
-
: [];
|
|
306
|
-
results.push({ teamName, data });
|
|
307
|
-
}
|
|
308
|
-
else {
|
|
309
|
-
const reason = outcome.reason instanceof LoopApiError
|
|
310
|
-
? `HTTP ${outcome.reason.status}`
|
|
311
|
-
: outcome.reason instanceof Error
|
|
312
|
-
? outcome.reason.message
|
|
313
|
-
: String(outcome.reason);
|
|
314
|
-
const kind = isTimeoutError(outcome.reason)
|
|
315
|
-
? "timeout"
|
|
316
|
-
: "other";
|
|
317
|
-
console.error(`[loop] ${toolName} team=${teamName} failed: ${reason}`);
|
|
318
|
-
failures.push({ teamName, reason, kind });
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
// Apply total limit across all teams
|
|
322
|
-
let totalItems = 0;
|
|
323
|
-
for (const r of results) {
|
|
324
|
-
const remaining = limitTotal - totalItems;
|
|
325
|
-
if (remaining <= 0) {
|
|
326
|
-
r.data = [];
|
|
327
|
-
}
|
|
328
|
-
else if (r.data.length > remaining) {
|
|
329
|
-
r.data = r.data.slice(0, remaining);
|
|
330
|
-
}
|
|
331
|
-
totalItems += r.data.length;
|
|
332
|
-
}
|
|
333
|
-
const timedOutCount = failures.filter((f) => f.kind === "timeout").length;
|
|
334
|
-
const erroredCount = failures.length - timedOutCount;
|
|
335
|
-
console.error(`[loop] aggregate tool=${toolName} teams=${keys.length} ` +
|
|
336
|
-
`succeeded=${results.length} failed=${failures.length} skipped=${skipped.length}`);
|
|
337
|
-
console.error(`[loop] aggregate-coverage tool=${toolName} requested=${keys.length} ` +
|
|
338
|
-
`answered=${results.length} timed_out=${timedOutCount} errored=${erroredCount}`);
|
|
339
|
-
return { results, failures, skipped, totalTeams: allKeys.length };
|
|
340
|
-
}
|
|
341
|
-
/**
|
|
342
|
-
* Resolve a single team's API key with permission checking.
|
|
343
|
-
* Handles key loading, decryption, and permission validation.
|
|
344
|
-
* Used for both reads and writes that target a specific team — no fan-out.
|
|
345
|
-
*/
|
|
346
|
-
export async function withTeamKey(accountId, teamName, endpointGroup, toolName, execute) {
|
|
347
|
-
const allKeys = await loadTeamKeys(accountId);
|
|
348
|
-
if (allKeys.length === 0) {
|
|
349
|
-
throw new Error("No Loop teams registered. Use loop-key-register to add team API keys.");
|
|
350
|
-
}
|
|
351
|
-
const key = allKeys.find((k) => k.teamName === teamName);
|
|
352
|
-
if (!key) {
|
|
353
|
-
const available = allKeys.map((k) => k.teamName).join(", ");
|
|
354
|
-
throw new Error(`Team "${teamName}" not found. Available teams: ${available}`);
|
|
355
|
-
}
|
|
356
|
-
if (!key.permissions.includes(endpointGroup)) {
|
|
357
|
-
throw new Error(`Team "${teamName}" does not have ${endpointGroup} permission. ` +
|
|
358
|
-
`Current permissions: ${key.permissions.join(", ")}`);
|
|
359
|
-
}
|
|
360
|
-
const apiKey = decrypt(key.encryptedKey);
|
|
361
|
-
return execute(apiKey);
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Format an aggregation result into a human-readable text response.
|
|
365
|
-
*/
|
|
366
|
-
export function formatAggregationResult(result, formatItem, entityName) {
|
|
367
|
-
if (result.totalTeams === 0) {
|
|
368
|
-
return "No Loop teams registered. Use loop-key-register to add team API keys.";
|
|
369
|
-
}
|
|
370
|
-
const allSkippedOrFailed = result.results.length === 0 && result.failures.length + result.skipped.length > 0;
|
|
371
|
-
if (allSkippedOrFailed) {
|
|
372
|
-
const reasons = [
|
|
373
|
-
...result.failures.map((f) => `${f.teamName}: ${f.reason}`),
|
|
374
|
-
...result.skipped.map((s) => `${s.teamName}: ${s.reason}`),
|
|
375
|
-
];
|
|
376
|
-
return `All teams failed or were skipped:\n${reasons.join("\n")}`;
|
|
377
|
-
}
|
|
378
|
-
const lines = [];
|
|
379
|
-
let totalItems = 0;
|
|
380
|
-
for (const teamResult of result.results) {
|
|
381
|
-
if (teamResult.data.length === 0)
|
|
382
|
-
continue;
|
|
383
|
-
totalItems += teamResult.data.length;
|
|
384
|
-
lines.push(`\n## ${teamResult.teamName}`);
|
|
385
|
-
for (const item of teamResult.data) {
|
|
386
|
-
lines.push(formatItem(item, teamResult.teamName));
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
// Coverage = teams that had a chance to answer (succeeded + failed). Skipped
|
|
390
|
-
// teams are excluded from the denominator: they were configured-out, not lost.
|
|
391
|
-
const answered = result.results.length;
|
|
392
|
-
const failed = result.failures.length;
|
|
393
|
-
const totalCovered = answered + failed;
|
|
394
|
-
const coverageNote = formatCoverageNote(result.failures);
|
|
395
|
-
if (totalItems === 0) {
|
|
396
|
-
if (failed > 0) {
|
|
397
|
-
return `No ${entityName} found across ${answered} of ${totalCovered} teams (${coverageNote}).`;
|
|
398
|
-
}
|
|
399
|
-
const teamCount = result.results.length === 1
|
|
400
|
-
? result.results[0].teamName
|
|
401
|
-
: `${result.results.length} teams`;
|
|
402
|
-
return `No ${entityName} found across ${teamCount}.`;
|
|
403
|
-
}
|
|
404
|
-
const teamCountFragment = failed > 0 ? `${answered} of ${totalCovered} team(s)` : `${answered} team(s)`;
|
|
405
|
-
let header = `${totalItems} ${entityName} across ${teamCountFragment}:`;
|
|
406
|
-
const parts = [header, ...lines];
|
|
407
|
-
if (failed > 0) {
|
|
408
|
-
parts.push(`\n---\nNote: ${coverageNote}.`);
|
|
409
|
-
}
|
|
410
|
-
if (result.skipped.length > 0) {
|
|
411
|
-
parts.push(`Note: ${result.skipped.length} team(s) skipped (insufficient permissions).`);
|
|
412
|
-
}
|
|
413
|
-
return parts.join("\n");
|
|
414
|
-
}
|
|
415
|
-
function formatCoverageNote(failures) {
|
|
416
|
-
const timedOut = failures.filter((f) => f.kind === "timeout");
|
|
417
|
-
const errored = failures.filter((f) => f.kind !== "timeout");
|
|
418
|
-
const fragments = [];
|
|
419
|
-
if (timedOut.length > 0) {
|
|
420
|
-
fragments.push(`${timedOut.length} timed out: ${timedOut.map((f) => f.teamName).join(", ")}`);
|
|
421
|
-
}
|
|
422
|
-
if (errored.length > 0) {
|
|
423
|
-
fragments.push(`${errored.length} errored: ${errored.map((f) => f.teamName).join(", ")}`);
|
|
424
|
-
}
|
|
425
|
-
return fragments.join("; ");
|
|
426
|
-
}
|
|
427
|
-
//# sourceMappingURL=loop-api.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loop-api.js","sourceRoot":"","sources":["../../src/lib/loop-api.ts"],"names":[],"mappings":"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"}
|