@rubytech/create-maxy-code 0.1.38 → 0.1.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/onboarding-state-readback.test.js +61 -0
- package/dist/onboarding-readback.js +27 -0
- package/package.json +1 -1
- package/payload/platform/lib/anthropic-key/dist/index.d.ts +22 -0
- package/payload/platform/lib/anthropic-key/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/anthropic-key/dist/index.js +232 -0
- package/payload/platform/lib/anthropic-key/dist/index.js.map +1 -0
- package/payload/platform/package-lock.json +513 -753
- package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.d.ts +39 -0
- package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.d.ts.map +1 -0
- package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.js +249 -0
- package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.js.map +1 -0
- package/payload/platform/plugins/docs/references/platform.md +1 -1
- package/payload/platform/plugins/real-agency/plugins/.claude-plugin/marketplace.json +13 -0
- package/payload/platform/plugins/real-agency/plugins/loop/.claude-plugin/plugin.json +17 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/index.d.ts +2 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/index.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/index.js +293 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/index.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.d.ts +10 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.js +88 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts +82 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js +427 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts +5 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js +40 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.d.ts +10 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.js +24 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.d.ts +16 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.js +35 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.d.ts +5 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.js +19 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.d.ts +4 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.js +14 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.d.ts +9 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.js +60 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts +13 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.js +41 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts +9 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.js +16 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts +15 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.js +11 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.d.ts +10 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.js +39 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.d.ts +9 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.js +125 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.d.ts +18 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.js +87 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.d.ts +10 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.js +82 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.d.ts +12 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.js +32 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.d.ts +15 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.js +11 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.d.ts +16 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.js +41 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.d.ts +13 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.js +49 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.d.ts +7 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.js +19 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.d.ts +5 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.js +32 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.d.ts +14 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.js +11 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.d.ts +9 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.js +85 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.d.ts +13 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.js +44 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.js.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.d.ts +14 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.d.ts.map +1 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.js +18 -0
- package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/.claude-plugin/marketplace.json +13 -0
- package/payload/premium-plugins/real-agency/plugins/loop/.claude-plugin/plugin.json +17 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/index.d.ts +2 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/index.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/index.js +293 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/index.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.d.ts +10 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.js +88 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts +82 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js +427 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts +5 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js +40 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.d.ts +10 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.js +24 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.d.ts +16 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.js +35 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.d.ts +5 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.js +19 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.d.ts +4 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.js +14 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.d.ts +9 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.js +60 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts +13 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.js +41 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts +9 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.js +16 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts +15 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.js +11 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.d.ts +10 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.js +39 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.d.ts +9 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.js +125 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.d.ts +18 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.js +87 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.d.ts +10 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.js +82 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.d.ts +12 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.js +32 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.d.ts +15 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.js +11 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.d.ts +16 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.js +41 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.d.ts +13 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.js +49 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.d.ts +7 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.js +19 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.d.ts +5 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.js +32 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.d.ts +14 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.js +11 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.d.ts +9 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.js +85 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.d.ts +13 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.js +44 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.d.ts +14 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.d.ts.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.js +18 -0
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.js.map +1 -0
- package/payload/server/public/assets/{Checkbox-DAki3vDW.js → Checkbox-CmCjmfJy.js} +1 -1
- package/payload/server/public/assets/{admin-CyAZtsYZ.js → admin-CtodW6As.js} +1 -1
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-C-hla3Ip.js → architectureDiagram-Q4EWVU46-CfOjbx0H.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-CbzjtNs3.js → blockDiagram-DXYQGD6D-D0kA2C9i.js} +1 -1
- package/payload/server/public/assets/{brand-Cun0PBrA.css → brand-6hKfBgOI.css} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-B87UblA0.js → c4Diagram-AHTNJAMY-CDgXiXgj.js} +1 -1
- package/payload/server/public/assets/channel-DA7MGMzQ.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-2a2pVlSg.js → chunk-336JU56O-BfBTcT5X.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-j9NOD8_a.js → chunk-426QAEUC-BdSSZ1Kw.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-Cs872xAq.js → chunk-4TB4RGXK-UvE1im9g.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-BnDFbZ_I.js → chunk-5FUZZQ4R-Dx4DslXz.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-Bu5B3Hyf.js → chunk-5PVQY5BW-CNHawhLJ.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-B96Fw4FF.js → chunk-EDXVE4YY-Rmjv-1et.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-CcGrGQim.js → chunk-ENJZ2VHE-CL-LeH3r.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-ZRvcI4Ai.js → chunk-ICPOFSXX-B2MFOJDt.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-B6RI9Fbf.js → chunk-OYMX7WX6-BxcIcCt5.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-BYGHVYyo.js → chunk-U2HBQHQK-COzwOBrY.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-rwNs-gTO.js → chunk-X2U36JSP-B0rjT5hL.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-jPttJRap.js → chunk-YZCP3GAM-pwrIw0XH.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-DLykWOT5.js → chunk-ZZ45TVLE-BXpeAm0k.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-DqfmcWSr.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BVOMSbZ_.js +1 -0
- package/payload/server/public/assets/clone-Byp7hagU.js +1 -0
- package/payload/server/public/assets/{dagre-jnQDnF-5.js → dagre-DjOJn05k.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-C6wSzHX2.js → dagre-KV5264BT-PczvQiEh.js} +1 -1
- package/payload/server/public/assets/data-A7azIkZU.js +1 -0
- package/payload/server/public/assets/{device-url-actions-y1tXNDZx.js → device-url-actions-C55ZS_Zg.js} +1 -1
- package/payload/server/public/assets/{diagram-5BDNPKRD-N3X-n90h.js → diagram-5BDNPKRD-D477xo5F.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-vfmbzdPd.js → diagram-G4DWMVQ6-C-HAtbtT.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-BETmPx_w.js → diagram-MMDJMWI5-B9wus4H0.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-BSUGM4wG.js → diagram-TYMM5635-UMZLloFr.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-CWZ9OwMb.js → erDiagram-SMLLAGMA-B8E52Mp4.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-BpQOQS1a.js → flowDiagram-DWJPFMVM-CUel34tq.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-Dc59igCS.js → ganttDiagram-T4ZO3ILL-BfwE-Xav.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-D6lXg3zl.js → gitGraphDiagram-UUTBAWPF-2d6tXRIM.js} +1 -1
- package/payload/server/public/assets/graph-Dx83EhtP.js +1 -0
- package/payload/server/public/assets/{graph-labels-DFyNH0jb.js → graph-labels-Bg2Bzelb.js} +1 -1
- package/payload/server/public/assets/{graphlib-yG7kH8Fr.js → graphlib-CCo9-wNJ.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-TS9Pv8Os.js → infoDiagram-42DDH7IO-DB1SVWL6.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-BJiJJTq6.js → ishikawaDiagram-UXIWVN3A-CdeMUTYS.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-C7PW4fmw.js → journeyDiagram-VCZTEJTY-D8x8TUoc.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BEk21ciD.js → kanban-definition-6JOO6SKY-Cmkhd1mO.js} +1 -1
- package/payload/server/public/assets/{line-DusyVWDE.js → line-CoHkpBv3.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-DeeojQSb.js → mermaid-parser.core-C7R2PfZC.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-p65Lo7Sj.js → mermaid.core-lQaq-kll.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-B0jxFxdS.js → mindmap-definition-QFDTVHPH-CsPq3pX1.js} +1 -1
- package/payload/server/public/assets/{page-BeYGnDzI.js → page-CBKzjUHO.js} +1 -1
- package/payload/server/public/assets/{page-x5khmfRx.js → page-DwEaAdVp.js} +1 -1
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-DJ5GKYt6.js → pieDiagram-DEJITSTG-FZH9sTnP.js} +1 -1
- package/payload/server/public/assets/{public-cnoUs7vq.js → public-hGLzxhE_.js} +3 -3
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-BV7R-kwV.js → quadrantDiagram-34T5L4WZ-9poxfoqh.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-DRiLzlGN.js → requirementDiagram-MS252O5E-Ce7iOdT_.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-C5-6_cCI.js → sankeyDiagram-XADWPNL6-DINuXatI.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-5FXm_VYM.js → sequenceDiagram-FGHM5R23-CSMec3EK.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-FCQTaGqV.js → stateDiagram-FHFEXIEX-15DKzypj.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-AcaK_QfD.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-tvtq62ef.js → timeline-definition-GMOUNBTQ-BxIRc9Pu.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-Dk-k7CE4.js → vennDiagram-DHZGUBPP-DdgRyU55.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-CZSrqniY.js → wardleyDiagram-NUSXRM2D-CKvhU1Uj.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-CpGLpk7Q.js → xychartDiagram-5P7HB3ND-d0V1V4PD.js} +1 -1
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +6 -6
- package/payload/server/public/index.html +8 -8
- package/payload/server/public/public.html +5 -5
- package/payload/server/public/assets/channel-CTNo72W7.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BaV5nDmT.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DOKlCKjY.js +0 -1
- package/payload/server/public/assets/clone-sQSwlSln.js +0 -1
- package/payload/server/public/assets/data-DbkuXcPb.js +0 -1
- package/payload/server/public/assets/graph-CC5_6-dg.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BdpPhdqg.js +0 -1
- /package/payload/server/public/assets/{brand-lj7EhWRg.js → brand-DXOx08r0.js} +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface OnboardingState {
|
|
2
|
+
currentStep: number;
|
|
3
|
+
step1CompletedAt: string | null;
|
|
4
|
+
step2CompletedAt: string | null;
|
|
5
|
+
step3CompletedAt: string | null;
|
|
6
|
+
step4CompletedAt: string | null;
|
|
7
|
+
step5CompletedAt: string | null;
|
|
8
|
+
step6CompletedAt: string | null;
|
|
9
|
+
step7CompletedAt: string | null;
|
|
10
|
+
step8CompletedAt: string | null;
|
|
11
|
+
step9CompletedAt: string | null;
|
|
12
|
+
createdAt: string;
|
|
13
|
+
updatedAt: string;
|
|
14
|
+
}
|
|
15
|
+
export interface SessionLike {
|
|
16
|
+
run(query: string, params?: Record<string, unknown>): Promise<{
|
|
17
|
+
records: Array<{
|
|
18
|
+
get(key: string): unknown;
|
|
19
|
+
}>;
|
|
20
|
+
}>;
|
|
21
|
+
close(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Task 562: consume the step-7 completion flag written by setup-tunnel.sh
|
|
25
|
+
* before the service restart. The script runs inside ${BRAND}.service's
|
|
26
|
+
* cgroup and cannot complete the MCP call after dispatching the restart —
|
|
27
|
+
* so it drops a filesystem marker instead. The first read of onboarding
|
|
28
|
+
* state after the restart picks it up, advances the graph via the same
|
|
29
|
+
* CASE-WHEN-NULL cypher as completeOnboardingStep, and deletes the marker.
|
|
30
|
+
*
|
|
31
|
+
* Idempotent at every layer: a missing flag is a no-op; a flag present
|
|
32
|
+
* against an already-completed step is a no-op on the graph (CASE-WHEN-NULL
|
|
33
|
+
* preserves the existing timestamp); a crash between graph write and flag
|
|
34
|
+
* delete re-consumes on the next call with the same no-op outcome.
|
|
35
|
+
*/
|
|
36
|
+
export declare function consumeStep7Flag(session: SessionLike, accountId: string, accountDir: string): Promise<boolean>;
|
|
37
|
+
export declare function getOnboardingState(sessionFactory: () => SessionLike, accountId: string, accountDir: string): Promise<OnboardingState>;
|
|
38
|
+
export declare function completeOnboardingStep(sessionFactory: () => SessionLike, accountId: string, step: number): Promise<OnboardingState>;
|
|
39
|
+
//# sourceMappingURL=onboarding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAC5D,OAAO,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC,CAAC;KAC/C,CAAC,CAAC;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAoED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CA4DlB;AAgBD,wBAAsB,kBAAkB,CACtC,cAAc,EAAE,MAAM,WAAW,EACjC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CA4E1B;AAED,wBAAsB,sBAAsB,CAC1C,cAAc,EAAE,MAAM,WAAW,EACjC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,eAAe,CAAC,CA6C1B"}
|
|
@@ -0,0 +1,249 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/lib/onboarding.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,7 +70,7 @@ There is no dashboard, no settings panel, no menus. Everything is done through c
|
|
|
70
70
|
|
|
71
71
|
The chat input auto-grows as you type — it expands to fit your message and shrinks back when you delete text. You can also drag the resize handle above the input to set a custom height.
|
|
72
72
|
|
|
73
|
-
The admin interface is a three-pane layout: a sidebar on the left with navigation (Sessions, People, Agents, Projects, Tasks, Artefacts) and your recent conversations; the chat in the middle; and an artefact pane on the right that opens when you select a document, click a project, or open Browser, Data, or Graph from the menu, holding the surface side-by-side with the conversation so the chat stays live while you work in it.
|
|
73
|
+
The admin interface is a three-pane layout: a sidebar on the left with navigation (Sessions, People, Agents, Projects, Tasks, Artefacts) and your recent conversations; the chat in the middle; and an artefact pane on the right that opens when you select a document, click a project, or open Browser, Data, or Graph from the menu, holding the surface side-by-side with the conversation so the chat stays live while you work in it. At the very top of the sidebar — above the nav rows — a borderless row holds two controls: a "+ New session" button on the left that spawns a fresh Claude Code session, and a Mode trigger on the right showing the current permission mode (Ask, Accept edits, Plan, or Auto). The sidebar's vertical order is: new-session strip first, then the nav (Sessions, People, Agents, Projects, Tasks, Artefacts), then the sessions list, then the footer. Both controls render as plain text-plus-icon affordances with no surrounding rectangle; hover only tints the background. Clicking the Mode trigger opens a popover downward from the row whose header reads "Mode" and lists the four permission modes with the current selection check-marked. The sidebar's nav rows swap the list view in place: Sessions shows recent conversations, Projects shows your active work projects, and Artefacts lists every KnowledgeDocument plus this account's agent templates (your admin agent's IDENTITY, SOUL, and KNOWLEDGE files plus one entry per enabled specialist). Each recent session row carries a small status dot (filled sage for alive, hollow circle for ended) so you can read the live state at a glance without parsing the subtitle. The People, Agents, and Tasks rows are graph shortcuts: clicking each opens the artefact-pane Graph filtered to every Person, every public Agent, or every Task in your account respectively, with no side-list, because the graph itself is the result. Public agents become first-class graph entities the moment you create them, with edges to their IDENTITY/SOUL/KNOWLEDGE files, edges to every knowledge document they have access to, and edges from every conversation they have handled, so a single Agents click reveals the whole shape of who knows what and who has been talking to whom. Click an artefact row to open the document. KnowledgeDocuments and your admin agent's templates are editable: type in the document and changes save automatically; specialist agent templates are read-only because they ship with Maxy and your edits would be overwritten on the next install. PDF artefacts render inline so you can read them without leaving the pane. If your browser doesn't have a built-in PDF viewer, a Download button appears instead. Artefacts that have no readable file backing them (orphan rows, files removed from disk, unsupported content types) show a one-line banner explaining the skip instead of opening to a blank pane. Click a project row to open the Graph view focused on that project's neighbourhood; clicking a second project swaps the focus rather than stacking on top. The chat and artefact divider is drag-resizable: drag the line between the columns to make either side wider; double-click it to reset to half of the available width (viewport minus sidebar), clamped to the chat and artefact min-width floors. Your chosen width is remembered across reloads. On wider screens (>1280px) all three panes are visible. The sidebar narrows at 1280px, the artefact pane hides at 1080px (Browser, Data, and Graph then open as full-window pages instead), and the sidebar collapses to a 56px icon rail at 820px. On every viewport the chat header reads left to right as a triptych: a dedicated sidebar toggle (the panel-right icon, which swaps to panel-right-open when the sidebar is showing), the brand mark next to the title in the centre, and the menu burger on the right. This header toggle is the sole sidebar-toggle button; the sidebar itself no longer carries a duplicate. Tap the sidebar toggle to show or hide the sidebar: on phones (<720px) it slides the drawer in or out, on wider screens it collapses or expands the sidebar column. The brand mark in the centre is decorative; clicks go through the dedicated toggle so the affordance is unambiguous. The drawer animation only fires on tap (220ms slide in or out); resizing your window across the 720px boundary snaps the layout without animation, so you never see a half-open flash. At ≤640px the session metadata pane stacks each label above its value instead of the desktop two-column grid, and the row of action buttons (Open in new tab / Open JSONL / Rename / Pin / Archive / End or Purge) collapses behind a single Actions trigger that opens a popover upward from the foot of the pane. Breakpoint summary: >1280px = full sidebar + chat + artefact pane (drag-resizable divider); 1280px→1080px = sidebar narrows; 1080px→820px = artefact pane hides (Browser/Data/Graph open as full-window pages instead); 820px→720px = sidebar collapses to 56px icon rail; ≤720px = sidebar becomes off-canvas drawer (vertical stack of nav, recents list, foot, the same shape as the desktop sidebar, just on top of the chat instead of beside it).
|
|
74
74
|
|
|
75
75
|
Page titles are brand-aware: the browser tab shows your product name (e.g. `Real Agent` instead of `Maxy`) on every shell — chat, graph, and data — so a non-default brand never leaks the default name in tab strips or browser history.
|
|
76
76
|
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|