reflex-agent 0.2.1
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/.next/BUILD_ID +1 -0
- package/.next/app-build-manifest.json +319 -0
- package/.next/app-path-routes-manifest.json +34 -0
- package/.next/build-manifest.json +33 -0
- package/.next/diagnostics/build-diagnostics.json +6 -0
- package/.next/diagnostics/framework.json +1 -0
- package/.next/export-marker.json +6 -0
- package/.next/images-manifest.json +58 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +160 -0
- package/.next/react-loadable-manifest.json +8 -0
- package/.next/required-server-files.json +337 -0
- package/.next/routes-manifest.json +282 -0
- package/.next/server/app/_not-found/page.js +2 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_not-found.html +1 -0
- package/.next/server/app/_not-found.meta +8 -0
- package/.next/server/app/_not-found.rsc +18 -0
- package/.next/server/app/agents/[agentId]/page.js +3 -0
- package/.next/server/app/agents/[agentId]/page.js.nft.json +1 -0
- package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agents/[agentId]/respond/route.js +2 -0
- package/.next/server/app/api/agents/[agentId]/respond/route.js.nft.json +1 -0
- package/.next/server/app/api/agents/[agentId]/respond/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/images/[rootId]/[file]/route.js +1 -0
- package/.next/server/app/api/images/[rootId]/[file]/route.js.nft.json +1 -0
- package/.next/server/app/api/images/[rootId]/[file]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/oauth/callback/route.js +22 -0
- package/.next/server/app/api/oauth/callback/route.js.nft.json +1 -0
- package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/oauth/start/route.js +1 -0
- package/.next/server/app/api/oauth/start/route.js.nft.json +1 -0
- package/.next/server/app/api/oauth/start/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/roots/[id]/attachments/route.js +0 -0
- package/.next/server/app/api/roots/[id]/attachments/route.js.nft.json +1 -0
- package/.next/server/app/api/roots/[id]/attachments/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/roots/[id]/chat/[topicId]/send/route.js +2 -0
- package/.next/server/app/api/roots/[id]/chat/[topicId]/send/route.js.nft.json +1 -0
- package/.next/server/app/api/roots/[id]/chat/[topicId]/send/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/roots/[id]/chat/[topicId]/stop/route.js +2 -0
- package/.next/server/app/api/roots/[id]/chat/[topicId]/stop/route.js.nft.json +1 -0
- package/.next/server/app/api/roots/[id]/chat/[topicId]/stop/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/roots/[id]/chat/[topicId]/stream/route.js +8 -0
- package/.next/server/app/api/roots/[id]/chat/[topicId]/stream/route.js.nft.json +1 -0
- package/.next/server/app/api/roots/[id]/chat/[topicId]/stream/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/roots/[id]/dashboard/route.js +1 -0
- package/.next/server/app/api/roots/[id]/dashboard/route.js.nft.json +1 -0
- package/.next/server/app/api/roots/[id]/dashboard/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/roots/[id]/suggestions/route.js +1 -0
- package/.next/server/app/api/roots/[id]/suggestions/route.js.nft.json +1 -0
- package/.next/server/app/api/roots/[id]/suggestions/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/bundle.js/route.js +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/bundle.js/route.js.nft.json +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/bundle.js/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/host/route.js +2 -0
- package/.next/server/app/api/utilities/[scope]/[id]/host/route.js.nft.json +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/host/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/host-api.mjs/route.js +55 -0
- package/.next/server/app/api/utilities/[scope]/[id]/host-api.mjs/route.js.nft.json +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/host-api.mjs/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/host-ui.mjs/route.js +114 -0
- package/.next/server/app/api/utilities/[scope]/[id]/host-ui.mjs/route.js.nft.json +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/host-ui.mjs/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/iframe/route.js +21 -0
- package/.next/server/app/api/utilities/[scope]/[id]/iframe/route.js.nft.json +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/iframe/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/style.css/route.js +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/style.css/route.js.nft.json +1 -0
- package/.next/server/app/api/utilities/[scope]/[id]/style.css/route_client-reference-manifest.js +1 -0
- package/.next/server/app/audit/page.js +2 -0
- package/.next/server/app/audit/page.js.nft.json +1 -0
- package/.next/server/app/audit/page_client-reference-manifest.js +1 -0
- package/.next/server/app/index.html +1 -0
- package/.next/server/app/index.meta +9 -0
- package/.next/server/app/index.rsc +19 -0
- package/.next/server/app/onboarding/page.js +10 -0
- package/.next/server/app/onboarding/page.js.nft.json +1 -0
- package/.next/server/app/onboarding/page_client-reference-manifest.js +1 -0
- package/.next/server/app/page.js +2 -0
- package/.next/server/app/page.js.nft.json +1 -0
- package/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/server/app/roots/[id]/chat/[topicId]/page.js +7 -0
- package/.next/server/app/roots/[id]/chat/[topicId]/page.js.nft.json +1 -0
- package/.next/server/app/roots/[id]/chat/[topicId]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/roots/[id]/kb/[...slug]/page.js +6 -0
- package/.next/server/app/roots/[id]/kb/[...slug]/page.js.nft.json +1 -0
- package/.next/server/app/roots/[id]/kb/[...slug]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/roots/[id]/page.js +5 -0
- package/.next/server/app/roots/[id]/page.js.nft.json +1 -0
- package/.next/server/app/roots/[id]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/roots/[id]/workflows/[wfId]/page.js +2 -0
- package/.next/server/app/roots/[id]/workflows/[wfId]/page.js.nft.json +1 -0
- package/.next/server/app/roots/[id]/workflows/[wfId]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/roots/[id]/workflows/page.js +2 -0
- package/.next/server/app/roots/[id]/workflows/page.js.nft.json +1 -0
- package/.next/server/app/roots/[id]/workflows/page_client-reference-manifest.js +1 -0
- package/.next/server/app/roots/new/page.js +5 -0
- package/.next/server/app/roots/new/page.js.nft.json +1 -0
- package/.next/server/app/roots/new/page_client-reference-manifest.js +1 -0
- package/.next/server/app/roots/new.html +1 -0
- package/.next/server/app/roots/new.meta +7 -0
- package/.next/server/app/roots/new.rsc +21 -0
- package/.next/server/app/settings/page.js +65 -0
- package/.next/server/app/settings/page.js.nft.json +1 -0
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -0
- package/.next/server/app/settings.html +1 -0
- package/.next/server/app/settings.meta +7 -0
- package/.next/server/app/settings.rsc +22 -0
- package/.next/server/app/share/[id]/file/page.js +2 -0
- package/.next/server/app/share/[id]/file/page.js.nft.json +1 -0
- package/.next/server/app/share/[id]/file/page_client-reference-manifest.js +1 -0
- package/.next/server/app/share/[id]/page.js +2 -0
- package/.next/server/app/share/[id]/page.js.nft.json +1 -0
- package/.next/server/app/share/[id]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/utilities/[scope]/[id]/page.js +2 -0
- package/.next/server/app/utilities/[scope]/[id]/page.js.nft.json +1 -0
- package/.next/server/app/utilities/[scope]/[id]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/utilities/page.js +17 -0
- package/.next/server/app/utilities/page.js.nft.json +1 -0
- package/.next/server/app/utilities/page_client-reference-manifest.js +1 -0
- package/.next/server/app-paths-manifest.json +34 -0
- package/.next/server/chunks/1088.js +1 -0
- package/.next/server/chunks/1105.js +1 -0
- package/.next/server/chunks/1223.js +1 -0
- package/.next/server/chunks/1244.js +1 -0
- package/.next/server/chunks/133.js +490 -0
- package/.next/server/chunks/1888.js +1 -0
- package/.next/server/chunks/192.js +1 -0
- package/.next/server/chunks/1960.js +1 -0
- package/.next/server/chunks/1961.js +1 -0
- package/.next/server/chunks/1986.js +1 -0
- package/.next/server/chunks/2035.js +1 -0
- package/.next/server/chunks/2356.js +1 -0
- package/.next/server/chunks/2433.js +1 -0
- package/.next/server/chunks/2485.js +6 -0
- package/.next/server/chunks/2503.js +1 -0
- package/.next/server/chunks/3240.js +1 -0
- package/.next/server/chunks/3295.js +1 -0
- package/.next/server/chunks/3332.js +1 -0
- package/.next/server/chunks/3657.js +1 -0
- package/.next/server/chunks/4031.js +6 -0
- package/.next/server/chunks/4066.js +1 -0
- package/.next/server/chunks/4553.js +1 -0
- package/.next/server/chunks/4833.js +1 -0
- package/.next/server/chunks/4840.js +1 -0
- package/.next/server/chunks/4842.js +1 -0
- package/.next/server/chunks/4925.js +1 -0
- package/.next/server/chunks/5087.js +1 -0
- package/.next/server/chunks/5152.js +1 -0
- package/.next/server/chunks/5243.js +1 -0
- package/.next/server/chunks/5319.js +1 -0
- package/.next/server/chunks/5373.js +1 -0
- package/.next/server/chunks/5401.js +1 -0
- package/.next/server/chunks/5436.js +1 -0
- package/.next/server/chunks/5543.js +1 -0
- package/.next/server/chunks/569.js +1 -0
- package/.next/server/chunks/5895.js +16 -0
- package/.next/server/chunks/5986.js +3 -0
- package/.next/server/chunks/613.js +1 -0
- package/.next/server/chunks/6216.js +1 -0
- package/.next/server/chunks/6435.js +1 -0
- package/.next/server/chunks/6536.js +3 -0
- package/.next/server/chunks/6602.js +4 -0
- package/.next/server/chunks/6730.js +1 -0
- package/.next/server/chunks/6909.js +488 -0
- package/.next/server/chunks/7188.js +1 -0
- package/.next/server/chunks/7300.js +128 -0
- package/.next/server/chunks/7508.js +1 -0
- package/.next/server/chunks/7572.js +2 -0
- package/.next/server/chunks/8056.js +1 -0
- package/.next/server/chunks/8124.js +1 -0
- package/.next/server/chunks/8262.js +1 -0
- package/.next/server/chunks/8404.js +62 -0
- package/.next/server/chunks/8514.js +1 -0
- package/.next/server/chunks/8843.js +1 -0
- package/.next/server/chunks/9098.js +1 -0
- package/.next/server/chunks/9293.js +1 -0
- package/.next/server/chunks/9328.js +179 -0
- package/.next/server/chunks/94.js +1 -0
- package/.next/server/chunks/9579.js +1 -0
- package/.next/server/chunks/9631.js +16 -0
- package/.next/server/chunks/9692.js +6 -0
- package/.next/server/chunks/9739.js +108 -0
- package/.next/server/chunks/9803.js +22 -0
- package/.next/server/chunks/9835.js +1 -0
- package/.next/server/chunks/9842.js +1 -0
- package/.next/server/chunks/9861.js +128 -0
- package/.next/server/chunks/9995.js +1 -0
- package/.next/server/edge-runtime-webpack.js +2 -0
- package/.next/server/edge-runtime-webpack.js.map +1 -0
- package/.next/server/functions-config-manifest.json +21 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -0
- package/.next/server/middleware-manifest.json +32 -0
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/middleware.js +14 -0
- package/.next/server/middleware.js.map +1 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +1 -0
- package/.next/server/pages/404.html +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages/_app.js +1 -0
- package/.next/server/pages/_app.js.nft.json +1 -0
- package/.next/server/pages/_document.js +1 -0
- package/.next/server/pages/_document.js.nft.json +1 -0
- package/.next/server/pages/_error.js +19 -0
- package/.next/server/pages/_error.js.nft.json +1 -0
- package/.next/server/pages-manifest.json +6 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +1 -0
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/static/chunks/1217-407174d9b164a499.js +1 -0
- package/.next/static/chunks/146-ccee3b26755b68c8.js +1 -0
- package/.next/static/chunks/3335-5647a38ab2cfa88d.js +1 -0
- package/.next/static/chunks/3954-fe27ff41d9bf012d.js +1 -0
- package/.next/static/chunks/4108.d6ed46bc2fcab462.js +1 -0
- package/.next/static/chunks/4400-cdb1f7913ae34e09.js +1 -0
- package/.next/static/chunks/4895-712004156efeccf2.js +1 -0
- package/.next/static/chunks/5097-f07f6aeee3f60a33.js +1 -0
- package/.next/static/chunks/5235-990ba9c4c8446446.js +62 -0
- package/.next/static/chunks/6489-ecde2d94e57eb8a9.js +1 -0
- package/.next/static/chunks/6568-e4d2de23d9f8d347.js +1 -0
- package/.next/static/chunks/6727-d38536774bdb32d5.js +1 -0
- package/.next/static/chunks/6734-9d524ec49e4ba49c.js +1 -0
- package/.next/static/chunks/6744-dbfe3cc4ce461613.js +1 -0
- package/.next/static/chunks/6fe292aa-7126ff9d6732e864.js +1 -0
- package/.next/static/chunks/8566-5d4c89b722d9cee1.js +1 -0
- package/.next/static/chunks/8775-890699c74c28df61.js +1 -0
- package/.next/static/chunks/9045-731ff0865352dd95.js +1 -0
- package/.next/static/chunks/app/_not-found/page-ffead1b4e248e14d.js +1 -0
- package/.next/static/chunks/app/agents/[agentId]/page-0b5c2838354d0eba.js +1 -0
- package/.next/static/chunks/app/api/agents/[agentId]/respond/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/images/[rootId]/[file]/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/oauth/callback/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/oauth/start/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/roots/[id]/attachments/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/roots/[id]/chat/[topicId]/send/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/roots/[id]/chat/[topicId]/stop/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/roots/[id]/chat/[topicId]/stream/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/roots/[id]/dashboard/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/roots/[id]/suggestions/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/utilities/[scope]/[id]/bundle.js/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/utilities/[scope]/[id]/host/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/utilities/[scope]/[id]/host-api.mjs/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/utilities/[scope]/[id]/host-ui.mjs/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/utilities/[scope]/[id]/iframe/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/api/utilities/[scope]/[id]/style.css/route-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/audit/page-e3445076d462aa80.js +1 -0
- package/.next/static/chunks/app/layout-c7a35075cfbfa3e3.js +1 -0
- package/.next/static/chunks/app/onboarding/page-cde5b92b13b03c63.js +1 -0
- package/.next/static/chunks/app/page-ddaeffdc9a15f597.js +1 -0
- package/.next/static/chunks/app/roots/[id]/chat/[topicId]/page-1b55f68984817d29.js +1 -0
- package/.next/static/chunks/app/roots/[id]/kb/[...slug]/page-d4358cb6042740c4.js +1 -0
- package/.next/static/chunks/app/roots/[id]/layout-7e2f82a91b10b7e2.js +1 -0
- package/.next/static/chunks/app/roots/[id]/page-703d96bf8208af2f.js +1 -0
- package/.next/static/chunks/app/roots/[id]/workflows/[wfId]/page-738e8e4128baa722.js +1 -0
- package/.next/static/chunks/app/roots/[id]/workflows/page-e3445076d462aa80.js +1 -0
- package/.next/static/chunks/app/roots/new/page-534769dce46d0d29.js +1 -0
- package/.next/static/chunks/app/settings/page-86ee3d07ea1acbc7.js +1 -0
- package/.next/static/chunks/app/share/[id]/file/page-93e0105d7903f777.js +1 -0
- package/.next/static/chunks/app/share/[id]/page-5bbc8503cb9a9eeb.js +1 -0
- package/.next/static/chunks/app/utilities/[scope]/[id]/page-72546d245b840091.js +1 -0
- package/.next/static/chunks/app/utilities/page-9f949d831421d314.js +1 -0
- package/.next/static/chunks/framework-aaa7c1a953276299.js +1 -0
- package/.next/static/chunks/main-app-ebe67847147d19aa.js +1 -0
- package/.next/static/chunks/main-bfb98fc1d6aa1d45.js +1 -0
- package/.next/static/chunks/pages/_app-bf8bc157ace53d59.js +1 -0
- package/.next/static/chunks/pages/_error-da89ab2956f0cf38.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-2e8cca5826414cc6.js +1 -0
- package/.next/static/css/87e01f779d555d04.css +1 -0
- package/.next/static/p8t15rbWhT5Rrs5fOXWZ6/_buildManifest.js +1 -0
- package/.next/static/p8t15rbWhT5Rrs5fOXWZ6/_ssgManifest.js +1 -0
- package/.next/trace +46 -0
- package/.next/types/app/agents/[agentId]/page.ts +84 -0
- package/.next/types/app/api/agents/[agentId]/respond/route.ts +347 -0
- package/.next/types/app/api/images/[rootId]/[file]/route.ts +347 -0
- package/.next/types/app/api/oauth/callback/route.ts +347 -0
- package/.next/types/app/api/oauth/start/route.ts +347 -0
- package/.next/types/app/api/roots/[id]/attachments/route.ts +347 -0
- package/.next/types/app/api/roots/[id]/chat/[topicId]/send/route.ts +347 -0
- package/.next/types/app/api/roots/[id]/chat/[topicId]/stop/route.ts +347 -0
- package/.next/types/app/api/roots/[id]/chat/[topicId]/stream/route.ts +347 -0
- package/.next/types/app/api/roots/[id]/dashboard/route.ts +347 -0
- package/.next/types/app/api/roots/[id]/suggestions/route.ts +347 -0
- package/.next/types/app/api/utilities/[scope]/[id]/bundle.js/route.ts +347 -0
- package/.next/types/app/api/utilities/[scope]/[id]/host/route.ts +347 -0
- package/.next/types/app/api/utilities/[scope]/[id]/host-api.mjs/route.ts +347 -0
- package/.next/types/app/api/utilities/[scope]/[id]/host-ui.mjs/route.ts +347 -0
- package/.next/types/app/api/utilities/[scope]/[id]/iframe/route.ts +347 -0
- package/.next/types/app/api/utilities/[scope]/[id]/style.css/route.ts +347 -0
- package/.next/types/app/audit/page.ts +84 -0
- package/.next/types/app/onboarding/page.ts +84 -0
- package/.next/types/app/page.ts +84 -0
- package/.next/types/app/roots/[id]/chat/[topicId]/page.ts +84 -0
- package/.next/types/app/roots/[id]/kb/[...slug]/page.ts +84 -0
- package/.next/types/app/roots/[id]/layout.ts +84 -0
- package/.next/types/app/roots/[id]/page.ts +84 -0
- package/.next/types/app/roots/[id]/workflows/[wfId]/page.ts +84 -0
- package/.next/types/app/roots/[id]/workflows/page.ts +84 -0
- package/.next/types/app/roots/new/page.ts +84 -0
- package/.next/types/app/settings/page.ts +84 -0
- package/.next/types/app/share/[id]/file/page.ts +84 -0
- package/.next/types/app/share/[id]/page.ts +84 -0
- package/.next/types/app/utilities/[scope]/[id]/page.ts +84 -0
- package/.next/types/app/utilities/page.ts +84 -0
- package/.next/types/cache-life.d.ts +141 -0
- package/.next/types/package.json +1 -0
- package/.next/types/routes.d.ts +103 -0
- package/.next/types/validator.ts +349 -0
- package/README.md +72 -0
- package/dist/bin/cli.js +82 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/lib/reflex/agents/backend.js +14 -0
- package/dist/lib/reflex/agents/backend.js.map +1 -0
- package/dist/lib/reflex/agents/claude-code.js +48 -0
- package/dist/lib/reflex/agents/claude-code.js.map +1 -0
- package/dist/lib/reflex/agents/codex.js +46 -0
- package/dist/lib/reflex/agents/codex.js.map +1 -0
- package/dist/lib/reflex/agents/index.js +13 -0
- package/dist/lib/reflex/agents/index.js.map +1 -0
- package/dist/lib/reflex/agents/prompts.js +228 -0
- package/dist/lib/reflex/agents/prompts.js.map +1 -0
- package/dist/lib/reflex/commands/chat.js +41 -0
- package/dist/lib/reflex/commands/chat.js.map +1 -0
- package/dist/lib/reflex/commands/init.js +38 -0
- package/dist/lib/reflex/commands/init.js.map +1 -0
- package/dist/lib/reflex/commands/start.js +64 -0
- package/dist/lib/reflex/commands/start.js.map +1 -0
- package/dist/lib/reflex/commands/watch.js +137 -0
- package/dist/lib/reflex/commands/watch.js.map +1 -0
- package/dist/lib/reflex/config.js +42 -0
- package/dist/lib/reflex/config.js.map +1 -0
- package/dist/lib/reflex/ignore.js +83 -0
- package/dist/lib/reflex/ignore.js.map +1 -0
- package/dist/lib/reflex/kb.js +48 -0
- package/dist/lib/reflex/kb.js.map +1 -0
- package/dist/lib/reflex/paths.js +33 -0
- package/dist/lib/reflex/paths.js.map +1 -0
- package/dist/lib/reflex/prompts/defaults.js +363 -0
- package/dist/lib/reflex/prompts/defaults.js.map +1 -0
- package/dist/lib/reflex/prompts/render.js +14 -0
- package/dist/lib/reflex/prompts/render.js.map +1 -0
- package/dist/lib/reflex/prompts/store.js +54 -0
- package/dist/lib/reflex/prompts/store.js.map +1 -0
- package/dist/lib/reflex/walker.js +55 -0
- package/dist/lib/reflex/walker.js.map +1 -0
- package/next.config.ts +33 -0
- package/package.json +87 -0
- package/packages/utilities/learn-anything/README.md +41 -0
- package/packages/utilities/learn-anything/actions/_json.ts +191 -0
- package/packages/utilities/learn-anything/actions/_store.ts +248 -0
- package/packages/utilities/learn-anything/actions/buildModule.ts +487 -0
- package/packages/utilities/learn-anything/actions/explainSelection.ts +64 -0
- package/packages/utilities/learn-anything/actions/generateOutline.ts +170 -0
- package/packages/utilities/learn-anything/actions/generateQuiz.ts +72 -0
- package/packages/utilities/learn-anything/actions/generateTrainer.ts +106 -0
- package/packages/utilities/learn-anything/actions/refreshCourseCard.ts +76 -0
- package/packages/utilities/learn-anything/actions/tutorAsk.ts +93 -0
- package/packages/utilities/learn-anything/article-view.tsx +464 -0
- package/packages/utilities/learn-anything/manifest.json +42 -0
- package/packages/utilities/learn-anything/ui.tsx +1589 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import ignore from "ignore";
|
|
4
|
+
import { DEFAULT_PRUNE, REFLEX_IGNORE } from "./paths.js";
|
|
5
|
+
/**
|
|
6
|
+
* Hierarchical .reflexignore matcher. Each directory may carry its own
|
|
7
|
+
* `.reflexignore` file (gitignore syntax). Patterns from a directory apply to
|
|
8
|
+
* that subtree only — like git's nested .gitignore behavior.
|
|
9
|
+
*
|
|
10
|
+
* Use {@link IgnoreStack#enter} when descending into a subdir and discard the
|
|
11
|
+
* returned stack when leaving (immutable push).
|
|
12
|
+
*/
|
|
13
|
+
export class IgnoreStack {
|
|
14
|
+
root;
|
|
15
|
+
layers;
|
|
16
|
+
constructor(root, layers) {
|
|
17
|
+
this.root = root;
|
|
18
|
+
this.layers = layers;
|
|
19
|
+
}
|
|
20
|
+
static async create(root) {
|
|
21
|
+
const empty = new IgnoreStack(root, []);
|
|
22
|
+
return empty.enter(root);
|
|
23
|
+
}
|
|
24
|
+
/** Push a layer for `dir` (absolute) if it contains a .reflexignore. */
|
|
25
|
+
async enter(dir) {
|
|
26
|
+
const file = path.join(dir, REFLEX_IGNORE);
|
|
27
|
+
let body;
|
|
28
|
+
try {
|
|
29
|
+
body = await fs.readFile(file, "utf8");
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
const ig = ignore().add(body);
|
|
35
|
+
return new IgnoreStack(this.root, [...this.layers, { dir, ig }]);
|
|
36
|
+
}
|
|
37
|
+
/** True if `abs` (file or dir) is ignored under any active layer. */
|
|
38
|
+
ignores(abs) {
|
|
39
|
+
const base = path.basename(abs);
|
|
40
|
+
if (DEFAULT_PRUNE.has(base))
|
|
41
|
+
return true;
|
|
42
|
+
for (const { dir, ig } of this.layers) {
|
|
43
|
+
const rel = path.relative(dir, abs);
|
|
44
|
+
if (!rel || rel.startsWith(".."))
|
|
45
|
+
continue;
|
|
46
|
+
if (ig.ignores(rel))
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Build a flat ignore predicate that incorporates every `.reflexignore` file
|
|
54
|
+
* found anywhere under `root`. Use this when you cannot walk hierarchically
|
|
55
|
+
* (e.g., handing a single function to a watcher).
|
|
56
|
+
*/
|
|
57
|
+
export async function buildFlatIgnore(root) {
|
|
58
|
+
const { promises: fs } = await import("node:fs");
|
|
59
|
+
let stack = await IgnoreStack.create(root);
|
|
60
|
+
// Walk synchronously here so the predicate is ready before the caller starts
|
|
61
|
+
// its watcher. Avoid importing walker.ts to keep ignore.ts dependency-light.
|
|
62
|
+
async function descend(dir) {
|
|
63
|
+
let entries;
|
|
64
|
+
try {
|
|
65
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
for (const e of entries) {
|
|
71
|
+
if (!e.isDirectory())
|
|
72
|
+
continue;
|
|
73
|
+
const abs = path.join(dir, e.name);
|
|
74
|
+
if (stack.ignores(abs))
|
|
75
|
+
continue;
|
|
76
|
+
stack = await stack.enter(abs);
|
|
77
|
+
await descend(abs);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
await descend(root);
|
|
81
|
+
return (abs) => stack.ignores(abs);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=ignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../../lib/reflex/ignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAuB,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,OAAO,WAAW;IAEH;IACA;IAFnB,YACmB,IAAY,EACZ,MAAkD;QADlD,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAA4C;IAClE,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAY;QAC9B,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAC3C,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,qEAAqE;IACrE,OAAO,CAAC,GAAW;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,KAAK,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC3C,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QACnC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY;IAEZ,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3C,6EAA6E;IAC7E,6EAA6E;IAC7E,KAAK,UAAU,OAAO,CAAC,GAAW;QAChC,IAAI,OAAmC,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;gBAAE,SAAS;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,SAAS;YACjC,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { walk } from "./walker.js";
|
|
4
|
+
import { mirrorInReflex, REFLEX_DIR, REFLEX_IGNORE } from "./paths.js";
|
|
5
|
+
/** Collect a snapshot of files visible under `scope` (honoring .reflexignore). */
|
|
6
|
+
export async function snapshotScope(args) {
|
|
7
|
+
const root = path.resolve(args.root);
|
|
8
|
+
const scope = path.resolve(args.scope);
|
|
9
|
+
const relScope = path.relative(root, scope);
|
|
10
|
+
if (relScope.startsWith("..")) {
|
|
11
|
+
throw new Error(`Scope ${scope} is outside root ${root}`);
|
|
12
|
+
}
|
|
13
|
+
const reflexScope = relScope
|
|
14
|
+
? mirrorInReflex(root, relScope)
|
|
15
|
+
: path.join(root, REFLEX_DIR);
|
|
16
|
+
const files = [];
|
|
17
|
+
for await (const entry of walk(scope)) {
|
|
18
|
+
if (entry.rel === ".")
|
|
19
|
+
continue;
|
|
20
|
+
if (!entry.isDir)
|
|
21
|
+
files.push(entry.rel);
|
|
22
|
+
}
|
|
23
|
+
return { root, scope, reflexScope, files };
|
|
24
|
+
}
|
|
25
|
+
export async function ensureReflexIgnoreTemplate(root) {
|
|
26
|
+
const target = path.join(root, REFLEX_IGNORE);
|
|
27
|
+
try {
|
|
28
|
+
await fs.access(target);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// not present — write a sane default
|
|
33
|
+
}
|
|
34
|
+
const body = [
|
|
35
|
+
"# .reflexignore — gitignore syntax",
|
|
36
|
+
"# Patterns listed here are excluded from Reflex's analysis and watchers.",
|
|
37
|
+
"",
|
|
38
|
+
"node_modules/",
|
|
39
|
+
"dist/",
|
|
40
|
+
"build/",
|
|
41
|
+
".venv/",
|
|
42
|
+
"__pycache__/",
|
|
43
|
+
"*.log",
|
|
44
|
+
"",
|
|
45
|
+
].join("\n");
|
|
46
|
+
await fs.writeFile(target, body, "utf8");
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=kb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb.js","sourceRoot":"","sources":["../../../lib/reflex/kb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAavE,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAGnC;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,oBAAoB,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,WAAW,GAAG,QAAQ;QAC1B,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC;QAChC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEhC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG;YAAE,SAAS;QAChC,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,IAAY;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;IACvC,CAAC;IACD,MAAM,IAAI,GAAG;QACX,oCAAoC;QACpC,0EAA0E;QAC1E,EAAE;QACF,eAAe;QACf,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,cAAc;QACd,OAAO;QACP,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
export const REFLEX_DIR = ".reflex";
|
|
3
|
+
export const REFLEX_IGNORE = ".reflexignore";
|
|
4
|
+
export const REFLEX_CONFIG = "config.json";
|
|
5
|
+
export const INDEX_MD = "INDEX.md";
|
|
6
|
+
export const DEFAULT_PRUNE = new Set([
|
|
7
|
+
".reflex",
|
|
8
|
+
".git",
|
|
9
|
+
"node_modules",
|
|
10
|
+
".DS_Store",
|
|
11
|
+
]);
|
|
12
|
+
/** Default debounce: 30 minutes. */
|
|
13
|
+
export const DEFAULT_DEBOUNCE_MS = 30 * 60 * 1000;
|
|
14
|
+
/** Minimum debounce: 1 second (prevents thrash; the user-meaningful floor is configured via settings). */
|
|
15
|
+
export const MIN_DEBOUNCE_MS = 1000;
|
|
16
|
+
export function reflexRoot(root) {
|
|
17
|
+
return path.join(root, REFLEX_DIR);
|
|
18
|
+
}
|
|
19
|
+
export function configPath(root) {
|
|
20
|
+
return path.join(reflexRoot(root), REFLEX_CONFIG);
|
|
21
|
+
}
|
|
22
|
+
export function rootIndexPath(root) {
|
|
23
|
+
return path.join(reflexRoot(root), INDEX_MD);
|
|
24
|
+
}
|
|
25
|
+
/** Mirror a directory's relative path inside .reflex/. */
|
|
26
|
+
export function mirrorInReflex(root, relDir) {
|
|
27
|
+
return path.join(reflexRoot(root), relDir);
|
|
28
|
+
}
|
|
29
|
+
/** INDEX.md location for a given subdir (relative to root). */
|
|
30
|
+
export function subdirIndexPath(root, relDir) {
|
|
31
|
+
return path.join(mirrorInReflex(root, relDir), INDEX_MD);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../lib/reflex/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AAEnC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IACnC,SAAS;IACT,MAAM;IACN,cAAc;IACd,WAAW;CACZ,CAAC,CAAC;AAEH,oCAAoC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAClD,0GAA0G;AAC1G,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAc;IACzD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,MAAc;IAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default prompt templates. Scaffolded into `~/.reflex/prompts/<name>.md` on
|
|
3
|
+
* first use. Variables use `{{name}}` syntax and are substituted at render
|
|
4
|
+
* time. Available variables per template are listed inline.
|
|
5
|
+
*/
|
|
6
|
+
export const TEMPLATE_NAMES = ["analyze", "chat"];
|
|
7
|
+
export const TEMPLATE_LABELS = {
|
|
8
|
+
analyze: "Analyze (KB build)",
|
|
9
|
+
chat: "Chat (KB Q&A)",
|
|
10
|
+
};
|
|
11
|
+
export const TEMPLATE_VARIABLES = {
|
|
12
|
+
analyze: [
|
|
13
|
+
"language",
|
|
14
|
+
"root",
|
|
15
|
+
"scope",
|
|
16
|
+
"relScope",
|
|
17
|
+
"reflexScope",
|
|
18
|
+
"files",
|
|
19
|
+
"fileCount",
|
|
20
|
+
"overflow",
|
|
21
|
+
],
|
|
22
|
+
chat: ["language", "root", "scope", "reflexScope"],
|
|
23
|
+
};
|
|
24
|
+
export const DEFAULT_TEMPLATES = {
|
|
25
|
+
analyze: `You are populating a local knowledge base (KB) for the directory:
|
|
26
|
+
{{scope}}
|
|
27
|
+
|
|
28
|
+
Project root: {{root}}
|
|
29
|
+
Scope (relative to root): {{relScope}}
|
|
30
|
+
Write all KB output as Markdown files under: {{reflexScope}}
|
|
31
|
+
|
|
32
|
+
**Write all Markdown content in {{language}}.** Keep code identifiers, file paths, and quoted source verbatim — translate prose only.
|
|
33
|
+
|
|
34
|
+
## Required structure
|
|
35
|
+
|
|
36
|
+
The KB is hierarchical. **Every directory under {{reflexScope}} MUST contain an INDEX.md.** Group related topics into subdirectories — do not dump every MD at the root.
|
|
37
|
+
|
|
38
|
+
Layout to produce (example for a typical project):
|
|
39
|
+
|
|
40
|
+
{{reflexScope}}/
|
|
41
|
+
├── INDEX.md # root overview, required
|
|
42
|
+
├── architecture/
|
|
43
|
+
│ ├── INDEX.md # required at every level
|
|
44
|
+
│ ├── data-model.md
|
|
45
|
+
│ └── routing.md
|
|
46
|
+
├── operations/
|
|
47
|
+
│ ├── INDEX.md
|
|
48
|
+
│ ├── build-and-test.md
|
|
49
|
+
│ └── deploy.md
|
|
50
|
+
└── modules/
|
|
51
|
+
├── INDEX.md
|
|
52
|
+
├── api/
|
|
53
|
+
│ ├── INDEX.md
|
|
54
|
+
│ └── endpoints.md
|
|
55
|
+
└── ui/
|
|
56
|
+
├── INDEX.md
|
|
57
|
+
└── components.md
|
|
58
|
+
|
|
59
|
+
Filenames are kebab-case. Directories are kebab-case too.
|
|
60
|
+
|
|
61
|
+
## Required frontmatter
|
|
62
|
+
|
|
63
|
+
Every Markdown file (INDEX.md included) MUST start with YAML frontmatter:
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
title: <human-readable title in {{language}}>
|
|
67
|
+
version: 1
|
|
68
|
+
date: <today's date in YYYY-MM-DD>
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
# <body>
|
|
72
|
+
|
|
73
|
+
Increment \`version\` only when re-writing a file later; keep \`date\` aligned with the day you last touched the content. \`title\` is what the UI sidebar shows — make it readable, not a filename.
|
|
74
|
+
|
|
75
|
+
## Content rules
|
|
76
|
+
|
|
77
|
+
- Each INDEX.md is a one-page overview of its directory: purpose, key files, how it relates to its parent. Link to direct-child files/INDEX.md as relative paths.
|
|
78
|
+
- Topic MD files focus on a single subject. Cross-link with relative paths.
|
|
79
|
+
- Prefer factual, source-grounded notes over speculation.
|
|
80
|
+
- Do not modify anything outside {{reflexScope}}.
|
|
81
|
+
- Do not write into \`{{reflexScope}}/topics/\` — that folder is reserved for chat transcripts.
|
|
82
|
+
- If the scope is essentially empty or boilerplate, write only a brief root INDEX.md and stop.
|
|
83
|
+
|
|
84
|
+
## Files visible in this scope (already filtered by .reflexignore)
|
|
85
|
+
|
|
86
|
+
{{files}}{{overflow}}
|
|
87
|
+
`,
|
|
88
|
+
chat: `You are a knowledge-base assistant for the directory: {{scope}}
|
|
89
|
+
Project root: {{root}}
|
|
90
|
+
The authoritative KB for this scope lives at: {{reflexScope}}
|
|
91
|
+
|
|
92
|
+
Reply in {{language}}. Keep code identifiers, file paths, and quoted source verbatim.
|
|
93
|
+
|
|
94
|
+
When the user asks a question:
|
|
95
|
+
1. Prefer reading the relevant MD file(s) inside {{reflexScope}} first.
|
|
96
|
+
2. If the KB is missing the answer, you may read source files under {{scope}}, but never modify them.
|
|
97
|
+
3. Cite MD files by relative path so the user can open them.
|
|
98
|
+
4. Do not regenerate or rewrite the KB unless the user explicitly asks.
|
|
99
|
+
|
|
100
|
+
## Interaction protocol (works for any provider)
|
|
101
|
+
|
|
102
|
+
If you need a permission decision before doing something, output a marker
|
|
103
|
+
block and STOP. Reflex will surface buttons to the user and send their
|
|
104
|
+
decision as your next user message.
|
|
105
|
+
|
|
106
|
+
<<reflex:permission>>{"tool":"Write","input":{"file_path":"…"},"description":"Why you need it"}<</reflex:permission>>
|
|
107
|
+
|
|
108
|
+
If you need a clarifying answer from the user, emit a question marker. **НЕ используй нативный инструмент \`AskUserQuestion\` — он не разрешён в Reflex.** Используй только маркер ниже — он поддерживает всё то же самое (header, multiSelect, label+description) и больше.
|
|
109
|
+
|
|
110
|
+
Простой вариант с готовыми ответами:
|
|
111
|
+
|
|
112
|
+
<<reflex:question>>{"prompt":"Какой язык для саммари?","choices":["english","русский"]}<</reflex:question>>
|
|
113
|
+
|
|
114
|
+
Развёрнутый вариант с label+description (как в AskUserQuestion):
|
|
115
|
+
|
|
116
|
+
<<reflex:question>>{
|
|
117
|
+
"id":"section",
|
|
118
|
+
"header":"Раздел",
|
|
119
|
+
"prompt":"С какого раздела начнём?",
|
|
120
|
+
"multiSelect":false,
|
|
121
|
+
"options":[
|
|
122
|
+
{"label":"История","description":"Хронология F1 с 1950 года"},
|
|
123
|
+
{"label":"Сезон 2025","description":"Календарь и таблицы текущего сезона"}
|
|
124
|
+
]
|
|
125
|
+
}<</reflex:question>>
|
|
126
|
+
|
|
127
|
+
Несколько вопросов в одном маркере (батч — Reflex покажет их подряд карточками):
|
|
128
|
+
|
|
129
|
+
<<reflex:question>>{
|
|
130
|
+
"questions":[
|
|
131
|
+
{"id":"section","header":"Раздел","prompt":"С какого раздела начнём?","options":[…]},
|
|
132
|
+
{"id":"depth","header":"Детальность","prompt":"Насколько детальные статьи?","options":[…]}
|
|
133
|
+
]
|
|
134
|
+
}<</reflex:question>>
|
|
135
|
+
|
|
136
|
+
Поля:
|
|
137
|
+
- \`prompt\` — обязательно. Сам вопрос, ~4-12 слов.
|
|
138
|
+
- \`header\` — короткая бирка-тэг (≤12 символов): «Раздел», «Язык», «Размер». Опционально.
|
|
139
|
+
- \`multiSelect\` — \`true\` если можно выбрать несколько вариантов. Reflex вернёт ответ как JSON-массив строк.
|
|
140
|
+
- \`options\` — список \`{label, description?}\`. Description — 1 строка контекста под label'ом.
|
|
141
|
+
- \`choices\` — legacy флэт массив строк. Для простых случаев. Не комбинируй с \`options\`.
|
|
142
|
+
- \`id\` — стабильный id если нужно соотнести ответ. Reflex сам генерит если опущен.
|
|
143
|
+
|
|
144
|
+
После эмита маркера(ов) — STOP. Reflex покажет карточку, дождётся ответа, и продолжит твой turn.
|
|
145
|
+
|
|
146
|
+
## Routing: you are an orchestrator, not the worker
|
|
147
|
+
|
|
148
|
+
For anything non-trivial (deep KB reading, multi-file research, code writes,
|
|
149
|
+
utility creation, summarization of large texts) — DELEGATE to a specialist
|
|
150
|
+
sub-agent instead of doing it yourself. Sub-agents run with a focused system
|
|
151
|
+
prompt and a constrained toolset, so they're faster and stay in their lane.
|
|
152
|
+
|
|
153
|
+
Available roles:
|
|
154
|
+
- **researcher** — read-only KB / web research (Read, Glob, Grep, WebFetch, WebSearch). Use for "найди / собери / процитируй".
|
|
155
|
+
- **coder** — writes/edits files (Write, Edit, MultiEdit + read tools). Use for "сделай / поправь / создай файл".
|
|
156
|
+
- **summarizer** — no tools; compresses long text passed in the brief. Use for "сожми / выдели главное" из большого куска.
|
|
157
|
+
- **kb-writer** — designs a structured KB entry (returns JSON for <<reflex:kb>>). Use when something is worth saving but the shape is non-trivial.
|
|
158
|
+
- **utility-builder** — designs a Reflex utility (manifest + ui.tsx). Use when the user asks to build a new utility.
|
|
159
|
+
|
|
160
|
+
To dispatch, emit one or more dispatch markers in a single turn and STOP:
|
|
161
|
+
|
|
162
|
+
<<reflex:dispatch>>{"id":"r1","role":"researcher","brief":"Прочитай {{reflexScope}}/INDEX.md и собери список всех тем."}<</reflex:dispatch>>
|
|
163
|
+
<<reflex:dispatch>>{"id":"c1","role":"coder","brief":"Добавь поле \`tags\` в schema/note.md и обнови примеры."}<</reflex:dispatch>>
|
|
164
|
+
|
|
165
|
+
Rules:
|
|
166
|
+
- The \`brief\` must be self-contained. Sub-agents do NOT see the chat
|
|
167
|
+
transcript — include all the context they need (rel-paths, expected
|
|
168
|
+
output shape, constraints).
|
|
169
|
+
- Multiple dispatches in one turn run **concurrently**. Don't dispatch
|
|
170
|
+
sequentially dependent tasks in the same turn — wait for the first
|
|
171
|
+
result before sending the second.
|
|
172
|
+
- After dispatches Reflex re-invokes you with each sub-agent's output
|
|
173
|
+
quoted. Compose the final user-facing reply from those results — quote
|
|
174
|
+
or paraphrase, don't just dump them.
|
|
175
|
+
- Do simple things yourself (one short answer, citing one file, a quick
|
|
176
|
+
KB lookup). Don't dispatch trivia.
|
|
177
|
+
- Don't re-dispatch the same brief if a sub-agent returned an empty or
|
|
178
|
+
unhelpful result — either solve it yourself or ask the user.
|
|
179
|
+
|
|
180
|
+
## Knowledge-base writes — ТОЛЬКО через \`<<reflex:kb>>\` маркер
|
|
181
|
+
|
|
182
|
+
**КРИТИЧНО.** Для записи в базу знаний (любой файл под \`{{reflexScope}}/\`) ты обязан использовать **только** маркер \`<<reflex:kb>>\`. **НЕ используй Write/Edit tool для KB-файлов** — они тебе там не разрешены, ты упрёшься в permission gate и затормозишь пользователя. Reflex сам создаёт файл под \`{{reflexScope}}/<kind>/<date>-<slug>.md\` с правильной структурой и frontmatter, никакой Write не нужен.
|
|
183
|
+
|
|
184
|
+
<<reflex:kb>>{"kind":"fact","title":"Краткий заголовок","body":"# H1\\n\\nРазвёрнутое описание в Markdown","meta":{"tags":["finance"]}}<</reflex:kb>>
|
|
185
|
+
|
|
186
|
+
Fields:
|
|
187
|
+
- kind — \`fact\` | \`task\` | \`meeting\` | \`product\` | any kebab-case noun
|
|
188
|
+
- title — 3-10 words, human-readable, in {{language}}
|
|
189
|
+
- body — Markdown content (use \\n for newlines inside JSON)
|
|
190
|
+
- meta (opt.) — structured fields surfaced as YAML frontmatter
|
|
191
|
+
- slug (opt.) — file slug if you want to fix the name
|
|
192
|
+
- date (opt.) — YYYY-MM-DD (for meetings/events; defaults to today)
|
|
193
|
+
|
|
194
|
+
Conventional \`meta\` shapes:
|
|
195
|
+
- task → {"status":"todo|doing|done","priority":"low|med|high","due":"YYYY-MM-DD","assignee":"…"}
|
|
196
|
+
- meeting → {"attendees":["…"],"decisions":["…"],"action_items":["…"]}
|
|
197
|
+
- product → {"sku":"…","price":"…","currency":"USD","vendor":"…","url":"…"}
|
|
198
|
+
- fact → {"tags":["…"],"source":"…"}
|
|
199
|
+
|
|
200
|
+
Rules:
|
|
201
|
+
- Эмить маркер **на каждую** запись, даже если их 50+. Многократные маркеры в одном ответе разрешены и приветствуются для батч-операций — это твой единственный путь к записи в KB.
|
|
202
|
+
- Write/Edit разрешены для **кода и файлов вне \`.reflex/\`** (исходники проекта). Для всего что должно лечь в базу знаний — только \`<<reflex:kb>>\`.
|
|
203
|
+
- Не дублируй содержимое маркера в обычном тексте ответа — маркер каноничен.
|
|
204
|
+
- The UI shows each saved entry as a card linking to the new file.
|
|
205
|
+
- Если пользователь явно просит «сделай Write» в файл под \`.reflex/\` — это специальный случай; запроси разрешение через \`<<reflex:permission>>\` с описанием почему обычный путь через \`<<reflex:kb>>\` не подходит.
|
|
206
|
+
|
|
207
|
+
## /reflex:utility — генерация утилит
|
|
208
|
+
|
|
209
|
+
Reflex поддерживает мини-приложения («утилиты»), которые ты можешь создать прямо из чата. Утилита живёт в отдельной директории (\`~/.reflex/utilities/<id>/\` для глобальной или \`<root>/.reflex/utilities/<id>/\` для проектной), грузится в изолированном iframe и **не имеет прямого доступа к сети, ллм или ФС** — только через Host API Reflex'а с проверкой разрешений.
|
|
210
|
+
|
|
211
|
+
Чтобы создать утилиту, эмить маркер:
|
|
212
|
+
|
|
213
|
+
<<reflex:utility>>{"scope":"global","manifest":{...},"files":{...}}<</reflex:utility>>
|
|
214
|
+
|
|
215
|
+
### Жёсткие правила
|
|
216
|
+
|
|
217
|
+
1. **UI** — один React functional-component default-export, TypeScript. Кладёшь в files["ui.tsx"].
|
|
218
|
+
2. **Импорты ТОЛЬКО**:
|
|
219
|
+
- \`"react"\`, \`"react-dom"\`, \`"react-dom/client"\` — резолвятся бандлером.
|
|
220
|
+
- \`"@host/api"\` — даёт \`{ reflex }\` объект (см. ниже).
|
|
221
|
+
- \`"@host/ui"\` — даёт примитивы Button, Input, Textarea, Label, Card, CardContent, CardHeader, CardTitle, Badge, ScrollArea.
|
|
222
|
+
- Никаких других пакетов / node_modules / node:* модулей. esbuild отвергнет любой другой импорт.
|
|
223
|
+
3. **Никаких fetch/XHR/WebSocket/localStorage** внутри утилиты. Только \`reflex.web.fetch({url})\` с явно whitelisted доменом в манифесте.
|
|
224
|
+
4. **Состояние** сохраняется через \`reflex.fs.write({path, content})\` (в \`<utility>/data/\`) или \`reflex.kb.add({...})\`.
|
|
225
|
+
5. **Манифест** обязательно перечисляет все нужные permissions — пользователь увидит этот список при установке и сможет отказать.
|
|
226
|
+
|
|
227
|
+
### Манифест (JSON)
|
|
228
|
+
|
|
229
|
+
\`\`\`json
|
|
230
|
+
{
|
|
231
|
+
"id": "kebab-case-id",
|
|
232
|
+
"name": "Человекочитаемое имя",
|
|
233
|
+
"description": "Что делает утилита",
|
|
234
|
+
"version": "1.0.0",
|
|
235
|
+
"ui": "ui.tsx",
|
|
236
|
+
"permissions": {
|
|
237
|
+
"llm": {"tasks": ["chat", "quick"]},
|
|
238
|
+
"kb": {"read": true, "write": true, "kinds": ["3d-model"]},
|
|
239
|
+
"fs": {"sandbox": true},
|
|
240
|
+
"web": {"fetch": {"domains": ["api.example.com"]}, "search": false},
|
|
241
|
+
"audit": {"write": true},
|
|
242
|
+
"workers": {"enabled": true}
|
|
243
|
+
},
|
|
244
|
+
"serverActions": [
|
|
245
|
+
{"name": "summarize", "entry": "actions/summarize.ts", "timeoutMs": 30000}
|
|
246
|
+
],
|
|
247
|
+
"secrets": [
|
|
248
|
+
{"key": "OPENAI_API_KEY", "label": "OpenAI API key", "description": "Нужен для вызовов api.openai.com из этой утилиты.", "required": true}
|
|
249
|
+
],
|
|
250
|
+
"mcpServers": ["github", "google-calendar"]
|
|
251
|
+
}
|
|
252
|
+
\`\`\`
|
|
253
|
+
|
|
254
|
+
### Host API (что доступно в \`reflex\` объекте)
|
|
255
|
+
|
|
256
|
+
- \`reflex.llm.complete({task, prompt, model?})\` → \`{text}\` — non-streaming LLM-вызов. task ∈ {"chat","quick","rag","embed"}.
|
|
257
|
+
- \`reflex.kb.add({kind, title, body, meta?, rootId?})\` → \`{relPath, absPath}\`.
|
|
258
|
+
- \`reflex.kb.list({kind?, query?, rootId?})\` → массив сводок.
|
|
259
|
+
- \`reflex.kb.read({relPath, rootId?})\` → \`{content}\`.
|
|
260
|
+
- \`reflex.fs.read({path})\` / \`fs.write({path, content})\` / \`fs.list({path})\` — изолировано в \`<utility>/data/\`.
|
|
261
|
+
- \`reflex.web.fetch({url, method?, headers?, body?})\` → \`{status, headers, body}\`. URL должен быть в \`permissions.web.fetch.domains\`.
|
|
262
|
+
- \`reflex.web.search({query})\` → \`{results: [{title, url, snippet}]}\`.
|
|
263
|
+
- \`reflex.audit.log({type, payload})\` — кастомная запись в аудит.
|
|
264
|
+
- \`reflex.actions.invoke({name, args})\` — запуск своего server action в Node Worker (если объявлен в манифесте).
|
|
265
|
+
- \`reflex.secrets.get({key})\` → \`{value}\` — читает секрет, заполненный пользователем. \`key\` должен быть из \`manifest.secrets\`, иначе ошибка. Если значение не задано — тоже ошибка (utility должен показать пользователю, что нужно заполнить).
|
|
266
|
+
- \`reflex.secrets.list()\` → \`{secrets: [{key, label, description, required, set}]}\` — UI утилиты может показывать пользователю, какие секреты нужны и какие из них уже заполнены.
|
|
267
|
+
- \`reflex.mcp.listServers()\` → \`{servers: [{id, label, description, registered}]}\` — какие MCP-серверы доступны (из \`manifest.mcpServers\`) и какие из них реально зарегистрированы в системе.
|
|
268
|
+
- \`reflex.mcp.listTools({server?})\` → \`{server, tools: [{name, description?, inputSchema?}]}\` — список tools конкретного MCP-сервера. Если в \`mcpServers\` объявлен ровно один — \`server\` можно опустить.
|
|
269
|
+
- \`reflex.mcp.call({server?, tool, args})\` → \`{server, isError?, content}\` — вызов MCP tool. Используй когда нужно реально что-то сделать через сторонний сервис (GitHub, Calendar, Slack…). Сервер должен быть в \`manifest.mcpServers\` И зарегистрирован пользователем в Settings → MCP.
|
|
270
|
+
|
|
271
|
+
### Секреты
|
|
272
|
+
|
|
273
|
+
Если утилите нужны конфиденциальные данные (API-ключи, токены, пароли) — **объяви их в манифесте, не подставляй в код**:
|
|
274
|
+
|
|
275
|
+
\`\`\`json
|
|
276
|
+
"secrets": [
|
|
277
|
+
{"key": "OPENAI_API_KEY", "label": "OpenAI API key", "description": "Что это и зачем", "required": true}
|
|
278
|
+
]
|
|
279
|
+
\`\`\`
|
|
280
|
+
|
|
281
|
+
Правила:
|
|
282
|
+
- \`key\` — UPPER_SNAKE_CASE (как у env-переменных).
|
|
283
|
+
- Описание (\`label\` + \`description\`) **видит пользователь** в правой панели утилиты, где он сам введёт значение. Объясни доступно: что это, где взять, на что влияет.
|
|
284
|
+
- **Ты как агент НЕ ВИДИШЬ значений секретов** — они хранятся в \`~/.reflex/secrets/\` вне твоего sandbox. Не пытайся их прочитать через Read/Glob, не проси пользователя ввести их в чат, не подставляй placeholder'ы в файлы утилиты.
|
|
285
|
+
- Внутри утилиты используй так: \`const {value: apiKey} = await reflex.secrets.get({key: "OPENAI_API_KEY"});\`. Если \`required: true\` и не заполнен — utility должен показать понятное сообщение (через \`reflex.secrets.list()\` и UI-карточку «Заполни секреты», а не упасть в консоли).
|
|
286
|
+
|
|
287
|
+
### Регистрация MCP-сервера из чата
|
|
288
|
+
|
|
289
|
+
Если для ответа нужен MCP-сервер, которого ещё нет в реестре — **не проси** пользователя идти в Settings вручную. Эмить маркер \`<<reflex:mcp-add>>\` с предложением: что за сервер, как его запустить, какие секреты надо запросить. Reflex покажет пользователю карточку с твоей конфигурацией и password-полями под секреты. Когда он одобрит — сервер сохранится в реестре, и ты получишь сообщение «MCP server X registered. You can now call …», после чего сразу зови \`mcp__<id>__<tool>\`.
|
|
290
|
+
|
|
291
|
+
<<reflex:mcp-add>>{"id":"mcp1","server":"google-calendar","label":"Google Calendar","description":"Чтение/создание событий в Google Calendar.","config":{"transport":"stdio","command":"npx","args":["-y","@modelcontextprotocol/server-google-calendar"],"env":{}},"secrets":[{"envKey":"GOOGLE_OAUTH_TOKEN","label":"Access token","description":"Получи через https://developers.google.com/oauthplayground (scope https://www.googleapis.com/auth/calendar). Скопируй access_token.","required":true}]}<</reflex:mcp-add>>
|
|
292
|
+
|
|
293
|
+
Правила:
|
|
294
|
+
- \`server\` — kebab-case id, под которым он будет жить в реестре (и из которого получится tool-prefix \`mcp__<id>__\`). Не путать с \`id\` (correlation id для тебя).
|
|
295
|
+
- \`config\` — McpConfig: stdio (command/args/env), http/sse (url/headers). НЕ ВПИСЫВАЙ секреты прямо в env/headers — оставь их пустыми/placeholder'ами; то, что пользователь должен ввести, объяви через \`secrets[]\`.
|
|
296
|
+
- Для stdio секреты идут в \`env\`, для http/sse — в \`headers\` (имя ключа = \`envKey\`).
|
|
297
|
+
- В \`description\` секрета **обязательно** напиши пользователю где взять токен.
|
|
298
|
+
- Не пытайся сам прочитать значения секретов после регистрации — они нужны только серверу, ты их не видишь.
|
|
299
|
+
- Если пользователь отклонил — НЕ пробуй ту же конфигурацию снова. Спроси что не так через \`<<reflex:question>>\` или подбери альтернативу.
|
|
300
|
+
|
|
301
|
+
#### Полный OAuth (auto-refresh)
|
|
302
|
+
|
|
303
|
+
Reflex поддерживает встроенный OAuth flow с локальным callback'ом, persist refresh-token и авто-обновлением. Поддержанные провайдеры: \`google\`, \`github\`, \`notion\`, \`slack\`, \`linear\`. Если сервер аутентифицируется через одного из них — **используй oauth-slot вместо обычного secret-input**: в слоте укажи поле \`"oauth":"<provider>"\`, и UI покажет пользователю кнопку «Authorize via <provider>» вместо password-инпута. После авторизации в env запишется placeholder \`$oauth:<provider>\` — Reflex подставит свежий access_token при каждом вызове.
|
|
304
|
+
|
|
305
|
+
<<reflex:mcp-add>>{"id":"mcp1","server":"google-calendar","label":"Google Calendar","config":{"transport":"stdio","command":"npx","args":["-y","@modelcontextprotocol/server-google-calendar"],"env":{}},"secrets":[{"envKey":"GOOGLE_OAUTH_TOKEN","label":"Access token","oauth":"google","required":true,"description":"Reflex откроет OAuth-окно Google и сохранит refresh-token. Тебе нужно один раз заранее настроить client_id в Settings → OAuth providers → Google."}]}<</reflex:mcp-add>>
|
|
306
|
+
|
|
307
|
+
Когда так делать: для любого сервера-обёртки над сервисом из списка выше (Google Calendar/Gmail/Drive, GitHub, Notion, Slack, Linear). Если провайдера в списке нет — fallback к ручному pat/bearer через обычный \`secrets[]\` без \`oauth\`.
|
|
308
|
+
|
|
309
|
+
### MCP-серверы (внешние сервисы)
|
|
310
|
+
|
|
311
|
+
Reflex хранит **глобальный реестр MCP-серверов** (Settings → MCP) — Google Calendar, GitHub, Slack, любой совместимый сервер. Утилита получает к ним доступ, декларируя их id в manifest:
|
|
312
|
+
|
|
313
|
+
\`\`\`json
|
|
314
|
+
"mcpServers": ["github", "google-calendar"]
|
|
315
|
+
\`\`\`
|
|
316
|
+
|
|
317
|
+
Правила:
|
|
318
|
+
- ID серверов — kebab-case, должны совпадать с тем, что в реестре. Если сервера нет в реестре — \`reflex.mcp.listServers()\` вернёт его с \`registered: false\`, и utility должен предложить пользователю добавить его (текстом, не пытайся регистрировать сам).
|
|
319
|
+
- НЕ используй \`reflex.llm.complete\` для «выполнения tool-call» — LLM возвращает только текст. Чтобы реально дернуть инструмент, вызывай \`reflex.mcp.call({server, tool, args})\` напрямую.
|
|
320
|
+
- Конфиг сервера (command/args/url/env) хранится централизованно — не дублируй его в utility'и и не выпрашивай у пользователя; он уже задал его один раз в Settings.
|
|
321
|
+
- Если \`mcpServers\` пуст или объявленный сервер не зарегистрирован — utility должен отрисовать понятное сообщение «Зарегистрируй сервер X в Settings → MCP», а не падать.
|
|
322
|
+
|
|
323
|
+
Чат-агент (orchestrator) **тоже** имеет натив-MCP через \`--mcp-config\`, который Reflex автоматически прокидывает в claude-code CLI. Tools там доступны как \`mcp__<server-id>__<tool-name>\` (например \`mcp__github__list_repos\`). В чате используй их **напрямую** через ToolUse, не дёргай через утилитные пути.
|
|
324
|
+
|
|
325
|
+
### Server actions (тяжёлая server-side логика)
|
|
326
|
+
|
|
327
|
+
Если утилите нужно делать что-то в Node, объявляй \`serverActions\` в манифесте. Каждый action — файл .ts в \`files["actions/<name>.ts"]\` с default-экспортом:
|
|
328
|
+
|
|
329
|
+
\`\`\`ts
|
|
330
|
+
import { reflex } from "@host/api";
|
|
331
|
+
export default async function run(args, host) {
|
|
332
|
+
// host === reflex; используй для llm/fs/kb/web вызовов
|
|
333
|
+
const data = await host.fs.read({path: args.path});
|
|
334
|
+
return {summary: data.content.slice(0, 200)};
|
|
335
|
+
}
|
|
336
|
+
\`\`\`
|
|
337
|
+
|
|
338
|
+
Action исполняется в Worker thread с теми же permissions, что и UI. После одного вызова Worker терминируется. Hard limits: 256MB heap, timeout по \`timeoutMs\`.
|
|
339
|
+
|
|
340
|
+
### Файлы
|
|
341
|
+
|
|
342
|
+
- \`ui.tsx\` — entry React component (обязательно).
|
|
343
|
+
- \`README.md\` — описание (рекомендуется).
|
|
344
|
+
- \`actions/<name>.ts\` — server actions (если объявлены).
|
|
345
|
+
|
|
346
|
+
Tailwind-классы доступны через стандартную таблицу (cdn.jsdelivr.net/npm/tailwindcss).
|
|
347
|
+
|
|
348
|
+
### Когда использовать
|
|
349
|
+
|
|
350
|
+
Эмить \`<<reflex:utility>>\` только если пользователь явно попросил создать утилиту / мини-приложение / форму / генератор. Для разовых задач — обычный ответ. Если сомневаешься — спроси через \`<<reflex:question>>\`.
|
|
351
|
+
|
|
352
|
+
После маркера система выведет карточку «Утилита установлена» со ссылкой; не дублируй название в прозе.
|
|
353
|
+
|
|
354
|
+
## General rules
|
|
355
|
+
|
|
356
|
+
- Emit at most one permission/question marker per pause, then stop
|
|
357
|
+
generating until the user responds.
|
|
358
|
+
- Markers must be valid JSON on a single block (whitespace inside is fine).
|
|
359
|
+
- You may proceed normally without any marker; only use them when blocked
|
|
360
|
+
or when there's knowledge worth persisting.
|
|
361
|
+
`,
|
|
362
|
+
};
|
|
363
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../../lib/reflex/prompts/defaults.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,CAAU,CAAC;AAG3D,MAAM,CAAC,MAAM,eAAe,GAAiC;IAC3D,OAAO,EAAE,oBAAoB;IAC7B,IAAI,EAAE,eAAe;CACtB,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAmC;IAChE,OAAO,EAAE;QACP,UAAU;QACV,MAAM;QACN,OAAO;QACP,UAAU;QACV,aAAa;QACb,OAAO;QACP,WAAW;QACX,UAAU;KACX;IACD,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAiC;IAC7D,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8DV;IAEC,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiRP;CACA,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal `{{var}}` template renderer. Whitespace around the name is allowed
|
|
3
|
+
* (`{{ var }}`). Unknown variables are left untouched so they don't silently
|
|
4
|
+
* vanish on a typo.
|
|
5
|
+
*/
|
|
6
|
+
export function renderTemplate(template, vars) {
|
|
7
|
+
return template.replace(/\{\{\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\}\}/g, (m, key) => {
|
|
8
|
+
const v = vars[key];
|
|
9
|
+
if (v === undefined)
|
|
10
|
+
return m;
|
|
11
|
+
return String(v);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../lib/reflex/prompts/render.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,IAAiD;IAEjD,OAAO,QAAQ,CAAC,OAAO,CAAC,yCAAyC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAC5E,MAAM,CAAC,GAAG,IAAI,CAAC,GAAa,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import { DEFAULT_TEMPLATES, TEMPLATE_NAMES, } from "./defaults.js";
|
|
5
|
+
const PROMPTS_DIR = path.join(os.homedir(), ".reflex", "prompts");
|
|
6
|
+
function pathFor(name) {
|
|
7
|
+
return path.join(PROMPTS_DIR, `${name}.md`);
|
|
8
|
+
}
|
|
9
|
+
function isTemplateName(s) {
|
|
10
|
+
return TEMPLATE_NAMES.includes(s);
|
|
11
|
+
}
|
|
12
|
+
export function templatePath(name) {
|
|
13
|
+
return pathFor(name);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load `<name>` template body. If the file is missing, scaffold it with the
|
|
17
|
+
* built-in default and return that. Always returns the on-disk content after
|
|
18
|
+
* the call so subsequent reads see the same bytes.
|
|
19
|
+
*/
|
|
20
|
+
export async function loadTemplate(name) {
|
|
21
|
+
const target = pathFor(name);
|
|
22
|
+
try {
|
|
23
|
+
return await fs.readFile(target, "utf8");
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
if (!isNotFound(err))
|
|
27
|
+
throw err;
|
|
28
|
+
}
|
|
29
|
+
// First touch — write the default so the user can edit on disk too.
|
|
30
|
+
await fs.mkdir(PROMPTS_DIR, { recursive: true });
|
|
31
|
+
await fs.writeFile(target, DEFAULT_TEMPLATES[name], "utf8");
|
|
32
|
+
return DEFAULT_TEMPLATES[name];
|
|
33
|
+
}
|
|
34
|
+
export async function saveTemplate(name, body) {
|
|
35
|
+
await fs.mkdir(PROMPTS_DIR, { recursive: true });
|
|
36
|
+
await fs.writeFile(pathFor(name), body, "utf8");
|
|
37
|
+
}
|
|
38
|
+
export async function resetTemplate(name) {
|
|
39
|
+
await saveTemplate(name, DEFAULT_TEMPLATES[name]);
|
|
40
|
+
return DEFAULT_TEMPLATES[name];
|
|
41
|
+
}
|
|
42
|
+
export function assertTemplateName(s) {
|
|
43
|
+
if (!isTemplateName(s)) {
|
|
44
|
+
throw new Error(`Unknown template: ${s}`);
|
|
45
|
+
}
|
|
46
|
+
return s;
|
|
47
|
+
}
|
|
48
|
+
function isNotFound(err) {
|
|
49
|
+
return (typeof err === "object" &&
|
|
50
|
+
err !== null &&
|
|
51
|
+
"code" in err &&
|
|
52
|
+
err.code === "ENOENT");
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../lib/reflex/prompts/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EACL,iBAAiB,EACjB,cAAc,GAEf,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAElE,SAAS,OAAO,CAAC,IAAkB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC/B,OAAQ,cAAoC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAkB;IAC7C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAkB;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;IAClC,CAAC;IACD,oEAAoE;IACpE,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAkB,EAClB,IAAY;IAEZ,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAkB;IACpD,MAAM,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,CAAS;IAC1C,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,UAAU,CAAC,GAAY;IAC9B,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,MAAM,IAAI,GAAG;QACZ,GAAwB,CAAC,IAAI,KAAK,QAAQ,CAC5C,CAAC;AACJ,CAAC"}
|