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,228 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { loadTemplate } from "../prompts/store.js";
|
|
3
|
+
import { renderTemplate } from "../prompts/render.js";
|
|
4
|
+
const MAX_FILE_LIST = 400;
|
|
5
|
+
const DEFAULT_LANGUAGE = "english";
|
|
6
|
+
export async function analyzePrompt(scope) {
|
|
7
|
+
const template = await loadTemplate("analyze");
|
|
8
|
+
const relScope = path.relative(scope.root, scope.scope) || ".";
|
|
9
|
+
const trimmed = scope.files.slice(0, MAX_FILE_LIST);
|
|
10
|
+
const overflow = scope.files.length > MAX_FILE_LIST
|
|
11
|
+
? `\n…and ${scope.files.length - MAX_FILE_LIST} more files (truncated).`
|
|
12
|
+
: "";
|
|
13
|
+
return renderTemplate(template, {
|
|
14
|
+
language: scope.language ?? DEFAULT_LANGUAGE,
|
|
15
|
+
root: scope.root,
|
|
16
|
+
scope: scope.scope,
|
|
17
|
+
relScope,
|
|
18
|
+
reflexScope: scope.reflexScope,
|
|
19
|
+
files: trimmed.map((f) => ` - ${f}`).join("\n"),
|
|
20
|
+
fileCount: scope.files.length,
|
|
21
|
+
overflow,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export async function chatSystemPrompt(scope) {
|
|
25
|
+
const template = await loadTemplate("chat");
|
|
26
|
+
const rendered = renderTemplate(template, {
|
|
27
|
+
language: scope.language ?? DEFAULT_LANGUAGE,
|
|
28
|
+
root: scope.root,
|
|
29
|
+
scope: scope.scope,
|
|
30
|
+
reflexScope: scope.reflexScope,
|
|
31
|
+
});
|
|
32
|
+
// Routing/dispatch instructions are appended at runtime (not via the
|
|
33
|
+
// user-editable chat.md template) so the protocol contract stays in lock-
|
|
34
|
+
// step with the manager's parser, regardless of any local prompt edits.
|
|
35
|
+
return [
|
|
36
|
+
rendered,
|
|
37
|
+
dispatchInstructions(),
|
|
38
|
+
widgetInstructions(),
|
|
39
|
+
workflowInstructions(),
|
|
40
|
+
imageGenInstructions(),
|
|
41
|
+
].join("\n\n");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Inline image generation via `<<reflex:image-gen>>`. Reflex calls
|
|
45
|
+
* Gemini Nano Banana (or Codex `$imagegen`) post-turn, saves the bytes
|
|
46
|
+
* under the project's `.reflex/assets/images/` and inserts a markdown
|
|
47
|
+
* `![]()` reference into THIS assistant message.
|
|
48
|
+
*/
|
|
49
|
+
function imageGenInstructions() {
|
|
50
|
+
return [
|
|
51
|
+
"## Generating images inline",
|
|
52
|
+
"",
|
|
53
|
+
"When the user asks to draw, generate, or illustrate something (\"нарисуй кота\", \"сделай иллюстрацию\", \"сгенерируй превью\"), DON'T describe what you'd draw — emit an image-gen marker and Reflex will render the actual image inside your reply.",
|
|
54
|
+
"",
|
|
55
|
+
"```",
|
|
56
|
+
`<<reflex:image-gen>>{`,
|
|
57
|
+
` "prompt": "детальный английский или русский промпт описывающий картинку",`,
|
|
58
|
+
` "provider": "gemini",`,
|
|
59
|
+
` "aspectRatio": "16:9",`,
|
|
60
|
+
` "caption": "короткая подпись (опционально)",`,
|
|
61
|
+
` "attachToKb": false`,
|
|
62
|
+
`}<</reflex:image-gen>>`,
|
|
63
|
+
"```",
|
|
64
|
+
"",
|
|
65
|
+
"- `provider`: `\"gemini\"` (Nano Banana, дефолт, дёшево и быстро) или `\"codex\"` (через `$imagegen` в Codex CLI).",
|
|
66
|
+
"- `aspectRatio`: `\"1:1\"`, `\"16:9\"`, `\"9:16\"`, `\"4:3\"` и т.п. Опционально.",
|
|
67
|
+
"- `attachToKb: true` — также сохранить картинку в KB как `kind: \"image\"` для будущей переподборки.",
|
|
68
|
+
"- Можно эмитить несколько маркеров за один ответ — будет N картинок подряд.",
|
|
69
|
+
"- Промпт пиши развёрнутый: стиль (фотореализм / акварель / 3D / иллюстрация), композиция, освещение, настроение. Чем конкретнее — тем лучше результат.",
|
|
70
|
+
"- НЕ описывай словами «вот картинка кота» — просто эмить маркер; Reflex сам вставит изображение в твой ответ.",
|
|
71
|
+
].join("\n");
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Workflows are linear "recipes" (steps run sequentially). Designed for
|
|
75
|
+
* non-programmers — the agent's job is to compose them from typed nodes
|
|
76
|
+
* (text-template, http-request, web-fetch, ask-agent, kb-write) when
|
|
77
|
+
* the user asks for "автоматизацию", "регулярную задачу", "робота".
|
|
78
|
+
*/
|
|
79
|
+
function workflowInstructions() {
|
|
80
|
+
return [
|
|
81
|
+
"## Workflows — встроенный «n8n для домохозяек»",
|
|
82
|
+
"",
|
|
83
|
+
"Когда пользователь хочет автоматизировать что-то регулярное (утренний дайджест, мониторинг страницы, рутина «скачай → обработай → запиши»), эмить маркер `<<reflex:workflow-create>>` — Reflex сохранит workflow на диск и покажет превью со ссылкой на редактор.",
|
|
84
|
+
"",
|
|
85
|
+
"```",
|
|
86
|
+
`<<reflex:workflow-create>>{`,
|
|
87
|
+
` "id": "<kebab-case-id>",`,
|
|
88
|
+
` "label": "<short title>",`,
|
|
89
|
+
` "description": "<one line>",`,
|
|
90
|
+
` "trigger": "manual" | "hourly" | "daily" | "weekly",`,
|
|
91
|
+
` "steps": [`,
|
|
92
|
+
` {"id": "fetch", "kind": "web-fetch", "label": "Скачать HN", "params": {"url": "https://news.ycombinator.com/rss"}},`,
|
|
93
|
+
` {"id": "digest", "kind": "ask-agent", "label": "Сжать в дайджест", "params": {"prompt": "Сожми топ-5 заголовков из RSS:\\n{{prev}}"}},`,
|
|
94
|
+
` {"id": "save", "kind": "kb-write", "label": "Записать в KB", "params": {"kind": "digest", "title": "HN дайджест", "body": "{{prev}}"}}`,
|
|
95
|
+
` ]`,
|
|
96
|
+
`}<</reflex:workflow-create>>`,
|
|
97
|
+
"```",
|
|
98
|
+
"",
|
|
99
|
+
"### Доступные `kind` шагов",
|
|
100
|
+
"",
|
|
101
|
+
"- `text-template` — `{template: string}`. Подстановки: `{{prev}}`, `{{steps.<id>.output}}`, `{{input.<field>}}`, `{{workflow.label}}`.",
|
|
102
|
+
"- `http-request` — `{url, method?, headers?: string-JSON, body?}`. Output: текст или JSON (по content-type).",
|
|
103
|
+
"- `web-fetch` — `{url}`. Простой GET, output — текст ответа.",
|
|
104
|
+
"- `ask-agent` — `{prompt}`. Запускает headless orchestrator и возвращает текст ответа. Используй для суммаризации, перефразирования, классификации.",
|
|
105
|
+
"- `kb-write` — `{kind, title, body}`. Сохраняет в базу знаний как обычный KB-файл.",
|
|
106
|
+
"",
|
|
107
|
+
"### Правила",
|
|
108
|
+
"",
|
|
109
|
+
"- Каждый step передаёт output следующему через `{{prev}}` или `{{steps.<id>.output}}`. Это единственная связь между шагами.",
|
|
110
|
+
"- `id` step'а должен быть стабильный и kebab-case — на него ссылаются templates.",
|
|
111
|
+
"- Шаги выполняются строго последовательно. Если step упадёт — остальные не запустятся, run отметится failed.",
|
|
112
|
+
"- Делай workflow КОРОТКИМИ (3-5 шагов). Если задача больше — разбей на несколько workflows или дай агенту через `ask-agent` сделать сложную часть.",
|
|
113
|
+
"- Trigger `manual` по умолчанию. `hourly`/`daily`/`weekly` пока работают только через ручной запуск, scheduler в работе.",
|
|
114
|
+
"- После эмита маркера — короткое сообщение пользователю: что собрал, как запустить, где редактировать.",
|
|
115
|
+
].join("\n");
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Tells the orchestrator about the widget system: how to materialize a
|
|
119
|
+
* structured result on the project dashboard via `<<reflex:widget-create>>`
|
|
120
|
+
* (or `widget-update`) markers, what kinds Reflex understands, and the
|
|
121
|
+
* data-shape per kind. Kept inline here so the protocol stays in sync
|
|
122
|
+
* with the manager's parser regardless of template edits.
|
|
123
|
+
*/
|
|
124
|
+
function widgetInstructions() {
|
|
125
|
+
return [
|
|
126
|
+
"## Widgets: putting results on the project dashboard",
|
|
127
|
+
"",
|
|
128
|
+
"When the user wants you to produce something durable — a news digest, a checklist, a KPI snapshot, a curated link list — DON'T just answer in chat and forget. Materialize it as a **widget** on the project dashboard so the user sees it on every visit.",
|
|
129
|
+
"",
|
|
130
|
+
"Emit a marker on its own block:",
|
|
131
|
+
"",
|
|
132
|
+
"```",
|
|
133
|
+
`<<reflex:widget-create>>{`,
|
|
134
|
+
` "id": "<kebab-case-id>",`,
|
|
135
|
+
` "title": "<short user-visible title>",`,
|
|
136
|
+
` "description": "<one-line subtitle, optional>",`,
|
|
137
|
+
` "kind": "<one of: markdown, news-list, link-list, kpi, checklist, quote, kb-pinned, progress, image, stat-table, map>",`,
|
|
138
|
+
` "data": { ...kind-specific payload... },`,
|
|
139
|
+
` "size": { "mode": "md" }`,
|
|
140
|
+
`}<</reflex:widget-create>>`,
|
|
141
|
+
"```",
|
|
142
|
+
"",
|
|
143
|
+
"Use `widget-update` (same shape, same id) when refreshing an existing widget — e.g. user asked for a weekly news digest, you regenerate the items.",
|
|
144
|
+
"",
|
|
145
|
+
"### Auto-refresh and memory",
|
|
146
|
+
"",
|
|
147
|
+
"- `refresh`: `\"manual\"` (default) | `\"hourly\"` | `\"daily\"` | `\"weekly\"`. When set to anything other than manual, Reflex's scheduler will periodically re-invoke you on the source topic with a synthetic `[Reflex] Refresh widget <id>` user-message — you respond by emitting a fresh `<<reflex:widget-update>>` with the same id.",
|
|
148
|
+
"- `memory`: agent-managed inline state (markdown, <2KB). Use for **short** state that should persist across refreshes — e.g. \"already-shown URLs to dedupe\", \"last 4 KPI snapshots\", \"running tally\". On every refresh prompt you'll see the current `memory` value; emit an updated one inside the widget-update payload.",
|
|
149
|
+
"- `memoryFile`: rel-path (inside `.reflex/`) for **long** memory — a journal-style markdown file you append to via the regular `<<reflex:kb>>` directive. Use for OKR-history-style widgets where the journal itself is worth keeping in the KB tree. Pick a path like `widgets/<widget-id>.memory.md`.",
|
|
150
|
+
"- Pick ONE of `memory` or `memoryFile` per widget. Inline for compact structured deduping; file for narrative history.",
|
|
151
|
+
"- When refreshing, prefer **incremental** updates: dedupe against memory, add new items at the top, drop very old ones — the user wants signal, not a snapshot reset.",
|
|
152
|
+
"",
|
|
153
|
+
"### Kinds and `data` shapes",
|
|
154
|
+
"",
|
|
155
|
+
"- `markdown` — `{body: string}`. Long-form notes, summaries, instructions.",
|
|
156
|
+
"- `news-list` — `{items: [{title, url?, summary?, source?, date?}]}`. Headlines + 1-2 line summaries.",
|
|
157
|
+
"- `link-list` — `{items: [{title, url, hint?}]}`. Curated resources, bookmarks.",
|
|
158
|
+
"- `kpi` — `{items: [{label, value, hint?, delta?: \"up\"|\"down\"|\"flat\"}]}`. Big-number tiles.",
|
|
159
|
+
"- `checklist` — `{items: [{text, done?: boolean}]}`. Action items / todo.",
|
|
160
|
+
"- `quote` — `{text, attribution?}`. One memorable quote.",
|
|
161
|
+
"- `kb-pinned` — `{items: [{rel, title?, snippet?}]}`. Pinned KB rel-paths.",
|
|
162
|
+
"- `progress` — `{items: [{label, current, target, unit?}]}`. Goal-tracking bars.",
|
|
163
|
+
"- `image` — `{url, alt?, caption?}`. Single image card.",
|
|
164
|
+
"- `stat-table` — `{columns?: [string], rows: [[string, ...]]}`. Compact comparison table.",
|
|
165
|
+
"- `map` — `{points: [{lat, lng, title, description?}], center?, zoom?, route?: {stops: number[], color?, mode?}}`. Карта с точками + опциональный маршрут (полилиния + multi-waypoint deep-links: google/yandex/2gis/apple/osm/waze/organic). `route.stops` — массив индексов в `points` в порядке прохождения (минимум 2). На каждой точке popup с фирменными кнопками сервисов. По умолчанию карта авто-фитит по точкам. ВАЖНО: `lat`/`lng` — числа в десятичных градусах (lat=55.7558, lng=37.6173 — Москва). НЕ строки. Если у тебя адрес — найди координаты через WebSearch/WebFetch (geocoding), не выдумывай. Пользователь может прямо в виджете искать места (Nominatim) и собирать маршрут — кнопка «Маршрут» переводит в режим выбора точек по клику.",
|
|
166
|
+
"",
|
|
167
|
+
"### Interactivity",
|
|
168
|
+
"",
|
|
169
|
+
"Виджеты на дашборде интерактивны — пользователь может прямо в UI:",
|
|
170
|
+
" - **checklist**: тыкать галочки (toggle done), удалять пункты, добавлять новые.",
|
|
171
|
+
" - **link-list**: удалять ссылки.",
|
|
172
|
+
" - **news-list**: помечать новость прочитанной (`read:true`), убирать карточку.",
|
|
173
|
+
" - **kb-pinned**: откреплять файлы.",
|
|
174
|
+
" - **progress**: ± кнопки на `current`.",
|
|
175
|
+
"",
|
|
176
|
+
"Эти изменения пишутся прямо на диск, минуя тебя. На следующем `widget-update` ты увидишь актуальное состояние. Стратегия:",
|
|
177
|
+
" - Если пользователь удалил пункт чек-листа — не добавляй его обратно (это сигнал).",
|
|
178
|
+
" - Если пользователь отметил новость прочитанной — внеси её URL в `memory` для дедупа.",
|
|
179
|
+
" - Если пользователь обнулил progress — это, видимо, новый цикл; уважай.",
|
|
180
|
+
"",
|
|
181
|
+
"### Rules",
|
|
182
|
+
"",
|
|
183
|
+
"- Pick the SIMPLEST kind that fits — don't squeeze a news digest into `markdown` if `news-list` exists.",
|
|
184
|
+
"- `id` is stable: same id across `widget-create` and `widget-update`. Pick a slug from the topic content (e.g. `tech-news-weekly`, `okrs-q2`).",
|
|
185
|
+
"- `size.mode`: `\"sm\"` (3 в ряд, иконки/KPI) | `\"md\"` (по умолчанию, 2 в ряд) | `\"wide\"` (на всю строку, для длинных таблиц/markdown). Подбирай к контенту, но пользователь может переопределить через UI — твой выбор всего лишь hint.",
|
|
186
|
+
"- After emitting the marker, briefly tell the user in plain text WHAT виджет ты собрал. ВАЖНО: новый виджет НЕ появляется на дашборде автоматически — он лежит в библиотеке как черновик. Пользователь увидит его прямо в чате (превью) и сможет закрепить кнопкой «Закрепить на дашборде» или через библиотеку. Не утверждай, что виджет уже на дашборде.",
|
|
187
|
+
"- Reflex automatically shows a live preview of the widget inside this chat turn — no need to re-render in markdown.",
|
|
188
|
+
].join("\n");
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Standalone block describing the sub-agent roles and the
|
|
192
|
+
* `<<reflex:dispatch>>` marker. Kept here (not in the user-editable
|
|
193
|
+
* template) so the wire protocol stays in sync with the parser in
|
|
194
|
+
* `lib/server/agents/manager.ts`.
|
|
195
|
+
*/
|
|
196
|
+
function dispatchInstructions() {
|
|
197
|
+
return [
|
|
198
|
+
"## Routing: you are an orchestrator, not the worker",
|
|
199
|
+
"",
|
|
200
|
+
"For anything non-trivial (deep KB reading, multi-file research, code writes, utility creation, summarization of large texts) — DELEGATE to a specialist sub-agent instead of doing it yourself. Sub-agents run with a focused system prompt and a constrained toolset.",
|
|
201
|
+
"",
|
|
202
|
+
"Available roles:",
|
|
203
|
+
" - **researcher** — read-only KB / web research. Use for \"найди / собери / процитируй\".",
|
|
204
|
+
" - **coder** — writes/edits files (Write/Edit + read tools). Use for \"сделай / поправь / создай файл\".",
|
|
205
|
+
" - **summarizer** — no tools; compresses long text from the brief. Use for \"сожми / выдели главное\" из большого куска.",
|
|
206
|
+
" - **kb-writer** — designs a structured KB entry (returns JSON for <<reflex:kb>>). Use when something is worth saving but the shape is non-trivial.",
|
|
207
|
+
" - **utility-builder** — designs a Reflex utility (manifest + ui.tsx). Use when the user asks to build a new utility.",
|
|
208
|
+
"",
|
|
209
|
+
"To dispatch, emit one or more markers in a single turn and STOP:",
|
|
210
|
+
"",
|
|
211
|
+
" <<reflex:dispatch>>{\"id\":\"r1\",\"role\":\"researcher\",\"brief\":\"Прочитай INDEX.md и собери список тем.\"}<</reflex:dispatch>>",
|
|
212
|
+
"",
|
|
213
|
+
"Rules:",
|
|
214
|
+
" - `brief` must be self-contained — sub-agents do NOT see the chat transcript. Include all rel-paths, expected output shape, constraints.",
|
|
215
|
+
" - Multiple dispatches in one turn run **concurrently**. Sequentially-dependent tasks → do them across multiple turns.",
|
|
216
|
+
" - After dispatches Reflex re-invokes you with each sub-agent's output quoted. Compose the final user-facing reply from those results.",
|
|
217
|
+
" - Do simple things yourself (one short answer, citing one file). Don't dispatch trivia.",
|
|
218
|
+
" - Don't re-dispatch the same brief if a sub-agent returned empty — either solve it yourself or ask the user.",
|
|
219
|
+
"",
|
|
220
|
+
"Optional harness routing:",
|
|
221
|
+
" - Add `\"harness\":\"codex\"` to the dispatch payload to run THAT sub-agent on Codex instead of inheriting yours. Useful when:",
|
|
222
|
+
" – task is heavy code synthesis / refactor / type-fixing — Codex shines there.",
|
|
223
|
+
" – task is short text classification / extraction — `\"harness\":\"ollama\"` is cheap and fast.",
|
|
224
|
+
" - Without `harness`, the sub-agent inherits the orchestrator's runtime — usually fine. Override only when you have a concrete reason.",
|
|
225
|
+
" - Example: `<<reflex:dispatch>>{\"role\":\"coder\",\"harness\":\"codex\",\"brief\":\"Перепиши X на TypeScript strict\"}<</reflex:dispatch>>`",
|
|
226
|
+
].join("\n");
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../lib/reflex/agents/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { loadConfig } from "../config.js";
|
|
4
|
+
import { getBackend } from "../agents/index.js";
|
|
5
|
+
import { REFLEX_DIR, mirrorInReflex, reflexRoot } from "../paths.js";
|
|
6
|
+
export async function runChat(targetInput) {
|
|
7
|
+
const target = path.resolve(targetInput);
|
|
8
|
+
await assertDir(target);
|
|
9
|
+
const root = await findReflexRoot(target);
|
|
10
|
+
if (!root) {
|
|
11
|
+
throw new Error(`No ${REFLEX_DIR}/ found at or above ${target}. Run \`reflex init <dir>\` first.`);
|
|
12
|
+
}
|
|
13
|
+
const cfg = await loadConfig(root);
|
|
14
|
+
const relScope = path.relative(root, target);
|
|
15
|
+
const reflexScope = relScope
|
|
16
|
+
? mirrorInReflex(root, relScope)
|
|
17
|
+
: reflexRoot(root);
|
|
18
|
+
const backend = getBackend(cfg);
|
|
19
|
+
await backend.chat({ root, scope: target, reflexScope });
|
|
20
|
+
}
|
|
21
|
+
async function assertDir(p) {
|
|
22
|
+
const stat = await fs.stat(p).catch(() => null);
|
|
23
|
+
if (!stat || !stat.isDirectory()) {
|
|
24
|
+
throw new Error(`Not a directory: ${p}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Walk upward from `start` looking for a directory containing `.reflex/`. */
|
|
28
|
+
async function findReflexRoot(start) {
|
|
29
|
+
let cur = start;
|
|
30
|
+
while (true) {
|
|
31
|
+
const candidate = path.join(cur, REFLEX_DIR);
|
|
32
|
+
const stat = await fs.stat(candidate).catch(() => null);
|
|
33
|
+
if (stat && stat.isDirectory())
|
|
34
|
+
return cur;
|
|
35
|
+
const parent = path.dirname(cur);
|
|
36
|
+
if (parent === cur)
|
|
37
|
+
return null;
|
|
38
|
+
cur = parent;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../../lib/reflex/commands/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,WAAmB;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,MAAM,UAAU,uBAAuB,MAAM,oCAAoC,CAClF,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,QAAQ;QAC1B,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC;QAChC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAErB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,CAAS;IAChC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,KAAK,UAAU,cAAc,CAAC,KAAa;IACzC,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,GAAG,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { loadConfig, writeConfig } from "../config.js";
|
|
4
|
+
import { getBackend } from "../agents/index.js";
|
|
5
|
+
import { ensureReflexIgnoreTemplate, snapshotScope } from "../kb.js";
|
|
6
|
+
import { reflexRoot } from "../paths.js";
|
|
7
|
+
export async function runInit(dirInput, options = {}) {
|
|
8
|
+
const root = path.resolve(dirInput);
|
|
9
|
+
await assertDir(root);
|
|
10
|
+
await fs.mkdir(reflexRoot(root), { recursive: true });
|
|
11
|
+
const cfg = await loadConfig(root);
|
|
12
|
+
await writeConfig(root, cfg); // persist normalized config
|
|
13
|
+
await ensureReflexIgnoreTemplate(root);
|
|
14
|
+
if (options.scaffoldOnly) {
|
|
15
|
+
process.stdout.write(`Reflex scaffolded at ${reflexRoot(root)} (scaffold-only).\n`);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const effectiveCfg = options.harness
|
|
19
|
+
? { ...cfg, agentBackend: options.harness }
|
|
20
|
+
: cfg;
|
|
21
|
+
const snapshot = await snapshotScope({ root, scope: root });
|
|
22
|
+
const scopeWithOverrides = {
|
|
23
|
+
...snapshot,
|
|
24
|
+
...(options.model ? { model: options.model } : {}),
|
|
25
|
+
...(options.language ? { language: options.language } : {}),
|
|
26
|
+
};
|
|
27
|
+
process.stdout.write(`Running ${effectiveCfg.agentBackend}${options.model ? ` (${options.model})` : ""}${options.language ? ` [lang=${options.language}]` : ""} over ${root} (${snapshot.files.length} files visible)…\n`);
|
|
28
|
+
const backend = getBackend(effectiveCfg);
|
|
29
|
+
await backend.analyzeScope(scopeWithOverrides);
|
|
30
|
+
process.stdout.write(`Done. KB written under ${reflexRoot(root)}\n`);
|
|
31
|
+
}
|
|
32
|
+
async function assertDir(p) {
|
|
33
|
+
const stat = await fs.stat(p).catch(() => null);
|
|
34
|
+
if (!stat || !stat.isDirectory()) {
|
|
35
|
+
throw new Error(`Not a directory: ${p}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../lib/reflex/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAe,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAazC,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,QAAgB,EAChB,UAAuB,EAAE;IAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IAEtB,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,4BAA4B;IAC1D,MAAM,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAEvC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wBAAwB,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAC9D,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAW,OAAO,CAAC,OAAO;QAC1C,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,OAAO,EAAE;QAC3C,CAAC,CAAC,GAAG,CAAC;IACR,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,kBAAkB,GAAG;QACzB,GAAG,QAAQ;QACX,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,WAAW,YAAY,CAAC,YAAY,GAClC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAC1C,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,KAAK,QAAQ,CAAC,KAAK,CAAC,MAAM,oBAAoB,CACpH,CAAC;IAEF,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACzC,MAAM,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;IAE/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,CAAS;IAChC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
6
|
+
export async function runStart(opts) {
|
|
7
|
+
const pkgRoot = await findPackageRoot();
|
|
8
|
+
await assertBuilt(pkgRoot);
|
|
9
|
+
// Lazy-import to avoid pulling Next into CLI-only commands.
|
|
10
|
+
const nextMod = (await import("next"));
|
|
11
|
+
const app = nextMod.default({ dev: false, dir: pkgRoot });
|
|
12
|
+
await app.prepare();
|
|
13
|
+
const handler = app.getRequestHandler();
|
|
14
|
+
await new Promise((resolve, reject) => {
|
|
15
|
+
const server = createServer((req, res) => {
|
|
16
|
+
void handler(req, res);
|
|
17
|
+
});
|
|
18
|
+
server.once("error", reject);
|
|
19
|
+
server.listen(opts.port, opts.host, () => {
|
|
20
|
+
const url = `http://${displayHost(opts.host)}:${opts.port}`;
|
|
21
|
+
process.stdout.write(`Reflex running at ${url}\n`);
|
|
22
|
+
if (opts.open)
|
|
23
|
+
openBrowser(url);
|
|
24
|
+
});
|
|
25
|
+
const shutdown = (signal) => {
|
|
26
|
+
process.stdout.write(`\n[reflex] ${signal} received, stopping…\n`);
|
|
27
|
+
server.close(() => resolve());
|
|
28
|
+
setTimeout(() => process.exit(0), 2000).unref();
|
|
29
|
+
};
|
|
30
|
+
process.on("SIGINT", shutdown);
|
|
31
|
+
process.on("SIGTERM", shutdown);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async function findPackageRoot() {
|
|
35
|
+
// dist/lib/reflex/commands/start.js → repo root is 4 levels up.
|
|
36
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
37
|
+
return path.resolve(here, "..", "..", "..", "..");
|
|
38
|
+
}
|
|
39
|
+
async function assertBuilt(pkgRoot) {
|
|
40
|
+
const required = path.join(pkgRoot, ".next", "BUILD_ID");
|
|
41
|
+
try {
|
|
42
|
+
await fs.access(required);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new Error(`Reflex web bundle not found at ${pkgRoot}/.next. If running from source, run \`pnpm run build\` first.`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function displayHost(host) {
|
|
49
|
+
if (host === "0.0.0.0" || host === "::")
|
|
50
|
+
return "localhost";
|
|
51
|
+
return host;
|
|
52
|
+
}
|
|
53
|
+
function openBrowser(url) {
|
|
54
|
+
const platform = process.platform;
|
|
55
|
+
const cmd = platform === "darwin" ? "open" : platform === "win32" ? "cmd" : "xdg-open";
|
|
56
|
+
const args = platform === "win32" ? ["/c", "start", "", url] : [url];
|
|
57
|
+
try {
|
|
58
|
+
spawn(cmd, args, { stdio: "ignore", detached: true }).unref();
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Browser launch is best-effort.
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../lib/reflex/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import chokidar from "chokidar";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { loadConfig } from "../config.js";
|
|
5
|
+
import { buildFlatIgnore } from "../ignore.js";
|
|
6
|
+
import { getBackend } from "../agents/index.js";
|
|
7
|
+
import { snapshotScope } from "../kb.js";
|
|
8
|
+
import { MIN_DEBOUNCE_MS, REFLEX_DIR, reflexRoot } from "../paths.js";
|
|
9
|
+
/**
|
|
10
|
+
* Start a background watcher on `dirInput`. The agent is re-run on the root
|
|
11
|
+
* scope whenever there are pending changes AND it has been at least
|
|
12
|
+
* `watchDebounceMs` since the last run. Floor: 30 min (HARD_DEBOUNCE_FLOOR_MS).
|
|
13
|
+
*
|
|
14
|
+
* Returns a handle so callers (tests, programmatic use) can stop the watcher;
|
|
15
|
+
* the CLI just lets it run until SIGINT.
|
|
16
|
+
*/
|
|
17
|
+
export async function runWatch(dirInput) {
|
|
18
|
+
const root = path.resolve(dirInput);
|
|
19
|
+
await assertDir(root);
|
|
20
|
+
const cfg = await loadConfig(root);
|
|
21
|
+
const debounceMs = Math.max(cfg.watchDebounceMs, MIN_DEBOUNCE_MS);
|
|
22
|
+
const flatIgnore = await buildFlatIgnore(root);
|
|
23
|
+
const reflexAbs = reflexRoot(root);
|
|
24
|
+
const watcher = chokidar.watch(root, {
|
|
25
|
+
ignoreInitial: true,
|
|
26
|
+
persistent: true,
|
|
27
|
+
// Coalesce rapid writes to the same file (atomic-save patterns, double
|
|
28
|
+
// FSEvents on macOS) into a single change event.
|
|
29
|
+
awaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 },
|
|
30
|
+
ignored: (p) => {
|
|
31
|
+
if (p === root)
|
|
32
|
+
return false;
|
|
33
|
+
// Always exclude .reflex/ to avoid feedback loops.
|
|
34
|
+
if (p === reflexAbs || p.startsWith(reflexAbs + path.sep))
|
|
35
|
+
return true;
|
|
36
|
+
return flatIgnore(p);
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
// Coalesce rapid bursts (writes across different files arriving back-to-back)
|
|
40
|
+
// into a single trigger. The "burst window" is the quiet period after the
|
|
41
|
+
// last event below which we don't consider the burst settled.
|
|
42
|
+
const BURST_MS = 300;
|
|
43
|
+
let lastRunAt = 0;
|
|
44
|
+
let lastEventAt = 0;
|
|
45
|
+
let pendingSince = null;
|
|
46
|
+
let scheduled = null;
|
|
47
|
+
let running = false;
|
|
48
|
+
let stopped = false;
|
|
49
|
+
const schedule = () => {
|
|
50
|
+
if (stopped || scheduled)
|
|
51
|
+
return;
|
|
52
|
+
const now = Date.now();
|
|
53
|
+
const debounceWait = Math.max(0, lastRunAt + debounceMs - now);
|
|
54
|
+
const burstWait = Math.max(0, lastEventAt + BURST_MS - now);
|
|
55
|
+
const delay = Math.max(debounceWait, burstWait);
|
|
56
|
+
scheduled = setTimeout(() => {
|
|
57
|
+
scheduled = null;
|
|
58
|
+
void tick();
|
|
59
|
+
}, delay);
|
|
60
|
+
};
|
|
61
|
+
const tick = async () => {
|
|
62
|
+
if (stopped || running)
|
|
63
|
+
return;
|
|
64
|
+
if (pendingSince === null)
|
|
65
|
+
return;
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
if (now - lastRunAt < debounceMs ||
|
|
68
|
+
now - lastEventAt < BURST_MS) {
|
|
69
|
+
// Either debounce or burst window not yet satisfied — re-arm.
|
|
70
|
+
schedule();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
running = true;
|
|
74
|
+
const triggeredAt = pendingSince;
|
|
75
|
+
pendingSince = null;
|
|
76
|
+
try {
|
|
77
|
+
const snapshot = await snapshotScope({ root, scope: root });
|
|
78
|
+
process.stdout.write(`[reflex] change detected at ${new Date(triggeredAt).toISOString()} — refreshing KB (${snapshot.files.length} files)…\n`);
|
|
79
|
+
const backend = getBackend(cfg);
|
|
80
|
+
await backend.analyzeScope(snapshot);
|
|
81
|
+
lastRunAt = Date.now();
|
|
82
|
+
process.stdout.write(`[reflex] KB refresh complete.\n`);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
process.stderr.write(`[reflex] agent run failed: ${describeErr(err)}\n`);
|
|
86
|
+
// Restore pending so we retry after the next debounce window.
|
|
87
|
+
pendingSince ??= triggeredAt;
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
running = false;
|
|
91
|
+
if (pendingSince !== null)
|
|
92
|
+
schedule();
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const onChange = (changedPath) => {
|
|
96
|
+
if (stopped)
|
|
97
|
+
return;
|
|
98
|
+
if (changedPath.startsWith(reflexAbs))
|
|
99
|
+
return;
|
|
100
|
+
lastEventAt = Date.now();
|
|
101
|
+
pendingSince ??= lastEventAt;
|
|
102
|
+
schedule();
|
|
103
|
+
};
|
|
104
|
+
watcher.on("add", onChange);
|
|
105
|
+
watcher.on("change", onChange);
|
|
106
|
+
watcher.on("unlink", onChange);
|
|
107
|
+
watcher.on("addDir", onChange);
|
|
108
|
+
watcher.on("unlinkDir", onChange);
|
|
109
|
+
watcher.on("error", (err) => process.stderr.write(`[reflex] watcher error: ${describeErr(err)}\n`));
|
|
110
|
+
process.stdout.write(`[reflex] watching ${root} (debounce: ${formatDuration(debounceMs)}, backend: ${cfg.agentBackend})\n`);
|
|
111
|
+
process.stdout.write(`[reflex] .reflex/ ignored to prevent feedback loops; using flat ${REFLEX_DIR}/.reflexignore view.\n`);
|
|
112
|
+
return {
|
|
113
|
+
async stop() {
|
|
114
|
+
stopped = true;
|
|
115
|
+
if (scheduled)
|
|
116
|
+
clearTimeout(scheduled);
|
|
117
|
+
await watcher.close();
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async function assertDir(p) {
|
|
122
|
+
const stat = await fs.stat(p).catch(() => null);
|
|
123
|
+
if (!stat || !stat.isDirectory()) {
|
|
124
|
+
throw new Error(`Not a directory: ${p}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function describeErr(err) {
|
|
128
|
+
return err instanceof Error ? err.message : String(err);
|
|
129
|
+
}
|
|
130
|
+
function formatDuration(ms) {
|
|
131
|
+
if (ms >= 60000)
|
|
132
|
+
return `${Math.round(ms / 60000)} min`;
|
|
133
|
+
if (ms >= 1000)
|
|
134
|
+
return `${Math.round(ms / 1000)} s`;
|
|
135
|
+
return `${ms} ms`;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../../lib/reflex/commands/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { configPath, DEFAULT_DEBOUNCE_MS, MIN_DEBOUNCE_MS, reflexRoot, } from "./paths.js";
|
|
5
|
+
export const ConfigSchema = z.object({
|
|
6
|
+
watchDebounceMs: z
|
|
7
|
+
.number()
|
|
8
|
+
.int()
|
|
9
|
+
.min(MIN_DEBOUNCE_MS, {
|
|
10
|
+
message: `watchDebounceMs must be ≥ ${MIN_DEBOUNCE_MS} ms`,
|
|
11
|
+
})
|
|
12
|
+
.default(DEFAULT_DEBOUNCE_MS),
|
|
13
|
+
agentBackend: z.enum(["codex", "claude-code"]).default("claude-code"),
|
|
14
|
+
ignoreFile: z.string().default(".reflexignore"),
|
|
15
|
+
});
|
|
16
|
+
export const DEFAULT_CONFIG = ConfigSchema.parse({});
|
|
17
|
+
export async function loadConfig(root) {
|
|
18
|
+
const p = configPath(root);
|
|
19
|
+
try {
|
|
20
|
+
const raw = await fs.readFile(p, "utf8");
|
|
21
|
+
return ConfigSchema.parse(JSON.parse(raw));
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
if (isNotFound(err))
|
|
25
|
+
return DEFAULT_CONFIG;
|
|
26
|
+
throw err;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function writeConfig(root, cfg) {
|
|
30
|
+
await fs.mkdir(reflexRoot(root), { recursive: true });
|
|
31
|
+
await fs.writeFile(configPath(root), JSON.stringify(cfg, null, 2) + "\n", "utf8");
|
|
32
|
+
}
|
|
33
|
+
function isNotFound(err) {
|
|
34
|
+
return (typeof err === "object" &&
|
|
35
|
+
err !== null &&
|
|
36
|
+
"code" in err &&
|
|
37
|
+
err.code === "ENOENT");
|
|
38
|
+
}
|
|
39
|
+
export function describeConfigPath(root) {
|
|
40
|
+
return path.relative(process.cwd(), configPath(root)) || configPath(root);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../lib/reflex/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,eAAe,EAAE;QACpB,OAAO,EAAE,6BAA6B,eAAe,KAAK;KAC3D,CAAC;SACD,OAAO,CAAC,mBAAmB,CAAC;IAC/B,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IACrE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC;CAChD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAW,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,cAAc,CAAC;QAC3C,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,GAAW;IACzD,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,EAAE,CAAC,SAAS,CAChB,UAAU,CAAC,IAAI,CAAC,EAChB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACnC,MAAM,CACP,CAAC;AACJ,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;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;AAC5E,CAAC"}
|