@rubytech/create-maxy-code 0.1.483 → 0.1.485

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.
Files changed (107) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/package-lock.json +271 -1
  3. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +28 -21
  4. package/payload/platform/plugins/cloudflare/mcp/__tests__/template-config.test.ts +26 -0
  5. package/payload/platform/plugins/cloudflare/skills/data-portal/template/index.html +16 -8
  6. package/payload/platform/plugins/cloudflare/skills/data-portal/template/portal.css +25 -0
  7. package/payload/platform/plugins/cloudflare/skills/data-portal/template/portal.js +23 -7
  8. package/payload/platform/plugins/docs/references/google-guide.md +27 -20
  9. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-send.test.js +76 -2
  10. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-send.test.js.map +1 -1
  11. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +1 -0
  12. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  13. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +1 -0
  14. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  15. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-send.d.ts.map +1 -1
  16. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-send.js +87 -6
  17. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-send.js.map +1 -1
  18. package/payload/platform/plugins/google/.claude-plugin/plugin.json +1 -1
  19. package/payload/platform/plugins/google/PLUGIN.md +20 -1
  20. package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.js +29 -1
  21. package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.js.map +1 -1
  22. package/payload/platform/plugins/google/mcp/dist/__tests__/consent-open.test.d.ts +2 -0
  23. package/payload/platform/plugins/google/mcp/dist/__tests__/consent-open.test.d.ts.map +1 -0
  24. package/payload/platform/plugins/google/mcp/dist/__tests__/consent-open.test.js +92 -0
  25. package/payload/platform/plugins/google/mcp/dist/__tests__/consent-open.test.js.map +1 -0
  26. package/payload/platform/plugins/google/mcp/dist/auth/consent-open.d.ts +61 -0
  27. package/payload/platform/plugins/google/mcp/dist/auth/consent-open.d.ts.map +1 -0
  28. package/payload/platform/plugins/google/mcp/dist/auth/consent-open.js +184 -0
  29. package/payload/platform/plugins/google/mcp/dist/auth/consent-open.js.map +1 -0
  30. package/payload/platform/plugins/google/mcp/dist/index.js +65 -2
  31. package/payload/platform/plugins/google/mcp/dist/index.js.map +1 -1
  32. package/payload/platform/plugins/google/mcp/dist/tools/account-register.d.ts +14 -0
  33. package/payload/platform/plugins/google/mcp/dist/tools/account-register.d.ts.map +1 -1
  34. package/payload/platform/plugins/google/mcp/dist/tools/account-register.js +16 -0
  35. package/payload/platform/plugins/google/mcp/dist/tools/account-register.js.map +1 -1
  36. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +5 -0
  37. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  38. package/payload/platform/services/claude-session-manager/dist/http-server.js +18 -1
  39. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  40. package/payload/platform/services/claude-session-manager/dist/index.js +8 -0
  41. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  42. package/payload/platform/services/claude-session-manager/dist/subagent-injection-tail.d.ts +13 -0
  43. package/payload/platform/services/claude-session-manager/dist/subagent-injection-tail.d.ts.map +1 -0
  44. package/payload/platform/services/claude-session-manager/dist/subagent-injection-tail.js +149 -0
  45. package/payload/platform/services/claude-session-manager/dist/subagent-injection-tail.js.map +1 -0
  46. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
  47. package/payload/platform/services/telegram-channel/dist/instructions.js +17 -2
  48. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  49. package/payload/platform/services/webchat-channel/dist/instructions.d.ts.map +1 -1
  50. package/payload/platform/services/webchat-channel/dist/instructions.js +17 -2
  51. package/payload/platform/services/webchat-channel/dist/instructions.js.map +1 -1
  52. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  53. package/payload/platform/services/whatsapp-channel/dist/server.js +16 -2
  54. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  55. package/payload/server/public/activity.html +6 -6
  56. package/payload/server/public/assets/{AdminLoginScreens-Jw45pvb2.js → AdminLoginScreens-DF9S5Rca.js} +1 -1
  57. package/payload/server/public/assets/AdminShell-B0PNDCAb.js +2 -0
  58. package/payload/server/public/assets/{Checkbox-D7_S2EUI.js → Checkbox-s5X6dso4.js} +1 -1
  59. package/payload/server/public/assets/activity-BRBsaalV.js +1 -0
  60. package/payload/server/public/assets/admin-rScqRq-R.js +1 -0
  61. package/payload/server/public/assets/{bot-GC7iZjtW.js → bot-BVO9Uqr_.js} +1 -1
  62. package/payload/server/public/assets/{browser-BI-wi3CM.js → browser-BVW4FFii.js} +1 -1
  63. package/payload/server/public/assets/calendar-CWsD3uLk.js +1 -0
  64. package/payload/server/public/assets/chat-DKGREuIO.js +1 -0
  65. package/payload/server/public/assets/chevron-down-m581tl1J.js +1 -0
  66. package/payload/server/public/assets/chevron-left-BAY0xfmR.js +1 -0
  67. package/payload/server/public/assets/chevron-right-Dy_REdYZ.js +1 -0
  68. package/payload/server/public/assets/data-TOWuhMFb.js +1 -0
  69. package/payload/server/public/assets/{graph-Cl72j3UC.js → graph-BEGs_P2m.js} +3 -3
  70. package/payload/server/public/assets/{graph-labels-7p-mVi9M.js → graph-labels-Axa04w8A.js} +1 -1
  71. package/payload/server/public/assets/{maximize-2-HcfeeOdJ.js → maximize-2-yucCepu_.js} +1 -1
  72. package/payload/server/public/assets/operator-911z_Fy_.js +1 -0
  73. package/payload/server/public/assets/page-6CZ8R57f.js +1 -0
  74. package/payload/server/public/assets/{page-DPQS0X5M.js → page-CgSgj8Cy.js} +3 -3
  75. package/payload/server/public/assets/{public-DAn13pnw.js → public-BzwveFwz.js} +1 -1
  76. package/payload/server/public/assets/{rotate-ccw-CCbbX5ef.js → rotate-ccw-BH51cf2Q.js} +1 -1
  77. package/payload/server/public/assets/tasks-21egY7A6.js +1 -0
  78. package/payload/server/public/assets/{time-entry-format-C-By1MbO.js → time-entry-format-DPdGkp1C.js} +1 -1
  79. package/payload/server/public/assets/{triangle-alert-BDtoi5R0.js → triangle-alert-DO2rjjfV.js} +1 -1
  80. package/payload/server/public/assets/useCopyFeedback-HMSM7-Ir.js +1 -0
  81. package/payload/server/public/assets/useSubAccountSwitcher-2ojOOYNo.css +1 -0
  82. package/payload/server/public/assets/{useSubAccountSwitcher-sPN6lobE.js → useSubAccountSwitcher-DLvqvfoc.js} +1 -1
  83. package/payload/server/public/assets/{useVoiceRecorder-DOFBQ2gP.js → useVoiceRecorder-BcukQIza.js} +1 -1
  84. package/payload/server/public/browser.html +4 -4
  85. package/payload/server/public/calendar.html +6 -6
  86. package/payload/server/public/chat.html +13 -13
  87. package/payload/server/public/data.html +10 -10
  88. package/payload/server/public/graph.html +11 -11
  89. package/payload/server/public/index.html +16 -16
  90. package/payload/server/public/operator.html +15 -15
  91. package/payload/server/public/public.html +13 -13
  92. package/payload/server/public/tasks.html +6 -6
  93. package/payload/server/server.js +128 -33
  94. package/payload/server/public/assets/AdminShell-DR6AzflZ.js +0 -2
  95. package/payload/server/public/assets/activity-CKbv3zFM.js +0 -1
  96. package/payload/server/public/assets/admin-DXUspIjz.js +0 -1
  97. package/payload/server/public/assets/calendar-DXnv4F7l.js +0 -1
  98. package/payload/server/public/assets/chat-CAdgaPW1.js +0 -1
  99. package/payload/server/public/assets/chevron-down-BCLf1wKu.js +0 -1
  100. package/payload/server/public/assets/chevron-left-BNtL-CjS.js +0 -1
  101. package/payload/server/public/assets/chevron-right-Bu5hsjy5.js +0 -1
  102. package/payload/server/public/assets/data-D7cYlorm.js +0 -1
  103. package/payload/server/public/assets/operator-C0iaGPNT.js +0 -1
  104. package/payload/server/public/assets/page-DsV3rID5.js +0 -1
  105. package/payload/server/public/assets/tasks-_Ij9BdOE.js +0 -1
  106. package/payload/server/public/assets/useCopyFeedback-CfbJc9iN.js +0 -1
  107. package/payload/server/public/assets/useSubAccountSwitcher-5jQsc23X.css +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.483",
3
+ "version": "0.1.485",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -577,6 +577,10 @@
577
577
  "resolved": "plugins/filesystem/mcp",
578
578
  "link": true
579
579
  },
580
+ "node_modules/@maxy/google": {
581
+ "resolved": "plugins/google/mcp",
582
+ "link": true
583
+ },
580
584
  "node_modules/@maxy/graph-viewer": {
581
585
  "resolved": "plugins/graph-viewer/mcp",
582
586
  "link": true
@@ -585,6 +589,10 @@
585
589
  "resolved": "plugins/joblogic/mcp",
586
590
  "link": true
587
591
  },
592
+ "node_modules/@maxy/ledger": {
593
+ "resolved": "plugins/ledger/mcp",
594
+ "link": true
595
+ },
588
596
  "node_modules/@maxy/memory": {
589
597
  "resolved": "plugins/memory/mcp",
590
598
  "link": true
@@ -609,6 +617,10 @@
609
617
  "resolved": "plugins/scheduling/mcp",
610
618
  "link": true
611
619
  },
620
+ "node_modules/@maxy/storage-broker": {
621
+ "resolved": "plugins/storage-broker/mcp",
622
+ "link": true
623
+ },
612
624
  "node_modules/@maxy/telegram-channel": {
613
625
  "resolved": "services/telegram-channel",
614
626
  "link": true
@@ -617,6 +629,10 @@
617
629
  "resolved": "plugins/url-get/mcp",
618
630
  "link": true
619
631
  },
632
+ "node_modules/@maxy/voice-mirror-mcp": {
633
+ "resolved": "plugins/voice-mirror/mcp",
634
+ "link": true
635
+ },
620
636
  "node_modules/@maxy/webchat-channel": {
621
637
  "resolved": "services/webchat-channel",
622
638
  "link": true
@@ -5618,7 +5634,211 @@
5618
5634
  },
5619
5635
  "devDependencies": {
5620
5636
  "@types/node": "^22.0.0",
5621
- "typescript": "^5.7.0"
5637
+ "typescript": "^5.7.0",
5638
+ "vitest": "^4.1.10"
5639
+ }
5640
+ },
5641
+ "plugins/cloudflare/mcp/node_modules/@vitest/expect": {
5642
+ "version": "4.1.10",
5643
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz",
5644
+ "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==",
5645
+ "dev": true,
5646
+ "license": "MIT",
5647
+ "dependencies": {
5648
+ "@standard-schema/spec": "^1.1.0",
5649
+ "@types/chai": "^5.2.2",
5650
+ "@vitest/spy": "4.1.10",
5651
+ "@vitest/utils": "4.1.10",
5652
+ "chai": "^6.2.2",
5653
+ "tinyrainbow": "^3.1.0"
5654
+ },
5655
+ "funding": {
5656
+ "url": "https://opencollective.com/vitest"
5657
+ }
5658
+ },
5659
+ "plugins/cloudflare/mcp/node_modules/@vitest/pretty-format": {
5660
+ "version": "4.1.10",
5661
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz",
5662
+ "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==",
5663
+ "dev": true,
5664
+ "license": "MIT",
5665
+ "dependencies": {
5666
+ "tinyrainbow": "^3.1.0"
5667
+ },
5668
+ "funding": {
5669
+ "url": "https://opencollective.com/vitest"
5670
+ }
5671
+ },
5672
+ "plugins/cloudflare/mcp/node_modules/@vitest/runner": {
5673
+ "version": "4.1.10",
5674
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz",
5675
+ "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==",
5676
+ "dev": true,
5677
+ "license": "MIT",
5678
+ "dependencies": {
5679
+ "@vitest/utils": "4.1.10",
5680
+ "pathe": "^2.0.3"
5681
+ },
5682
+ "funding": {
5683
+ "url": "https://opencollective.com/vitest"
5684
+ }
5685
+ },
5686
+ "plugins/cloudflare/mcp/node_modules/@vitest/snapshot": {
5687
+ "version": "4.1.10",
5688
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz",
5689
+ "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==",
5690
+ "dev": true,
5691
+ "license": "MIT",
5692
+ "dependencies": {
5693
+ "@vitest/pretty-format": "4.1.10",
5694
+ "@vitest/utils": "4.1.10",
5695
+ "magic-string": "^0.30.21",
5696
+ "pathe": "^2.0.3"
5697
+ },
5698
+ "funding": {
5699
+ "url": "https://opencollective.com/vitest"
5700
+ }
5701
+ },
5702
+ "plugins/cloudflare/mcp/node_modules/@vitest/spy": {
5703
+ "version": "4.1.10",
5704
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz",
5705
+ "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==",
5706
+ "dev": true,
5707
+ "license": "MIT",
5708
+ "funding": {
5709
+ "url": "https://opencollective.com/vitest"
5710
+ }
5711
+ },
5712
+ "plugins/cloudflare/mcp/node_modules/@vitest/utils": {
5713
+ "version": "4.1.10",
5714
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz",
5715
+ "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==",
5716
+ "dev": true,
5717
+ "license": "MIT",
5718
+ "dependencies": {
5719
+ "@vitest/pretty-format": "4.1.10",
5720
+ "convert-source-map": "^2.0.0",
5721
+ "tinyrainbow": "^3.1.0"
5722
+ },
5723
+ "funding": {
5724
+ "url": "https://opencollective.com/vitest"
5725
+ }
5726
+ },
5727
+ "plugins/cloudflare/mcp/node_modules/vitest": {
5728
+ "version": "4.1.10",
5729
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz",
5730
+ "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==",
5731
+ "dev": true,
5732
+ "license": "MIT",
5733
+ "dependencies": {
5734
+ "@vitest/expect": "4.1.10",
5735
+ "@vitest/mocker": "4.1.10",
5736
+ "@vitest/pretty-format": "4.1.10",
5737
+ "@vitest/runner": "4.1.10",
5738
+ "@vitest/snapshot": "4.1.10",
5739
+ "@vitest/spy": "4.1.10",
5740
+ "@vitest/utils": "4.1.10",
5741
+ "es-module-lexer": "^2.0.0",
5742
+ "expect-type": "^1.3.0",
5743
+ "magic-string": "^0.30.21",
5744
+ "obug": "^2.1.1",
5745
+ "pathe": "^2.0.3",
5746
+ "picomatch": "^4.0.3",
5747
+ "std-env": "^4.0.0-rc.1",
5748
+ "tinybench": "^2.9.0",
5749
+ "tinyexec": "^1.0.2",
5750
+ "tinyglobby": "^0.2.15",
5751
+ "tinyrainbow": "^3.1.0",
5752
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
5753
+ "why-is-node-running": "^2.3.0"
5754
+ },
5755
+ "bin": {
5756
+ "vitest": "vitest.mjs"
5757
+ },
5758
+ "engines": {
5759
+ "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
5760
+ },
5761
+ "funding": {
5762
+ "url": "https://opencollective.com/vitest"
5763
+ },
5764
+ "peerDependencies": {
5765
+ "@edge-runtime/vm": "*",
5766
+ "@opentelemetry/api": "^1.9.0",
5767
+ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
5768
+ "@vitest/browser-playwright": "4.1.10",
5769
+ "@vitest/browser-preview": "4.1.10",
5770
+ "@vitest/browser-webdriverio": "4.1.10",
5771
+ "@vitest/coverage-istanbul": "4.1.10",
5772
+ "@vitest/coverage-v8": "4.1.10",
5773
+ "@vitest/ui": "4.1.10",
5774
+ "happy-dom": "*",
5775
+ "jsdom": "*",
5776
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
5777
+ },
5778
+ "peerDependenciesMeta": {
5779
+ "@edge-runtime/vm": {
5780
+ "optional": true
5781
+ },
5782
+ "@opentelemetry/api": {
5783
+ "optional": true
5784
+ },
5785
+ "@types/node": {
5786
+ "optional": true
5787
+ },
5788
+ "@vitest/browser-playwright": {
5789
+ "optional": true
5790
+ },
5791
+ "@vitest/browser-preview": {
5792
+ "optional": true
5793
+ },
5794
+ "@vitest/browser-webdriverio": {
5795
+ "optional": true
5796
+ },
5797
+ "@vitest/coverage-istanbul": {
5798
+ "optional": true
5799
+ },
5800
+ "@vitest/coverage-v8": {
5801
+ "optional": true
5802
+ },
5803
+ "@vitest/ui": {
5804
+ "optional": true
5805
+ },
5806
+ "happy-dom": {
5807
+ "optional": true
5808
+ },
5809
+ "jsdom": {
5810
+ "optional": true
5811
+ },
5812
+ "vite": {
5813
+ "optional": false
5814
+ }
5815
+ }
5816
+ },
5817
+ "plugins/cloudflare/mcp/node_modules/vitest/node_modules/@vitest/mocker": {
5818
+ "version": "4.1.10",
5819
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz",
5820
+ "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==",
5821
+ "dev": true,
5822
+ "license": "MIT",
5823
+ "dependencies": {
5824
+ "@vitest/spy": "4.1.10",
5825
+ "estree-walker": "^3.0.3",
5826
+ "magic-string": "^0.30.21"
5827
+ },
5828
+ "funding": {
5829
+ "url": "https://opencollective.com/vitest"
5830
+ },
5831
+ "peerDependencies": {
5832
+ "msw": "^2.4.9",
5833
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
5834
+ },
5835
+ "peerDependenciesMeta": {
5836
+ "msw": {
5837
+ "optional": true
5838
+ },
5839
+ "vite": {
5840
+ "optional": true
5841
+ }
5622
5842
  }
5623
5843
  },
5624
5844
  "plugins/connector/mcp": {
@@ -6395,6 +6615,18 @@
6395
6615
  }
6396
6616
  }
6397
6617
  },
6618
+ "plugins/google/mcp": {
6619
+ "name": "@maxy/google",
6620
+ "version": "0.1.0",
6621
+ "dependencies": {
6622
+ "@modelcontextprotocol/sdk": "^1.12.1",
6623
+ "zod": "^3.24.0"
6624
+ },
6625
+ "devDependencies": {
6626
+ "@types/node": "^22.0.0",
6627
+ "typescript": "^5.7.0"
6628
+ }
6629
+ },
6398
6630
  "plugins/graph-viewer/mcp": {
6399
6631
  "name": "@maxy/graph-viewer",
6400
6632
  "version": "0.1.0",
@@ -6424,6 +6656,19 @@
6424
6656
  "typescript": "^5.7.0"
6425
6657
  }
6426
6658
  },
6659
+ "plugins/ledger/mcp": {
6660
+ "name": "@maxy/ledger",
6661
+ "version": "0.1.0",
6662
+ "dependencies": {
6663
+ "@modelcontextprotocol/sdk": "^1.12.1",
6664
+ "neo4j-driver": "^5.28.1"
6665
+ },
6666
+ "devDependencies": {
6667
+ "@types/node": "^22.0.0",
6668
+ "typescript": "^5.7.0",
6669
+ "vitest": "^4.1.2"
6670
+ }
6671
+ },
6427
6672
  "plugins/memory/mcp": {
6428
6673
  "name": "@maxy/memory",
6429
6674
  "version": "0.1.0",
@@ -6491,6 +6736,19 @@
6491
6736
  "vitest": "^4.1.2"
6492
6737
  }
6493
6738
  },
6739
+ "plugins/storage-broker/mcp": {
6740
+ "name": "@maxy/storage-broker",
6741
+ "version": "0.1.0",
6742
+ "dependencies": {
6743
+ "@modelcontextprotocol/sdk": "^1.12.1",
6744
+ "zod": "^3.24.0"
6745
+ },
6746
+ "devDependencies": {
6747
+ "@types/node": "^22.0.0",
6748
+ "typescript": "^5.7.0",
6749
+ "vitest": "^4.1.7"
6750
+ }
6751
+ },
6494
6752
  "plugins/tasks/mcp": {
6495
6753
  "name": "@maxy/tasks",
6496
6754
  "version": "0.1.0",
@@ -6531,6 +6789,18 @@
6531
6789
  "vitest": "^4.1.2"
6532
6790
  }
6533
6791
  },
6792
+ "plugins/voice-mirror/mcp": {
6793
+ "name": "@maxy/voice-mirror-mcp",
6794
+ "version": "0.1.0",
6795
+ "dependencies": {
6796
+ "@modelcontextprotocol/sdk": "^1.12.1",
6797
+ "neo4j-driver": "^5.28.1"
6798
+ },
6799
+ "devDependencies": {
6800
+ "@types/node": "^22.0.0",
6801
+ "typescript": "^5.7.0"
6802
+ }
6803
+ },
6534
6804
  "plugins/waitlist/mcp": {
6535
6805
  "name": "@maxy/waitlist",
6536
6806
  "version": "0.1.0",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: platform-architecture
3
3
  description: Use when grounding any documented-surface claim about what Maxy ships — plugins, skills, specialists, install/deploy flows, internals. This is the install catalogue, not evidence of what is enabled on the current account. For install state on this account, call `capabilities-here`; for documented surface, cite the `Source:` URL inline.
4
- content-hash: sha256:860985abfaeacef667442edd05ba359dfcdc734746919c2856550b4b2631e38f
4
+ content-hash: sha256:103d5688cd9255611a9bf233effbaf7ffd8b45afa48b26d4f92b86febcfac1f5
5
5
  brand: maxy-code
6
6
  product-name: Maxy
7
7
  ---
@@ -2237,26 +2237,33 @@ force Google's annual third-party security assessment. Calendar is only a
2237
2237
 
2238
2238
  ## Connecting an account
2239
2239
 
2240
- `google-account-register` returns a consent URL. Relay it to the user: they open
2241
- it on any device, sign in, and approve.
2242
-
2243
- What happens next depends on where they approved.
2244
-
2245
- **If they approved on the machine this install runs on**, the connection
2246
- completes by itself and their browser shows a page naming the connected account.
2247
- Nothing is pasted. That page asks them to return to the chat and say so — do
2248
- that, then call `google-account-register-poll` to confirm.
2249
-
2250
- **If they approved on another device**, such as a phone, their browser lands on
2251
- a page that **fails to load**. That is expected, not a fault: the vendor app is
2252
- a Desktop client, so Google redirects to a loopback address on the install, and
2253
- a phone has no route to it. The address bar still carries the code. Ask them to
2254
- copy the **whole URL** from the address bar and pass it to
2255
- `google-account-register-submit`, which completes the connection.
2256
-
2257
- Paste the entire URL — the tool pulls the code out. A bare code, a `code=...`
2258
- fragment, and a value containing `%2F` all work too.
2259
- `google-account-register-poll` reports the outcome at any point.
2240
+ `google-account-register` resolves which of two routes applies to this install
2241
+ and returns one `instruction` field plus a `readback` directive. Relay the
2242
+ `instruction` to the user verbatim. Do not narrate both routes or decide between
2243
+ them yourself; the tool already chose.
2244
+
2245
+ The two routes behind that resolution:
2246
+
2247
+ **Auto-opened** (`path: "auto-open"`), when the install's own browser is
2248
+ reachable. Register opens the Google sign-in in it, so no link is handed over.
2249
+ The user signs in and approves there and the connection completes by itself. A
2250
+ backup link comes back in `consentUrl` for the rare case the page did not open
2251
+ in front of them.
2252
+
2253
+ **Paste** (`path: "paste"`), when no on-host browser is reachable, such as a
2254
+ browserless brand or a phone. Register returns a consent URL to relay. The user
2255
+ opens it, signs in, and approves; the loopback page then fails to load, which is
2256
+ expected, because the vendor app is a Desktop client that redirects to a
2257
+ loopback address the device cannot reach. The address bar still carries the
2258
+ code, so they copy the whole URL from it and pass it to
2259
+ `google-account-register-submit`. The tool pulls the code out of a whole URL, a
2260
+ bare code, a `code=...` fragment, or a value containing `%2F`.
2261
+
2262
+ Either way, read the outcome back with `google-account-register-poll`, per the
2263
+ result's `readback` field: `registered` names the connected email, `pending`
2264
+ means it has not completed, `expired` means the code timed out and register
2265
+ should be re-run. Do not tell the user they are connected before poll returns
2266
+ `registered`.
2260
2267
 
2261
2268
  The register tool does not block and does not wait. A second register while one
2262
2269
  is already live is refused rather than overwriting it; that refusal names how
@@ -144,3 +144,29 @@ describe('device binding', () => {
144
144
  expect(text).toMatch(/accountId\s+TEXT NOT NULL DEFAULT ''/)
145
145
  })
146
146
  })
147
+
148
+ const portalJs = () => readFileSync(join(TEMPLATE, 'portal.js'), 'utf8')
149
+ const indexHtml = () => readFileSync(join(TEMPLATE, 'index.html'), 'utf8')
150
+
151
+ describe('login error surfacing and passcode reveal (Task 1872)', () => {
152
+ it('maps each auth failure to a distinct message, not one opaque string', () => {
153
+ const js = portalJs()
154
+ expect(js).not.toMatch(/That did not work\./)
155
+ expect(js).toContain('Too many attempts. Try again later.')
156
+ expect(js).toContain('Enter both your name and your passcode.')
157
+ expect(js).toContain('That name and passcode did not match.')
158
+ expect(js).toContain('Something went wrong. Please try again in a moment.')
159
+ expect(js).toContain('Could not reach the server. Check your connection and try again.')
160
+ })
161
+
162
+ it('logs the status and error on the auth failure path', () => {
163
+ expect(portalJs()).toMatch(/console\.error\(\s*'\[data-portal\] auth failed'/)
164
+ })
165
+
166
+ it('ships a reveal control bound to the passcode field', () => {
167
+ const html = indexHtml()
168
+ expect(html).toMatch(/id="dp-reveal"/)
169
+ expect(html).toMatch(/aria-controls="dp-passcode"/)
170
+ expect(portalJs()).toMatch(/dp-reveal/)
171
+ })
172
+ })
@@ -18,14 +18,22 @@
18
18
  <label class="dp-label" for="dp-owner">Your name</label>
19
19
  <input class="dp-input" id="dp-owner" name="owner" autocomplete="username" required />
20
20
  <label class="dp-label" for="dp-passcode">Passcode</label>
21
- <input
22
- class="dp-input"
23
- id="dp-passcode"
24
- name="passcode"
25
- type="password"
26
- autocomplete="current-password"
27
- required
28
- />
21
+ <div class="dp-field">
22
+ <input
23
+ class="dp-input"
24
+ id="dp-passcode"
25
+ name="passcode"
26
+ type="password"
27
+ autocomplete="current-password"
28
+ required
29
+ />
30
+ <button
31
+ type="button"
32
+ class="dp-reveal"
33
+ id="dp-reveal"
34
+ aria-controls="dp-passcode"
35
+ >Show passcode</button>
36
+ </div>
29
37
  <button class="dp-btn" type="submit">Sign in</button>
30
38
  </form>
31
39
 
@@ -178,3 +178,28 @@ body {
178
178
  cursor: pointer;
179
179
  text-align: left;
180
180
  }
181
+
182
+ /* Passcode field with its reveal control. The passcode is transcribed out of
183
+ band, so being able to check what was typed is the point of the toggle.
184
+ Reuses existing variables and declares no new :root value, which
185
+ portal-brand-css.mjs would drop. */
186
+ .dp-field {
187
+ display: flex;
188
+ gap: 0.5rem;
189
+ align-items: stretch;
190
+ }
191
+
192
+ .dp-field .dp-input {
193
+ flex: 1;
194
+ }
195
+
196
+ .dp-reveal {
197
+ border: 1px solid var(--dp-rule);
198
+ border-radius: 0.375rem;
199
+ background: transparent;
200
+ color: var(--dp-muted);
201
+ padding: 0.375rem 0.625rem;
202
+ font: inherit;
203
+ cursor: pointer;
204
+ white-space: nowrap;
205
+ }
@@ -192,6 +192,13 @@
192
192
  });
193
193
  }
194
194
 
195
+ function authFailureMessage(status) {
196
+ if (status === 429) return 'Too many attempts. Try again later.';
197
+ if (status === 400) return 'Enter both your name and your passcode.';
198
+ if (status === 401) return 'That name and passcode did not match.';
199
+ return 'Something went wrong. Please try again in a moment.';
200
+ }
201
+
195
202
  loginEl.addEventListener('submit', function (e) {
196
203
  e.preventDefault();
197
204
  say('Signing in…');
@@ -209,12 +216,12 @@
209
216
  });
210
217
  })
211
218
  .then(function (res) {
212
- if (res.s === 429) {
213
- say('Too many attempts. Try again later.');
214
- return;
215
- }
216
219
  if (!res.d.ok) {
217
- say('That did not work.');
220
+ // The server returns the same denial for a wrong passcode and an
221
+ // unknown owner on purpose, so the message stays single and the
222
+ // console carries only the status class, never the reason.
223
+ console.error('[data-portal] auth failed', { status: res.s, error: res.d.error });
224
+ say(authFailureMessage(res.s));
218
225
  return;
219
226
  }
220
227
  document.getElementById('dp-passcode').value = '';
@@ -223,11 +230,20 @@
223
230
  say('');
224
231
  return refresh();
225
232
  })
226
- .catch(function () {
227
- say('That did not work.');
233
+ .catch(function (err) {
234
+ console.error('[data-portal] auth failed', { status: 'network', error: err });
235
+ say('Could not reach the server. Check your connection and try again.');
228
236
  });
229
237
  });
230
238
 
239
+ var revealEl = document.getElementById('dp-reveal');
240
+ var passcodeInput = document.getElementById('dp-passcode');
241
+ revealEl.addEventListener('click', function () {
242
+ var revealed = passcodeInput.type === 'text';
243
+ passcodeInput.type = revealed ? 'password' : 'text';
244
+ revealEl.textContent = revealed ? 'Show passcode' : 'Hide passcode';
245
+ });
246
+
231
247
  document.getElementById('dp-upload').addEventListener('submit', function (e) {
232
248
  e.preventDefault();
233
249
  var input = document.getElementById('dp-file');
@@ -11,26 +11,33 @@ force Google's annual third-party security assessment. Calendar is only a
11
11
 
12
12
  ## Connecting an account
13
13
 
14
- `google-account-register` returns a consent URL. Relay it to the user: they open
15
- it on any device, sign in, and approve.
16
-
17
- What happens next depends on where they approved.
18
-
19
- **If they approved on the machine this install runs on**, the connection
20
- completes by itself and their browser shows a page naming the connected account.
21
- Nothing is pasted. That page asks them to return to the chat and say so — do
22
- that, then call `google-account-register-poll` to confirm.
23
-
24
- **If they approved on another device**, such as a phone, their browser lands on
25
- a page that **fails to load**. That is expected, not a fault: the vendor app is
26
- a Desktop client, so Google redirects to a loopback address on the install, and
27
- a phone has no route to it. The address bar still carries the code. Ask them to
28
- copy the **whole URL** from the address bar and pass it to
29
- `google-account-register-submit`, which completes the connection.
30
-
31
- Paste the entire URL — the tool pulls the code out. A bare code, a `code=...`
32
- fragment, and a value containing `%2F` all work too.
33
- `google-account-register-poll` reports the outcome at any point.
14
+ `google-account-register` resolves which of two routes applies to this install
15
+ and returns one `instruction` field plus a `readback` directive. Relay the
16
+ `instruction` to the user verbatim. Do not narrate both routes or decide between
17
+ them yourself; the tool already chose.
18
+
19
+ The two routes behind that resolution:
20
+
21
+ **Auto-opened** (`path: "auto-open"`), when the install's own browser is
22
+ reachable. Register opens the Google sign-in in it, so no link is handed over.
23
+ The user signs in and approves there and the connection completes by itself. A
24
+ backup link comes back in `consentUrl` for the rare case the page did not open
25
+ in front of them.
26
+
27
+ **Paste** (`path: "paste"`), when no on-host browser is reachable, such as a
28
+ browserless brand or a phone. Register returns a consent URL to relay. The user
29
+ opens it, signs in, and approves; the loopback page then fails to load, which is
30
+ expected, because the vendor app is a Desktop client that redirects to a
31
+ loopback address the device cannot reach. The address bar still carries the
32
+ code, so they copy the whole URL from it and pass it to
33
+ `google-account-register-submit`. The tool pulls the code out of a whole URL, a
34
+ bare code, a `code=...` fragment, or a value containing `%2F`.
35
+
36
+ Either way, read the outcome back with `google-account-register-poll`, per the
37
+ result's `readback` field: `registered` names the connected email, `pending`
38
+ means it has not completed, `expired` means the code timed out and register
39
+ should be re-run. Do not tell the user they are connected before poll returns
40
+ `registered`.
34
41
 
35
42
  The register tool does not block and does not wait. A second register while one
36
43
  is already live is refused rather than overwriting it; that refusal names how