vibebusiness 1.2.11
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.
Potentially problematic release.
This version of vibebusiness might be problematic. Click here for more details.
- package/.next/standalone/.env +1 -0
- package/.next/standalone/.next/BUILD_ID +1 -0
- package/.next/standalone/.next/app-build-manifest.json +86 -0
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
- package/.next/standalone/.next/build-manifest.json +32 -0
- package/.next/standalone/.next/package.json +1 -0
- package/.next/standalone/.next/prerender-manifest.json +1 -0
- package/.next/standalone/.next/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/required-server-files.json +1 -0
- package/.next/standalone/.next/routes-manifest.json +1 -0
- package/.next/standalone/.next/server/app/_not-found/page.js +1 -0
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/_not-found.html +1 -0
- package/.next/standalone/.next/server/app/_not-found.meta +6 -0
- package/.next/standalone/.next/server/app/_not-found.rsc +9 -0
- package/.next/standalone/.next/server/app/api/analyze/route.js +1 -0
- package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/config/detect-repos/route.js +1 -0
- package/.next/standalone/.next/server/app/api/config/detect-repos/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/config/route.js +1 -0
- package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js +1 -0
- package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/goals/[id]/route.js +1 -0
- package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/goals/route.js +1 -0
- package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/health/route.js +1 -0
- package/.next/standalone/.next/server/app/api/health/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js +1 -0
- package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/hypotheses/route.js +1 -0
- package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js +1 -0
- package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js +1 -0
- package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/ideas/[id]/route.js +1 -0
- package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js +1 -0
- package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/ideas/route.js +1 -0
- package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/implementations/route.js +1 -0
- package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/kpis/refresh/route.js +1 -0
- package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/goals/[id]/page.js +1 -0
- package/.next/standalone/.next/server/app/goals/[id]/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/goals/page.js +1 -0
- package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/hypotheses/[id]/page.js +1 -0
- package/.next/standalone/.next/server/app/hypotheses/[id]/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/hypotheses/page.js +1 -0
- package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/ideas/[id]/page.js +1 -0
- package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/page.js +1 -0
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/sessions/page.js +1 -0
- package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/settings/page.js +1 -0
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/settings.html +1 -0
- package/.next/standalone/.next/server/app/settings.meta +5 -0
- package/.next/standalone/.next/server/app/settings.rsc +7 -0
- package/.next/standalone/.next/server/app-paths-manifest.json +27 -0
- package/.next/standalone/.next/server/chunks/276.js +2 -0
- package/.next/standalone/.next/server/chunks/416.js +1 -0
- package/.next/standalone/.next/server/chunks/471.js +2 -0
- package/.next/standalone/.next/server/chunks/484.js +1 -0
- package/.next/standalone/.next/server/chunks/644.js +1 -0
- package/.next/standalone/.next/server/chunks/682.js +6 -0
- package/.next/standalone/.next/server/chunks/972.js +12 -0
- package/.next/standalone/.next/server/font-manifest.json +1 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -0
- package/.next/standalone/.next/server/middleware-manifest.json +6 -0
- package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/standalone/.next/server/next-font-manifest.js +1 -0
- package/.next/standalone/.next/server/next-font-manifest.json +1 -0
- package/.next/standalone/.next/server/pages/404.html +1 -0
- package/.next/standalone/.next/server/pages/500.html +1 -0
- package/.next/standalone/.next/server/pages/_app.js +1 -0
- package/.next/standalone/.next/server/pages/_app.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/_document.js +1 -0
- package/.next/standalone/.next/server/pages/_document.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/_error.js +1 -0
- package/.next/standalone/.next/server/pages/_error.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages-manifest.json +1 -0
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -0
- package/.next/standalone/.next/server/webpack-runtime.js +1 -0
- package/.next/standalone/data/.gitkeep +0 -0
- package/.next/standalone/data/business-context.json +252 -0
- package/.next/standalone/data/codebase-snapshot.json +82 -0
- package/.next/standalone/data/config.json +59 -0
- package/.next/standalone/data/goals.json +334 -0
- package/.next/standalone/data/hypotheses.json +160 -0
- package/.next/standalone/data/ideas.json +3780 -0
- package/.next/standalone/data/ideas.json.backup-20260215-185530 +3647 -0
- package/.next/standalone/data/implementations.json +735 -0
- package/.next/standalone/data/sessions.json +370 -0
- package/.next/standalone/node_modules/@next/env/dist/index.js +1 -0
- package/.next/standalone/node_modules/@next/env/package.json +36 -0
- package/.next/standalone/node_modules/@swc/helpers/_/_interop_require_default/package.json +4 -0
- package/.next/standalone/node_modules/@swc/helpers/_/_interop_require_wildcard/package.json +4 -0
- package/.next/standalone/node_modules/@swc/helpers/_/_tagged_template_literal_loose/package.json +4 -0
- package/.next/standalone/node_modules/@swc/helpers/cjs/_interop_require_default.cjs +6 -0
- package/.next/standalone/node_modules/@swc/helpers/cjs/_interop_require_wildcard.cjs +38 -0
- package/.next/standalone/node_modules/@swc/helpers/cjs/_tagged_template_literal_loose.cjs +10 -0
- package/.next/standalone/node_modules/@swc/helpers/package.json +452 -0
- package/.next/standalone/node_modules/busboy/lib/index.js +57 -0
- package/.next/standalone/node_modules/busboy/lib/types/multipart.js +653 -0
- package/.next/standalone/node_modules/busboy/lib/types/urlencoded.js +350 -0
- package/.next/standalone/node_modules/busboy/lib/utils.js +596 -0
- package/.next/standalone/node_modules/busboy/package.json +22 -0
- package/.next/standalone/node_modules/caniuse-lite/data/agents.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/browserVersions.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/browsers.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/aac.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/abortcontroller.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/ac3-ec3.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/accelerometer.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/addeventlistener.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/alternate-stylesheet.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/ambient-light.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/apng.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/array-find-index.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/array-find.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/array-flat.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/array-includes.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/arrow-functions.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/asmjs.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/async-clipboard.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/async-functions.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/atob-btoa.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/audio-api.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/audio.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/audiotracks.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/autofocus.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/auxclick.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/av1.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/avif.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/background-attachment.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/background-clip-text.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/background-img-opts.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/background-position-x-y.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/background-repeat-round-space.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/background-sync.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/battery-status.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/beacon.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/beforeafterprint.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/bigint.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/blobbuilder.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/bloburls.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/border-image.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/border-radius.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/broadcastchannel.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/brotli.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/calc.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/canvas-blending.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/canvas-text.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/canvas.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/ch-unit.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/chacha20-poly1305.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/channel-messaging.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/childnode-remove.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/classlist.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/client-hints-dpr-width-viewport.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/clipboard.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/colr-v1.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/colr.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/comparedocumentposition.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/console-basic.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/console-time.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/const.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/constraint-validation.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/contenteditable.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/contentsecuritypolicy.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/contentsecuritypolicy2.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/cookie-store-api.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/cors.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/createimagebitmap.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/credential-management.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/cross-document-view-transitions.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/cryptography.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-all.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-anchor-positioning.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-animation.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-any-link.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-appearance.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-at-counter-style.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-autofill.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-backdrop-filter.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-background-offsets.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-backgroundblendmode.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-boxdecorationbreak.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-boxshadow.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-canvas.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-caret-color.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-cascade-layers.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-cascade-scope.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-case-insensitive.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-clip-path.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-color-adjust.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-color-function.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-conic-gradients.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-container-queries-style.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-container-queries.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-container-query-units.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-containment.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-content-visibility.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-counters.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-crisp-edges.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-cross-fade.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-default-pseudo.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-descendant-gtgt.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-deviceadaptation.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-dir-pseudo.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-display-contents.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-element-function.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-env-function.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-exclusions.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-featurequeries.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-file-selector-button.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-filter-function.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-filters.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-first-letter.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-first-line.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-fixed.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-focus-visible.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-focus-within.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-font-palette.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-font-rendering-controls.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-font-stretch.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-gencontent.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-gradients.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-grid-animation.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-grid-lanes.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-grid.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-hanging-punctuation.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-has.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-hyphens.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-if.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-image-orientation.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-image-set.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-in-out-of-range.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-indeterminate-pseudo.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-initial-letter.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-initial-value.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-lch-lab.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-letter-spacing.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-line-clamp.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-logical-props.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-marker-pseudo.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-masks.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-matches-pseudo.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-math-functions.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-media-interaction.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-media-range-syntax.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-media-resolution.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-media-scripting.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-mediaqueries.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-mixblendmode.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-module-scripts.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-motion-paths.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-namespaces.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-nesting.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-not-sel-list.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-nth-child-of.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-opacity.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-optional-pseudo.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-overflow-anchor.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-overflow-overlay.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-overflow.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-overscroll-behavior.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-page-break.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-paged-media.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-paint-api.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-placeholder-shown.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-placeholder.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-print-color-adjust.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-read-only-write.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-rebeccapurple.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-reflections.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-regions.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-relative-colors.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-repeating-gradients.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-resize.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-revert-value.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-rrggbbaa.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-scroll-behavior.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-scrollbar.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-sel2.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-sel3.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-selection.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-shapes.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-snappoints.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-sticky.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-subgrid.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-supports-api.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-table.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-text-align-last.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-text-box-trim.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-text-indent.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-text-justify.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-text-orientation.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-text-spacing.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-text-wrap-balance.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-textshadow.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-touch-action.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-transitions.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-unicode-bidi.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-unset-value.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-variables.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-when-else.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-widows-orphans.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-width-stretch.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-writing-mode.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css-zoom.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css3-attr.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css3-boxsizing.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css3-colors.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css3-cursors-grab.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css3-cursors-newer.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css3-cursors.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/css3-tabsize.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/currentcolor.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/custom-elements.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/custom-elementsv1.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/customevent.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/datalist.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/dataset.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/datauri.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/date-tolocaledatestring.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/declarative-shadow-dom.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/decorators.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/details.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/deviceorientation.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/devicepixelratio.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/dialog.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/dispatchevent.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/dnssec.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/do-not-track.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/document-currentscript.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/document-evaluate-xpath.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/document-execcommand.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/document-policy.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/document-scrollingelement.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/documenthead.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/dom-manip-convenience.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/dom-range.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/domcontentloaded.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/dommatrix.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/download.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/dragndrop.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/element-closest.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/element-from-point.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/element-scroll-methods.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/eme.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/eot.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/es5.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/es6-class.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/es6-generators.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/es6-module-dynamic-import.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/es6-module.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/es6-number.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/es6-string-includes.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/es6.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/eventsource.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/extended-system-fonts.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/feature-policy.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/fetch.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/fieldset-disabled.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/fileapi.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/filereader.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/filereadersync.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/filesystem.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/flac.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/flexbox-gap.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/flexbox.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/flow-root.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/focusin-focusout-events.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/font-family-system-ui.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/font-feature.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/font-kerning.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/font-loading.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/font-size-adjust.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/font-smooth.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/font-unicode-range.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/font-variant-alternates.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/font-variant-numeric.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/fontface.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/form-attribute.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/form-submit-attributes.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/form-validation.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/forms.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/fullscreen.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/gamepad.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/geolocation.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/getboundingclientrect.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/getcomputedstyle.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/getelementsbyclassname.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/getrandomvalues.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/gyroscope.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/hardwareconcurrency.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/hashchange.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/heif.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/hevc.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/hidden.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/high-resolution-time.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/history.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/html-media-capture.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/html5semantic.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/http-live-streaming.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/http2.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/http3.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/iframe-sandbox.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/iframe-seamless.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/iframe-srcdoc.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/imagecapture.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/ime.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/img-naturalwidth-naturalheight.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/import-maps.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/imports.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/indeterminate-checkbox.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/indexeddb.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/indexeddb2.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/inline-block.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/innertext.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-autocomplete-onoff.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-color.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-datetime.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-email-tel-url.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-event.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-file-accept.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-file-directory.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-file-multiple.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-inputmode.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-minlength.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-number.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-pattern.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-placeholder.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-range.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-search.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/input-selection.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/insert-adjacent.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/insertadjacenthtml.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/internationalization.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/intersectionobserver-v2.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/intersectionobserver.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/intl-pluralrules.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/intrinsic-width.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/jpeg2000.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/jpegxl.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/jpegxr.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/js-regexp-lookbehind.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/json.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/justify-content-space-evenly.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/kerning-pairs-ligatures.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/keyboardevent-charcode.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/keyboardevent-code.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/keyboardevent-getmodifierstate.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/keyboardevent-key.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/keyboardevent-location.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/keyboardevent-which.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/lazyload.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/let.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/link-icon-png.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/link-icon-svg.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/link-rel-dns-prefetch.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/link-rel-modulepreload.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/link-rel-preconnect.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/link-rel-prefetch.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/link-rel-preload.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/link-rel-prerender.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/loading-lazy-attr.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/localecompare.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/magnetometer.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/matchesselector.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/matchmedia.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mathml.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/maxlength.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mdn-css-backdrop-pseudo-element.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-isolate-override.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-isolate.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-plaintext.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mdn-text-decoration-color.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mdn-text-decoration-line.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mdn-text-decoration-shorthand.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mdn-text-decoration-style.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/media-fragments.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mediacapture-fromelement.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mediarecorder.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mediasource.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/menu.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/meta-theme-color.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/meter.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/midi.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/minmaxwh.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mp3.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mpeg-dash.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mpeg4.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/multibackgrounds.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/multicolumn.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mutation-events.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/mutationobserver.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/namevalue-storage.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/native-filesystem-api.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/nav-timing.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/netinfo.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/notifications.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/object-entries.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/object-fit.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/object-observe.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/object-values.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/objectrtc.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/offline-apps.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/offscreencanvas.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/ogg-vorbis.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/ogv.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/ol-reversed.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/once-event-listener.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/online-status.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/opus.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/orientation-sensor.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/outline.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/pad-start-end.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/page-transition-events.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/pagevisibility.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/passive-event-listener.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/passkeys.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/passwordrules.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/path2d.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/payment-request.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/pdf-viewer.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/permissions-api.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/permissions-policy.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/picture-in-picture.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/picture.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/ping.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/png-alpha.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/pointer-events.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/pointer.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/pointerlock.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/portals.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/prefers-color-scheme.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/prefers-reduced-motion.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/progress.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/promise-finally.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/promises.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/proximity.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/proxy.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/publickeypinning.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/push-api.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/queryselector.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/readonly-attr.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/referrer-policy.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/registerprotocolhandler.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/rel-noopener.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/rel-noreferrer.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/rellist.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/rem.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/requestanimationframe.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/requestidlecallback.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/resizeobserver.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/resource-timing.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/rest-parameters.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/rtcpeerconnection.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/ruby.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/run-in.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/same-site-cookie-attribute.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/screen-orientation.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/script-async.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/script-defer.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/scrollintoview.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/scrollintoviewifneeded.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/sdch.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/selection-api.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/selectlist.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/server-timing.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/serviceworkers.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/setimmediate.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/shadowdom.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/shadowdomv1.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/sharedarraybuffer.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/sharedworkers.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/sni.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/spdy.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/speech-recognition.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/speech-synthesis.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/spellcheck-attribute.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/sql-storage.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/srcset.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/stream.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/streams.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/stricttransportsecurity.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/style-scoped.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/subresource-bundling.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/subresource-integrity.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/svg-css.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/svg-filters.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/svg-fonts.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/svg-fragment.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/svg-html.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/svg-html5.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/svg-img.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/svg-smil.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/svg.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/sxg.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/tabindex-attr.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/template-literals.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/template.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/temporal.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/testfeat.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/text-decoration.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/text-emphasis.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/text-overflow.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/text-size-adjust.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/text-stroke.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/textcontent.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/textencoder.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/tls1-1.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/tls1-2.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/tls1-3.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/touch.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/transforms2d.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/transforms3d.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/trusted-types.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/ttf.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/typedarrays.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/u2f.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/unhandledrejection.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/upgradeinsecurerequests.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/url-scroll-to-text-fragment.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/url.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/urlsearchparams.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/use-strict.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/user-select-none.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/user-timing.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/variable-fonts.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/vector-effect.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/vibration.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/video.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/videotracks.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/view-transitions.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/viewport-unit-variants.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/viewport-units.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wai-aria.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wake-lock.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-bigint.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-bulk-memory.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-extended-const.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-gc.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-multi-memory.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-multi-value.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-mutable-globals.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-nontrapping-fptoint.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-reference-types.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-relaxed-simd.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-signext.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-simd.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-tail-calls.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm-threads.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wasm.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wav.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wbr-element.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/web-animation.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/web-app-manifest.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/web-bluetooth.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/web-serial.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/web-share.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webauthn.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webcodecs.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webgl.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webgl2.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webgpu.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webhid.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webkit-user-drag.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webm.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webnfc.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webp.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/websockets.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webtransport.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webusb.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webvr.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webvtt.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webworkers.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/webxr.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/will-change.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/woff.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/woff2.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/word-break.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/wordwrap.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/x-doc-messaging.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/x-frame-options.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/xhr2.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/xhtml.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/xhtmlsmil.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/xml-serializer.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features/zstd.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/data/features.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/dist/lib/statuses.js +9 -0
- package/.next/standalone/node_modules/caniuse-lite/dist/lib/supported.js +9 -0
- package/.next/standalone/node_modules/caniuse-lite/dist/unpacker/agents.js +47 -0
- package/.next/standalone/node_modules/caniuse-lite/dist/unpacker/browserVersions.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/dist/unpacker/browsers.js +1 -0
- package/.next/standalone/node_modules/caniuse-lite/dist/unpacker/feature.js +52 -0
- package/.next/standalone/node_modules/caniuse-lite/dist/unpacker/features.js +6 -0
- package/.next/standalone/node_modules/caniuse-lite/dist/unpacker/index.js +4 -0
- package/.next/standalone/node_modules/caniuse-lite/dist/unpacker/region.js +22 -0
- package/.next/standalone/node_modules/caniuse-lite/package.json +34 -0
- package/.next/standalone/node_modules/client-only/index.js +0 -0
- package/.next/standalone/node_modules/client-only/package.json +19 -0
- package/.next/standalone/node_modules/graceful-fs/clone.js +23 -0
- package/.next/standalone/node_modules/graceful-fs/graceful-fs.js +448 -0
- package/.next/standalone/node_modules/graceful-fs/legacy-streams.js +118 -0
- package/.next/standalone/node_modules/graceful-fs/package.json +53 -0
- package/.next/standalone/node_modules/graceful-fs/polyfills.js +355 -0
- package/.next/standalone/node_modules/nanoid/non-secure/index.cjs +34 -0
- package/.next/standalone/node_modules/nanoid/non-secure/package.json +6 -0
- package/.next/standalone/node_modules/nanoid/package.json +89 -0
- package/.next/standalone/node_modules/next/dist/build/analysis/extract-const-value.js +200 -0
- package/.next/standalone/node_modules/next/dist/build/analysis/get-page-static-info.js +496 -0
- package/.next/standalone/node_modules/next/dist/build/analysis/parse-module.js +27 -0
- package/.next/standalone/node_modules/next/dist/build/babel/loader/get-config.js +335 -0
- package/.next/standalone/node_modules/next/dist/build/babel/loader/index.js +38 -0
- package/.next/standalone/node_modules/next/dist/build/babel/loader/transform.js +97 -0
- package/.next/standalone/node_modules/next/dist/build/babel/loader/util.js +20 -0
- package/.next/standalone/node_modules/next/dist/build/babel/plugins/commonjs.js +42 -0
- package/.next/standalone/node_modules/next/dist/build/babel/plugins/next-font-unsupported.js +32 -0
- package/.next/standalone/node_modules/next/dist/build/babel/plugins/next-page-config.js +116 -0
- package/.next/standalone/node_modules/next/dist/build/babel/plugins/next-page-disallow-re-export-all-exports.js +25 -0
- package/.next/standalone/node_modules/next/dist/build/babel/plugins/next-ssg-transform.js +328 -0
- package/.next/standalone/node_modules/next/dist/build/build-context.js +58 -0
- package/.next/standalone/node_modules/next/dist/build/create-compiler-aliases.js +281 -0
- package/.next/standalone/node_modules/next/dist/build/deployment-id.js +18 -0
- package/.next/standalone/node_modules/next/dist/build/entries.js +624 -0
- package/.next/standalone/node_modules/next/dist/build/get-babel-config-file.js +35 -0
- package/.next/standalone/node_modules/next/dist/build/handle-externals.js +280 -0
- package/.next/standalone/node_modules/next/dist/build/load-entrypoint.js +128 -0
- package/.next/standalone/node_modules/next/dist/build/load-jsconfig.js +144 -0
- package/.next/standalone/node_modules/next/dist/build/normalize-catchall-routes.js +76 -0
- package/.next/standalone/node_modules/next/dist/build/output/index.js +295 -0
- package/.next/standalone/node_modules/next/dist/build/output/log.js +115 -0
- package/.next/standalone/node_modules/next/dist/build/output/store.js +214 -0
- package/.next/standalone/node_modules/next/dist/build/polyfills/fetch/index.js +6 -0
- package/.next/standalone/node_modules/next/dist/build/polyfills/fetch/whatwg-fetch.js +7 -0
- package/.next/standalone/node_modules/next/dist/build/polyfills/object-assign.js +6 -0
- package/.next/standalone/node_modules/next/dist/build/polyfills/object.assign/auto.js +4 -0
- package/.next/standalone/node_modules/next/dist/build/polyfills/object.assign/implementation.js +4 -0
- package/.next/standalone/node_modules/next/dist/build/polyfills/object.assign/polyfill.js +6 -0
- package/.next/standalone/node_modules/next/dist/build/polyfills/object.assign/shim.js +6 -0
- package/.next/standalone/node_modules/next/dist/build/polyfills/polyfill-nomodule.js +1 -0
- package/.next/standalone/node_modules/next/dist/build/polyfills/process.js +5 -0
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +975 -0
- package/.next/standalone/node_modules/next/dist/build/swc/options.js +357 -0
- package/.next/standalone/node_modules/next/dist/build/utils.js +1584 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/base.js +58 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/css/index.js +568 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/css/loaders/client.js +47 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/css/loaders/file-resolve.js +21 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/css/loaders/getCssModuleLocalIdent.js +37 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/css/loaders/global.js +62 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/css/loaders/index.js +22 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/css/loaders/modules.js +84 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/css/loaders/next-font.js +62 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/css/messages.js +45 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/css/plugins.js +162 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/images/index.js +42 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/blocks/images/messages.js +16 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/helpers.js +78 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/index.js +46 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/config/utils.js +13 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/css-loader/src/CssSyntaxError.js +32 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/css-loader/src/camelcase.js +89 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js +269 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/css-loader/src/plugins/index.js +36 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/css-loader/src/plugins/postcss-icss-parser.js +107 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/css-loader/src/plugins/postcss-import-parser.js +207 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/css-loader/src/plugins/postcss-url-parser.js +327 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/css-loader/src/runtime/api.js +91 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/css-loader/src/runtime/getUrl.js +26 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/css-loader/src/utils.js +463 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/get-module-build-info.js +15 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/lightningcss-loader/src/codegen.js +156 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/lightningcss-loader/src/index.js +27 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/lightningcss-loader/src/interface.js +17 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/lightningcss-loader/src/loader.js +410 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/lightningcss-loader/src/minify.js +90 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/lightningcss-loader/src/utils.js +58 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/next-flight-css-loader.js +52 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/next-flight-loader/index.js +120 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/next-middleware-loader.js +59 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/next-route-loader/index.js +129 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/Error.js +40 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/Warning.js +35 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js +117 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/utils.js +89 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/resolve-url-loader/index.js +100 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/resolve-url-loader/lib/file-protocol.js +70 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/resolve-url-loader/lib/join-function.js +186 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/resolve-url-loader/lib/postcss.js +90 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/resolve-url-loader/lib/value-processor.js +99 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/loaders/utils.js +117 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/app-build-manifest-plugin.js +66 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/build-manifest-plugin.js +235 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/copy-file-plugin.js +67 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/css-chunking-plugin.js +277 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/css-minimizer-plugin.js +90 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/define-env-plugin.js +174 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/flight-client-entry-plugin.js +694 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.js +351 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/font-stylesheet-gathering-plugin.js +224 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/jsconfig-paths-plugin.js +219 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/memory-with-gc-cache-plugin.js +114 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/middleware-plugin.js +558 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/mini-css-extract-plugin.js +25 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/next-drop-client-page-plugin.js +85 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.js +120 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/next-trace-entrypoints-plugin.js +524 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/next-types-plugin/index.js +556 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/next-types-plugin/shared.js +14 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/nextjs-require-cache-hot-reloader.js +123 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/optional-peer-dependency-resolve-plugin.js +45 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.js +146 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/profiling-plugin.js +284 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/react-loadable-plugin.js +149 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.js +58 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/telemetry-plugin.js +173 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/terser-webpack-plugin/src/index.js +273 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/getModuleTrace.js +89 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/index.js +43 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/parse-dynamic-code-evaluation-error.js +19 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/parseBabel.js +29 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/parseCss.js +29 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/parseNextAppLoaderError.js +25 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/parseNextFontError.js +33 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/parseNextInvalidImportError.js +26 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/parseNotFoundError.js +150 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/parseRSC.js +97 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/parseScss.js +42 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/simpleWebpackError.js +18 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/webpackModuleError.js +143 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/stringify-request.js +15 -0
- package/.next/standalone/node_modules/next/dist/build/webpack/utils.js +97 -0
- package/.next/standalone/node_modules/next/dist/build/webpack-config-rules/resolve.js +58 -0
- package/.next/standalone/node_modules/next/dist/build/webpack-config.js +2026 -0
- package/.next/standalone/node_modules/next/dist/client/add-base-path.js +24 -0
- package/.next/standalone/node_modules/next/dist/client/add-locale.js +28 -0
- package/.next/standalone/node_modules/next/dist/client/components/action-async-storage-instance.js +20 -0
- package/.next/standalone/node_modules/next/dist/client/components/action-async-storage.external.js +20 -0
- package/.next/standalone/node_modules/next/dist/client/components/app-router-headers.js +77 -0
- package/.next/standalone/node_modules/next/dist/client/components/async-local-storage.js +44 -0
- package/.next/standalone/node_modules/next/dist/client/components/bailout-to-client-rendering.js +25 -0
- package/.next/standalone/node_modules/next/dist/client/components/dev-root-not-found-boundary.js +50 -0
- package/.next/standalone/node_modules/next/dist/client/components/hooks-server-context.js +44 -0
- package/.next/standalone/node_modules/next/dist/client/components/match-segments.js +52 -0
- package/.next/standalone/node_modules/next/dist/client/components/navigation.js +268 -0
- package/.next/standalone/node_modules/next/dist/client/components/navigation.react-server.js +63 -0
- package/.next/standalone/node_modules/next/dist/client/components/noop-head.js +21 -0
- package/.next/standalone/node_modules/next/dist/client/components/not-found-boundary.js +107 -0
- package/.next/standalone/node_modules/next/dist/client/components/not-found-error.js +96 -0
- package/.next/standalone/node_modules/next/dist/client/components/not-found.js +43 -0
- package/.next/standalone/node_modules/next/dist/client/components/parallel-route-default.js +35 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/CodeFrame/CodeFrame.js +120 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/CodeFrame/index.js +19 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/CodeFrame/styles.js +30 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Dialog/Dialog.js +86 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Dialog/DialogBody.js +29 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Dialog/DialogContent.js +29 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Dialog/DialogHeader.js +29 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Dialog/index.js +47 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Dialog/styles.js +30 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/LeftRightDialogHeader/LeftRightDialogHeader.js +178 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/LeftRightDialogHeader/index.js +32 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/LeftRightDialogHeader/styles.js +30 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Overlay/Overlay.js +62 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Overlay/body-locker.js +62 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Overlay/index.js +19 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Overlay/maintain--tab-focus.js +2716 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Overlay/styles.js +30 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/ShadowPortal.js +42 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Terminal/EditorLink.js +67 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Terminal/Terminal.js +108 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Terminal/index.js +19 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Terminal/styles.js +30 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Toast/Toast.js +36 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Toast/index.js +32 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/Toast/styles.js +30 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/VersionStalenessInfo/VersionStalenessInfo.js +104 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/VersionStalenessInfo/index.js +32 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/VersionStalenessInfo/styles.js +30 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/components/hot-linked-text/index.js +74 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/container/BuildError.js +99 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/container/Errors.js +339 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/container/RuntimeError/CallStackFrame.js +81 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/container/RuntimeError/GroupedStackFrames.js +62 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/container/RuntimeError/component-stack-pseudo-html.js +186 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/container/RuntimeError/index.js +126 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/format-webpack-messages.js +164 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/getErrorByType.js +47 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/getRawSourceMap.js +44 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/getSourceMapUrl.js +33 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/group-stack-frames-by-framework.js +36 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/hydration-error-info.js +77 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/launchEditor.js +404 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/nodeStackFrames.js +75 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/noop-template.js +25 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/parse-component-stack.js +98 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/parseStack.js +37 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/stack-frame.js +145 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/helpers/use-open-in-editor.js +37 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/hooks/use-on-click-outside.js +44 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/icons/CloseIcon.js +46 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/icons/CollapseIcon.js +43 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/icons/FrameworkIcon.js +135 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/styles/Base.js +37 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/styles/ComponentStyles.js +55 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/internal/styles/CssReset.js +37 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/pages/ErrorBoundary.js +56 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/pages/ReactDevOverlay.js +82 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/pages/bus.js +70 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/pages/client.js +172 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/server/middleware-turbopack.js +124 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/server/middleware.js +263 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/server/shared.js +103 -0
- package/.next/standalone/node_modules/next/dist/client/components/react-dev-overlay/shared.js +187 -0
- package/.next/standalone/node_modules/next/dist/client/components/redirect-status-code.js +24 -0
- package/.next/standalone/node_modules/next/dist/client/components/redirect.js +115 -0
- package/.next/standalone/node_modules/next/dist/client/components/request-async-storage-instance.js +20 -0
- package/.next/standalone/node_modules/next/dist/client/components/request-async-storage.external.js +37 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/get-segment-value.js +21 -0
- package/.next/standalone/node_modules/next/dist/client/components/static-generation-async-storage-instance.js +20 -0
- package/.next/standalone/node_modules/next/dist/client/components/static-generation-async-storage.external.js +20 -0
- package/.next/standalone/node_modules/next/dist/client/components/static-generation-bailout.js +43 -0
- package/.next/standalone/node_modules/next/dist/client/detect-domain-locale.js +26 -0
- package/.next/standalone/node_modules/next/dist/client/has-base-path.js +23 -0
- package/.next/standalone/node_modules/next/dist/client/head-manager.js +205 -0
- package/.next/standalone/node_modules/next/dist/client/normalize-trailing-slash.js +36 -0
- package/.next/standalone/node_modules/next/dist/client/remove-base-path.js +32 -0
- package/.next/standalone/node_modules/next/dist/client/remove-locale.js +28 -0
- package/.next/standalone/node_modules/next/dist/client/request-idle-callback.js +44 -0
- package/.next/standalone/node_modules/next/dist/client/resolve-href.js +79 -0
- package/.next/standalone/node_modules/next/dist/client/route-loader.js +319 -0
- package/.next/standalone/node_modules/next/dist/client/router.js +189 -0
- package/.next/standalone/node_modules/next/dist/client/script.js +357 -0
- package/.next/standalone/node_modules/next/dist/client/trusted-types.js +40 -0
- package/.next/standalone/node_modules/next/dist/client/with-router.js +37 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/cookies/index.js +336 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/cookies/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/ponyfill/index.js +46 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/ponyfill/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/abort-controller.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/blob.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/console.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/crypto.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/events.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/fetch.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/index.js +5 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/load.js +251 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/structured-clone.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/timers.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/url.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@hapi/accept/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@hapi/accept/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@mswjs/interceptors/ClientRequest/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@mswjs/interceptors/ClientRequest/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@napi-rs/triples/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@napi-rs/triples/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/constants.js +10 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/fontkit/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/format-available-values.js +9 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/fetch-css-from-google-fonts.js +65 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/fetch-font-file.js +39 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/find-font-files-in-css.js +35 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/font-data.json +14483 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/get-fallback-font-override-metrics.js +53 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/get-font-axes.js +67 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/get-google-fonts-url.js +56 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/get-proxy-agent.js +24 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/google-fonts-metadata.js +8 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/loader.js +165 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/retry.js +19 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/sort-fonts-variant-values.js +27 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/google/validate-google-font-function-call.js +97 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/local/get-fallback-metrics-from-font-file.js +86 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/local/loader.js +75 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/local/pick-font-file-for-fallback-generation.js +86 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/local/validate-local-font-function-call.js +73 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/dist/next-font-error.js +12 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/google/loader.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/local/loader.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/font/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/ReactRefreshWebpackPlugin.js +130 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/internal/ReactRefreshModule.runtime.js +69 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/internal/helpers.js +170 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/loader.js +21 -0
- package/.next/standalone/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js +27 -0
- package/.next/standalone/node_modules/next/dist/compiled/@opentelemetry/api/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@opentelemetry/api/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@vercel/nft/LICENSE +7 -0
- package/.next/standalone/node_modules/next/dist/compiled/@vercel/nft/index.js +24 -0
- package/.next/standalone/node_modules/next/dist/compiled/@vercel/nft/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/acorn/acorn.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/acorn/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/amphtml-validator/index.js +17 -0
- package/.next/standalone/node_modules/next/dist/compiled/amphtml-validator/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/anser/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/anser/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/assert/assert.js +7 -0
- package/.next/standalone/node_modules/next/dist/compiled/assert/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/async-retry/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/async-retry/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/async-sema/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/async-sema/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/bundle.js +1871 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/code-frame.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/core-lib-block-hoist-plugin.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/core-lib-config.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/core-lib-normalize-file.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/core-lib-normalize-opts.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/core-lib-plugin-pass.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/core.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/generator.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/parser.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/plugin-transform-define.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/plugin-transform-modules-commonjs.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/traverse.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel/types.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel-packages/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/babel-packages/packages-bundle.js +399 -0
- package/.next/standalone/node_modules/next/dist/compiled/browserify-zlib/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/browserify-zlib/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/browserslist/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/browserslist/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/buffer/index.js +9 -0
- package/.next/standalone/node_modules/next/dist/compiled/buffer/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/bytes/index.js +8 -0
- package/.next/standalone/node_modules/next/dist/compiled/bytes/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/ci-info/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/ci-info/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/commander/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/commander/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/comment-json/index.js +7 -0
- package/.next/standalone/node_modules/next/dist/compiled/comment-json/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/compression/index.js +51 -0
- package/.next/standalone/node_modules/next/dist/compiled/compression/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/conf/index.js +15 -0
- package/.next/standalone/node_modules/next/dist/compiled/conf/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/constants-browserify/constants.json +209 -0
- package/.next/standalone/node_modules/next/dist/compiled/constants-browserify/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/content-disposition/index.js +6 -0
- package/.next/standalone/node_modules/next/dist/compiled/content-disposition/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/cookie/index.js +7 -0
- package/.next/standalone/node_modules/next/dist/compiled/cookie/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/cross-spawn/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/cross-spawn/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/crypto-browserify/index.js +3 -0
- package/.next/standalone/node_modules/next/dist/compiled/crypto-browserify/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/css.escape/css.escape.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/css.escape/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/cssnano-simple/index.js +190 -0
- package/.next/standalone/node_modules/next/dist/compiled/data-uri-to-buffer/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/data-uri-to-buffer/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/debug/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/debug/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/devalue/devalue.umd.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/devalue/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/domain-browser/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/domain-browser/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/edge-runtime/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/edge-runtime/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/events/events.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/events/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/find-up/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/find-up/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/fresh/index.js +8 -0
- package/.next/standalone/node_modules/next/dist/compiled/fresh/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/get-orientation/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/get-orientation/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/glob/glob.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/glob/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/gzip-size/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/gzip-size/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/http-proxy/index.js +34 -0
- package/.next/standalone/node_modules/next/dist/compiled/http-proxy/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/http-proxy-agent/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/http-proxy-agent/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/https-browserify/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/https-browserify/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/https-proxy-agent/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/https-proxy-agent/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/icss-utils/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/icss-utils/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/ignore-loader/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/ignore-loader/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/image-size/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/image-size/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/is-animated/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/is-animated/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/is-docker/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/is-docker/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/is-wsl/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/is-wsl/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/jest-worker/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/jest-worker/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/jest-worker/processChild.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/jest-worker/threadChild.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/json5/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/json5/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/jsonwebtoken/index.js +11 -0
- package/.next/standalone/node_modules/next/dist/compiled/jsonwebtoken/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/loader-utils2/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/loader-utils2/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/loader-utils3/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/loader-utils3/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/lodash.curry/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/lodash.curry/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/lru-cache/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/lru-cache/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/mini-css-extract-plugin/cjs.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/mini-css-extract-plugin/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/mini-css-extract-plugin/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/nanoid/index.cjs +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/nanoid/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/native-url/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/native-url/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/neo-async/async.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/neo-async/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-experimental.runtime.prod.js +21 -0
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +21 -0
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +21 -0
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js +21 -0
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js +7 -0
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +32 -0
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages.runtime.prod.js +32 -0
- package/.next/standalone/node_modules/next/dist/compiled/node-fetch/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/node-fetch/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/node-html-parser/index.js +2 -0
- package/.next/standalone/node_modules/next/dist/compiled/node-html-parser/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/os-browserify/browser.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/os-browserify/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/p-limit/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/p-limit/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/path-browserify/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/path-browserify/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/path-to-regexp/index.js +406 -0
- package/.next/standalone/node_modules/next/dist/compiled/picomatch/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/picomatch/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/platform/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/platform/platform.js +7 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-flexbugs-fixes/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-flexbugs-fixes/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-modules-extract-imports/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-modules-extract-imports/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-modules-local-by-default/index.js +2 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-modules-local-by-default/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-modules-scope/index.js +2 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-modules-scope/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-modules-values/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-modules-values/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-plugin-stub-for-cssnano-simple/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-preset-env/index.cjs +94 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-preset-env/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-scss/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-scss/scss-syntax.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-value-parser/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/postcss-value-parser/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/process/browser.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/process/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/punycode/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/punycode/punycode.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/querystring-es3/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/querystring-es3/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-is/cjs/react-is.development.js +221 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-is/cjs/react-is.production.min.js +14 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-is/index.js +7 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-is/package.json +26 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-refresh/babel.js +7 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-refresh/cjs/react-refresh-babel.development.js +842 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-refresh/cjs/react-refresh-babel.production.min.js +24 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-refresh/cjs/react-refresh-runtime.development.js +658 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-refresh/cjs/react-refresh-runtime.production.min.js +10 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-refresh/package.json +39 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-refresh/runtime.js +7 -0
- package/.next/standalone/node_modules/next/dist/compiled/regenerator-runtime/package.json +19 -0
- package/.next/standalone/node_modules/next/dist/compiled/regenerator-runtime/runtime.js +729 -0
- package/.next/standalone/node_modules/next/dist/compiled/sass-loader/cjs.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/sass-loader/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/schema-utils3/index.js +3 -0
- package/.next/standalone/node_modules/next/dist/compiled/schema-utils3/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/semver/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/semver/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/send/index.js +85 -0
- package/.next/standalone/node_modules/next/dist/compiled/send/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/setimmediate/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/setimmediate/setImmediate.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/shell-quote/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/shell-quote/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/source-map/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/source-map/source-map.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/source-map08/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/source-map08/source-map.js +3002 -0
- package/.next/standalone/node_modules/next/dist/compiled/stacktrace-parser/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/stacktrace-parser/stack-trace-parser.cjs.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/stream-browserify/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/stream-browserify/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/stream-http/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/stream-http/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/string-hash/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/string-hash/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/string_decoder/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/string_decoder/string_decoder.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/strip-ansi/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/strip-ansi/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/superstruct/index.cjs +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/superstruct/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/tar/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/tar/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/text-table/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/text-table/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/timers-browserify/main.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/timers-browserify/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/tty-browserify/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/tty-browserify/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/unistore/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/unistore/unistore.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/util/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/util/util.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/vm-browserify/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/vm-browserify/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/watchpack/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/watchpack/watchpack.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/webpack/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/webpack/webpack.js +26 -0
- package/.next/standalone/node_modules/next/dist/compiled/webpack-sources3/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/webpack-sources3/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/ws/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/ws/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/zod/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/zod/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/experimental/testmode/context.js +57 -0
- package/.next/standalone/node_modules/next/dist/experimental/testmode/fetch.js +133 -0
- package/.next/standalone/node_modules/next/dist/experimental/testmode/httpget.js +26 -0
- package/.next/standalone/node_modules/next/dist/experimental/testmode/server.js +62 -0
- package/.next/standalone/node_modules/next/dist/export/helpers/is-dynamic-usage-error.js +16 -0
- package/.next/standalone/node_modules/next/dist/export/helpers/is-navigation-signal-error.js +15 -0
- package/.next/standalone/node_modules/next/dist/export/utils.js +24 -0
- package/.next/standalone/node_modules/next/dist/lib/batcher.js +59 -0
- package/.next/standalone/node_modules/next/dist/lib/build-custom-route.js +39 -0
- package/.next/standalone/node_modules/next/dist/lib/client-reference.js +16 -0
- package/.next/standalone/node_modules/next/dist/lib/coalesced-function.js +39 -0
- package/.next/standalone/node_modules/next/dist/lib/compile-error.js +14 -0
- package/.next/standalone/node_modules/next/dist/lib/constants.js +334 -0
- package/.next/standalone/node_modules/next/dist/lib/create-client-router-filter.js +67 -0
- package/.next/standalone/node_modules/next/dist/lib/detached-promise.js +32 -0
- package/.next/standalone/node_modules/next/dist/lib/detect-typo.js +51 -0
- package/.next/standalone/node_modules/next/dist/lib/download-swc.js +171 -0
- package/.next/standalone/node_modules/next/dist/lib/fatal-error.js +14 -0
- package/.next/standalone/node_modules/next/dist/lib/file-exists.js +53 -0
- package/.next/standalone/node_modules/next/dist/lib/find-config.js +102 -0
- package/.next/standalone/node_modules/next/dist/lib/find-pages-dir.js +50 -0
- package/.next/standalone/node_modules/next/dist/lib/find-root.js +45 -0
- package/.next/standalone/node_modules/next/dist/lib/format-dynamic-import-path.js +24 -0
- package/.next/standalone/node_modules/next/dist/lib/format-server-error.js +74 -0
- package/.next/standalone/node_modules/next/dist/lib/fs/rename.js +128 -0
- package/.next/standalone/node_modules/next/dist/lib/fs/write-atomic.js +28 -0
- package/.next/standalone/node_modules/next/dist/lib/generate-interception-routes-rewrites.js +88 -0
- package/.next/standalone/node_modules/next/dist/lib/get-project-dir.js +51 -0
- package/.next/standalone/node_modules/next/dist/lib/has-necessary-dependencies.js +46 -0
- package/.next/standalone/node_modules/next/dist/lib/helpers/get-cache-directory.js +62 -0
- package/.next/standalone/node_modules/next/dist/lib/helpers/get-online.js +50 -0
- package/.next/standalone/node_modules/next/dist/lib/helpers/get-pkg-manager.js +63 -0
- package/.next/standalone/node_modules/next/dist/lib/helpers/get-registry.js +32 -0
- package/.next/standalone/node_modules/next/dist/lib/helpers/install.js +105 -0
- package/.next/standalone/node_modules/next/dist/lib/install-dependencies.js +40 -0
- package/.next/standalone/node_modules/next/dist/lib/interop-default.js +15 -0
- package/.next/standalone/node_modules/next/dist/lib/is-api-route.js +15 -0
- package/.next/standalone/node_modules/next/dist/lib/is-app-page-route.js +15 -0
- package/.next/standalone/node_modules/next/dist/lib/is-app-route-route.js +15 -0
- package/.next/standalone/node_modules/next/dist/lib/is-edge-runtime.js +16 -0
- package/.next/standalone/node_modules/next/dist/lib/is-error.js +44 -0
- package/.next/standalone/node_modules/next/dist/lib/is-internal-component.js +36 -0
- package/.next/standalone/node_modules/next/dist/lib/is-serializable-props.js +82 -0
- package/.next/standalone/node_modules/next/dist/lib/known-edge-safe-packages.json +1 -0
- package/.next/standalone/node_modules/next/dist/lib/load-custom-routes.js +504 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/clone-metadata.js +33 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/constants.js +40 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/default-metadata.js +77 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/generate/alternate.js +55 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/generate/basic.js +281 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/generate/icons.js +66 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/generate/meta.js +123 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/generate/opengraph.js +474 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/generate/utils.js +38 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/get-metadata-route.js +85 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/is-metadata-route.js +115 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/metadata.js +163 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/resolve-metadata.js +629 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-basics.js +218 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-icons.js +56 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-opengraph.js +178 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-title.js +40 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-url.js +136 -0
- package/.next/standalone/node_modules/next/dist/lib/needs-experimental-react.js +16 -0
- package/.next/standalone/node_modules/next/dist/lib/non-nullable.js +15 -0
- package/.next/standalone/node_modules/next/dist/lib/oxford-comma-list.js +15 -0
- package/.next/standalone/node_modules/next/dist/lib/page-types.js +18 -0
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +181 -0
- package/.next/standalone/node_modules/next/dist/lib/pick.js +19 -0
- package/.next/standalone/node_modules/next/dist/lib/picocolors.js +177 -0
- package/.next/standalone/node_modules/next/dist/lib/pretty-bytes.js +70 -0
- package/.next/standalone/node_modules/next/dist/lib/realpath.js +20 -0
- package/.next/standalone/node_modules/next/dist/lib/recursive-delete.js +75 -0
- package/.next/standalone/node_modules/next/dist/lib/recursive-readdir.js +124 -0
- package/.next/standalone/node_modules/next/dist/lib/redirect-status.js +46 -0
- package/.next/standalone/node_modules/next/dist/lib/resolve-from.js +55 -0
- package/.next/standalone/node_modules/next/dist/lib/scheduler.js +49 -0
- package/.next/standalone/node_modules/next/dist/lib/semver-noop.js +18 -0
- package/.next/standalone/node_modules/next/dist/lib/server-external-packages.json +53 -0
- package/.next/standalone/node_modules/next/dist/lib/try-to-parse-path.js +50 -0
- package/.next/standalone/node_modules/next/dist/lib/turbopack-warning.js +205 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/diagnosticFormatter.js +258 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/getTypeScriptConfiguration.js +61 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/getTypeScriptIntent.js +52 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/missingDependencyError.js +23 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/runTypeCheck.js +95 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/writeAppTypeDeclarations.js +62 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/writeConfigurationDefaults.js +296 -0
- package/.next/standalone/node_modules/next/dist/lib/url.js +45 -0
- package/.next/standalone/node_modules/next/dist/lib/verify-partytown-setup.js +110 -0
- package/.next/standalone/node_modules/next/dist/lib/verify-typescript-setup.js +165 -0
- package/.next/standalone/node_modules/next/dist/lib/wait.js +19 -0
- package/.next/standalone/node_modules/next/dist/lib/with-promise-cache.js +24 -0
- package/.next/standalone/node_modules/next/dist/pages/_app.js +42 -0
- package/.next/standalone/node_modules/next/dist/pages/_document.js +851 -0
- package/.next/standalone/node_modules/next/dist/server/accept-header.js +120 -0
- package/.next/standalone/node_modules/next/dist/server/api-utils/get-cookie-parser.js +22 -0
- package/.next/standalone/node_modules/next/dist/server/api-utils/index.js +198 -0
- package/.next/standalone/node_modules/next/dist/server/api-utils/node/try-get-preview-data.js +86 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/action-handler.js +730 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/action-utils.js +65 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/app-render.js +1034 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/create-component-styles-and-scripts.js +53 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/create-component-tree.js +455 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/create-error-handler.js +99 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/create-flight-router-state-from-loader-tree.js +50 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/csrf-protection.js +90 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-rendering.js +195 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/encryption-utils.js +174 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/flight-render-result.js +28 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-asset-query-string.js +28 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-css-inlined-link-tags.js +48 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-layer-assets.js +85 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-preloadable-fonts.js +39 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-script-nonce-from-header.js +40 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-segment-param.js +42 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-short-dynamic-param-type.js +38 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/has-loading-component-in-tree.js +19 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/interop-default.js +17 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/make-get-server-inserted-html.js +83 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/parse-and-validate-flight-router-state.js +37 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/parse-loader-tree.js +29 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/react-server.node.js +35 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/required-scripts.js +71 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/server-inserted-html.js +41 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/static/static-renderer.js +165 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/strip-flight-headers.js +18 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/types.js +43 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/use-flight-response.js +126 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/validate-url.js +29 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/walk-tree-with-flight-router-state.js +150 -0
- package/.next/standalone/node_modules/next/dist/server/async-storage/draft-mode-provider.js +53 -0
- package/.next/standalone/node_modules/next/dist/server/async-storage/request-async-storage-wrapper.js +109 -0
- package/.next/standalone/node_modules/next/dist/server/async-storage/static-generation-async-storage-wrapper.js +53 -0
- package/.next/standalone/node_modules/next/dist/server/base-http/index.js +54 -0
- package/.next/standalone/node_modules/next/dist/server/base-http/node.js +119 -0
- package/.next/standalone/node_modules/next/dist/server/base-server.js +2253 -0
- package/.next/standalone/node_modules/next/dist/server/body-streams.js +90 -0
- package/.next/standalone/node_modules/next/dist/server/capsize-font-metrics.json +30312 -0
- package/.next/standalone/node_modules/next/dist/server/client-component-renderer-logger.js +69 -0
- package/.next/standalone/node_modules/next/dist/server/config-schema.js +483 -0
- package/.next/standalone/node_modules/next/dist/server/config-shared.js +165 -0
- package/.next/standalone/node_modules/next/dist/server/config-utils.js +189 -0
- package/.next/standalone/node_modules/next/dist/server/config.js +825 -0
- package/.next/standalone/node_modules/next/dist/server/crypto-utils.js +70 -0
- package/.next/standalone/node_modules/next/dist/server/dev/hot-middleware.js +215 -0
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +748 -0
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-types.js +29 -0
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1192 -0
- package/.next/standalone/node_modules/next/dist/server/dev/log-app-dir-error.js +80 -0
- package/.next/standalone/node_modules/next/dist/server/dev/messages.js +13 -0
- package/.next/standalone/node_modules/next/dist/server/dev/next-dev-server.js +601 -0
- package/.next/standalone/node_modules/next/dist/server/dev/on-demand-entry-handler.js +663 -0
- package/.next/standalone/node_modules/next/dist/server/dev/parse-version-info.js +108 -0
- package/.next/standalone/node_modules/next/dist/server/dev/static-paths-worker.js +72 -0
- package/.next/standalone/node_modules/next/dist/server/dev/turbopack/entry-key.js +39 -0
- package/.next/standalone/node_modules/next/dist/server/dev/turbopack/manifest-loader.js +327 -0
- package/.next/standalone/node_modules/next/dist/server/dev/turbopack-utils.js +713 -0
- package/.next/standalone/node_modules/next/dist/server/font-utils.js +205 -0
- package/.next/standalone/node_modules/next/dist/server/future/helpers/i18n-provider.js +146 -0
- package/.next/standalone/node_modules/next/dist/server/future/helpers/interception-routes.js +89 -0
- package/.next/standalone/node_modules/next/dist/server/future/helpers/module-loader/node-module-loader.js +21 -0
- package/.next/standalone/node_modules/next/dist/server/future/helpers/module-loader/route-module-loader.js +22 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/absolute-filename-normalizer.js +33 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/built/app/app-bundle-path-normalizer.js +48 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/built/app/app-filename-normalizer.js +22 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/built/app/app-page-normalizer.js +19 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/built/app/app-pathname-normalizer.js +55 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/built/app/index.js +42 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/built/pages/index.js +44 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/built/pages/pages-bundle-path-normalizer.js +55 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/built/pages/pages-filename-normalizer.js +22 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/built/pages/pages-page-normalizer.js +19 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/built/pages/pages-pathname-normalizer.js +19 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/locale-route-normalizer.js +26 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/normalizers.js +23 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/prefixing-normalizer.js +26 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/request/action.js +19 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/request/base-path.js +21 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/request/next-data.js +34 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/request/postponed.js +27 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/request/prefetch-rsc.js +19 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/request/prefix.js +35 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/request/rsc.js +19 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/request/suffix.js +27 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/underscore-normalizer.js +17 -0
- package/.next/standalone/node_modules/next/dist/server/future/normalizers/wrap-normalizer-fn.js +17 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-definitions/app-page-route-definition.js +16 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-kind.js +29 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-managers/default-route-matcher-manager.js +227 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-managers/dev-route-matcher-manager.js +126 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/app-page-route-matcher-provider.js +55 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/app-route-route-matcher-provider.js +43 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/dev/dev-app-page-route-matcher-provider.js +78 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/dev/dev-app-route-route-matcher-provider.js +43 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/dev/dev-pages-api-route-matcher-provider.js +80 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/dev/dev-pages-route-matcher-provider.js +80 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/dev/file-cache-route-matcher-provider.js +28 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/dev/helpers/file-reader/batched-file-reader.js +106 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/dev/helpers/file-reader/default-file-reader.js +43 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/helpers/cached-route-matcher-provider.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/helpers/manifest-loaders/node-manifest-loader.js +34 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/helpers/manifest-loaders/server-manifest-loader.js +20 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/manifest-route-matcher-provider.js +21 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/pages-api-route-matcher-provider.js +56 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matcher-providers/pages-route-matcher-provider.js +65 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matchers/app-page-route-matcher.js +18 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matchers/app-route-route-matcher.js +15 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matchers/locale-route-matcher.js +68 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matchers/pages-api-route-matcher.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matchers/pages-route-matcher.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matchers/route-matcher.js +54 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-matches/pages-api-route-match.js +16 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/module.compiled.js +24 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/module.js +94 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/module.render.js +20 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/amp-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/app-router-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/entrypoints.js +107 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/head-manager-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/hooks-client-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/html-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/image-config-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/loadable-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/loadable.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/router-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/server-inserted-html.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/rsc/entrypoints.js +136 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/entrypoints.js +115 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/checks.js +45 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/helpers/response-handlers.js +67 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/builtin/_error.js +78 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/module.compiled.js +14 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/module.js +92 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/module.render.js +20 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/amp-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/app-router-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/entrypoints.js +107 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/head-manager-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/hooks-client-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/html-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/image-config-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/loadable-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/loadable.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/router-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/server-inserted-html.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/future/route-modules/route-module.js +18 -0
- package/.next/standalone/node_modules/next/dist/server/get-app-route-from-entrypoint.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/get-route-from-entrypoint.js +35 -0
- package/.next/standalone/node_modules/next/dist/server/htmlescape.js +37 -0
- package/.next/standalone/node_modules/next/dist/server/image-optimizer.js +914 -0
- package/.next/standalone/node_modules/next/dist/server/internal-utils.js +54 -0
- package/.next/standalone/node_modules/next/dist/server/lib/app-dir-module.js +54 -0
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +113 -0
- package/.next/standalone/node_modules/next/dist/server/lib/builtin-request-context.js +38 -0
- package/.next/standalone/node_modules/next/dist/server/lib/clone-response.js +54 -0
- package/.next/standalone/node_modules/next/dist/server/lib/dedupe-fetch.js +157 -0
- package/.next/standalone/node_modules/next/dist/server/lib/dev-bundler-service.js +55 -0
- package/.next/standalone/node_modules/next/dist/server/lib/etag.js +56 -0
- package/.next/standalone/node_modules/next/dist/server/lib/find-page-file.js +111 -0
- package/.next/standalone/node_modules/next/dist/server/lib/format-hostname.js +16 -0
- package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/fetch-cache.js +320 -0
- package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/file-system-cache.js +322 -0
- package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/index.js +407 -0
- package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/shared-revalidate-timings.js +57 -0
- package/.next/standalone/node_modules/next/dist/server/lib/is-ipv6.js +41 -0
- package/.next/standalone/node_modules/next/dist/server/lib/match-next-data-pathname.js +18 -0
- package/.next/standalone/node_modules/next/dist/server/lib/mock-request.js +329 -0
- package/.next/standalone/node_modules/next/dist/server/lib/node-fs-methods.js +28 -0
- package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +653 -0
- package/.next/standalone/node_modules/next/dist/server/lib/render-server.js +114 -0
- package/.next/standalone/node_modules/next/dist/server/lib/revalidate.js +22 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-server.js +502 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/block-cross-site.js +76 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/build-data-route.js +44 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/filesystem.js +536 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/is-postpone.js +16 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/proxy-request.js +110 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/resolve-routes.js +567 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.js +830 -0
- package/.next/standalone/node_modules/next/dist/server/lib/server-action-request-meta.js +53 -0
- package/.next/standalone/node_modules/next/dist/server/lib/server-ipc/invoke-request.js +33 -0
- package/.next/standalone/node_modules/next/dist/server/lib/server-ipc/request-utils.js +60 -0
- package/.next/standalone/node_modules/next/dist/server/lib/server-ipc/utils.js +80 -0
- package/.next/standalone/node_modules/next/dist/server/lib/squoosh/main.js +136 -0
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +325 -0
- package/.next/standalone/node_modules/next/dist/server/lib/to-route.js +37 -0
- package/.next/standalone/node_modules/next/dist/server/lib/trace/constants.js +202 -0
- package/.next/standalone/node_modules/next/dist/server/lib/trace/tracer.js +214 -0
- package/.next/standalone/node_modules/next/dist/server/lib/utils.js +87 -0
- package/.next/standalone/node_modules/next/dist/server/load-components.js +128 -0
- package/.next/standalone/node_modules/next/dist/server/load-default-error-components.js +39 -0
- package/.next/standalone/node_modules/next/dist/server/load-manifest.js +70 -0
- package/.next/standalone/node_modules/next/dist/server/match-bundle.js +25 -0
- package/.next/standalone/node_modules/next/dist/server/next-server.js +1277 -0
- package/.next/standalone/node_modules/next/dist/server/next-typescript.js +13 -0
- package/.next/standalone/node_modules/next/dist/server/next.js +335 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment.js +17 -0
- package/.next/standalone/node_modules/next/dist/server/node-polyfill-crypto.js +20 -0
- package/.next/standalone/node_modules/next/dist/server/optimize-amp.js +22 -0
- package/.next/standalone/node_modules/next/dist/server/pipe-readable.js +132 -0
- package/.next/standalone/node_modules/next/dist/server/post-process.js +175 -0
- package/.next/standalone/node_modules/next/dist/server/render-result.js +147 -0
- package/.next/standalone/node_modules/next/dist/server/render.js +1028 -0
- package/.next/standalone/node_modules/next/dist/server/request-meta.js +78 -0
- package/.next/standalone/node_modules/next/dist/server/require-hook.js +68 -0
- package/.next/standalone/node_modules/next/dist/server/require.js +121 -0
- package/.next/standalone/node_modules/next/dist/server/response-cache/index.js +149 -0
- package/.next/standalone/node_modules/next/dist/server/response-cache/types.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/response-cache/utils.js +64 -0
- package/.next/standalone/node_modules/next/dist/server/send-payload.js +123 -0
- package/.next/standalone/node_modules/next/dist/server/send-response.js +51 -0
- package/.next/standalone/node_modules/next/dist/server/serve-static.js +62 -0
- package/.next/standalone/node_modules/next/dist/server/server-route-utils.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/server-utils.js +306 -0
- package/.next/standalone/node_modules/next/dist/server/setup-http-agent-env.js +27 -0
- package/.next/standalone/node_modules/next/dist/server/stream-utils/encodedTags.js +82 -0
- package/.next/standalone/node_modules/next/dist/server/stream-utils/node-web-streams-helper.js +484 -0
- package/.next/standalone/node_modules/next/dist/server/stream-utils/uint8array-helpers.js +69 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/constant.js +96 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/index.js +204 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/client-boundary.js +68 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/config.js +388 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/entry.js +149 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/error.js +38 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/metadata.js +389 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/server-boundary.js +112 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/server.js +79 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/utils.js +194 -0
- package/.next/standalone/node_modules/next/dist/server/utils.js +87 -0
- package/.next/standalone/node_modules/next/dist/server/web/error.js +54 -0
- package/.next/standalone/node_modules/next/dist/server/web/http.js +39 -0
- package/.next/standalone/node_modules/next/dist/server/web/next-url.js +191 -0
- package/.next/standalone/node_modules/next/dist/server/web/sandbox/context.js +416 -0
- package/.next/standalone/node_modules/next/dist/server/web/sandbox/fetch-inline-assets.js +35 -0
- package/.next/standalone/node_modules/next/dist/server/web/sandbox/index.js +28 -0
- package/.next/standalone/node_modules/next/dist/server/web/sandbox/resource-managers.js +62 -0
- package/.next/standalone/node_modules/next/dist/server/web/sandbox/sandbox.js +115 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/adapters/headers.js +192 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/adapters/next-request.js +134 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/adapters/reflect.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.js +150 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/cookies.js +29 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/request.js +100 -0
- package/.next/standalone/node_modules/next/dist/server/web/utils.js +147 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/amp-context.shared-runtime.js +18 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/amp-mode.js +16 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/app-router-context.shared-runtime.js +51 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/bloom-filter.js +86 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/constants.js +414 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/deep-freeze.js +30 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/encode-uri-path.js +15 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/error-source.js +36 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/escape-regexp.js +22 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/get-hostname.js +23 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/hash.js +42 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.js +18 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/head.js +189 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.js +39 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/html-context.shared-runtime.js +36 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/i18n/detect-domain-locale.js +26 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/i18n/get-locale-redirect.js +63 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/i18n/normalize-locale-path.js +30 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/image-blur-svg.js +23 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/image-config-context.shared-runtime.js +19 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/image-config.js +69 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/is-plain-object.js +42 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/isomorphic/path.js +14 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/lazy-dynamic/bailout-to-csr.js +39 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/loadable-context.shared-runtime.js +20 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/loadable.shared-runtime.js +248 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/magic-identifier.js +99 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/match-local-pattern.js +47 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/match-remote-pattern.js +61 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/mitt.js +46 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/modern-browserslist-target.js +18 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/normalized-asset-prefix.js +28 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/absolute-path-to-page.js +26 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/denormalize-app-path.js +19 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/denormalize-page-path.js +18 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/ensure-leading-slash.js +18 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/get-page-paths.js +40 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/normalize-page-path.js +26 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/normalize-path-sep.js +19 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/remove-page-path-tail.js +20 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/adapters.js +139 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/router.js +1728 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/add-locale.js +28 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/add-path-prefix.js +20 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/add-path-suffix.js +20 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/app-paths.js +51 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/as-path-to-search-params.js +17 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/compare-states.js +34 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/escape-path-delimiters.js +16 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/format-next-pathname-info.js +27 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/format-url.js +111 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/get-asset-path-from-route.js +19 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/get-next-pathname-info.js +54 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/get-route-from-asset-path.js +26 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/handle-smooth-scroll.js +35 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/index.js +26 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/interpolate-as.js +53 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/is-bot.js +15 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/is-dynamic.js +21 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/is-local-url.js +26 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.js +31 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/omit.js +21 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/parse-path.js +33 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.js +29 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/parse-url.js +30 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/path-has-prefix.js +20 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/path-match.js +49 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/prepare-destination.js +236 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/querystring.js +73 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/relativize-url.js +22 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/remove-path-prefix.js +39 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/remove-trailing-slash.js +21 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/resolve-rewrites.js +118 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/route-matcher.js +40 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/route-regex.js +192 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/sorted-routes.js +170 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router-context.shared-runtime.js +18 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/runtime-config.external.js +31 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/segment.js +34 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.js +36 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/side-effect.js +66 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/utils/warn-once.js +22 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/utils.js +203 -0
- package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +89 -0
- package/.next/standalone/node_modules/next/dist/telemetry/ci-info.js +41 -0
- package/.next/standalone/node_modules/next/dist/telemetry/detached-flush.js +49 -0
- package/.next/standalone/node_modules/next/dist/telemetry/events/build.js +114 -0
- package/.next/standalone/node_modules/next/dist/telemetry/events/index.js +23 -0
- package/.next/standalone/node_modules/next/dist/telemetry/events/plugins.js +51 -0
- package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +55 -0
- package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +86 -0
- package/.next/standalone/node_modules/next/dist/telemetry/flush-and-exit.js +20 -0
- package/.next/standalone/node_modules/next/dist/telemetry/post-payload.js +44 -0
- package/.next/standalone/node_modules/next/dist/telemetry/project-id.js +48 -0
- package/.next/standalone/node_modules/next/dist/telemetry/storage.js +290 -0
- package/.next/standalone/node_modules/next/dist/trace/index.js +54 -0
- package/.next/standalone/node_modules/next/dist/trace/report/index.js +35 -0
- package/.next/standalone/node_modules/next/dist/trace/report/to-json.js +161 -0
- package/.next/standalone/node_modules/next/dist/trace/report/to-telemetry.js +36 -0
- package/.next/standalone/node_modules/next/dist/trace/shared.js +33 -0
- package/.next/standalone/node_modules/next/dist/trace/trace.js +194 -0
- package/.next/standalone/node_modules/next/font/google/target.css +1 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/at-rule.js +25 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/comment.js +13 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/container.js +439 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/css-syntax-error.js +100 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/declaration.js +24 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/document.js +33 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/fromJSON.js +54 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/input.js +248 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/lazy-result.js +550 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/list.js +58 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/map-generator.js +359 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/no-work-result.js +135 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/node.js +381 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/parse.js +42 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/parser.js +610 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/postcss.js +101 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/previous-map.js +142 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/processor.js +67 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/result.js +42 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/root.js +61 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/rule.js +27 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/stringifier.js +353 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/stringify.js +11 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/symbols.js +5 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/terminal-highlight.js +70 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/tokenize.js +266 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/warn-once.js +13 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/lib/warning.js +37 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/package.json +88 -0
- package/.next/standalone/node_modules/next/package.json +337 -0
- package/.next/standalone/node_modules/picocolors/package.json +25 -0
- package/.next/standalone/node_modules/picocolors/picocolors.js +75 -0
- package/.next/standalone/node_modules/react/cjs/react-jsx-dev-runtime.production.min.js +10 -0
- package/.next/standalone/node_modules/react/cjs/react-jsx-runtime.development.js +1333 -0
- package/.next/standalone/node_modules/react/cjs/react-jsx-runtime.production.min.js +11 -0
- package/.next/standalone/node_modules/react/cjs/react.development.js +2740 -0
- package/.next/standalone/node_modules/react/cjs/react.production.min.js +26 -0
- package/.next/standalone/node_modules/react/index.js +7 -0
- package/.next/standalone/node_modules/react/jsx-dev-runtime.js +7 -0
- package/.next/standalone/node_modules/react/jsx-runtime.js +7 -0
- package/.next/standalone/node_modules/react/package.json +47 -0
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js +7029 -0
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js +93 -0
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.development.js +7014 -0
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.min.js +96 -0
- package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.min.js +322 -0
- package/.next/standalone/node_modules/react-dom/index.js +38 -0
- package/.next/standalone/node_modules/react-dom/package.json +62 -0
- package/.next/standalone/node_modules/react-dom/server.browser.js +17 -0
- package/.next/standalone/node_modules/scheduler/cjs/scheduler.development.js +634 -0
- package/.next/standalone/node_modules/scheduler/cjs/scheduler.production.min.js +19 -0
- package/.next/standalone/node_modules/scheduler/index.js +7 -0
- package/.next/standalone/node_modules/scheduler/package.json +36 -0
- package/.next/standalone/node_modules/source-map-js/lib/array-set.js +121 -0
- package/.next/standalone/node_modules/source-map-js/lib/base64-vlq.js +140 -0
- package/.next/standalone/node_modules/source-map-js/lib/base64.js +67 -0
- package/.next/standalone/node_modules/source-map-js/lib/binary-search.js +111 -0
- package/.next/standalone/node_modules/source-map-js/lib/mapping-list.js +79 -0
- package/.next/standalone/node_modules/source-map-js/lib/quick-sort.js +132 -0
- package/.next/standalone/node_modules/source-map-js/lib/source-map-consumer.js +1188 -0
- package/.next/standalone/node_modules/source-map-js/lib/source-map-generator.js +444 -0
- package/.next/standalone/node_modules/source-map-js/lib/source-node.js +413 -0
- package/.next/standalone/node_modules/source-map-js/lib/util.js +594 -0
- package/.next/standalone/node_modules/source-map-js/package.json +71 -0
- package/.next/standalone/node_modules/source-map-js/source-map.js +8 -0
- package/.next/standalone/node_modules/streamsearch/lib/sbmh.js +267 -0
- package/.next/standalone/node_modules/streamsearch/package.json +34 -0
- package/.next/standalone/node_modules/styled-jsx/dist/index/index.js +499 -0
- package/.next/standalone/node_modules/styled-jsx/index.js +1 -0
- package/.next/standalone/node_modules/styled-jsx/package.json +129 -0
- package/.next/standalone/node_modules/styled-jsx/style.js +1 -0
- package/.next/standalone/package.json +71 -0
- package/.next/standalone/scripts/analyze.ts +681 -0
- package/.next/standalone/scripts/implement.ts +792 -0
- package/.next/standalone/server.js +38 -0
- package/.next/static/chunks/117-b74c3899e29d85d7.js +2 -0
- package/.next/static/chunks/444-b604794bb48fdc78.js +1 -0
- package/.next/static/chunks/59-a053b1c0e85128de.js +1 -0
- package/.next/static/chunks/912-d0c915da2a33166b.js +1 -0
- package/.next/static/chunks/app/_not-found/page-2573b25f318b094f.js +1 -0
- package/.next/static/chunks/app/goals/[id]/page-6175de61243f271d.js +1 -0
- package/.next/static/chunks/app/goals/page-88b8f2fecdfe6fa4.js +1 -0
- package/.next/static/chunks/app/hypotheses/[id]/page-8b167198d5f424c5.js +1 -0
- package/.next/static/chunks/app/hypotheses/page-6cc7b4601a539bea.js +1 -0
- package/.next/static/chunks/app/ideas/[id]/page-81711a4372b305f9.js +1 -0
- package/.next/static/chunks/app/layout-ae8acf4955ee5472.js +1 -0
- package/.next/static/chunks/app/page-556e21dc37b97c6c.js +1 -0
- package/.next/static/chunks/app/sessions/page-927c5bfba9cd960c.js +1 -0
- package/.next/static/chunks/app/settings/page-df97b2909593654e.js +1 -0
- package/.next/static/chunks/fd9d1056-2182e078483b259b.js +1 -0
- package/.next/static/chunks/framework-f66176bb897dc684.js +1 -0
- package/.next/static/chunks/main-2a63902ba6517d04.js +1 -0
- package/.next/static/chunks/main-app-f42d9aa726a818bf.js +1 -0
- package/.next/static/chunks/pages/_app-72b849fbd24ac258.js +1 -0
- package/.next/static/chunks/pages/_error-7ba65e1336b92748.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-a3c37fcbf859f6f9.js +1 -0
- package/.next/static/css/7a13622bd02f1f19.css +3 -0
- package/.next/static/lLze4mUD_L6YkNc9KSHpt/_buildManifest.js +1 -0
- package/.next/static/lLze4mUD_L6YkNc9KSHpt/_ssgManifest.js +1 -0
- package/LICENSE +8 -0
- package/README.md +115 -0
- package/dist/bin/vibebusiness.js +443 -0
- package/dist/scripts/analyze.js +1047 -0
- package/dist/scripts/generate-idea.js +327 -0
- package/dist/scripts/heartbeat.js +3562 -0
- package/dist/scripts/implement.js +639 -0
- package/dist/scripts/init.js +1083 -0
- package/package.json +71 -0
- package/templates/commands/build-page.md +129 -0
- package/templates/commands/growth-audit.md +85 -0
- package/templates/commands/manage.md +147 -0
- package/templates/commands/measure-page.md +89 -0
- package/templates/commands/positioning.md +128 -0
- package/templates/commands/pricing-analysis.md +91 -0
- package/templates/commands/research-competitors.md +124 -0
- package/templates/commands/status-summary.md +103 -0
- package/templates/commands/validate-idea.md +102 -0
|
@@ -0,0 +1,3562 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (let key of __getOwnPropNames(from))
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
+
}
|
|
14
|
+
return to;
|
|
15
|
+
};
|
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
|
|
25
|
+
// scripts/heartbeat.ts
|
|
26
|
+
var fs6 = __toESM(require("fs"));
|
|
27
|
+
var path6 = __toESM(require("path"));
|
|
28
|
+
var import_child_process3 = require("child_process");
|
|
29
|
+
|
|
30
|
+
// scripts/lib/api.ts
|
|
31
|
+
var API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8001";
|
|
32
|
+
var INTERNAL_API_KEY = process.env.INTERNAL_API_KEY;
|
|
33
|
+
async function apiRequest(endpoint, options = {}) {
|
|
34
|
+
const url = `${API_URL}${endpoint}`;
|
|
35
|
+
const headers = {
|
|
36
|
+
"Content-Type": "application/json",
|
|
37
|
+
...options.headers
|
|
38
|
+
};
|
|
39
|
+
if (INTERNAL_API_KEY) {
|
|
40
|
+
headers["X-Internal-API-Key"] = INTERNAL_API_KEY;
|
|
41
|
+
}
|
|
42
|
+
const response = await fetch(url, {
|
|
43
|
+
...options,
|
|
44
|
+
headers
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
const errorText = await response.text();
|
|
48
|
+
throw new Error(`API request failed: ${response.status} ${response.statusText} - ${errorText}`);
|
|
49
|
+
}
|
|
50
|
+
return response.json();
|
|
51
|
+
}
|
|
52
|
+
async function fetchLawyerSuccessKPIs(startDate, endDate) {
|
|
53
|
+
const params = new URLSearchParams();
|
|
54
|
+
if (startDate) {
|
|
55
|
+
params.append("start_date", startDate.toISOString());
|
|
56
|
+
}
|
|
57
|
+
if (endDate) {
|
|
58
|
+
params.append("end_date", endDate.toISOString());
|
|
59
|
+
}
|
|
60
|
+
const queryString = params.toString();
|
|
61
|
+
const endpoint = `/api/v1/analytics/internal/lawyer-success-kpis${queryString ? `?${queryString}` : ""}`;
|
|
62
|
+
return apiRequest(endpoint);
|
|
63
|
+
}
|
|
64
|
+
async function checkBackendHealth() {
|
|
65
|
+
try {
|
|
66
|
+
const response = await fetch(`${API_URL}/health`, { method: "GET" });
|
|
67
|
+
return response.ok;
|
|
68
|
+
} catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function hasInternalApiKey() {
|
|
73
|
+
return !!INTERNAL_API_KEY;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// src/lib/prompts.ts
|
|
77
|
+
function buildBaseContext(businessConfig) {
|
|
78
|
+
if (!businessConfig) {
|
|
79
|
+
return `You are an AI Business Analyst.
|
|
80
|
+
|
|
81
|
+
Your role is to analyze the codebase and generate actionable improvement ideas.`;
|
|
82
|
+
}
|
|
83
|
+
const { product } = businessConfig;
|
|
84
|
+
let architectureSection = "";
|
|
85
|
+
if (product.architecture && product.architecture.length > 0) {
|
|
86
|
+
const components = product.architecture.map((c, i) => {
|
|
87
|
+
const techLine = c.tech_stack.length > 0 ? `
|
|
88
|
+
Tech: ${c.tech_stack.join(", ")}` : "";
|
|
89
|
+
return `${i + 1}. **${c.name} (${c.repo_name})**: ${c.description}${techLine}`;
|
|
90
|
+
}).join("\n\n");
|
|
91
|
+
architectureSection = `
|
|
92
|
+
|
|
93
|
+
The product consists of:
|
|
94
|
+
${components}`;
|
|
95
|
+
}
|
|
96
|
+
return `You are an AI Business Analyst for ${product.name}, ${product.summary}.${architectureSection}
|
|
97
|
+
|
|
98
|
+
Your role is to analyze the codebase and generate actionable improvement ideas.`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// scripts/skills/content-marketing.ts
|
|
102
|
+
var import_child_process = require("child_process");
|
|
103
|
+
var fs = __toESM(require("fs"));
|
|
104
|
+
var CONTENT_TASK_PREFIX = "content-";
|
|
105
|
+
function isContentTask(taskId) {
|
|
106
|
+
return taskId.startsWith(CONTENT_TASK_PREFIX);
|
|
107
|
+
}
|
|
108
|
+
function extractActionKey(taskId) {
|
|
109
|
+
const withoutPrefix = taskId.replace(CONTENT_TASK_PREFIX, "");
|
|
110
|
+
const knownActions = [
|
|
111
|
+
"discover-keywords",
|
|
112
|
+
"track-rankings",
|
|
113
|
+
"analyze-gaps",
|
|
114
|
+
"generate-blog",
|
|
115
|
+
"generate-carousels",
|
|
116
|
+
"generate-nurture"
|
|
117
|
+
];
|
|
118
|
+
for (const action of knownActions) {
|
|
119
|
+
if (withoutPrefix.startsWith(action)) {
|
|
120
|
+
return action;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
function extractParams(description) {
|
|
126
|
+
const params = {};
|
|
127
|
+
const patterns = [
|
|
128
|
+
/seed[=: ]*"([^"]+)"/i,
|
|
129
|
+
/term[=: ]*"([^"]+)"/i,
|
|
130
|
+
/category[=: ]*"([^"]+)"/i,
|
|
131
|
+
/topic[=: ]*"([^"]+)"/i,
|
|
132
|
+
/keyword[=: ]*"([^"]+)"/i
|
|
133
|
+
];
|
|
134
|
+
for (const pattern of patterns) {
|
|
135
|
+
const match = description.match(pattern);
|
|
136
|
+
if (match) {
|
|
137
|
+
if (pattern.source.startsWith("seed")) params.seed = match[1];
|
|
138
|
+
else if (pattern.source.startsWith("term")) params.term = match[1];
|
|
139
|
+
else if (pattern.source.startsWith("category")) params.category = match[1];
|
|
140
|
+
else if (pattern.source.startsWith("topic")) params.topic = match[1];
|
|
141
|
+
else if (pattern.source.startsWith("keyword")) params.seed = match[1];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return params;
|
|
145
|
+
}
|
|
146
|
+
async function executeContentTask(taskId, description, contentflowConfig) {
|
|
147
|
+
const actionKey = extractActionKey(taskId);
|
|
148
|
+
if (!actionKey) {
|
|
149
|
+
return {
|
|
150
|
+
success: false,
|
|
151
|
+
output: `Unknown content action in task: ${taskId}`
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const repoPath = contentflowConfig?.repo_path;
|
|
155
|
+
if (!repoPath || !fs.existsSync(repoPath)) {
|
|
156
|
+
return {
|
|
157
|
+
success: false,
|
|
158
|
+
output: `ContentFlow repo not found at: ${repoPath || "(not configured)"}`
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const commandConfig = contentflowConfig?.commands?.[actionKey];
|
|
162
|
+
if (!commandConfig) {
|
|
163
|
+
return {
|
|
164
|
+
success: false,
|
|
165
|
+
output: `No command configured for action: ${actionKey}`
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
const params = extractParams(description);
|
|
169
|
+
const suffix = taskId.replace(CONTENT_TASK_PREFIX, "").replace(actionKey, "").replace(/^-/, "");
|
|
170
|
+
if (suffix && !params.seed && !params.term && !params.category && !params.topic) {
|
|
171
|
+
if (commandConfig.command.includes("{seed}")) params.seed = suffix;
|
|
172
|
+
else if (commandConfig.command.includes("{term}")) params.term = suffix;
|
|
173
|
+
else if (commandConfig.command.includes("{category}")) params.category = suffix;
|
|
174
|
+
else if (commandConfig.command.includes("{topic}")) params.topic = suffix;
|
|
175
|
+
}
|
|
176
|
+
let command = commandConfig.command;
|
|
177
|
+
for (const [key, value] of Object.entries(params)) {
|
|
178
|
+
command = command.replace(`{${key}}`, value);
|
|
179
|
+
}
|
|
180
|
+
command = command.replace(/\{[^}]+\}/g, "");
|
|
181
|
+
console.log(`[ContentFlow] Executing: ${command} in ${repoPath}`);
|
|
182
|
+
try {
|
|
183
|
+
const output = (0, import_child_process.execSync)(command, {
|
|
184
|
+
cwd: repoPath,
|
|
185
|
+
encoding: "utf-8",
|
|
186
|
+
timeout: 3e5,
|
|
187
|
+
// 5 minute timeout
|
|
188
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
189
|
+
});
|
|
190
|
+
return {
|
|
191
|
+
success: true,
|
|
192
|
+
output: output.slice(-2e3)
|
|
193
|
+
// Last 2000 chars
|
|
194
|
+
};
|
|
195
|
+
} catch (error) {
|
|
196
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
197
|
+
return {
|
|
198
|
+
success: false,
|
|
199
|
+
output: `ContentFlow command failed: ${errMsg.slice(-1e3)}`
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// scripts/skills/business-intelligence.ts
|
|
205
|
+
var import_child_process2 = require("child_process");
|
|
206
|
+
var fs3 = __toESM(require("fs"));
|
|
207
|
+
var path2 = __toESM(require("path"));
|
|
208
|
+
|
|
209
|
+
// scripts/lib/paths.ts
|
|
210
|
+
var path = __toESM(require("path"));
|
|
211
|
+
var fs2 = __toESM(require("fs"));
|
|
212
|
+
function findProjectRoot() {
|
|
213
|
+
const cwd = process.cwd();
|
|
214
|
+
if (fs2.existsSync(path.join(cwd, "data", "config.json"))) {
|
|
215
|
+
return cwd;
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const entries = fs2.readdirSync(cwd, { withFileTypes: true });
|
|
219
|
+
for (const entry of entries) {
|
|
220
|
+
if (entry.isDirectory()) {
|
|
221
|
+
const candidate = path.join(cwd, entry.name, "data", "config.json");
|
|
222
|
+
if (fs2.existsSync(candidate)) {
|
|
223
|
+
return path.join(cwd, entry.name);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
} catch {
|
|
228
|
+
}
|
|
229
|
+
let dir = cwd;
|
|
230
|
+
for (let i = 0; i < 5; i++) {
|
|
231
|
+
const parent = path.dirname(dir);
|
|
232
|
+
if (parent === dir) break;
|
|
233
|
+
if (fs2.existsSync(path.join(parent, "data", "config.json"))) {
|
|
234
|
+
return parent;
|
|
235
|
+
}
|
|
236
|
+
dir = parent;
|
|
237
|
+
}
|
|
238
|
+
return cwd;
|
|
239
|
+
}
|
|
240
|
+
var PROJECT_DIR = findProjectRoot();
|
|
241
|
+
var DATA_DIR = path.join(PROJECT_DIR, "data");
|
|
242
|
+
var STATUS_FILE = path.join(PROJECT_DIR, "STATUS.md");
|
|
243
|
+
var TODO_FILE = path.join(PROJECT_DIR, "TODO.md");
|
|
244
|
+
var MEMORY_FILE = path.join(PROJECT_DIR, "MEMORY.md");
|
|
245
|
+
var IDEAS_FILE = path.join(DATA_DIR, "ideas.json");
|
|
246
|
+
var GOALS_FILE = path.join(DATA_DIR, "goals.json");
|
|
247
|
+
var SESSIONS_FILE = path.join(DATA_DIR, "sessions.json");
|
|
248
|
+
var CONFIG_FILE = path.join(DATA_DIR, "config.json");
|
|
249
|
+
var BUSINESS_CONTEXT_FILE = path.join(DATA_DIR, "business-context.json");
|
|
250
|
+
var HYPOTHESES_FILE = path.join(DATA_DIR, "hypotheses.json");
|
|
251
|
+
var IMPLEMENTATIONS_FILE = path.join(DATA_DIR, "implementations.json");
|
|
252
|
+
var COMPETITORS_FILE = path.join(DATA_DIR, "competitors.json");
|
|
253
|
+
var POSITIONING_FILE = path.join(DATA_DIR, "positioning.json");
|
|
254
|
+
var PAGES_FILE = path.join(DATA_DIR, "pages.json");
|
|
255
|
+
var TEMPLATES_DIR = path.join(__dirname, "..", "..", "templates");
|
|
256
|
+
var COMMAND_TEMPLATES_DIR = path.join(TEMPLATES_DIR, "commands");
|
|
257
|
+
|
|
258
|
+
// scripts/skills/business-intelligence.ts
|
|
259
|
+
var BI_PREFIXES = [
|
|
260
|
+
"competitor-research",
|
|
261
|
+
"positioning-refresh",
|
|
262
|
+
"positioning-copy-bank",
|
|
263
|
+
"build-page-",
|
|
264
|
+
"measure-page-",
|
|
265
|
+
"growth-audit",
|
|
266
|
+
"pricing-analysis",
|
|
267
|
+
"validate-idea-"
|
|
268
|
+
];
|
|
269
|
+
function isBusinessIntelTask(taskId) {
|
|
270
|
+
return BI_PREFIXES.some((prefix) => taskId.startsWith(prefix));
|
|
271
|
+
}
|
|
272
|
+
function parseTaskToCommand(taskId, description) {
|
|
273
|
+
if (taskId === "competitor-research") {
|
|
274
|
+
return { command: "research-competitors", args: "" };
|
|
275
|
+
}
|
|
276
|
+
if (taskId === "competitor-research-discover") {
|
|
277
|
+
return { command: "research-competitors", args: "discover" };
|
|
278
|
+
}
|
|
279
|
+
if (taskId === "competitor-research-refresh") {
|
|
280
|
+
return { command: "research-competitors", args: "refresh" };
|
|
281
|
+
}
|
|
282
|
+
if (taskId.startsWith("competitor-research-")) {
|
|
283
|
+
const name = taskId.replace("competitor-research-", "");
|
|
284
|
+
return { command: "research-competitors", args: name };
|
|
285
|
+
}
|
|
286
|
+
if (taskId === "positioning-refresh") {
|
|
287
|
+
return { command: "positioning", args: "refresh" };
|
|
288
|
+
}
|
|
289
|
+
if (taskId === "positioning-copy-bank") {
|
|
290
|
+
return { command: "positioning", args: "copy-bank" };
|
|
291
|
+
}
|
|
292
|
+
if (taskId.startsWith("build-page-")) {
|
|
293
|
+
return { command: "build-page", args: description };
|
|
294
|
+
}
|
|
295
|
+
if (taskId.startsWith("measure-page-")) {
|
|
296
|
+
const slug = taskId.replace("measure-page-", "");
|
|
297
|
+
return { command: "measure-page", args: slug };
|
|
298
|
+
}
|
|
299
|
+
if (taskId === "growth-audit") {
|
|
300
|
+
return { command: "growth-audit", args: "" };
|
|
301
|
+
}
|
|
302
|
+
if (taskId.startsWith("growth-audit-")) {
|
|
303
|
+
const channel = taskId.replace("growth-audit-", "");
|
|
304
|
+
return { command: "growth-audit", args: channel };
|
|
305
|
+
}
|
|
306
|
+
if (taskId === "pricing-analysis") {
|
|
307
|
+
return { command: "pricing-analysis", args: "" };
|
|
308
|
+
}
|
|
309
|
+
if (taskId.startsWith("validate-idea-")) {
|
|
310
|
+
return { command: "validate-idea", args: description };
|
|
311
|
+
}
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
async function executeBusinessIntelTask(taskId, description, businessContext) {
|
|
315
|
+
const parsed = parseTaskToCommand(taskId, description);
|
|
316
|
+
if (!parsed) {
|
|
317
|
+
return {
|
|
318
|
+
success: false,
|
|
319
|
+
output: `Unknown business intelligence task: ${taskId}`
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
const { command, args: args2 } = parsed;
|
|
323
|
+
const commandFile = path2.join(PROJECT_DIR, ".claude", "commands", `${command}.md`);
|
|
324
|
+
if (!fs3.existsSync(commandFile)) {
|
|
325
|
+
return {
|
|
326
|
+
success: false,
|
|
327
|
+
output: `Slash command template not found: ${commandFile}. Run 'init' to scaffold commands.`
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
const template = fs3.readFileSync(commandFile, "utf-8");
|
|
331
|
+
const prompt = args2 ? `${template}
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
$ARGUMENTS: ${args2}
|
|
336
|
+
|
|
337
|
+
Execute this command now.` : `${template}
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
Execute this command now with no arguments (use defaults).`;
|
|
342
|
+
console.log(`[BusinessIntel] Executing: /${command} ${args2} (task: ${taskId})`);
|
|
343
|
+
try {
|
|
344
|
+
const result = (0, import_child_process2.spawnSync)("claude", [
|
|
345
|
+
"--print",
|
|
346
|
+
"--dangerously-skip-permissions",
|
|
347
|
+
"--allowedTools",
|
|
348
|
+
"Read Write Edit Bash Glob Grep WebSearch WebFetch"
|
|
349
|
+
], {
|
|
350
|
+
cwd: PROJECT_DIR,
|
|
351
|
+
input: prompt,
|
|
352
|
+
encoding: "utf-8",
|
|
353
|
+
timeout: 6e5,
|
|
354
|
+
// 10 minute timeout for web research tasks
|
|
355
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
356
|
+
env: process.env
|
|
357
|
+
});
|
|
358
|
+
if (result.status !== 0) {
|
|
359
|
+
const errorOutput = result.stderr || result.stdout || "Unknown error";
|
|
360
|
+
return {
|
|
361
|
+
success: false,
|
|
362
|
+
output: `Claude Code exited with code ${result.status}: ${errorOutput.slice(-1e3)}`
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
return {
|
|
366
|
+
success: true,
|
|
367
|
+
output: (result.stdout || "").slice(-2e3)
|
|
368
|
+
// Last 2000 chars
|
|
369
|
+
};
|
|
370
|
+
} catch (error) {
|
|
371
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
372
|
+
return {
|
|
373
|
+
success: false,
|
|
374
|
+
output: `Business intelligence task failed: ${errMsg.slice(-1e3)}`
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
function readBusinessIntelFreshness() {
|
|
379
|
+
const result = {
|
|
380
|
+
competitors: { count: 0, lastUpdated: null, staleDays: null },
|
|
381
|
+
positioning: { exists: false, lastUpdated: null, staleDays: null },
|
|
382
|
+
pages: { count: 0, livePagesWithoutMetrics: 0 }
|
|
383
|
+
};
|
|
384
|
+
if (fs3.existsSync(COMPETITORS_FILE)) {
|
|
385
|
+
try {
|
|
386
|
+
const data = JSON.parse(fs3.readFileSync(COMPETITORS_FILE, "utf-8"));
|
|
387
|
+
result.competitors.count = data.competitors?.length || 0;
|
|
388
|
+
result.competitors.lastUpdated = data.last_updated || null;
|
|
389
|
+
if (data.last_updated) {
|
|
390
|
+
const daysSince2 = Math.floor((Date.now() - new Date(data.last_updated).getTime()) / 864e5);
|
|
391
|
+
result.competitors.staleDays = daysSince2;
|
|
392
|
+
}
|
|
393
|
+
} catch {
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
if (fs3.existsSync(POSITIONING_FILE)) {
|
|
397
|
+
try {
|
|
398
|
+
const data = JSON.parse(fs3.readFileSync(POSITIONING_FILE, "utf-8"));
|
|
399
|
+
result.positioning.exists = !!data.current;
|
|
400
|
+
result.positioning.lastUpdated = data.last_updated || null;
|
|
401
|
+
if (data.last_updated) {
|
|
402
|
+
const daysSince2 = Math.floor((Date.now() - new Date(data.last_updated).getTime()) / 864e5);
|
|
403
|
+
result.positioning.staleDays = daysSince2;
|
|
404
|
+
}
|
|
405
|
+
} catch {
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
if (fs3.existsSync(PAGES_FILE)) {
|
|
409
|
+
try {
|
|
410
|
+
const data = JSON.parse(fs3.readFileSync(PAGES_FILE, "utf-8"));
|
|
411
|
+
result.pages.count = data.pages?.length || 0;
|
|
412
|
+
result.pages.livePagesWithoutMetrics = (data.pages || []).filter(
|
|
413
|
+
(p) => p.status === "live" && p.metrics.conversion_rate === null
|
|
414
|
+
).length;
|
|
415
|
+
} catch {
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return result;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// scripts/lib/run.ts
|
|
422
|
+
var path3 = __toESM(require("path"));
|
|
423
|
+
function resolveScript(baseDir, scriptName) {
|
|
424
|
+
const isCompiled = path3.extname(__filename) === ".js";
|
|
425
|
+
const resolvedName = isCompiled ? scriptName.replace(/\.ts$/, ".js") : scriptName;
|
|
426
|
+
const scriptPath = path3.join(baseDir, resolvedName);
|
|
427
|
+
return isCompiled ? { command: "node", args: [scriptPath] } : { command: "npx", args: ["tsx", scriptPath] };
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// scripts/lib/telemetry.ts
|
|
431
|
+
var fs4 = __toESM(require("fs"));
|
|
432
|
+
var path4 = __toESM(require("path"));
|
|
433
|
+
var CONFIG_DIR = path4.join(
|
|
434
|
+
process.env.HOME || process.env.USERPROFILE || "~",
|
|
435
|
+
".vibebusiness"
|
|
436
|
+
);
|
|
437
|
+
var TELEMETRY_CONFIG_FILE = path4.join(CONFIG_DIR, "telemetry.json");
|
|
438
|
+
var EVENTS_FILE = path4.join(CONFIG_DIR, "events.jsonl");
|
|
439
|
+
function getVersion() {
|
|
440
|
+
try {
|
|
441
|
+
let dir = __dirname;
|
|
442
|
+
for (let i = 0; i < 4; i++) {
|
|
443
|
+
const pkgPath = path4.join(dir, "package.json");
|
|
444
|
+
if (fs4.existsSync(pkgPath)) {
|
|
445
|
+
const pkg = JSON.parse(fs4.readFileSync(pkgPath, "utf-8"));
|
|
446
|
+
return pkg.version || "0.0.0";
|
|
447
|
+
}
|
|
448
|
+
dir = path4.dirname(dir);
|
|
449
|
+
}
|
|
450
|
+
} catch {
|
|
451
|
+
}
|
|
452
|
+
return "0.0.0";
|
|
453
|
+
}
|
|
454
|
+
function getTelemetryConfig() {
|
|
455
|
+
try {
|
|
456
|
+
if (!fs4.existsSync(TELEMETRY_CONFIG_FILE)) return null;
|
|
457
|
+
return JSON.parse(fs4.readFileSync(TELEMETRY_CONFIG_FILE, "utf-8"));
|
|
458
|
+
} catch {
|
|
459
|
+
return null;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
function isTelemetryEnabled() {
|
|
463
|
+
const config = getTelemetryConfig();
|
|
464
|
+
return config?.enabled === true;
|
|
465
|
+
}
|
|
466
|
+
function trackEvent(event, properties = {}) {
|
|
467
|
+
try {
|
|
468
|
+
if (!isTelemetryEnabled()) return;
|
|
469
|
+
const config = getTelemetryConfig();
|
|
470
|
+
if (!config) return;
|
|
471
|
+
const entry = {
|
|
472
|
+
event,
|
|
473
|
+
properties,
|
|
474
|
+
id: config.id,
|
|
475
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
476
|
+
version: getVersion()
|
|
477
|
+
};
|
|
478
|
+
fs4.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
479
|
+
fs4.appendFileSync(EVENTS_FILE, JSON.stringify(entry) + "\n");
|
|
480
|
+
} catch {
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// scripts/lib/scaffold.ts
|
|
485
|
+
var fs5 = __toESM(require("fs"));
|
|
486
|
+
var path5 = __toESM(require("path"));
|
|
487
|
+
function scaffoldSlashCommands(rootDir) {
|
|
488
|
+
let templatesDir = path5.join(__dirname, "..", "..", "templates", "commands");
|
|
489
|
+
if (!fs5.existsSync(templatesDir)) {
|
|
490
|
+
templatesDir = path5.join(__dirname, "..", "..", "..", "templates", "commands");
|
|
491
|
+
}
|
|
492
|
+
if (!fs5.existsSync(templatesDir)) return;
|
|
493
|
+
const targetDir = path5.join(rootDir, ".claude", "commands");
|
|
494
|
+
fs5.mkdirSync(targetDir, { recursive: true });
|
|
495
|
+
const templates = fs5.readdirSync(templatesDir).filter((f) => f.endsWith(".md"));
|
|
496
|
+
let copied = 0;
|
|
497
|
+
for (const file of templates) {
|
|
498
|
+
const src = path5.join(templatesDir, file);
|
|
499
|
+
const dest = path5.join(targetDir, file);
|
|
500
|
+
fs5.copyFileSync(src, dest);
|
|
501
|
+
copied++;
|
|
502
|
+
}
|
|
503
|
+
if (copied > 0) {
|
|
504
|
+
console.log(` \u2713 Scaffolded ${copied} slash commands into .claude/commands/`);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// scripts/heartbeat.ts
|
|
509
|
+
var ROOT_DIR = PROJECT_DIR;
|
|
510
|
+
var args = process.argv.slice(2);
|
|
511
|
+
var DRY_RUN = args.includes("--dry-run");
|
|
512
|
+
var SKIP_REASONING = args.includes("--skip-reasoning");
|
|
513
|
+
var SESSION_MODE = args.includes("--session");
|
|
514
|
+
var DURATION_MINUTES = parseInt(args.find((a) => a.startsWith("--duration="))?.split("=")[1] || "30");
|
|
515
|
+
var INTERVAL_MINUTES = parseInt(args.find((a) => a.startsWith("--interval="))?.split("=")[1] || "5");
|
|
516
|
+
var HEARTBEAT_COUNT = parseInt(args.find((a) => a.startsWith("--count="))?.split("=")[1] || "0");
|
|
517
|
+
var capturedLogs = [];
|
|
518
|
+
var isCapturingLogs = false;
|
|
519
|
+
function log(message) {
|
|
520
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
521
|
+
const logLine = `[${timestamp}] ${message}`;
|
|
522
|
+
console.log(logLine);
|
|
523
|
+
if (isCapturingLogs) {
|
|
524
|
+
capturedLogs.push(logLine);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
function sleep(ms) {
|
|
528
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
529
|
+
}
|
|
530
|
+
function loadJson(filePath, defaultValue) {
|
|
531
|
+
try {
|
|
532
|
+
const content = fs6.readFileSync(filePath, "utf-8");
|
|
533
|
+
return JSON.parse(content);
|
|
534
|
+
} catch {
|
|
535
|
+
return defaultValue;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
function saveJson(filePath, data) {
|
|
539
|
+
fs6.writeFileSync(filePath, JSON.stringify(data, null, 2));
|
|
540
|
+
}
|
|
541
|
+
function parseTodoFile() {
|
|
542
|
+
try {
|
|
543
|
+
const content = fs6.readFileSync(TODO_FILE, "utf-8");
|
|
544
|
+
const tasks = [];
|
|
545
|
+
let currentSection = "high_priority";
|
|
546
|
+
const lines = content.split("\n");
|
|
547
|
+
for (const line of lines) {
|
|
548
|
+
if (line.includes("## High Priority")) {
|
|
549
|
+
currentSection = "high_priority";
|
|
550
|
+
} else if (line.includes("## Scheduled")) {
|
|
551
|
+
currentSection = "scheduled";
|
|
552
|
+
} else if (line.includes("## Blocked")) {
|
|
553
|
+
currentSection = "blocked";
|
|
554
|
+
} else if (line.includes("## Completed")) {
|
|
555
|
+
currentSection = "completed";
|
|
556
|
+
}
|
|
557
|
+
const taskMatch = line.match(/^- \[([ x])\] `([^`]+)` — (.+)$/);
|
|
558
|
+
if (taskMatch) {
|
|
559
|
+
tasks.push({
|
|
560
|
+
id: taskMatch[2],
|
|
561
|
+
description: taskMatch[3],
|
|
562
|
+
completed: taskMatch[1] === "x",
|
|
563
|
+
section: currentSection
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
return tasks;
|
|
568
|
+
} catch {
|
|
569
|
+
return [];
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
function loadState() {
|
|
573
|
+
const ideasData = loadJson(IDEAS_FILE, { ideas: [] });
|
|
574
|
+
const goalsData = loadJson(GOALS_FILE, { goals: [] });
|
|
575
|
+
const sessionsData = loadJson(SESSIONS_FILE, { sessions: [] });
|
|
576
|
+
const todos = parseTodoFile();
|
|
577
|
+
return {
|
|
578
|
+
ideas: ideasData.ideas || [],
|
|
579
|
+
goals: goalsData.goals || [],
|
|
580
|
+
sessions: sessionsData.sessions || [],
|
|
581
|
+
todos
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
var DEFAULT_BUSINESS_CONTEXT = {
|
|
585
|
+
last_manual_update: (/* @__PURE__ */ new Date()).toISOString().split("T")[0],
|
|
586
|
+
last_auto_update: null,
|
|
587
|
+
product: { name: process.env.NEXT_PUBLIC_PRODUCT_NAME || "My Product", summary: "" },
|
|
588
|
+
funnels: [],
|
|
589
|
+
monetization: {
|
|
590
|
+
current_mrr: 0,
|
|
591
|
+
paying_lawyers: 0,
|
|
592
|
+
immediate_opportunity: "",
|
|
593
|
+
revenue_streams: []
|
|
594
|
+
},
|
|
595
|
+
funnel_stages: { description: "", stages: {} },
|
|
596
|
+
key_constraints: []
|
|
597
|
+
};
|
|
598
|
+
function loadBusinessContext() {
|
|
599
|
+
return loadJson(BUSINESS_CONTEXT_FILE, DEFAULT_BUSINESS_CONTEXT);
|
|
600
|
+
}
|
|
601
|
+
function updateBusinessContext(ctx, kpis) {
|
|
602
|
+
const marketplace = ctx.funnels.find((f) => f.id === "marketplace");
|
|
603
|
+
if (marketplace) {
|
|
604
|
+
marketplace.metrics = {
|
|
605
|
+
leads_per_lawyer_per_week: kpis.leads_per_lawyer_per_week ?? 0,
|
|
606
|
+
total_active_lawyers: kpis.total_active_lawyers ?? 0
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
updateFunnelStageStatuses(ctx, kpis);
|
|
610
|
+
ctx.last_auto_update = (/* @__PURE__ */ new Date()).toISOString();
|
|
611
|
+
saveJson(BUSINESS_CONTEXT_FILE, ctx);
|
|
612
|
+
}
|
|
613
|
+
function checkThreshold(threshold, kpiValue) {
|
|
614
|
+
if (kpiValue === null || kpiValue === void 0) return false;
|
|
615
|
+
if (threshold.operator === "gte") return kpiValue >= threshold.value;
|
|
616
|
+
if (threshold.operator === "lte") return kpiValue <= threshold.value;
|
|
617
|
+
return false;
|
|
618
|
+
}
|
|
619
|
+
function getKpiValueById(kpiId, kpis) {
|
|
620
|
+
const mapping = {
|
|
621
|
+
"kpi-001": kpis.first_response_rate,
|
|
622
|
+
"kpi-002": kpis.avg_response_time_hours,
|
|
623
|
+
"kpi-003": kpis.conversation_rate,
|
|
624
|
+
"kpi-004": kpis.contract_rate,
|
|
625
|
+
"kpi-005": kpis.leads_per_lawyer_per_week
|
|
626
|
+
};
|
|
627
|
+
return mapping[kpiId] ?? null;
|
|
628
|
+
}
|
|
629
|
+
function updateFunnelStageStatuses(ctx, kpis) {
|
|
630
|
+
for (const [, stage] of Object.entries(ctx.funnel_stages.stages)) {
|
|
631
|
+
const thresholds = [];
|
|
632
|
+
if (stage.healthy_threshold) thresholds.push(stage.healthy_threshold);
|
|
633
|
+
if (stage.healthy_thresholds) thresholds.push(...stage.healthy_thresholds);
|
|
634
|
+
if (thresholds.length === 0) {
|
|
635
|
+
continue;
|
|
636
|
+
}
|
|
637
|
+
const allMet = thresholds.every((t) => {
|
|
638
|
+
const val = getKpiValueById(t.kpi_id, kpis);
|
|
639
|
+
return checkThreshold(t, val);
|
|
640
|
+
});
|
|
641
|
+
const anyHaveData = thresholds.some((t) => {
|
|
642
|
+
const val = getKpiValueById(t.kpi_id, kpis);
|
|
643
|
+
return val !== null && val !== void 0;
|
|
644
|
+
});
|
|
645
|
+
if (!anyHaveData) {
|
|
646
|
+
stage.current_status = "not_started";
|
|
647
|
+
} else {
|
|
648
|
+
stage.current_status = allMet ? "healthy" : "broken";
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
var FUNNEL_STAGE_ORDER = ["acquisition", "engagement", "conversion", "monetization"];
|
|
653
|
+
function computeFunnelHealth(ctx, goals) {
|
|
654
|
+
const stages = ctx.funnel_stages.stages;
|
|
655
|
+
let earliestBroken = null;
|
|
656
|
+
const health = {};
|
|
657
|
+
for (const stageName of FUNNEL_STAGE_ORDER) {
|
|
658
|
+
const stage = stages[stageName];
|
|
659
|
+
if (!stage) continue;
|
|
660
|
+
health[stageName] = {
|
|
661
|
+
status: stage.current_status,
|
|
662
|
+
question: stage.question
|
|
663
|
+
};
|
|
664
|
+
if (!earliestBroken && stage.current_status === "broken") {
|
|
665
|
+
earliestBroken = stageName;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
return {
|
|
669
|
+
...health,
|
|
670
|
+
earliest_broken_stage: earliestBroken
|
|
671
|
+
};
|
|
672
|
+
}
|
|
673
|
+
function evaluatePrerequisites(prerequisites, goals) {
|
|
674
|
+
const kpiValues = {};
|
|
675
|
+
for (const goal of goals) {
|
|
676
|
+
for (const kpi of goal.kpis) {
|
|
677
|
+
kpiValues[kpi.id] = kpi.current_value;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
return prerequisites.conditions.every((condition) => {
|
|
681
|
+
const val = kpiValues[condition.kpi_id];
|
|
682
|
+
return checkThreshold(condition, val);
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
function daysSince(dateString) {
|
|
686
|
+
const date = new Date(dateString);
|
|
687
|
+
const now = /* @__PURE__ */ new Date();
|
|
688
|
+
const diffTime = Math.abs(now.getTime() - date.getTime());
|
|
689
|
+
return Math.floor(diffTime / (1e3 * 60 * 60 * 24));
|
|
690
|
+
}
|
|
691
|
+
function formatDate(date) {
|
|
692
|
+
return date.toISOString().split("T")[0];
|
|
693
|
+
}
|
|
694
|
+
function formatDateTime(date) {
|
|
695
|
+
return date.toISOString();
|
|
696
|
+
}
|
|
697
|
+
function captureGitDiffInfo(workspacePath) {
|
|
698
|
+
const result = {
|
|
699
|
+
files_changed: [],
|
|
700
|
+
lines_added: 0,
|
|
701
|
+
lines_removed: 0,
|
|
702
|
+
has_uncommitted_changes: false
|
|
703
|
+
};
|
|
704
|
+
try {
|
|
705
|
+
const status = (0, import_child_process3.execSync)("git status --porcelain", { cwd: workspacePath, encoding: "utf-8" });
|
|
706
|
+
result.has_uncommitted_changes = status.trim().length > 0;
|
|
707
|
+
try {
|
|
708
|
+
const diffStat = (0, import_child_process3.execSync)("git diff --stat HEAD~1 HEAD 2>/dev/null || git diff --stat --cached 2>/dev/null || git diff --stat 2>/dev/null", {
|
|
709
|
+
cwd: workspacePath,
|
|
710
|
+
encoding: "utf-8",
|
|
711
|
+
shell: "/bin/bash"
|
|
712
|
+
});
|
|
713
|
+
const lines = diffStat.trim().split("\n");
|
|
714
|
+
for (const line of lines) {
|
|
715
|
+
const fileMatch = line.match(/^\s*(.+?)\s+\|\s+\d+/);
|
|
716
|
+
if (fileMatch) {
|
|
717
|
+
result.files_changed.push(fileMatch[1].trim());
|
|
718
|
+
}
|
|
719
|
+
const summaryMatch = line.match(/(\d+) insertion[s]?\(\+\)/);
|
|
720
|
+
const deletionsMatch = line.match(/(\d+) deletion[s]?\(-\)/);
|
|
721
|
+
if (summaryMatch) {
|
|
722
|
+
result.lines_added = parseInt(summaryMatch[1], 10);
|
|
723
|
+
}
|
|
724
|
+
if (deletionsMatch) {
|
|
725
|
+
result.lines_removed = parseInt(deletionsMatch[1], 10);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
} catch {
|
|
729
|
+
if (status.trim()) {
|
|
730
|
+
const statusLines = status.trim().split("\n");
|
|
731
|
+
for (const line of statusLines) {
|
|
732
|
+
const parts = line.trim().split(/\s+/);
|
|
733
|
+
if (parts.length >= 2) {
|
|
734
|
+
result.files_changed.push(parts.slice(1).join(" "));
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
} catch (error) {
|
|
740
|
+
log(`Failed to capture git diff info: ${error instanceof Error ? error.message : "Unknown"}`);
|
|
741
|
+
}
|
|
742
|
+
return result;
|
|
743
|
+
}
|
|
744
|
+
function checkAlerts(state) {
|
|
745
|
+
const alerts = [];
|
|
746
|
+
const inboxIdeas = state.ideas.filter((i) => i.stage === "inbox");
|
|
747
|
+
for (const idea of inboxIdeas) {
|
|
748
|
+
const days = daysSince(idea.created_at);
|
|
749
|
+
if (days > 7) {
|
|
750
|
+
alerts.push(`Idea "${idea.title}" has been in inbox for ${days} days`);
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
const inProgressIdeas = state.ideas.filter((i) => i.stage === "in_progress");
|
|
754
|
+
for (const idea of inProgressIdeas) {
|
|
755
|
+
const days = daysSince(idea.updated_at);
|
|
756
|
+
if (days > 14) {
|
|
757
|
+
alerts.push(`Idea "${idea.title}" has been in progress for ${days} days`);
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
for (const goal of state.goals) {
|
|
761
|
+
if (goal.status === "at_risk") {
|
|
762
|
+
alerts.push(`Goal "${goal.title}" is at risk`);
|
|
763
|
+
} else if (goal.status === "behind") {
|
|
764
|
+
alerts.push(`Goal "${goal.title}" is behind schedule`);
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
const shippedIdeas = state.ideas.filter((i) => i.stage === "shipped");
|
|
768
|
+
for (const idea of shippedIdeas) {
|
|
769
|
+
const daysShipped = daysSince(idea.implementation?.completed_at || idea.updated_at);
|
|
770
|
+
const v = idea.verification;
|
|
771
|
+
if (daysShipped > 7 && (!v || v.evaluation_count === 0)) {
|
|
772
|
+
alerts.push(`Shipped idea "${idea.title}" has never been evaluated (${daysShipped} days since ship)`);
|
|
773
|
+
}
|
|
774
|
+
if (v?.status === "needs_investigation") {
|
|
775
|
+
alerts.push(`Shipped idea "${idea.title}" needs investigation \u2014 metrics not met`);
|
|
776
|
+
}
|
|
777
|
+
if (v?.requires_human_review) {
|
|
778
|
+
alerts.push(`Shipped idea "${idea.title}" requires human review: ${v.human_review_reason || "unspecified reason"}`);
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
for (const goal of state.goals) {
|
|
782
|
+
for (const kpi of goal.kpis) {
|
|
783
|
+
if (kpi.history.length > 0) {
|
|
784
|
+
const lastEntry = kpi.history[kpi.history.length - 1];
|
|
785
|
+
const days = daysSince(lastEntry.date);
|
|
786
|
+
if (days > 7) {
|
|
787
|
+
alerts.push(`KPI "${kpi.name}" hasn't been updated in ${days} days`);
|
|
788
|
+
}
|
|
789
|
+
} else if (kpi.current_value === null) {
|
|
790
|
+
alerts.push(`KPI "${kpi.name}" has never been measured`);
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
return alerts;
|
|
795
|
+
}
|
|
796
|
+
async function fetchLiveKPIs() {
|
|
797
|
+
try {
|
|
798
|
+
if (!hasInternalApiKey()) {
|
|
799
|
+
log("No INTERNAL_API_KEY configured, skipping KPI fetch");
|
|
800
|
+
return null;
|
|
801
|
+
}
|
|
802
|
+
log("Fetching live KPIs from backend...");
|
|
803
|
+
const isHealthy = await checkBackendHealth();
|
|
804
|
+
if (!isHealthy) {
|
|
805
|
+
log("Backend not reachable, skipping KPI fetch");
|
|
806
|
+
return null;
|
|
807
|
+
}
|
|
808
|
+
const endDate = /* @__PURE__ */ new Date();
|
|
809
|
+
const startDate = /* @__PURE__ */ new Date();
|
|
810
|
+
startDate.setDate(startDate.getDate() - 30);
|
|
811
|
+
const kpis = await fetchLawyerSuccessKPIs(startDate, endDate);
|
|
812
|
+
log(`Fetched KPIs: first_response_rate=${kpis.first_response_rate}, contract_rate=${kpis.contract_rate}`);
|
|
813
|
+
return kpis;
|
|
814
|
+
} catch (error) {
|
|
815
|
+
log(`Failed to fetch KPIs: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
816
|
+
return null;
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
function updateGoalsWithKPIs(kpis) {
|
|
820
|
+
const goalsData = loadJson(GOALS_FILE, { goals: [] });
|
|
821
|
+
const today = formatDate(/* @__PURE__ */ new Date());
|
|
822
|
+
const lawyerSuccessGoal = goalsData.goals.find((g) => g.id === "goal-001");
|
|
823
|
+
if (!lawyerSuccessGoal) {
|
|
824
|
+
log("Lawyer Success goal (goal-001) not found");
|
|
825
|
+
return;
|
|
826
|
+
}
|
|
827
|
+
const kpiMapping = {
|
|
828
|
+
"kpi-001": "first_response_rate",
|
|
829
|
+
"kpi-002": "avg_response_time_hours",
|
|
830
|
+
"kpi-003": "conversation_rate",
|
|
831
|
+
"kpi-004": "contract_rate",
|
|
832
|
+
"kpi-005": "leads_per_lawyer_per_week"
|
|
833
|
+
};
|
|
834
|
+
for (const kpi of lawyerSuccessGoal.kpis) {
|
|
835
|
+
const apiKey = kpiMapping[kpi.id];
|
|
836
|
+
if (apiKey && kpis[apiKey] !== null && kpis[apiKey] !== void 0) {
|
|
837
|
+
let value = kpis[apiKey];
|
|
838
|
+
if (["first_response_rate", "conversation_rate", "contract_rate"].includes(apiKey)) {
|
|
839
|
+
value = value * 100;
|
|
840
|
+
}
|
|
841
|
+
value = Math.round(value * 100) / 100;
|
|
842
|
+
kpi.current_value = value;
|
|
843
|
+
const existingEntry = kpi.history.find((h) => h.date === today);
|
|
844
|
+
if (existingEntry) {
|
|
845
|
+
existingEntry.value = value;
|
|
846
|
+
} else {
|
|
847
|
+
kpi.history.push({ date: today, value });
|
|
848
|
+
if (kpi.history.length > 90) {
|
|
849
|
+
kpi.history = kpi.history.slice(-90);
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
log(`Updated KPI "${kpi.name}": ${value}${kpi.unit}`);
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
const contractRateKPI = lawyerSuccessGoal.kpis.find((k) => k.id === "kpi-004");
|
|
856
|
+
if (contractRateKPI && contractRateKPI.current_value !== null) {
|
|
857
|
+
lawyerSuccessGoal.current_value = contractRateKPI.current_value;
|
|
858
|
+
}
|
|
859
|
+
if (lawyerSuccessGoal.current_value !== null) {
|
|
860
|
+
const progress = lawyerSuccessGoal.current_value / lawyerSuccessGoal.target_value;
|
|
861
|
+
if (progress >= 0.9) {
|
|
862
|
+
lawyerSuccessGoal.status = "on_track";
|
|
863
|
+
} else if (progress >= 0.6) {
|
|
864
|
+
lawyerSuccessGoal.status = "at_risk";
|
|
865
|
+
} else {
|
|
866
|
+
lawyerSuccessGoal.status = "behind";
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
saveJson(GOALS_FILE, goalsData);
|
|
870
|
+
log("Updated goals.json with live KPIs");
|
|
871
|
+
}
|
|
872
|
+
function loadCodebaseSnapshot() {
|
|
873
|
+
const snapshotPath = path6.join(DATA_DIR, "codebase-snapshot.json");
|
|
874
|
+
try {
|
|
875
|
+
if (fs6.existsSync(snapshotPath)) {
|
|
876
|
+
return JSON.parse(fs6.readFileSync(snapshotPath, "utf-8"));
|
|
877
|
+
}
|
|
878
|
+
} catch {
|
|
879
|
+
}
|
|
880
|
+
return null;
|
|
881
|
+
}
|
|
882
|
+
function buildContextForClaude(state, alerts, businessContext) {
|
|
883
|
+
const codebaseSnapshot = loadCodebaseSnapshot();
|
|
884
|
+
return {
|
|
885
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
886
|
+
alerts,
|
|
887
|
+
codebase_context: codebaseSnapshot,
|
|
888
|
+
business_context: businessContext ? {
|
|
889
|
+
funnels: businessContext.funnels.map((f) => ({
|
|
890
|
+
id: f.id,
|
|
891
|
+
name: f.name,
|
|
892
|
+
status: f.status,
|
|
893
|
+
key_insight: f.key_insight,
|
|
894
|
+
metrics: f.metrics
|
|
895
|
+
})),
|
|
896
|
+
monetization: {
|
|
897
|
+
current_mrr: businessContext.monetization.current_mrr,
|
|
898
|
+
paying_lawyers: businessContext.monetization.paying_lawyers,
|
|
899
|
+
immediate_opportunity: businessContext.monetization.immediate_opportunity,
|
|
900
|
+
revenue_streams: businessContext.monetization.revenue_streams
|
|
901
|
+
},
|
|
902
|
+
key_constraints: businessContext.key_constraints
|
|
903
|
+
} : null,
|
|
904
|
+
funnel_health: businessContext ? computeFunnelHealth(businessContext, state.goals) : null,
|
|
905
|
+
hypotheses: (loadJson(HYPOTHESES_FILE, { hypotheses: [] }).hypotheses || []).map((h) => ({
|
|
906
|
+
id: h.id,
|
|
907
|
+
title: h.title,
|
|
908
|
+
statement: h.statement,
|
|
909
|
+
funnel_stage: h.funnel_stage,
|
|
910
|
+
priority: h.priority,
|
|
911
|
+
status: h.status,
|
|
912
|
+
validation_ideas: h.validation_ideas,
|
|
913
|
+
effort_to_test: h.effort_to_test
|
|
914
|
+
})),
|
|
915
|
+
goals: state.goals.map((g) => ({
|
|
916
|
+
id: g.id,
|
|
917
|
+
title: g.title,
|
|
918
|
+
status: g.status,
|
|
919
|
+
current_value: g.current_value,
|
|
920
|
+
target_value: g.target_value,
|
|
921
|
+
target_unit: g.target_unit,
|
|
922
|
+
kpis: g.kpis.map((k) => ({
|
|
923
|
+
name: k.name,
|
|
924
|
+
current_value: k.current_value,
|
|
925
|
+
target_value: k.target_value,
|
|
926
|
+
unit: k.unit,
|
|
927
|
+
direction: k.direction,
|
|
928
|
+
last_updated: k.history.length > 0 ? k.history[k.history.length - 1].date : null
|
|
929
|
+
}))
|
|
930
|
+
})),
|
|
931
|
+
ideas: {
|
|
932
|
+
inbox: state.ideas.filter((i) => i.stage === "inbox").map((i) => ({
|
|
933
|
+
id: i.id,
|
|
934
|
+
title: i.title,
|
|
935
|
+
days_in_inbox: daysSince(i.created_at),
|
|
936
|
+
prerequisites_met: i.prerequisites ? evaluatePrerequisites(i.prerequisites, state.goals) : null,
|
|
937
|
+
funnel_stage: i.prerequisites?.funnel_stage ?? null,
|
|
938
|
+
prerequisites_summary: i.prerequisites?.description ?? null
|
|
939
|
+
})),
|
|
940
|
+
approved: state.ideas.filter((i) => i.stage === "approved").map((i) => ({
|
|
941
|
+
id: i.id,
|
|
942
|
+
title: i.title,
|
|
943
|
+
category: i.category,
|
|
944
|
+
days_since_approval: daysSince(i.updated_at)
|
|
945
|
+
})),
|
|
946
|
+
in_progress: state.ideas.filter((i) => i.stage === "in_progress").map((i) => {
|
|
947
|
+
const subTasks = i.implementation.sub_tasks || [];
|
|
948
|
+
const completed = subTasks.filter((st) => st.status === "completed").length;
|
|
949
|
+
const failed = subTasks.filter((st) => st.status === "failed").length;
|
|
950
|
+
return {
|
|
951
|
+
id: i.id,
|
|
952
|
+
title: i.title,
|
|
953
|
+
days_in_progress: daysSince(i.updated_at),
|
|
954
|
+
branch: i.implementation.branch_name,
|
|
955
|
+
sub_task_progress: subTasks.length > 0 ? `${completed}/${subTasks.length} done${failed > 0 ? `, ${failed} failed` : ""}` : null
|
|
956
|
+
};
|
|
957
|
+
}),
|
|
958
|
+
shipped: state.ideas.filter((i) => i.stage === "shipped").map((i) => ({
|
|
959
|
+
id: i.id,
|
|
960
|
+
title: i.title,
|
|
961
|
+
days_since_shipped: daysSince(i.implementation?.completed_at || i.updated_at),
|
|
962
|
+
goal_id: i.goal_id || null,
|
|
963
|
+
success_metrics: i.success_metrics,
|
|
964
|
+
verification_status: i.verification?.status || "pending",
|
|
965
|
+
last_evaluated: i.verification?.last_evaluated_at || null,
|
|
966
|
+
ready_for_evaluation: !i.verification?.next_evaluation_after || new Date(i.verification.next_evaluation_after) <= /* @__PURE__ */ new Date()
|
|
967
|
+
})),
|
|
968
|
+
total_count: state.ideas.length
|
|
969
|
+
},
|
|
970
|
+
todos: {
|
|
971
|
+
high_priority: state.todos.filter((t) => t.section === "high_priority" && !t.completed),
|
|
972
|
+
scheduled: state.todos.filter((t) => t.section === "scheduled"),
|
|
973
|
+
blocked: state.todos.filter((t) => t.section === "blocked")
|
|
974
|
+
},
|
|
975
|
+
live_data: state.liveData ? {
|
|
976
|
+
backend_healthy: state.liveData.backendHealthy,
|
|
977
|
+
kpis: state.liveData.kpis ? {
|
|
978
|
+
first_response_rate: state.liveData.kpis.first_response_rate,
|
|
979
|
+
avg_response_time_hours: state.liveData.kpis.avg_response_time_hours,
|
|
980
|
+
conversation_rate: state.liveData.kpis.conversation_rate,
|
|
981
|
+
contract_rate: state.liveData.kpis.contract_rate,
|
|
982
|
+
leads_per_lawyer_per_week: state.liveData.kpis.leads_per_lawyer_per_week,
|
|
983
|
+
total_leads: state.liveData.kpis.total_leads,
|
|
984
|
+
total_active_lawyers: state.liveData.kpis.total_active_lawyers
|
|
985
|
+
} : null
|
|
986
|
+
} : null,
|
|
987
|
+
recent_sessions: state.sessions.slice(-5).map((s) => ({
|
|
988
|
+
type: s.type,
|
|
989
|
+
status: s.status,
|
|
990
|
+
date: s.completed_at || s.created_at,
|
|
991
|
+
ideas_generated: s.ideas_generated.length
|
|
992
|
+
})),
|
|
993
|
+
business_intelligence: readBusinessIntelFreshness()
|
|
994
|
+
};
|
|
995
|
+
}
|
|
996
|
+
function buildBusinessConstraints(businessContext) {
|
|
997
|
+
if (!businessContext) {
|
|
998
|
+
return `BUSINESS CONTEXT:
|
|
999
|
+
No business context configured yet. Focus on competitor research and foundational setup.`;
|
|
1000
|
+
}
|
|
1001
|
+
const lines = ["BUSINESS CONTEXT:"];
|
|
1002
|
+
const productName = businessContext.product?.name || "Unknown product";
|
|
1003
|
+
const productSummary = businessContext.product?.summary || "";
|
|
1004
|
+
lines.push(`Product: ${productName}${productSummary ? ` \u2014 ${productSummary}` : ""}`);
|
|
1005
|
+
if (businessContext.funnels?.length > 0) {
|
|
1006
|
+
const funnelSummaries = businessContext.funnels.map((f) => {
|
|
1007
|
+
const parts = [f.name];
|
|
1008
|
+
if (f.status) parts.push(`(${f.status})`);
|
|
1009
|
+
if (f.active_lawyers?.length) parts.push(`\u2014 ${f.active_lawyers.length} active lawyers`);
|
|
1010
|
+
return parts.join(" ");
|
|
1011
|
+
});
|
|
1012
|
+
lines.push(`Funnels: ${funnelSummaries.join("; ")}`);
|
|
1013
|
+
}
|
|
1014
|
+
if (businessContext.monetization) {
|
|
1015
|
+
const m = businessContext.monetization;
|
|
1016
|
+
const parts = [];
|
|
1017
|
+
if (m.current_mrr !== void 0) parts.push(`MRR: R$${m.current_mrr}`);
|
|
1018
|
+
if (m.paying_lawyers !== void 0) parts.push(`${m.paying_lawyers} paying lawyers`);
|
|
1019
|
+
if (m.revenue_streams?.length > 0) {
|
|
1020
|
+
const streams = m.revenue_streams.map((s) => `${s.name} (${s.status})`).join(", ");
|
|
1021
|
+
parts.push(`streams: ${streams}`);
|
|
1022
|
+
}
|
|
1023
|
+
if (m.immediate_opportunity) parts.push(`opportunity: ${m.immediate_opportunity}`);
|
|
1024
|
+
if (parts.length > 0) lines.push(`Monetization: ${parts.join(", ")}`);
|
|
1025
|
+
}
|
|
1026
|
+
if (businessContext.key_constraints?.length > 0) {
|
|
1027
|
+
lines.push("");
|
|
1028
|
+
lines.push("KEY CONSTRAINTS (from business-context.json):");
|
|
1029
|
+
for (const c of businessContext.key_constraints) {
|
|
1030
|
+
lines.push(`- ${c}`);
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
if ((businessContext.regulatory?.length ?? 0) > 0) {
|
|
1034
|
+
lines.push("");
|
|
1035
|
+
lines.push("REGULATORY:");
|
|
1036
|
+
for (const r of businessContext.regulatory) {
|
|
1037
|
+
lines.push(`- ${r}`);
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
return lines.join("\n");
|
|
1041
|
+
}
|
|
1042
|
+
async function runClaudeReasoning(state, alerts, businessContext) {
|
|
1043
|
+
const context = buildContextForClaude(state, alerts, businessContext);
|
|
1044
|
+
const TIMEOUT_MS = 12e4;
|
|
1045
|
+
const productName = businessContext?.product?.name || process.env.NEXT_PUBLIC_PRODUCT_NAME || "this product";
|
|
1046
|
+
const productSummary = businessContext?.product?.summary ? `, ${businessContext.product.summary}` : "";
|
|
1047
|
+
const prompt = `You are the AI Business Analyst for ${productName}${productSummary}.
|
|
1048
|
+
|
|
1049
|
+
CURRENT STATE:
|
|
1050
|
+
${JSON.stringify(context, null, 2)}
|
|
1051
|
+
|
|
1052
|
+
Your job is to analyze this state and recommend the next action. Consider:
|
|
1053
|
+
1. Are there critical alerts that need immediate attention?
|
|
1054
|
+
2. Are KPIs trending in the right direction?
|
|
1055
|
+
3. Are there ideas stuck that need to be moved forward?
|
|
1056
|
+
4. What should be prioritized next?
|
|
1057
|
+
5. Are there approved ideas ready for autonomous implementation? If so, recommend task_id "implement-{ideaId}" to trigger it.
|
|
1058
|
+
6. Are there in_progress ideas with sub-tasks? Check their progress.
|
|
1059
|
+
|
|
1060
|
+
DATA FRESHNESS CHECK:
|
|
1061
|
+
Before acting on any TODO or idea description, verify its assumptions against live_data:
|
|
1062
|
+
- If a TODO references a specific KPI value (e.g., "-27.17h", "86.34h") that differs from the current live_data.kpis value, the TODO's assumption is STALE
|
|
1063
|
+
- If an idea's motivation is to "fix" a metric that live_data shows is already at a reasonable (non-negative, non-zero) value, deprioritize it
|
|
1064
|
+
- When you detect stale assumptions, recommend a meta-task to update the TODO/idea descriptions rather than implementing the stale fix
|
|
1065
|
+
- Learnings in MEMORY that reference specific numbers should be validated against live_data before acting on them
|
|
1066
|
+
|
|
1067
|
+
IMPLEMENTATION TASKS:
|
|
1068
|
+
- To trigger autonomous implementation of an approved idea, use task_id format: "implement-{ideaId}"
|
|
1069
|
+
Example: "implement-idea-abc123"
|
|
1070
|
+
- The system will decompose the idea into sub-tasks, execute them one at a time, run tests, and create a PR
|
|
1071
|
+
- Only recommend implementation for ideas in "approved" stage
|
|
1072
|
+
|
|
1073
|
+
META-TASKS:
|
|
1074
|
+
- You can recommend ANY task_id for operations on the analyst's own data files
|
|
1075
|
+
- The system will execute your task using Claude Code with access to: TODO.md, MEMORY.md, data/ideas.json, data/goals.json
|
|
1076
|
+
- Examples of valid meta-tasks:
|
|
1077
|
+
- "consolidate-todos" \u2014 Clean up duplicate/completed items in TODO.md
|
|
1078
|
+
- "create-idea-{slug}" \u2014 Create a new idea in data/ideas.json
|
|
1079
|
+
- "update-goal-{slug}" \u2014 Modify goal targets or KPIs in data/goals.json
|
|
1080
|
+
- "batch-cleanup" \u2014 Multiple cleanup operations in one pass
|
|
1081
|
+
- Use descriptive task_id names and detailed descriptions so the executor knows exactly what to do
|
|
1082
|
+
- The description field is critical \u2014 it's the full instruction set for the executor
|
|
1083
|
+
|
|
1084
|
+
EVALUATION TASKS:
|
|
1085
|
+
- To evaluate a shipped idea's success metrics, use task_id: "evaluate-shipped-{ideaId}"
|
|
1086
|
+
- Only evaluate ideas in "shipped" stage with ready_for_evaluation=true
|
|
1087
|
+
- Consider the timeline in success_metrics \u2014 don't evaluate too early
|
|
1088
|
+
- After evaluation, the system may generate follow-up ideas for unmet metrics
|
|
1089
|
+
|
|
1090
|
+
RESEARCH TASKS:
|
|
1091
|
+
There are TWO types of research tasks:
|
|
1092
|
+
|
|
1093
|
+
1. TOPIC-BASED RESEARCH (for exploring new problems):
|
|
1094
|
+
- Task ID format: "research-{slug}" (e.g., "research-response-time-optimization")
|
|
1095
|
+
- Spawns a single Claude Code session with web search + codebase access
|
|
1096
|
+
- Generates a deeply-researched idea grounded in evidence
|
|
1097
|
+
- Use when you need to investigate a problem before creating an idea
|
|
1098
|
+
|
|
1099
|
+
2. PARALLEL IDEA RESEARCH (for validating ideas before implementation):
|
|
1100
|
+
- Task ID format: "research-idea-{ideaId}" (e.g., "research-idea-emergency-001")
|
|
1101
|
+
- Triggers PARALLEL research agents that run simultaneously:
|
|
1102
|
+
* Competitor Analysis (how competitors solve the problem)
|
|
1103
|
+
* Codebase Verification (verify assumptions against actual code)
|
|
1104
|
+
* Risk Assessment (identify technical, business, security risks)
|
|
1105
|
+
* Alternative Approaches (explore different solutions)
|
|
1106
|
+
- Results are aggregated into a recommendation: proceed, revise, or reject
|
|
1107
|
+
- Use when an idea is in "under_review" stage before approving for implementation
|
|
1108
|
+
- RECOMMENDED before implementing any medium+ effort ideas
|
|
1109
|
+
|
|
1110
|
+
Best practice workflow:
|
|
1111
|
+
1. Create idea \u2192 inbox
|
|
1112
|
+
2. Move to under_review \u2192 trigger "research-idea-{id}" for parallel validation
|
|
1113
|
+
3. Review research findings \u2192 approve or revise
|
|
1114
|
+
4. Approved \u2192 trigger "implement-{id}" for autonomous implementation
|
|
1115
|
+
|
|
1116
|
+
GOAL-GAP RESEARCH:
|
|
1117
|
+
- To research ideas for an underperforming goal, use task_id: "goal-gap-research-{goalId}"
|
|
1118
|
+
- Use when a goal is "behind" or "at_risk" AND has few/no active ideas working toward it
|
|
1119
|
+
- The system will spawn a focused research session that generates goal-aligned ideas
|
|
1120
|
+
- Example: "goal-gap-research-goal-003" for the Increase Revenue goal
|
|
1121
|
+
|
|
1122
|
+
BUSINESS INTELLIGENCE TASKS:
|
|
1123
|
+
The "business_intelligence" field in CURRENT STATE shows freshness of competitor/positioning/page data.
|
|
1124
|
+
These tasks invoke slash commands via Claude Code for market research and page building.
|
|
1125
|
+
|
|
1126
|
+
Task prefixes:
|
|
1127
|
+
- "competitor-research" \u2192 Discover + research all competitors (zero-input, auto-discovers from product description)
|
|
1128
|
+
- "competitor-research-discover" \u2192 Only discover new competitors
|
|
1129
|
+
- "competitor-research-refresh" \u2192 Re-research all existing competitors
|
|
1130
|
+
- "competitor-research-{name}" \u2192 Deep-dive on a single competitor
|
|
1131
|
+
- "positioning-refresh" \u2192 Regenerate positioning from fresh competitor data
|
|
1132
|
+
- "positioning-copy-bank" \u2192 Regenerate copy variations using existing positioning
|
|
1133
|
+
- "build-page-{slug}" \u2192 Build a landing/pricing/comparison page (description should specify page type + audience)
|
|
1134
|
+
- "measure-page-{slug}" \u2192 Measure a live page's performance
|
|
1135
|
+
- "growth-audit" \u2192 Audit growth channels vs. competitors
|
|
1136
|
+
- "growth-audit-{channel}" \u2192 Deep-dive on specific channel (seo, paid, content, referral)
|
|
1137
|
+
- "pricing-analysis" \u2192 Analyze pricing strategy vs. competitors
|
|
1138
|
+
- "validate-idea-{slug}" \u2192 Pre-build validation of an idea (description should contain the idea)
|
|
1139
|
+
|
|
1140
|
+
When to recommend BI tasks:
|
|
1141
|
+
1. If business_intelligence.competitors.count == 0 \u2192 suggest "competitor-research" (high priority for new projects)
|
|
1142
|
+
2. If business_intelligence.competitors.staleDays > 14 \u2192 suggest "competitor-research-refresh"
|
|
1143
|
+
3. If business_intelligence.positioning.exists == false AND competitors.count > 0 \u2192 suggest "positioning-refresh"
|
|
1144
|
+
4. If business_intelligence.positioning.staleDays > 30 \u2192 suggest "positioning-refresh"
|
|
1145
|
+
5. If business_intelligence.pages.livePagesWithoutMetrics > 0 \u2192 suggest "measure-page-{id}"
|
|
1146
|
+
6. These form a natural chain: research competitors \u2192 develop positioning \u2192 generate copy \u2192 build pages \u2192 measure results
|
|
1147
|
+
|
|
1148
|
+
- Use codebase_context (if present) to understand what services/integrations actually exist before proposing solutions
|
|
1149
|
+
|
|
1150
|
+
${buildBusinessConstraints(businessContext)}
|
|
1151
|
+
|
|
1152
|
+
The "business_context", "key_constraints", and "funnel_health" fields in CURRENT STATE describe the actual product, active funnels, constraints, and current business state. USE THIS for all decision-making. Do NOT assume facts not present in the data.
|
|
1153
|
+
|
|
1154
|
+
FUNNEL REASONING:
|
|
1155
|
+
The business funnel is: Acquisition \u2192 Engagement \u2192 Conversion \u2192 Monetization.
|
|
1156
|
+
See "funnel_health" for which stages are broken.
|
|
1157
|
+
|
|
1158
|
+
Rules:
|
|
1159
|
+
1. Inbox ideas with prerequisites_met=false \u2192 recommend DEFERRING, not approving.
|
|
1160
|
+
2. When recommending goal-gap research, prefer the EARLIEST broken funnel stage.
|
|
1161
|
+
3. Monetization ideas are premature if acquisition or engagement is broken.
|
|
1162
|
+
4. Focus energy on the "earliest_broken_stage".
|
|
1163
|
+
5. Ideas without prerequisites (tech debt, infrastructure) can proceed normally.
|
|
1164
|
+
6. For revenue ideas: "convert existing free users to paid" > "build new revenue streams" when the user base is tiny.
|
|
1165
|
+
|
|
1166
|
+
HYPOTHESIS VALIDATION:
|
|
1167
|
+
The "hypotheses" field contains business hypotheses that need validation through experiments.
|
|
1168
|
+
Rules:
|
|
1169
|
+
1. When generating ideas or research tasks, PREFER ideas that validate an active hypothesis (status="stated" or "testing").
|
|
1170
|
+
2. For each hypothesis, consider: What is the cheapest experiment to validate/invalidate it?
|
|
1171
|
+
3. Prioritize hypotheses that address the earliest broken funnel stage.
|
|
1172
|
+
4. When recommending research, reference the hypothesis ID (e.g., "research-validate-hyp-003").
|
|
1173
|
+
5. Track which ideas map to which hypothesis \u2014 set "hypothesis_id" in the idea JSON (e.g., "hypothesis_id": "hyp-003"). This auto-links the idea to the hypothesis.
|
|
1174
|
+
6. When hypotheses have "effort_to_test" data, prefer the lowest-effort hypothesis when tie-breaking.
|
|
1175
|
+
|
|
1176
|
+
Respond with JSON only (no markdown code blocks, just raw JSON):
|
|
1177
|
+
{
|
|
1178
|
+
"analysis": "Your 1-2 sentence analysis of the current situation",
|
|
1179
|
+
"critical_issue": "The most important problem to address (or null if none)",
|
|
1180
|
+
"next_action": {
|
|
1181
|
+
"task_id": "existing task ID to execute, or a new task ID",
|
|
1182
|
+
"description": "What specifically to do"
|
|
1183
|
+
},
|
|
1184
|
+
"new_todos": [
|
|
1185
|
+
{
|
|
1186
|
+
"id": "unique-task-id",
|
|
1187
|
+
"description": "Task description",
|
|
1188
|
+
"priority": "high_priority or scheduled"
|
|
1189
|
+
}
|
|
1190
|
+
],
|
|
1191
|
+
"learnings": ["Any patterns or insights to remember for future heartbeats"]
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
If there's nothing urgent, set next_action to null and new_todos to an empty array.
|
|
1195
|
+
Focus on actionable, specific recommendations. Be concise.`;
|
|
1196
|
+
return new Promise((resolve, reject) => {
|
|
1197
|
+
const startTime = Date.now();
|
|
1198
|
+
const promptSize = prompt.length;
|
|
1199
|
+
log(`Running Claude reasoning (prompt: ${promptSize} chars)...`);
|
|
1200
|
+
const claude = (0, import_child_process3.spawn)("claude", ["--print"], {
|
|
1201
|
+
cwd: ROOT_DIR,
|
|
1202
|
+
env: process.env,
|
|
1203
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
1204
|
+
});
|
|
1205
|
+
log(` Claude process started (PID: ${claude.pid})`);
|
|
1206
|
+
claude.stdin.write(prompt);
|
|
1207
|
+
claude.stdin.end();
|
|
1208
|
+
log(` Prompt sent via stdin`);
|
|
1209
|
+
let output = "";
|
|
1210
|
+
let errorOutput = "";
|
|
1211
|
+
let isResolved = false;
|
|
1212
|
+
const progressInterval = setInterval(() => {
|
|
1213
|
+
if (!isResolved) {
|
|
1214
|
+
const elapsed = Math.round((Date.now() - startTime) / 1e3);
|
|
1215
|
+
log(` ...Claude thinking (${elapsed}s elapsed)`);
|
|
1216
|
+
}
|
|
1217
|
+
}, 1e4);
|
|
1218
|
+
const timeout = setTimeout(() => {
|
|
1219
|
+
if (!isResolved) {
|
|
1220
|
+
isResolved = true;
|
|
1221
|
+
clearInterval(progressInterval);
|
|
1222
|
+
claude.kill("SIGTERM");
|
|
1223
|
+
const elapsed = Math.round((Date.now() - startTime) / 1e3);
|
|
1224
|
+
log(`Claude reasoning timed out after ${elapsed}s`);
|
|
1225
|
+
resolve(null);
|
|
1226
|
+
}
|
|
1227
|
+
}, TIMEOUT_MS);
|
|
1228
|
+
claude.stdout.on("data", (data) => {
|
|
1229
|
+
const chunk = data.toString();
|
|
1230
|
+
output += chunk;
|
|
1231
|
+
if (output.length === chunk.length) {
|
|
1232
|
+
log(` Claude is responding...`);
|
|
1233
|
+
}
|
|
1234
|
+
});
|
|
1235
|
+
claude.stderr.on("data", (data) => {
|
|
1236
|
+
const text = data.toString();
|
|
1237
|
+
errorOutput += text;
|
|
1238
|
+
if (text.trim()) {
|
|
1239
|
+
log(` [Claude stderr]: ${text.trim().substring(0, 200)}`);
|
|
1240
|
+
}
|
|
1241
|
+
});
|
|
1242
|
+
claude.on("close", (code) => {
|
|
1243
|
+
if (isResolved) return;
|
|
1244
|
+
isResolved = true;
|
|
1245
|
+
clearInterval(progressInterval);
|
|
1246
|
+
clearTimeout(timeout);
|
|
1247
|
+
const elapsed = Math.round((Date.now() - startTime) / 1e3);
|
|
1248
|
+
if (code === 0) {
|
|
1249
|
+
try {
|
|
1250
|
+
let jsonStr = output.trim();
|
|
1251
|
+
const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
1252
|
+
if (jsonMatch) {
|
|
1253
|
+
jsonStr = jsonMatch[1].trim();
|
|
1254
|
+
}
|
|
1255
|
+
const objectMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
1256
|
+
if (objectMatch) {
|
|
1257
|
+
const result = JSON.parse(objectMatch[0]);
|
|
1258
|
+
log(`Claude completed in ${elapsed}s: ${result.analysis}`);
|
|
1259
|
+
resolve(result);
|
|
1260
|
+
} else {
|
|
1261
|
+
log(`Claude completed in ${elapsed}s but no valid JSON found`);
|
|
1262
|
+
resolve(null);
|
|
1263
|
+
}
|
|
1264
|
+
} catch (error) {
|
|
1265
|
+
log(`Claude completed in ${elapsed}s but failed to parse: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
1266
|
+
log(`Raw output: ${output.substring(0, 500)}`);
|
|
1267
|
+
resolve(null);
|
|
1268
|
+
}
|
|
1269
|
+
} else {
|
|
1270
|
+
log(`Claude exited with code ${code} after ${elapsed}s: ${errorOutput}`);
|
|
1271
|
+
resolve(null);
|
|
1272
|
+
}
|
|
1273
|
+
});
|
|
1274
|
+
claude.on("error", (error) => {
|
|
1275
|
+
if (isResolved) return;
|
|
1276
|
+
isResolved = true;
|
|
1277
|
+
clearInterval(progressInterval);
|
|
1278
|
+
clearTimeout(timeout);
|
|
1279
|
+
log(`Claude spawn error: ${error.message}`);
|
|
1280
|
+
resolve(null);
|
|
1281
|
+
});
|
|
1282
|
+
});
|
|
1283
|
+
}
|
|
1284
|
+
function addTasksToTodo(tasks) {
|
|
1285
|
+
if (tasks.length === 0) return;
|
|
1286
|
+
if (!fs6.existsSync(TODO_FILE)) return;
|
|
1287
|
+
try {
|
|
1288
|
+
let content = fs6.readFileSync(TODO_FILE, "utf-8");
|
|
1289
|
+
if (!content.includes("## High Priority (Do Now)")) {
|
|
1290
|
+
log('TODO.md missing "## High Priority (Do Now)" section \u2014 creating it');
|
|
1291
|
+
const scheduledIdx = content.indexOf("## Scheduled");
|
|
1292
|
+
if (scheduledIdx !== -1) {
|
|
1293
|
+
content = content.slice(0, scheduledIdx) + "## High Priority (Do Now)\n\n" + content.slice(scheduledIdx);
|
|
1294
|
+
} else {
|
|
1295
|
+
content += "\n## High Priority (Do Now)\n\n";
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
if (!content.includes("## Scheduled")) {
|
|
1299
|
+
log('TODO.md missing "## Scheduled" section \u2014 creating it');
|
|
1300
|
+
content += "\n## Scheduled\n\n";
|
|
1301
|
+
}
|
|
1302
|
+
if (!content.includes("## Completed This Week")) {
|
|
1303
|
+
content += "\n## Completed This Week\n\n";
|
|
1304
|
+
}
|
|
1305
|
+
const existingTodoLines = content.split("\n").filter((l) => l.startsWith("- [ ]"));
|
|
1306
|
+
for (const task of tasks) {
|
|
1307
|
+
if (content.includes(`\`${task.id}\``)) {
|
|
1308
|
+
log(`Skipped duplicate TODO: ${task.id}`);
|
|
1309
|
+
continue;
|
|
1310
|
+
}
|
|
1311
|
+
const entityPattern = /(?:idea-[a-f0-9]{8}|idea-[a-z0-9-]+|PR #\d+|hyp-\d{3}|goal-\d{3})/gi;
|
|
1312
|
+
const newEntities = task.description.match(entityPattern) || [];
|
|
1313
|
+
if (newEntities.length > 0) {
|
|
1314
|
+
const coveredEntity = newEntities.find(
|
|
1315
|
+
(entity) => existingTodoLines.some((line) => line.toLowerCase().includes(entity.toLowerCase()))
|
|
1316
|
+
);
|
|
1317
|
+
if (coveredEntity) {
|
|
1318
|
+
log(`Skipped semantically duplicate TODO: ${task.id} (${coveredEntity} already in existing TODO)`);
|
|
1319
|
+
continue;
|
|
1320
|
+
}
|
|
1321
|
+
}
|
|
1322
|
+
if (task.priority === "high_priority") {
|
|
1323
|
+
const highPriorityCount = content.split("\n").filter(
|
|
1324
|
+
(l) => l.startsWith("- [ ]") && content.indexOf(l) > content.indexOf("## High Priority") && content.indexOf(l) < (content.indexOf("## Scheduled") || content.length)
|
|
1325
|
+
).length;
|
|
1326
|
+
if (highPriorityCount >= 5) {
|
|
1327
|
+
log(`Downgraded TODO ${task.id} to scheduled (high_priority cap of 5 reached)`);
|
|
1328
|
+
task.priority = "scheduled";
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
const taskLine = `- [ ] \`${task.id}\` \u2014 ${task.description}`;
|
|
1332
|
+
if (task.priority === "high_priority") {
|
|
1333
|
+
const marker = "## High Priority (Do Now)";
|
|
1334
|
+
const markerIndex = content.indexOf(marker);
|
|
1335
|
+
if (markerIndex !== -1) {
|
|
1336
|
+
const insertIndex = content.indexOf("\n", markerIndex) + 1;
|
|
1337
|
+
content = content.slice(0, insertIndex) + "\n" + taskLine + content.slice(insertIndex);
|
|
1338
|
+
}
|
|
1339
|
+
} else {
|
|
1340
|
+
const marker = "## Scheduled";
|
|
1341
|
+
const markerIndex = content.indexOf(marker);
|
|
1342
|
+
if (markerIndex !== -1) {
|
|
1343
|
+
const insertIndex = content.indexOf("\n", markerIndex) + 1;
|
|
1344
|
+
content = content.slice(0, insertIndex) + "\n" + taskLine + content.slice(insertIndex);
|
|
1345
|
+
}
|
|
1346
|
+
}
|
|
1347
|
+
log(`Added TODO: ${task.id} \u2014 ${task.description}`);
|
|
1348
|
+
}
|
|
1349
|
+
fs6.writeFileSync(TODO_FILE, content);
|
|
1350
|
+
} catch (error) {
|
|
1351
|
+
log(`Failed to add tasks to TODO.md: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
function archiveCompletedTodos() {
|
|
1355
|
+
try {
|
|
1356
|
+
if (!fs6.existsSync(TODO_FILE)) return;
|
|
1357
|
+
let content = fs6.readFileSync(TODO_FILE, "utf-8");
|
|
1358
|
+
const lines = content.split("\n");
|
|
1359
|
+
const completedLines = [];
|
|
1360
|
+
const newLines = [];
|
|
1361
|
+
let currentSection = "";
|
|
1362
|
+
for (const line of lines) {
|
|
1363
|
+
if (line.includes("## High Priority")) currentSection = "high_priority";
|
|
1364
|
+
else if (line.includes("## Scheduled")) currentSection = "scheduled";
|
|
1365
|
+
else if (line.includes("## Blocked")) currentSection = "blocked";
|
|
1366
|
+
else if (line.includes("## Completed")) currentSection = "completed";
|
|
1367
|
+
const isCheckedTask = /^- \[x\] /.test(line);
|
|
1368
|
+
if (isCheckedTask && (currentSection === "high_priority" || currentSection === "scheduled")) {
|
|
1369
|
+
completedLines.push(line);
|
|
1370
|
+
} else {
|
|
1371
|
+
newLines.push(line);
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
if (completedLines.length === 0) return;
|
|
1375
|
+
content = newLines.join("\n");
|
|
1376
|
+
const completedMarker = "## Completed This Week";
|
|
1377
|
+
const markerIndex = content.indexOf(completedMarker);
|
|
1378
|
+
if (markerIndex !== -1) {
|
|
1379
|
+
const insertIndex = content.indexOf("\n", markerIndex) + 1;
|
|
1380
|
+
const archiveBlock = completedLines.join("\n") + "\n";
|
|
1381
|
+
content = content.slice(0, insertIndex) + archiveBlock + content.slice(insertIndex);
|
|
1382
|
+
}
|
|
1383
|
+
fs6.writeFileSync(TODO_FILE, content);
|
|
1384
|
+
log(`Archived ${completedLines.length} completed TODO(s) to Completed This Week`);
|
|
1385
|
+
} catch (error) {
|
|
1386
|
+
log(`Failed to archive completed TODOs: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
function pruneStaleScheduledTodos(state) {
|
|
1390
|
+
try {
|
|
1391
|
+
if (!fs6.existsSync(TODO_FILE)) return;
|
|
1392
|
+
const content = fs6.readFileSync(TODO_FILE, "utf-8");
|
|
1393
|
+
const lines = content.split("\n");
|
|
1394
|
+
const prunedIds = [];
|
|
1395
|
+
const terminalIdeaIds = new Set(
|
|
1396
|
+
state.ideas.filter((i) => ["shipped", "rejected", "rolled_back"].includes(i.stage)).map((i) => i.id)
|
|
1397
|
+
);
|
|
1398
|
+
if (terminalIdeaIds.size === 0) return;
|
|
1399
|
+
let currentSection = "";
|
|
1400
|
+
const newLines = lines.filter((line) => {
|
|
1401
|
+
if (line.includes("## High Priority")) currentSection = "high_priority";
|
|
1402
|
+
else if (line.includes("## Scheduled")) currentSection = "scheduled";
|
|
1403
|
+
else if (line.includes("## Blocked")) currentSection = "blocked";
|
|
1404
|
+
else if (line.includes("## Completed")) currentSection = "completed";
|
|
1405
|
+
if (currentSection !== "scheduled") return true;
|
|
1406
|
+
const taskMatch = line.match(/^- \[ \] `([^`]+)`/);
|
|
1407
|
+
if (!taskMatch) return true;
|
|
1408
|
+
const taskId = taskMatch[1];
|
|
1409
|
+
const ideaRefMatch = taskId.match(/(?:implement|research)-idea-(.+)/);
|
|
1410
|
+
if (!ideaRefMatch) return true;
|
|
1411
|
+
const ideaId = `idea-${ideaRefMatch[1]}`;
|
|
1412
|
+
if (terminalIdeaIds.has(ideaId)) {
|
|
1413
|
+
prunedIds.push(taskId);
|
|
1414
|
+
return false;
|
|
1415
|
+
}
|
|
1416
|
+
return true;
|
|
1417
|
+
});
|
|
1418
|
+
if (prunedIds.length === 0) return;
|
|
1419
|
+
fs6.writeFileSync(TODO_FILE, newLines.join("\n"));
|
|
1420
|
+
log(`Pruned ${prunedIds.length} stale TODO(s): ${prunedIds.join(", ")}`);
|
|
1421
|
+
} catch (error) {
|
|
1422
|
+
log(`Failed to prune stale TODOs: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
function appendToMemory(learnings) {
|
|
1426
|
+
if (learnings.length === 0) return;
|
|
1427
|
+
if (!fs6.existsSync(MEMORY_FILE)) return;
|
|
1428
|
+
const MAX_LEARNINGS_PER_HEARTBEAT = 2;
|
|
1429
|
+
let filtered = learnings.slice(0, MAX_LEARNINGS_PER_HEARTBEAT);
|
|
1430
|
+
if (learnings.length > MAX_LEARNINGS_PER_HEARTBEAT) {
|
|
1431
|
+
log(`Capped learnings from ${learnings.length} to ${MAX_LEARNINGS_PER_HEARTBEAT}`);
|
|
1432
|
+
}
|
|
1433
|
+
try {
|
|
1434
|
+
let content = fs6.readFileSync(MEMORY_FILE, "utf-8");
|
|
1435
|
+
const existingLines = content.split("\n").filter((l) => l.match(/^- \*\*/));
|
|
1436
|
+
filtered = filtered.filter((learning) => {
|
|
1437
|
+
const words = learning.toLowerCase().split(/\s+/).filter((w) => w.length > 4);
|
|
1438
|
+
if (words.length === 0) return true;
|
|
1439
|
+
const isDuplicate = existingLines.some((existing) => {
|
|
1440
|
+
const existingLower = existing.toLowerCase();
|
|
1441
|
+
const overlapCount = words.filter((w) => existingLower.includes(w)).length;
|
|
1442
|
+
return overlapCount / words.length > 0.6;
|
|
1443
|
+
});
|
|
1444
|
+
if (isDuplicate) {
|
|
1445
|
+
log(`Skipped duplicate learning: "${learning.slice(0, 60)}..."`);
|
|
1446
|
+
}
|
|
1447
|
+
return !isDuplicate;
|
|
1448
|
+
});
|
|
1449
|
+
if (filtered.length === 0) {
|
|
1450
|
+
log(`All learnings deduplicated \u2014 nothing new to add`);
|
|
1451
|
+
return;
|
|
1452
|
+
}
|
|
1453
|
+
const section = "## Learned Patterns";
|
|
1454
|
+
let sectionIndex = content.indexOf(section);
|
|
1455
|
+
if (sectionIndex === -1) {
|
|
1456
|
+
log('MEMORY.md missing "## Learned Patterns" section \u2014 creating it');
|
|
1457
|
+
content += "\n" + section + "\n";
|
|
1458
|
+
sectionIndex = content.indexOf(section);
|
|
1459
|
+
}
|
|
1460
|
+
if (sectionIndex !== -1) {
|
|
1461
|
+
const nextSectionMatch = content.slice(sectionIndex + section.length).match(/\n## /);
|
|
1462
|
+
const insertPoint = nextSectionMatch ? sectionIndex + section.length + (nextSectionMatch.index || 0) : content.length;
|
|
1463
|
+
const today = formatDate(/* @__PURE__ */ new Date());
|
|
1464
|
+
const newEntries = filtered.map((l) => `- **${today}:** ${l}`).join("\n");
|
|
1465
|
+
const beforeSection = content.slice(0, insertPoint);
|
|
1466
|
+
const afterSection = content.slice(insertPoint);
|
|
1467
|
+
if (!beforeSection.includes("### Heartbeat Learnings")) {
|
|
1468
|
+
content = beforeSection + "\n\n### Heartbeat Learnings\n\n" + newEntries + "\n" + afterSection;
|
|
1469
|
+
} else {
|
|
1470
|
+
const subsectionIndex = content.indexOf("### Heartbeat Learnings");
|
|
1471
|
+
const subsectionEndMatch = content.slice(subsectionIndex + 22).match(/\n###/);
|
|
1472
|
+
const subsectionEnd = subsectionEndMatch ? subsectionIndex + 22 + (subsectionEndMatch.index || 0) : insertPoint;
|
|
1473
|
+
content = content.slice(0, subsectionEnd) + newEntries + "\n" + content.slice(subsectionEnd);
|
|
1474
|
+
}
|
|
1475
|
+
fs6.writeFileSync(MEMORY_FILE, content);
|
|
1476
|
+
log(`Added ${filtered.length} learning(s) to MEMORY.md`);
|
|
1477
|
+
}
|
|
1478
|
+
} catch (error) {
|
|
1479
|
+
log(`Failed to append to MEMORY.md: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1482
|
+
function determineWork(state) {
|
|
1483
|
+
const highPriorityTasks = state.todos.filter(
|
|
1484
|
+
(t) => t.section === "high_priority" && !t.completed
|
|
1485
|
+
);
|
|
1486
|
+
if (highPriorityTasks.length > 0) {
|
|
1487
|
+
return highPriorityTasks[0];
|
|
1488
|
+
}
|
|
1489
|
+
const now = /* @__PURE__ */ new Date();
|
|
1490
|
+
const hour = now.getHours();
|
|
1491
|
+
const dayOfWeek = now.getDay();
|
|
1492
|
+
const dayOfMonth = now.getDate();
|
|
1493
|
+
const scheduledTasks = state.todos.filter(
|
|
1494
|
+
(t) => t.section === "scheduled" && !t.completed
|
|
1495
|
+
);
|
|
1496
|
+
for (const task of scheduledTasks) {
|
|
1497
|
+
if (task.id === "quick-analysis" && hour >= 6 && hour < 7) {
|
|
1498
|
+
return task;
|
|
1499
|
+
}
|
|
1500
|
+
if (task.id === "deep-analysis" && dayOfWeek === 0 && hour >= 3 && hour < 4) {
|
|
1501
|
+
return task;
|
|
1502
|
+
}
|
|
1503
|
+
if (task.id === "metrics-analysis" && dayOfWeek === 1 && hour >= 8 && hour < 9) {
|
|
1504
|
+
return task;
|
|
1505
|
+
}
|
|
1506
|
+
if (task.id === "seo-audit" && (dayOfMonth === 1 || dayOfMonth === 15) && hour >= 4 && hour < 5) {
|
|
1507
|
+
return task;
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1510
|
+
const shippedIdeas = state.ideas.filter((i) => i.stage === "shipped");
|
|
1511
|
+
for (const idea of shippedIdeas) {
|
|
1512
|
+
const v = idea.verification;
|
|
1513
|
+
const ready = !v?.next_evaluation_after || new Date(v.next_evaluation_after) <= /* @__PURE__ */ new Date();
|
|
1514
|
+
const daysShipped = daysSince(idea.implementation?.completed_at || idea.updated_at);
|
|
1515
|
+
if (ready && daysShipped >= 7) {
|
|
1516
|
+
return {
|
|
1517
|
+
id: `evaluate-shipped-${idea.id}`,
|
|
1518
|
+
description: `Evaluate shipped idea: ${idea.title}`,
|
|
1519
|
+
completed: false,
|
|
1520
|
+
section: "scheduled"
|
|
1521
|
+
};
|
|
1522
|
+
}
|
|
1523
|
+
}
|
|
1524
|
+
for (const goal of state.goals) {
|
|
1525
|
+
if (goal.status !== "behind" && goal.status !== "at_risk") continue;
|
|
1526
|
+
const activeIdeasForGoal = state.ideas.filter(
|
|
1527
|
+
(i) => i.goal_id === goal.id && ["inbox", "under_review", "approved", "in_progress", "testing"].includes(i.stage)
|
|
1528
|
+
);
|
|
1529
|
+
if (activeIdeasForGoal.length === 0) {
|
|
1530
|
+
return {
|
|
1531
|
+
id: `goal-gap-research-${goal.id}`,
|
|
1532
|
+
description: `Research ideas for behind goal: ${goal.title}`,
|
|
1533
|
+
completed: false,
|
|
1534
|
+
section: "high_priority"
|
|
1535
|
+
};
|
|
1536
|
+
}
|
|
1537
|
+
}
|
|
1538
|
+
const config = loadConfig();
|
|
1539
|
+
if (config.autonomy?.enabled) {
|
|
1540
|
+
const inProgressIdeas = state.ideas.filter((i) => i.stage === "in_progress");
|
|
1541
|
+
for (const idea of inProgressIdeas) {
|
|
1542
|
+
const subTasks = idea.implementation.sub_tasks || [];
|
|
1543
|
+
const hasPending = subTasks.some((st) => st.status === "pending");
|
|
1544
|
+
const hasFailed = subTasks.some((st) => st.status === "failed");
|
|
1545
|
+
if (hasPending && !hasFailed) {
|
|
1546
|
+
return {
|
|
1547
|
+
id: `implement-${idea.id}`,
|
|
1548
|
+
description: `Continue autonomous implementation: ${idea.title}`,
|
|
1549
|
+
completed: false,
|
|
1550
|
+
section: "high_priority"
|
|
1551
|
+
};
|
|
1552
|
+
}
|
|
1553
|
+
}
|
|
1554
|
+
const approvedIdeas = state.ideas.filter((i) => i.stage === "approved");
|
|
1555
|
+
if (approvedIdeas.length > 0) {
|
|
1556
|
+
const idea = approvedIdeas[0];
|
|
1557
|
+
return {
|
|
1558
|
+
id: `implement-${idea.id}`,
|
|
1559
|
+
description: `Start autonomous implementation: ${idea.title}`,
|
|
1560
|
+
completed: false,
|
|
1561
|
+
section: "high_priority"
|
|
1562
|
+
};
|
|
1563
|
+
}
|
|
1564
|
+
}
|
|
1565
|
+
return null;
|
|
1566
|
+
}
|
|
1567
|
+
function loadConfig() {
|
|
1568
|
+
return loadJson(CONFIG_FILE, {
|
|
1569
|
+
repos: [],
|
|
1570
|
+
workspace_dir: "",
|
|
1571
|
+
schedules: {}
|
|
1572
|
+
});
|
|
1573
|
+
}
|
|
1574
|
+
function detectTargetRepo(idea, config) {
|
|
1575
|
+
const filesAnalyzed = idea.source.files_analyzed || [];
|
|
1576
|
+
for (const file of filesAnalyzed) {
|
|
1577
|
+
for (const repo of config.repos) {
|
|
1578
|
+
if (file.includes(repo.name) || file.includes(path6.basename(repo.path))) {
|
|
1579
|
+
return repo;
|
|
1580
|
+
}
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
if (idea.category === "security" || idea.category === "performance") {
|
|
1584
|
+
return config.repos.find((r) => r.type === "fastapi") || config.repos[0];
|
|
1585
|
+
}
|
|
1586
|
+
if (idea.category === "ux_design") {
|
|
1587
|
+
return config.repos.find((r) => r.type === "nextjs") || config.repos[0];
|
|
1588
|
+
}
|
|
1589
|
+
return config.repos[0];
|
|
1590
|
+
}
|
|
1591
|
+
async function decomposeIdea(idea, config) {
|
|
1592
|
+
const maxSubTasks = config.autonomy?.max_sub_tasks_per_idea || 10;
|
|
1593
|
+
const prompt = `You are decomposing a feature into small, implementable sub-tasks for an AI coding agent.
|
|
1594
|
+
|
|
1595
|
+
## Feature: ${idea.title}
|
|
1596
|
+
|
|
1597
|
+
${idea.summary}
|
|
1598
|
+
|
|
1599
|
+
## Implementation Plan
|
|
1600
|
+
|
|
1601
|
+
${idea.implementation_plan}
|
|
1602
|
+
|
|
1603
|
+
## Rules
|
|
1604
|
+
|
|
1605
|
+
1. Each sub-task should modify 1-3 files maximum
|
|
1606
|
+
2. Order by dependency: foundation first, integration last
|
|
1607
|
+
3. Maximum ${maxSubTasks} sub-tasks
|
|
1608
|
+
4. Each sub-task must have specific instructions: file paths, function names, what to add/change
|
|
1609
|
+
5. Sub-tasks should be small enough to fit in a single Claude Code session
|
|
1610
|
+
6. Include the exact file paths that need to be modified
|
|
1611
|
+
7. **IMPORTANT: Each sub-task MUST include writing tests.** For every new function/service created, include instructions to write corresponding tests. Example: "Create lawyer_service.py with X function, AND write tests in tests/test_lawyer_service.py that verify Y behavior." Tests should cover: happy path, error cases, and edge cases.
|
|
1612
|
+
8. **Monitoring/Observability**: Each sub-task that creates or modifies a service/endpoint MUST specify:
|
|
1613
|
+
- Logging: "Add structured logs at [points] using the project's logger"
|
|
1614
|
+
- Error handling: "Wrap [operation] in try/except, log error with [context variables]"
|
|
1615
|
+
- Metrics: "Track [metric_name] for [operation]" (if performance-critical)
|
|
1616
|
+
9. **Final sub-task should be verification**: The last sub-task should verify the feature works end-to-end, including that logs/metrics are emitted correctly. Example: "Write integration test that verifies [endpoint] returns 200, logs [event], and handles [error case] gracefully."
|
|
1617
|
+
10. **Error paths are first-class**: Don't just implement the happy path. Each sub-task description must mention how errors are handled and logged.
|
|
1618
|
+
|
|
1619
|
+
Respond with JSON only (no markdown code blocks, just raw JSON):
|
|
1620
|
+
{
|
|
1621
|
+
"sub_tasks": [
|
|
1622
|
+
{
|
|
1623
|
+
"id": "st-001",
|
|
1624
|
+
"title": "Short descriptive title",
|
|
1625
|
+
"description": "Detailed instructions for Claude Code: what files to modify, what functions to add/change, specific implementation details. MUST include: 'Also write tests in tests/test_X.py that verify [specific behaviors].'",
|
|
1626
|
+
"files_to_modify": ["src/path/to/file.ts", "tests/test_file.ts"],
|
|
1627
|
+
"observability": "Brief description of logging/metrics/error handling this sub-task adds"
|
|
1628
|
+
}
|
|
1629
|
+
]
|
|
1630
|
+
}`;
|
|
1631
|
+
return new Promise((resolve) => {
|
|
1632
|
+
const TIMEOUT_MS = 3e5;
|
|
1633
|
+
log("Decomposing idea into sub-tasks via Claude reasoning...");
|
|
1634
|
+
const claude = (0, import_child_process3.spawn)("claude", ["--print"], {
|
|
1635
|
+
cwd: ROOT_DIR,
|
|
1636
|
+
env: process.env,
|
|
1637
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
1638
|
+
});
|
|
1639
|
+
claude.stdin.write(prompt);
|
|
1640
|
+
claude.stdin.end();
|
|
1641
|
+
let output = "";
|
|
1642
|
+
let isResolved = false;
|
|
1643
|
+
const timeout = setTimeout(() => {
|
|
1644
|
+
if (!isResolved) {
|
|
1645
|
+
isResolved = true;
|
|
1646
|
+
claude.kill("SIGTERM");
|
|
1647
|
+
log("Decomposition timed out");
|
|
1648
|
+
resolve([]);
|
|
1649
|
+
}
|
|
1650
|
+
}, TIMEOUT_MS);
|
|
1651
|
+
claude.stdout.on("data", (data) => {
|
|
1652
|
+
output += data.toString();
|
|
1653
|
+
});
|
|
1654
|
+
claude.on("close", (code) => {
|
|
1655
|
+
if (isResolved) return;
|
|
1656
|
+
isResolved = true;
|
|
1657
|
+
clearTimeout(timeout);
|
|
1658
|
+
if (code === 0) {
|
|
1659
|
+
try {
|
|
1660
|
+
let jsonStr = output.trim();
|
|
1661
|
+
const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
1662
|
+
if (jsonMatch) jsonStr = jsonMatch[1].trim();
|
|
1663
|
+
const objectMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
1664
|
+
if (objectMatch) {
|
|
1665
|
+
const parsed = JSON.parse(objectMatch[0]);
|
|
1666
|
+
const subTasks = parsed.sub_tasks.slice(0, maxSubTasks).map((st, i) => ({
|
|
1667
|
+
id: st.id || `st-${String(i + 1).padStart(3, "0")}`,
|
|
1668
|
+
title: st.title,
|
|
1669
|
+
description: st.description,
|
|
1670
|
+
files_to_modify: st.files_to_modify || [],
|
|
1671
|
+
observability: st.observability || void 0,
|
|
1672
|
+
status: "pending",
|
|
1673
|
+
started_at: null,
|
|
1674
|
+
completed_at: null,
|
|
1675
|
+
error_message: null,
|
|
1676
|
+
commit_hash: null
|
|
1677
|
+
}));
|
|
1678
|
+
log(`Decomposed into ${subTasks.length} sub-tasks`);
|
|
1679
|
+
resolve(subTasks);
|
|
1680
|
+
return;
|
|
1681
|
+
}
|
|
1682
|
+
} catch (error) {
|
|
1683
|
+
log(`Failed to parse decomposition: ${error instanceof Error ? error.message : "Unknown"}`);
|
|
1684
|
+
}
|
|
1685
|
+
}
|
|
1686
|
+
resolve([]);
|
|
1687
|
+
});
|
|
1688
|
+
claude.on("error", () => {
|
|
1689
|
+
if (!isResolved) {
|
|
1690
|
+
isResolved = true;
|
|
1691
|
+
clearTimeout(timeout);
|
|
1692
|
+
resolve([]);
|
|
1693
|
+
}
|
|
1694
|
+
});
|
|
1695
|
+
});
|
|
1696
|
+
}
|
|
1697
|
+
function runTestsForRepo(workspacePath, testCommands, sourceRepoPath) {
|
|
1698
|
+
const allOutput = [];
|
|
1699
|
+
const env = { ...process.env };
|
|
1700
|
+
if (sourceRepoPath) {
|
|
1701
|
+
const venvBin = path6.join(sourceRepoPath, ".venv", "bin");
|
|
1702
|
+
if (fs6.existsSync(venvBin)) {
|
|
1703
|
+
env.PATH = `${venvBin}:${env.PATH}`;
|
|
1704
|
+
env.VIRTUAL_ENV = path6.join(sourceRepoPath, ".venv");
|
|
1705
|
+
log(`Using venv from ${sourceRepoPath}/.venv`);
|
|
1706
|
+
}
|
|
1707
|
+
}
|
|
1708
|
+
for (const cmd of testCommands) {
|
|
1709
|
+
log(`Running test: ${cmd}`);
|
|
1710
|
+
try {
|
|
1711
|
+
const result = (0, import_child_process3.execSync)(cmd, {
|
|
1712
|
+
cwd: workspacePath,
|
|
1713
|
+
encoding: "utf-8",
|
|
1714
|
+
env,
|
|
1715
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
1716
|
+
timeout: 12e4
|
|
1717
|
+
// 2 min per test command
|
|
1718
|
+
});
|
|
1719
|
+
allOutput.push(`[PASS] ${cmd}
|
|
1720
|
+
${result}`);
|
|
1721
|
+
} catch (error) {
|
|
1722
|
+
const execError = error;
|
|
1723
|
+
const errorOutput = execError.stderr || execError.stdout || execError.message;
|
|
1724
|
+
allOutput.push(`[FAIL] ${cmd}
|
|
1725
|
+
${errorOutput}`);
|
|
1726
|
+
log(`Test failed: ${cmd}`);
|
|
1727
|
+
return { passed: false, output: allOutput.join("\n\n") };
|
|
1728
|
+
}
|
|
1729
|
+
}
|
|
1730
|
+
log("All tests passed");
|
|
1731
|
+
return { passed: true, output: allOutput.join("\n\n") };
|
|
1732
|
+
}
|
|
1733
|
+
async function executeAutonomousImplementation(ideaId) {
|
|
1734
|
+
const config = loadConfig();
|
|
1735
|
+
const autonomy = config.autonomy;
|
|
1736
|
+
if (!autonomy?.enabled) {
|
|
1737
|
+
log(`Autonomy not enabled, skipping implementation for ${ideaId}`);
|
|
1738
|
+
return false;
|
|
1739
|
+
}
|
|
1740
|
+
const ideasData = loadJson(IDEAS_FILE, { ideas: [] });
|
|
1741
|
+
const idea = ideasData.ideas.find((i) => i.id === ideaId);
|
|
1742
|
+
if (!idea) {
|
|
1743
|
+
log(`Idea not found: ${ideaId}`);
|
|
1744
|
+
return false;
|
|
1745
|
+
}
|
|
1746
|
+
const subTasks = idea.implementation.sub_tasks || [];
|
|
1747
|
+
if (subTasks.length === 0) {
|
|
1748
|
+
log(`No sub-tasks for ${ideaId}, decomposing...`);
|
|
1749
|
+
const newSubTasks = await decomposeIdea(idea, config);
|
|
1750
|
+
if (newSubTasks.length === 0) {
|
|
1751
|
+
log(`Decomposition failed for ${ideaId}`);
|
|
1752
|
+
return false;
|
|
1753
|
+
}
|
|
1754
|
+
idea.implementation.sub_tasks = newSubTasks;
|
|
1755
|
+
const ideaIndex2 = ideasData.ideas.findIndex((i) => i.id === ideaId);
|
|
1756
|
+
ideasData.ideas[ideaIndex2] = idea;
|
|
1757
|
+
saveJson(IDEAS_FILE, ideasData);
|
|
1758
|
+
log(`Saved ${newSubTasks.length} sub-tasks for ${ideaId}`);
|
|
1759
|
+
return true;
|
|
1760
|
+
}
|
|
1761
|
+
const pendingTasks = subTasks.filter((st) => st.status === "pending");
|
|
1762
|
+
const completedTasks = subTasks.filter((st) => st.status === "completed");
|
|
1763
|
+
const failedTasks = subTasks.filter((st) => st.status === "failed");
|
|
1764
|
+
const inProgressTasks = subTasks.filter((st) => st.status === "in_progress");
|
|
1765
|
+
if (pendingTasks.length === 0 && inProgressTasks.length === 0 && failedTasks.length === 0) {
|
|
1766
|
+
log(`All ${completedTasks.length} sub-tasks completed for ${ideaId}, creating PR...`);
|
|
1767
|
+
const targetRepo2 = detectTargetRepo(idea, config);
|
|
1768
|
+
if (!targetRepo2) {
|
|
1769
|
+
log("Could not determine target repo");
|
|
1770
|
+
return false;
|
|
1771
|
+
}
|
|
1772
|
+
try {
|
|
1773
|
+
const { command, args: args2 } = resolveScript(__dirname, "implement.ts");
|
|
1774
|
+
(0, import_child_process3.execSync)(
|
|
1775
|
+
[command, ...args2, `--idea=${ideaId}`, `--repo=${targetRepo2.name}`, "--create-pr-only"].join(" "),
|
|
1776
|
+
{ cwd: ROOT_DIR, encoding: "utf-8", stdio: "inherit", timeout: 12e4 }
|
|
1777
|
+
);
|
|
1778
|
+
log(`PR created for ${ideaId}`);
|
|
1779
|
+
const reloadedIdeas = loadJson(IDEAS_FILE, { ideas: [] });
|
|
1780
|
+
const reloadedIndex = reloadedIdeas.ideas.findIndex((i) => i.id === ideaId);
|
|
1781
|
+
if (reloadedIndex !== -1) {
|
|
1782
|
+
reloadedIdeas.ideas[reloadedIndex].stage = "testing";
|
|
1783
|
+
reloadedIdeas.ideas[reloadedIndex].updated_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
1784
|
+
saveJson(IDEAS_FILE, reloadedIdeas);
|
|
1785
|
+
}
|
|
1786
|
+
return true;
|
|
1787
|
+
} catch (error) {
|
|
1788
|
+
log(`PR creation failed: ${error instanceof Error ? error.message : "Unknown"}`);
|
|
1789
|
+
return false;
|
|
1790
|
+
}
|
|
1791
|
+
}
|
|
1792
|
+
if (failedTasks.length > 0) {
|
|
1793
|
+
log(`${failedTasks.length} sub-task(s) failed for ${ideaId}, manual intervention needed`);
|
|
1794
|
+
for (const st of failedTasks) {
|
|
1795
|
+
log(` Failed: ${st.id} \u2014 ${st.title}: ${st.error_message || "Unknown error"}`);
|
|
1796
|
+
}
|
|
1797
|
+
return false;
|
|
1798
|
+
}
|
|
1799
|
+
const nextTask = pendingTasks[0];
|
|
1800
|
+
if (!nextTask) {
|
|
1801
|
+
log(`No pending sub-tasks for ${ideaId}`);
|
|
1802
|
+
return false;
|
|
1803
|
+
}
|
|
1804
|
+
log(`Executing sub-task ${nextTask.id}: ${nextTask.title}`);
|
|
1805
|
+
nextTask.status = "in_progress";
|
|
1806
|
+
nextTask.started_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
1807
|
+
const ideaIndex = ideasData.ideas.findIndex((i) => i.id === ideaId);
|
|
1808
|
+
ideasData.ideas[ideaIndex] = idea;
|
|
1809
|
+
saveJson(IDEAS_FILE, ideasData);
|
|
1810
|
+
const targetRepo = detectTargetRepo(idea, config);
|
|
1811
|
+
if (!targetRepo) {
|
|
1812
|
+
log("Could not determine target repo");
|
|
1813
|
+
nextTask.status = "failed";
|
|
1814
|
+
nextTask.error_message = "Could not determine target repository";
|
|
1815
|
+
saveJson(IDEAS_FILE, ideasData);
|
|
1816
|
+
return false;
|
|
1817
|
+
}
|
|
1818
|
+
const scopePayload = JSON.stringify({
|
|
1819
|
+
description: nextTask.description,
|
|
1820
|
+
files_to_modify: nextTask.files_to_modify || [],
|
|
1821
|
+
observability: nextTask.observability || void 0
|
|
1822
|
+
});
|
|
1823
|
+
const scopeBase64 = Buffer.from(scopePayload).toString("base64");
|
|
1824
|
+
const timeoutMs = autonomy.max_sub_task_timeout_ms || 3e5;
|
|
1825
|
+
const workspacePath = path6.join(config.workspace_dir, targetRepo.name);
|
|
1826
|
+
const executionStartTime = Date.now();
|
|
1827
|
+
const updateSubTaskWithDetails = (status, options = {}) => {
|
|
1828
|
+
const endTime = Date.now();
|
|
1829
|
+
const durationMs = endTime - executionStartTime;
|
|
1830
|
+
const gitInfo = captureGitDiffInfo(workspacePath);
|
|
1831
|
+
const reloadedIdeas = loadJson(IDEAS_FILE, { ideas: [] });
|
|
1832
|
+
const reloadedIndex = reloadedIdeas.ideas.findIndex((i) => i.id === ideaId);
|
|
1833
|
+
if (reloadedIndex !== -1) {
|
|
1834
|
+
const reloadedSubTask = reloadedIdeas.ideas[reloadedIndex].implementation.sub_tasks.find(
|
|
1835
|
+
(st) => st.id === nextTask.id
|
|
1836
|
+
);
|
|
1837
|
+
if (reloadedSubTask) {
|
|
1838
|
+
reloadedSubTask.status = status;
|
|
1839
|
+
reloadedSubTask.completed_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
1840
|
+
reloadedSubTask.duration_ms = durationMs;
|
|
1841
|
+
reloadedSubTask.files_changed = gitInfo.files_changed;
|
|
1842
|
+
reloadedSubTask.lines_added = gitInfo.lines_added;
|
|
1843
|
+
reloadedSubTask.lines_removed = gitInfo.lines_removed;
|
|
1844
|
+
reloadedSubTask.has_uncommitted_changes = gitInfo.has_uncommitted_changes;
|
|
1845
|
+
if (options.failureType !== void 0) {
|
|
1846
|
+
reloadedSubTask.failure_type = options.failureType;
|
|
1847
|
+
}
|
|
1848
|
+
if (options.errorMessage !== void 0) {
|
|
1849
|
+
reloadedSubTask.error_message = options.errorMessage?.substring(0, 2e3) || null;
|
|
1850
|
+
}
|
|
1851
|
+
if (options.outputSnippet !== void 0) {
|
|
1852
|
+
reloadedSubTask.output_snippet = options.outputSnippet?.substring(0, 2e3) || null;
|
|
1853
|
+
}
|
|
1854
|
+
if (options.commitHash !== void 0) {
|
|
1855
|
+
reloadedSubTask.commit_hash = options.commitHash;
|
|
1856
|
+
}
|
|
1857
|
+
saveJson(IDEAS_FILE, reloadedIdeas);
|
|
1858
|
+
}
|
|
1859
|
+
}
|
|
1860
|
+
};
|
|
1861
|
+
let outputBuffer = "";
|
|
1862
|
+
let timedOut = false;
|
|
1863
|
+
try {
|
|
1864
|
+
const { command: implCmd, args: implArgs } = resolveScript(__dirname, "implement.ts");
|
|
1865
|
+
try {
|
|
1866
|
+
outputBuffer = (0, import_child_process3.execSync)(
|
|
1867
|
+
[implCmd, ...implArgs, `--idea=${ideaId}`, `--repo=${targetRepo.name}`, `--scope=${scopeBase64}`, "--skip-pr", `--timeout=${timeoutMs}`, "--model=sonnet"].join(" "),
|
|
1868
|
+
{ cwd: ROOT_DIR, encoding: "utf-8", timeout: timeoutMs + 3e4 }
|
|
1869
|
+
);
|
|
1870
|
+
} catch (execError) {
|
|
1871
|
+
if (execError instanceof Error && "killed" in execError) {
|
|
1872
|
+
const errWithSignal = execError;
|
|
1873
|
+
if (errWithSignal.signal === "SIGTERM") {
|
|
1874
|
+
timedOut = true;
|
|
1875
|
+
}
|
|
1876
|
+
}
|
|
1877
|
+
throw execError;
|
|
1878
|
+
}
|
|
1879
|
+
const testCommands = targetRepo.test_commands || [];
|
|
1880
|
+
if (testCommands.length > 0) {
|
|
1881
|
+
log(`Running tests for ${targetRepo.name}...`);
|
|
1882
|
+
const testResult = runTestsForRepo(workspacePath, testCommands, targetRepo.path);
|
|
1883
|
+
if (!testResult.passed) {
|
|
1884
|
+
log(`Tests failed after sub-task ${nextTask.id}`);
|
|
1885
|
+
updateSubTaskWithDetails("failed", {
|
|
1886
|
+
failureType: "tests_failed",
|
|
1887
|
+
errorMessage: `Tests failed: ${testResult.output}`,
|
|
1888
|
+
outputSnippet: outputBuffer.slice(-2e3)
|
|
1889
|
+
});
|
|
1890
|
+
return false;
|
|
1891
|
+
}
|
|
1892
|
+
}
|
|
1893
|
+
let commitHash = null;
|
|
1894
|
+
try {
|
|
1895
|
+
commitHash = (0, import_child_process3.execSync)("git rev-parse HEAD", { cwd: workspacePath, encoding: "utf-8" }).trim();
|
|
1896
|
+
} catch {
|
|
1897
|
+
}
|
|
1898
|
+
updateSubTaskWithDetails("completed", {
|
|
1899
|
+
failureType: null,
|
|
1900
|
+
commitHash,
|
|
1901
|
+
outputSnippet: outputBuffer.slice(-2e3)
|
|
1902
|
+
});
|
|
1903
|
+
log(`Sub-task ${nextTask.id} completed successfully`);
|
|
1904
|
+
return true;
|
|
1905
|
+
} catch (error) {
|
|
1906
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
1907
|
+
log(`Sub-task ${nextTask.id} failed: ${errorMessage}`);
|
|
1908
|
+
let failureType = "error";
|
|
1909
|
+
if (timedOut) {
|
|
1910
|
+
failureType = "timeout";
|
|
1911
|
+
}
|
|
1912
|
+
updateSubTaskWithDetails("failed", {
|
|
1913
|
+
failureType,
|
|
1914
|
+
errorMessage,
|
|
1915
|
+
outputSnippet: outputBuffer.slice(-2e3) || null
|
|
1916
|
+
});
|
|
1917
|
+
return false;
|
|
1918
|
+
}
|
|
1919
|
+
}
|
|
1920
|
+
async function executeMetaTask(taskId, description, businessContext) {
|
|
1921
|
+
log(`Executing meta-task via Claude Code: ${taskId}`);
|
|
1922
|
+
const allowedFiles = [
|
|
1923
|
+
"TODO.md",
|
|
1924
|
+
"MEMORY.md",
|
|
1925
|
+
"data/ideas.json",
|
|
1926
|
+
"data/goals.json"
|
|
1927
|
+
];
|
|
1928
|
+
const metaProductName = businessContext?.product?.name || process.env.NEXT_PUBLIC_PRODUCT_NAME || "this product";
|
|
1929
|
+
const prompt = `You are the AI Business Analyst for ${metaProductName}.
|
|
1930
|
+
|
|
1931
|
+
## Task: ${taskId}
|
|
1932
|
+
|
|
1933
|
+
${description}
|
|
1934
|
+
|
|
1935
|
+
## Allowed Files
|
|
1936
|
+
|
|
1937
|
+
You may ONLY read and modify these files:
|
|
1938
|
+
${allowedFiles.map((f) => `- ${f}`).join("\n")}
|
|
1939
|
+
|
|
1940
|
+
## Rules
|
|
1941
|
+
|
|
1942
|
+
1. Make the changes described above \u2014 be precise and thorough
|
|
1943
|
+
2. Do NOT modify any files outside the allowed list
|
|
1944
|
+
3. Do NOT modify scripts/, src/, or any code files
|
|
1945
|
+
4. Do NOT run any shell commands
|
|
1946
|
+
5. When modifying JSON files, preserve valid JSON structure
|
|
1947
|
+
6. When modifying TODO.md, preserve the markdown checkbox format: - [ ] or - [x]
|
|
1948
|
+
7. Be direct \u2014 read the file, make the edit, done
|
|
1949
|
+
`;
|
|
1950
|
+
return new Promise((resolve) => {
|
|
1951
|
+
const claude = (0, import_child_process3.spawn)("claude", [
|
|
1952
|
+
"--print",
|
|
1953
|
+
"--dangerously-skip-permissions",
|
|
1954
|
+
"--model",
|
|
1955
|
+
"sonnet",
|
|
1956
|
+
"--allowedTools",
|
|
1957
|
+
"Read Edit Write",
|
|
1958
|
+
"-p",
|
|
1959
|
+
prompt
|
|
1960
|
+
], {
|
|
1961
|
+
cwd: ROOT_DIR,
|
|
1962
|
+
env: { ...process.env },
|
|
1963
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
1964
|
+
});
|
|
1965
|
+
let output = "";
|
|
1966
|
+
let isResolved = false;
|
|
1967
|
+
const timeout = setTimeout(() => {
|
|
1968
|
+
if (!isResolved) {
|
|
1969
|
+
isResolved = true;
|
|
1970
|
+
log(`Meta-task timed out after 240s`);
|
|
1971
|
+
claude.kill("SIGTERM");
|
|
1972
|
+
setTimeout(() => {
|
|
1973
|
+
try {
|
|
1974
|
+
claude.kill("SIGKILL");
|
|
1975
|
+
} catch {
|
|
1976
|
+
}
|
|
1977
|
+
}, 5e3);
|
|
1978
|
+
resolve(false);
|
|
1979
|
+
}
|
|
1980
|
+
}, 24e4);
|
|
1981
|
+
claude.stdout.on("data", (data) => {
|
|
1982
|
+
output += data.toString();
|
|
1983
|
+
});
|
|
1984
|
+
claude.stderr.on("data", (data) => {
|
|
1985
|
+
process.stderr.write(data.toString());
|
|
1986
|
+
});
|
|
1987
|
+
claude.on("close", (code) => {
|
|
1988
|
+
if (isResolved) return;
|
|
1989
|
+
isResolved = true;
|
|
1990
|
+
clearTimeout(timeout);
|
|
1991
|
+
if (code === 0) {
|
|
1992
|
+
log(`Meta-task completed: ${output.substring(0, 200)}`);
|
|
1993
|
+
resolve(true);
|
|
1994
|
+
} else {
|
|
1995
|
+
log(`Meta-task failed (exit ${code})`);
|
|
1996
|
+
resolve(false);
|
|
1997
|
+
}
|
|
1998
|
+
});
|
|
1999
|
+
claude.on("error", (err) => {
|
|
2000
|
+
if (isResolved) return;
|
|
2001
|
+
isResolved = true;
|
|
2002
|
+
clearTimeout(timeout);
|
|
2003
|
+
log(`Meta-task error: ${err.message}`);
|
|
2004
|
+
resolve(false);
|
|
2005
|
+
});
|
|
2006
|
+
});
|
|
2007
|
+
}
|
|
2008
|
+
async function executeResearchTask(taskId, description) {
|
|
2009
|
+
const topicSlug = taskId.replace("research-", "").replace(/-/g, " ");
|
|
2010
|
+
const topic = description || topicSlug;
|
|
2011
|
+
log(`Executing research task: ${topic}`);
|
|
2012
|
+
const goalsData = loadJson(GOALS_FILE, { goals: [] });
|
|
2013
|
+
const goalsContext = goalsData.goals.map((g) => {
|
|
2014
|
+
const kpiLines = g.kpis.map(
|
|
2015
|
+
(k) => ` - ${k.name}: ${k.current_value ?? "N/A"} / ${k.target_value} ${k.unit}`
|
|
2016
|
+
).join("\n");
|
|
2017
|
+
return `${g.id}: ${g.title} (${g.status}) \u2014 ${g.current_value ?? 0}/${g.target_value} ${g.target_unit}
|
|
2018
|
+
${kpiLines}`;
|
|
2019
|
+
}).join("\n\n");
|
|
2020
|
+
const contextPayload = JSON.stringify({
|
|
2021
|
+
trigger: description,
|
|
2022
|
+
codebase_snapshot: loadCodebaseSnapshot(),
|
|
2023
|
+
goals: goalsContext
|
|
2024
|
+
});
|
|
2025
|
+
const contextBase64 = Buffer.from(contextPayload).toString("base64");
|
|
2026
|
+
return new Promise((resolve) => {
|
|
2027
|
+
const { command: analyzeCmd, args: analyzeArgs } = resolveScript(__dirname, "analyze.ts");
|
|
2028
|
+
const childProcess = (0, import_child_process3.spawn)(analyzeCmd, [
|
|
2029
|
+
...analyzeArgs,
|
|
2030
|
+
`--type=research`,
|
|
2031
|
+
`--topic=${topic}`,
|
|
2032
|
+
`--context=${contextBase64}`
|
|
2033
|
+
], {
|
|
2034
|
+
cwd: ROOT_DIR,
|
|
2035
|
+
stdio: "inherit"
|
|
2036
|
+
});
|
|
2037
|
+
const timeout = setTimeout(() => {
|
|
2038
|
+
childProcess.kill("SIGTERM");
|
|
2039
|
+
log("Research task timed out after 15 minutes");
|
|
2040
|
+
resolve(false);
|
|
2041
|
+
}, 9e5);
|
|
2042
|
+
childProcess.on("close", (code) => {
|
|
2043
|
+
clearTimeout(timeout);
|
|
2044
|
+
if (code === 0) {
|
|
2045
|
+
log("Research task completed successfully");
|
|
2046
|
+
resolve(true);
|
|
2047
|
+
} else {
|
|
2048
|
+
log(`Research task failed with code ${code}`);
|
|
2049
|
+
resolve(false);
|
|
2050
|
+
}
|
|
2051
|
+
});
|
|
2052
|
+
childProcess.on("error", (error) => {
|
|
2053
|
+
clearTimeout(timeout);
|
|
2054
|
+
log(`Research task error: ${error.message}`);
|
|
2055
|
+
resolve(false);
|
|
2056
|
+
});
|
|
2057
|
+
});
|
|
2058
|
+
}
|
|
2059
|
+
function buildGoalGapPrompt(goal, existingIdeas, liveKPIs, config, businessContext) {
|
|
2060
|
+
const repoList = config.repos.map((r) => `- ${r.name}: ${r.path} (${r.type})`).join("\n");
|
|
2061
|
+
const kpiLines = goal.kpis.map((k) => {
|
|
2062
|
+
const progress = k.target_value && k.current_value !== null ? `${Math.round(k.current_value / k.target_value * 100)}%` : "0%";
|
|
2063
|
+
const trend = k.history.length >= 2 ? k.history[k.history.length - 1].value > k.history[k.history.length - 2].value ? "UP" : "DOWN" : "N/A";
|
|
2064
|
+
return `- **${k.name}**: ${k.current_value ?? 0} / ${k.target_value} ${k.unit} (${progress} complete, trend: ${trend})`;
|
|
2065
|
+
}).join("\n");
|
|
2066
|
+
let existingIdeasContext = "No existing ideas for this goal.";
|
|
2067
|
+
if (existingIdeas.length > 0) {
|
|
2068
|
+
existingIdeasContext = existingIdeas.map(
|
|
2069
|
+
(i) => `- "${i.title}" \u2014 Stage: ${i.stage}, Created: ${i.created_at.split("T")[0]}`
|
|
2070
|
+
).join("\n");
|
|
2071
|
+
}
|
|
2072
|
+
let liveKPIContext = "Backend KPIs not available.";
|
|
2073
|
+
if (liveKPIs) {
|
|
2074
|
+
liveKPIContext = `Live KPIs: first_response_rate=${liveKPIs.first_response_rate}, contract_rate=${liveKPIs.contract_rate}, active_lawyers=${liveKPIs.total_active_lawyers}, total_leads=${liveKPIs.total_leads}`;
|
|
2075
|
+
}
|
|
2076
|
+
let funnelContextSection = "";
|
|
2077
|
+
if (businessContext) {
|
|
2078
|
+
const funnelSummary = businessContext.funnels.map(
|
|
2079
|
+
(f) => `- **${f.name}** (${f.status}): ${f.key_insight}`
|
|
2080
|
+
).join("\n");
|
|
2081
|
+
const goalsForHealth = loadJson(GOALS_FILE, { goals: [] }).goals;
|
|
2082
|
+
const health = computeFunnelHealth(businessContext, goalsForHealth);
|
|
2083
|
+
const earliestBroken = health.earliest_broken_stage || "unknown";
|
|
2084
|
+
const activeLawyers = businessContext.funnels.reduce((sum, f) => sum + (f.active_lawyers?.length || 0), 0);
|
|
2085
|
+
const payingLawyers = businessContext.monetization.paying_lawyers;
|
|
2086
|
+
funnelContextSection = `
|
|
2087
|
+
### Business & Funnel Context
|
|
2088
|
+
${funnelSummary}
|
|
2089
|
+
|
|
2090
|
+
The platform currently has ${activeLawyers} active lawyers, ${payingLawyers} paying. The earliest broken funnel stage is **${earliestBroken}**.
|
|
2091
|
+
|
|
2092
|
+
Key constraints:
|
|
2093
|
+
${businessContext.key_constraints.map((c) => `- ${c}`).join("\n")}
|
|
2094
|
+
|
|
2095
|
+
Rules:
|
|
2096
|
+
1. At least HALF of ideas must target the earliest broken stage, even if the goal is about a later stage.
|
|
2097
|
+
2. For the Revenue goal: if only ${activeLawyers} lawyers are active and ${payingLawyers} are paying, prioritize "convert free \u2192 paid" over "build new revenue features".
|
|
2098
|
+
3. Later-stage ideas MUST include a "prerequisites" object: { "description": "...", "funnel_stage": "...", "conditions": [{ "kpi_id": "...", "operator": "gte"|"lte", "value": N, "label": "..." }] }
|
|
2099
|
+
4. Don't propose per-lead fees when lead volume is < 3/lawyer/week.
|
|
2100
|
+
`;
|
|
2101
|
+
}
|
|
2102
|
+
const baseContextStr = buildBaseContext(businessContext);
|
|
2103
|
+
const constraintsSection = businessContext?.key_constraints?.length ? businessContext.key_constraints.map((c) => `- ${c}`).join("\n") : "- Review business constraints before proposing changes";
|
|
2104
|
+
return `${baseContextStr}
|
|
2105
|
+
|
|
2106
|
+
## GOAL-GAP RESEARCH
|
|
2107
|
+
|
|
2108
|
+
A business goal is **behind schedule** and needs ideas to close the gap.
|
|
2109
|
+
|
|
2110
|
+
### Goal: ${goal.title}
|
|
2111
|
+
**ID:** ${goal.id}
|
|
2112
|
+
**Description:** ${goal.description || goal.title}
|
|
2113
|
+
**Status:** ${goal.status}
|
|
2114
|
+
**Progress:** ${goal.current_value ?? 0} / ${goal.target_value} ${goal.target_unit}
|
|
2115
|
+
**Deadline:** ${goal.deadline || "Not set"}
|
|
2116
|
+
|
|
2117
|
+
### KPI Breakdown
|
|
2118
|
+
${kpiLines}
|
|
2119
|
+
|
|
2120
|
+
### What's Already Been Tried
|
|
2121
|
+
${existingIdeasContext}
|
|
2122
|
+
|
|
2123
|
+
### Live Backend Data
|
|
2124
|
+
${liveKPIContext}
|
|
2125
|
+
${funnelContextSection}
|
|
2126
|
+
### Repositories Available
|
|
2127
|
+
${repoList}
|
|
2128
|
+
|
|
2129
|
+
## Business Model Constraints
|
|
2130
|
+
${constraintsSection}
|
|
2131
|
+
|
|
2132
|
+
## Your Task
|
|
2133
|
+
|
|
2134
|
+
Research and generate **2-5 actionable ideas** that directly move this goal's KPIs forward.
|
|
2135
|
+
|
|
2136
|
+
### Requirements for Each Idea
|
|
2137
|
+
1. **Codebase grounded**: Use Glob/Grep/Read to verify what exists before proposing changes
|
|
2138
|
+
2. **Web researched**: Use WebSearch for best practices, competitor analysis, Brazil-specific context
|
|
2139
|
+
3. **Goal-aligned**: Must have \`goal_id\` set to "${goal.id}"
|
|
2140
|
+
4. **Measurable**: success_metrics must be in "baseline \u2192 target \u2192 timeline" format tied to goal KPIs
|
|
2141
|
+
5. **Tagged**: Include tag "goal-gap-${goal.id}"
|
|
2142
|
+
6. **Funnel-aware**: Growth/revenue ideas targeting later funnel stages must include a "prerequisites" object
|
|
2143
|
+
|
|
2144
|
+
### Output Format
|
|
2145
|
+
|
|
2146
|
+
Return a JSON array of ideas:
|
|
2147
|
+
\`\`\`json
|
|
2148
|
+
[
|
|
2149
|
+
{
|
|
2150
|
+
"title": "string - Clear, actionable title (max 80 chars)",
|
|
2151
|
+
"summary": "string - One sentence describing the improvement",
|
|
2152
|
+
"category": "product | ux_design | growth | performance | tech_debt | security | infrastructure | content | analytics | integration",
|
|
2153
|
+
"priority": "critical | high | medium | low",
|
|
2154
|
+
"effort": "xs | s | m | l | xl",
|
|
2155
|
+
"impact": "xs | s | m | l | xl",
|
|
2156
|
+
"context": "string - What triggered this idea (observations, data)",
|
|
2157
|
+
"rationale": "string - Why this matters for the business",
|
|
2158
|
+
"implementation_plan": "string - Step-by-step implementation (markdown ok)",
|
|
2159
|
+
"success_metrics": ["array of measurable outcomes in baseline\u2192target\u2192timeline format"],
|
|
2160
|
+
"tags": ["array of relevant tags including goal-gap-${goal.id}"],
|
|
2161
|
+
"files_analyzed": ["array of relevant file paths"],
|
|
2162
|
+
"goal_id": "${goal.id}",
|
|
2163
|
+
"prerequisites": "optional - { description, funnel_stage, conditions: [{ kpi_id, operator, value, label }] }"
|
|
2164
|
+
}
|
|
2165
|
+
]
|
|
2166
|
+
\`\`\`
|
|
2167
|
+
|
|
2168
|
+
Only output the JSON array, no other text.`;
|
|
2169
|
+
}
|
|
2170
|
+
async function executeGoalGapResearch(goalId) {
|
|
2171
|
+
log(`Executing goal-gap research for ${goalId}...`);
|
|
2172
|
+
const goalsData = loadJson(GOALS_FILE, { goals: [] });
|
|
2173
|
+
const goal = goalsData.goals.find((g) => g.id === goalId);
|
|
2174
|
+
if (!goal) {
|
|
2175
|
+
log(`Goal ${goalId} not found`);
|
|
2176
|
+
return false;
|
|
2177
|
+
}
|
|
2178
|
+
if (goal.status !== "behind" && goal.status !== "at_risk") {
|
|
2179
|
+
log(`Goal ${goalId} is not behind or at_risk (status: ${goal.status}), skipping`);
|
|
2180
|
+
return false;
|
|
2181
|
+
}
|
|
2182
|
+
const ideasData = loadJson(IDEAS_FILE, { ideas: [] });
|
|
2183
|
+
const existingIdeas = ideasData.ideas.filter((i) => i.goal_id === goalId);
|
|
2184
|
+
const liveKPIs = await fetchLiveKPIs();
|
|
2185
|
+
const config = loadConfig();
|
|
2186
|
+
const businessContext = loadBusinessContext();
|
|
2187
|
+
const prompt = buildGoalGapPrompt(goal, existingIdeas, liveKPIs, config, businessContext);
|
|
2188
|
+
log(`Goal-gap prompt built (${prompt.length} chars), spawning Claude Code...`);
|
|
2189
|
+
return new Promise((resolve) => {
|
|
2190
|
+
const TIMEOUT_MS = 9e5;
|
|
2191
|
+
const startTime = Date.now();
|
|
2192
|
+
const claude = (0, import_child_process3.spawn)("claude", [
|
|
2193
|
+
"--print",
|
|
2194
|
+
"--dangerously-skip-permissions"
|
|
2195
|
+
], {
|
|
2196
|
+
cwd: config.repos[0]?.path || ROOT_DIR,
|
|
2197
|
+
env: process.env,
|
|
2198
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
2199
|
+
});
|
|
2200
|
+
claude.stdin.write(prompt);
|
|
2201
|
+
claude.stdin.end();
|
|
2202
|
+
let output = "";
|
|
2203
|
+
let isResolved = false;
|
|
2204
|
+
const progressInterval = setInterval(() => {
|
|
2205
|
+
if (!isResolved) {
|
|
2206
|
+
const elapsed = Math.round((Date.now() - startTime) / 1e3);
|
|
2207
|
+
log(` ...Goal-gap research working (${elapsed}s elapsed, ${output.length} chars)`);
|
|
2208
|
+
}
|
|
2209
|
+
}, 3e4);
|
|
2210
|
+
const timeout = setTimeout(() => {
|
|
2211
|
+
if (!isResolved) {
|
|
2212
|
+
isResolved = true;
|
|
2213
|
+
clearInterval(progressInterval);
|
|
2214
|
+
claude.kill("SIGTERM");
|
|
2215
|
+
log("Goal-gap research timed out after 15 minutes");
|
|
2216
|
+
resolve(false);
|
|
2217
|
+
}
|
|
2218
|
+
}, TIMEOUT_MS);
|
|
2219
|
+
claude.stdout.on("data", (data) => {
|
|
2220
|
+
output += data.toString();
|
|
2221
|
+
});
|
|
2222
|
+
claude.stderr.on("data", (data) => {
|
|
2223
|
+
const text = data.toString();
|
|
2224
|
+
if (text.trim()) {
|
|
2225
|
+
log(` [Goal-gap stderr]: ${text.trim().substring(0, 200)}`);
|
|
2226
|
+
}
|
|
2227
|
+
});
|
|
2228
|
+
claude.on("close", (code) => {
|
|
2229
|
+
if (isResolved) return;
|
|
2230
|
+
isResolved = true;
|
|
2231
|
+
clearInterval(progressInterval);
|
|
2232
|
+
clearTimeout(timeout);
|
|
2233
|
+
const elapsed = Math.round((Date.now() - startTime) / 1e3);
|
|
2234
|
+
if (code !== 0) {
|
|
2235
|
+
log(`Goal-gap research failed with code ${code} after ${elapsed}s`);
|
|
2236
|
+
resolve(false);
|
|
2237
|
+
return;
|
|
2238
|
+
}
|
|
2239
|
+
log(`Goal-gap research completed in ${elapsed}s, parsing ideas...`);
|
|
2240
|
+
const jsonMatch = output.match(/\[\s*\{[\s\S]*\}\s*\]/);
|
|
2241
|
+
if (!jsonMatch) {
|
|
2242
|
+
log("No JSON array found in goal-gap research response");
|
|
2243
|
+
resolve(false);
|
|
2244
|
+
return;
|
|
2245
|
+
}
|
|
2246
|
+
try {
|
|
2247
|
+
const rawIdeas = JSON.parse(jsonMatch[0]);
|
|
2248
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
2249
|
+
const newIdeas = rawIdeas.map((idea) => ({
|
|
2250
|
+
id: `idea-${Math.random().toString(36).substring(2, 10)}`,
|
|
2251
|
+
title: idea.title || "Untitled Idea",
|
|
2252
|
+
summary: idea.summary || "",
|
|
2253
|
+
context: idea.context || "",
|
|
2254
|
+
rationale: idea.rationale || "",
|
|
2255
|
+
stage: "inbox",
|
|
2256
|
+
category: idea.category || "product",
|
|
2257
|
+
effort: idea.effort || "m",
|
|
2258
|
+
created_at: now,
|
|
2259
|
+
updated_at: now,
|
|
2260
|
+
implementation_plan: idea.implementation_plan || "",
|
|
2261
|
+
success_metrics: idea.success_metrics || [],
|
|
2262
|
+
source: {
|
|
2263
|
+
type: "metrics_review",
|
|
2264
|
+
files_analyzed: idea.files_analyzed
|
|
2265
|
+
},
|
|
2266
|
+
implementation: {
|
|
2267
|
+
branch_name: null,
|
|
2268
|
+
sub_tasks: []
|
|
2269
|
+
},
|
|
2270
|
+
goal_id: goalId,
|
|
2271
|
+
tags: [...idea.tags || [], `goal-gap-${goalId}`],
|
|
2272
|
+
comments: [{
|
|
2273
|
+
id: `comment-${Math.random().toString(36).substring(2, 10)}`,
|
|
2274
|
+
created_at: now,
|
|
2275
|
+
author: "system",
|
|
2276
|
+
author_name: "Goal-Gap Research",
|
|
2277
|
+
content: `Auto-generated to address goal "${goal.title}" (${goal.status}). Current progress: ${goal.current_value ?? 0}/${goal.target_value} ${goal.target_unit}.`
|
|
2278
|
+
}],
|
|
2279
|
+
related_ideas: []
|
|
2280
|
+
}));
|
|
2281
|
+
if (newIdeas.length === 0) {
|
|
2282
|
+
log("No ideas parsed from goal-gap research");
|
|
2283
|
+
resolve(false);
|
|
2284
|
+
return;
|
|
2285
|
+
}
|
|
2286
|
+
const freshIdeasData = loadJson(IDEAS_FILE, { ideas: [] });
|
|
2287
|
+
freshIdeasData.ideas.push(...newIdeas);
|
|
2288
|
+
saveJson(IDEAS_FILE, freshIdeasData);
|
|
2289
|
+
const freshGoalsData = loadJson(GOALS_FILE, { goals: [] });
|
|
2290
|
+
const freshGoal = freshGoalsData.goals.find((g) => g.id === goalId);
|
|
2291
|
+
if (freshGoal) {
|
|
2292
|
+
if (!freshGoal.related_ideas) freshGoal.related_ideas = [];
|
|
2293
|
+
freshGoal.related_ideas.push(...newIdeas.map((i) => i.id));
|
|
2294
|
+
saveJson(GOALS_FILE, freshGoalsData);
|
|
2295
|
+
}
|
|
2296
|
+
log(`Goal-gap research generated ${newIdeas.length} ideas for ${goalId}:`);
|
|
2297
|
+
newIdeas.forEach((idea, i) => {
|
|
2298
|
+
log(` ${i + 1}. ${idea.title}`);
|
|
2299
|
+
});
|
|
2300
|
+
resolve(true);
|
|
2301
|
+
} catch (error) {
|
|
2302
|
+
log(`Failed to parse goal-gap research ideas: ${error instanceof Error ? error.message : "Unknown"}`);
|
|
2303
|
+
resolve(false);
|
|
2304
|
+
}
|
|
2305
|
+
});
|
|
2306
|
+
claude.on("error", (error) => {
|
|
2307
|
+
if (!isResolved) {
|
|
2308
|
+
isResolved = true;
|
|
2309
|
+
clearInterval(progressInterval);
|
|
2310
|
+
clearTimeout(timeout);
|
|
2311
|
+
log(`Goal-gap research error: ${error.message}`);
|
|
2312
|
+
resolve(false);
|
|
2313
|
+
}
|
|
2314
|
+
});
|
|
2315
|
+
});
|
|
2316
|
+
}
|
|
2317
|
+
function buildEvaluationPrompt(idea, goal, liveKPIs, daysShipped) {
|
|
2318
|
+
let kpiComparison = "No KPI snapshot available at ship time.";
|
|
2319
|
+
if (idea.verification?.kpi_snapshot_at_ship && idea.verification.kpi_snapshot_at_ship.length > 0) {
|
|
2320
|
+
const rows = idea.verification.kpi_snapshot_at_ship.map((snap) => {
|
|
2321
|
+
const currentKPI = goal?.kpis.find((k) => k.id === snap.kpi_id);
|
|
2322
|
+
const currentVal = currentKPI?.current_value ?? "N/A";
|
|
2323
|
+
const trend = currentKPI?.history && currentKPI.history.length >= 2 ? currentKPI.history[currentKPI.history.length - 1].value > currentKPI.history[currentKPI.history.length - 2].value ? "UP" : "DOWN" : "N/A";
|
|
2324
|
+
return `| ${snap.kpi_name} | ${snap.value ?? "N/A"} | ${currentVal} | ${trend} |`;
|
|
2325
|
+
}).join("\n");
|
|
2326
|
+
kpiComparison = `| KPI | At Ship | Current | Trend |
|
|
2327
|
+
|-----|---------|---------|-------|
|
|
2328
|
+
${rows}`;
|
|
2329
|
+
}
|
|
2330
|
+
let goalContext = "No linked goal.";
|
|
2331
|
+
if (goal) {
|
|
2332
|
+
goalContext = `Goal: "${goal.title}" \u2014 Status: ${goal.status}, Current: ${goal.current_value ?? "N/A"} / Target: ${goal.target_value} ${goal.target_unit}`;
|
|
2333
|
+
}
|
|
2334
|
+
let liveKPIContext = "Backend KPIs not available.";
|
|
2335
|
+
if (liveKPIs) {
|
|
2336
|
+
liveKPIContext = `Live KPIs: first_response_rate=${liveKPIs.first_response_rate}, contract_rate=${liveKPIs.contract_rate}, conversation_rate=${liveKPIs.conversation_rate}, leads_per_lawyer_per_week=${liveKPIs.leads_per_lawyer_per_week}`;
|
|
2337
|
+
}
|
|
2338
|
+
return `You are evaluating whether a shipped product improvement achieved its intended results.
|
|
2339
|
+
|
|
2340
|
+
## Shipped Idea
|
|
2341
|
+
|
|
2342
|
+
**Title:** ${idea.title}
|
|
2343
|
+
**Summary:** ${idea.summary}
|
|
2344
|
+
**Days Since Ship:** ${daysShipped}
|
|
2345
|
+
|
|
2346
|
+
## Success Metrics (defined at creation)
|
|
2347
|
+
|
|
2348
|
+
${idea.success_metrics.map((m, i) => `${i + 1}. ${m}`).join("\n")}
|
|
2349
|
+
|
|
2350
|
+
## KPI Comparison (At Ship vs Current)
|
|
2351
|
+
|
|
2352
|
+
${kpiComparison}
|
|
2353
|
+
|
|
2354
|
+
## Goal Context
|
|
2355
|
+
|
|
2356
|
+
${goalContext}
|
|
2357
|
+
|
|
2358
|
+
## Live Backend KPIs
|
|
2359
|
+
|
|
2360
|
+
${liveKPIContext}
|
|
2361
|
+
|
|
2362
|
+
## Judgment Rules
|
|
2363
|
+
|
|
2364
|
+
For each success_metric:
|
|
2365
|
+
1. Try to parse "baseline \u2192 target \u2192 timeline" format (e.g., "Increase X from 10% to 20% within 30 days")
|
|
2366
|
+
2. If the timeline hasn't elapsed yet \u2192 status = "no_data"
|
|
2367
|
+
3. If KPI data is stale (>7 days old) \u2192 note "low" confidence
|
|
2368
|
+
4. Compare at-ship value to current value against the metric's target
|
|
2369
|
+
|
|
2370
|
+
Overall status mapping:
|
|
2371
|
+
- "validated" = majority of metrics are "met" or "partially_met" with positive trends
|
|
2372
|
+
- "needs_investigation" = majority of metrics are "not_met" despite sufficient time elapsed
|
|
2373
|
+
- "inconclusive" = not enough data, or timeline not yet elapsed for most metrics
|
|
2374
|
+
- "invalidated" = clear negative evidence (KPIs moved in wrong direction) \u2014 rare, requires strong proof
|
|
2375
|
+
|
|
2376
|
+
Set requires_human_review=true if:
|
|
2377
|
+
- Metrics show contradictory signals (some improving, some declining)
|
|
2378
|
+
- Confidence is "low" across the board
|
|
2379
|
+
- The idea may have caused a regression
|
|
2380
|
+
|
|
2381
|
+
## Follow-Up Ideas
|
|
2382
|
+
|
|
2383
|
+
If metrics are "not_met" or "needs_investigation", propose 0-2 follow-up ideas to address the gap. Each should be actionable and specific.
|
|
2384
|
+
|
|
2385
|
+
## Response Format
|
|
2386
|
+
|
|
2387
|
+
Respond with JSON only (no markdown code blocks):
|
|
2388
|
+
{
|
|
2389
|
+
"status": "validated|needs_investigation|inconclusive|invalidated",
|
|
2390
|
+
"summary": "2-3 sentence judgment of the evaluation results",
|
|
2391
|
+
"confidence": "high|medium|low",
|
|
2392
|
+
"metric_evaluations": [
|
|
2393
|
+
{
|
|
2394
|
+
"metric": "The original metric text",
|
|
2395
|
+
"status": "met|partially_met|not_met|no_data",
|
|
2396
|
+
"evidence": "What data supports this judgment"
|
|
2397
|
+
}
|
|
2398
|
+
],
|
|
2399
|
+
"requires_human_review": false,
|
|
2400
|
+
"human_review_reason": null,
|
|
2401
|
+
"follow_up_ideas": [
|
|
2402
|
+
{
|
|
2403
|
+
"title": "Short title",
|
|
2404
|
+
"summary": "What to do and why",
|
|
2405
|
+
"category": "product|growth|performance|etc",
|
|
2406
|
+
"priority": "high|medium|low"
|
|
2407
|
+
}
|
|
2408
|
+
]
|
|
2409
|
+
}`;
|
|
2410
|
+
}
|
|
2411
|
+
async function executeShippedEvaluation(ideaId) {
|
|
2412
|
+
log(`Starting post-ship evaluation for idea: ${ideaId}`);
|
|
2413
|
+
const ideasData = loadJson(IDEAS_FILE, { ideas: [] });
|
|
2414
|
+
const idea = ideasData.ideas.find((i) => i.id === ideaId);
|
|
2415
|
+
if (!idea) {
|
|
2416
|
+
log(`Idea not found: ${ideaId}`);
|
|
2417
|
+
return false;
|
|
2418
|
+
}
|
|
2419
|
+
if (idea.stage !== "shipped") {
|
|
2420
|
+
log(`Idea ${ideaId} is not in shipped stage (current: ${idea.stage})`);
|
|
2421
|
+
return false;
|
|
2422
|
+
}
|
|
2423
|
+
const daysShipped = daysSince(idea.implementation?.completed_at || idea.updated_at);
|
|
2424
|
+
let goal = null;
|
|
2425
|
+
if (idea.goal_id) {
|
|
2426
|
+
const goalsData = loadJson(GOALS_FILE, { goals: [] });
|
|
2427
|
+
goal = goalsData.goals.find((g) => g.id === idea.goal_id) || null;
|
|
2428
|
+
}
|
|
2429
|
+
const liveKPIs = await fetchLiveKPIs();
|
|
2430
|
+
const prompt = buildEvaluationPrompt(idea, goal, liveKPIs, daysShipped);
|
|
2431
|
+
const TIMEOUT_MS = 12e4;
|
|
2432
|
+
const result = await new Promise((resolve) => {
|
|
2433
|
+
const claude = (0, import_child_process3.spawn)("claude", ["--print"], {
|
|
2434
|
+
cwd: ROOT_DIR,
|
|
2435
|
+
env: process.env,
|
|
2436
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
2437
|
+
});
|
|
2438
|
+
claude.stdin.write(prompt);
|
|
2439
|
+
claude.stdin.end();
|
|
2440
|
+
let output = "";
|
|
2441
|
+
let isResolved = false;
|
|
2442
|
+
const timeout = setTimeout(() => {
|
|
2443
|
+
if (!isResolved) {
|
|
2444
|
+
isResolved = true;
|
|
2445
|
+
claude.kill("SIGTERM");
|
|
2446
|
+
log("Evaluation timed out");
|
|
2447
|
+
resolve(null);
|
|
2448
|
+
}
|
|
2449
|
+
}, TIMEOUT_MS);
|
|
2450
|
+
claude.stdout.on("data", (data) => {
|
|
2451
|
+
output += data.toString();
|
|
2452
|
+
});
|
|
2453
|
+
claude.on("close", (code) => {
|
|
2454
|
+
if (isResolved) return;
|
|
2455
|
+
isResolved = true;
|
|
2456
|
+
clearTimeout(timeout);
|
|
2457
|
+
if (code === 0 && output.trim()) {
|
|
2458
|
+
try {
|
|
2459
|
+
let jsonStr = output.trim();
|
|
2460
|
+
const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
2461
|
+
if (jsonMatch) jsonStr = jsonMatch[1].trim();
|
|
2462
|
+
const objectMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
2463
|
+
if (objectMatch) {
|
|
2464
|
+
const parsed = JSON.parse(objectMatch[0]);
|
|
2465
|
+
log(`Evaluation complete: status=${parsed.status}, confidence=${parsed.confidence}`);
|
|
2466
|
+
resolve(parsed);
|
|
2467
|
+
return;
|
|
2468
|
+
}
|
|
2469
|
+
} catch (error) {
|
|
2470
|
+
log(`Failed to parse evaluation: ${error instanceof Error ? error.message : "Unknown"}`);
|
|
2471
|
+
}
|
|
2472
|
+
}
|
|
2473
|
+
resolve(null);
|
|
2474
|
+
});
|
|
2475
|
+
claude.on("error", () => {
|
|
2476
|
+
if (!isResolved) {
|
|
2477
|
+
isResolved = true;
|
|
2478
|
+
clearTimeout(timeout);
|
|
2479
|
+
resolve(null);
|
|
2480
|
+
}
|
|
2481
|
+
});
|
|
2482
|
+
});
|
|
2483
|
+
if (!result) {
|
|
2484
|
+
log(`Evaluation failed for ${ideaId}`);
|
|
2485
|
+
return false;
|
|
2486
|
+
}
|
|
2487
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
2488
|
+
const existingVerification = idea.verification || {
|
|
2489
|
+
status: "pending",
|
|
2490
|
+
first_evaluated_at: null,
|
|
2491
|
+
last_evaluated_at: null,
|
|
2492
|
+
evaluation_count: 0,
|
|
2493
|
+
next_evaluation_after: null,
|
|
2494
|
+
summary: null,
|
|
2495
|
+
metric_evaluations: [],
|
|
2496
|
+
confidence: null,
|
|
2497
|
+
follow_up_idea_ids: [],
|
|
2498
|
+
requires_human_review: false,
|
|
2499
|
+
human_review_reason: null,
|
|
2500
|
+
kpi_snapshot_at_ship: []
|
|
2501
|
+
};
|
|
2502
|
+
let nextEvaluationDays;
|
|
2503
|
+
switch (result.status) {
|
|
2504
|
+
case "validated":
|
|
2505
|
+
nextEvaluationDays = 30;
|
|
2506
|
+
break;
|
|
2507
|
+
case "needs_investigation":
|
|
2508
|
+
nextEvaluationDays = 14;
|
|
2509
|
+
break;
|
|
2510
|
+
case "inconclusive":
|
|
2511
|
+
nextEvaluationDays = 7;
|
|
2512
|
+
break;
|
|
2513
|
+
case "invalidated":
|
|
2514
|
+
nextEvaluationDays = 30;
|
|
2515
|
+
break;
|
|
2516
|
+
default:
|
|
2517
|
+
nextEvaluationDays = 14;
|
|
2518
|
+
}
|
|
2519
|
+
const nextEvalDate = /* @__PURE__ */ new Date();
|
|
2520
|
+
nextEvalDate.setDate(nextEvalDate.getDate() + nextEvaluationDays);
|
|
2521
|
+
const updatedVerification = {
|
|
2522
|
+
...existingVerification,
|
|
2523
|
+
status: result.status,
|
|
2524
|
+
first_evaluated_at: existingVerification.first_evaluated_at || now,
|
|
2525
|
+
last_evaluated_at: now,
|
|
2526
|
+
evaluation_count: existingVerification.evaluation_count + 1,
|
|
2527
|
+
next_evaluation_after: nextEvalDate.toISOString(),
|
|
2528
|
+
summary: result.summary,
|
|
2529
|
+
metric_evaluations: result.metric_evaluations,
|
|
2530
|
+
confidence: result.confidence,
|
|
2531
|
+
requires_human_review: result.requires_human_review,
|
|
2532
|
+
human_review_reason: result.human_review_reason
|
|
2533
|
+
};
|
|
2534
|
+
const followUpIds = [];
|
|
2535
|
+
if (result.follow_up_ideas && result.follow_up_ideas.length > 0) {
|
|
2536
|
+
for (const followUp of result.follow_up_ideas) {
|
|
2537
|
+
const followUpId = `idea-eval-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
|
|
2538
|
+
const newIdea = {
|
|
2539
|
+
id: followUpId,
|
|
2540
|
+
title: followUp.title,
|
|
2541
|
+
summary: followUp.summary,
|
|
2542
|
+
context: `Follow-up from post-ship evaluation of "${idea.title}" (${ideaId})`,
|
|
2543
|
+
rationale: `Evaluation found metrics not met for shipped idea. This follow-up addresses the gap.`,
|
|
2544
|
+
stage: "inbox",
|
|
2545
|
+
category: followUp.category || "product",
|
|
2546
|
+
effort: "s",
|
|
2547
|
+
created_at: now,
|
|
2548
|
+
updated_at: now,
|
|
2549
|
+
implementation_plan: "",
|
|
2550
|
+
success_metrics: [],
|
|
2551
|
+
source: {
|
|
2552
|
+
type: "metrics_review",
|
|
2553
|
+
files_analyzed: []
|
|
2554
|
+
},
|
|
2555
|
+
implementation: {
|
|
2556
|
+
branch_name: null,
|
|
2557
|
+
completed_at: null,
|
|
2558
|
+
sub_tasks: []
|
|
2559
|
+
},
|
|
2560
|
+
goal_id: idea.goal_id || null,
|
|
2561
|
+
comments: [],
|
|
2562
|
+
tags: ["follow-up", `evaluation-${ideaId}`],
|
|
2563
|
+
related_ideas: [ideaId]
|
|
2564
|
+
};
|
|
2565
|
+
ideasData.ideas.push(newIdea);
|
|
2566
|
+
followUpIds.push(followUpId);
|
|
2567
|
+
log(`Created follow-up idea: ${followUpId} \u2014 "${followUp.title}"`);
|
|
2568
|
+
}
|
|
2569
|
+
}
|
|
2570
|
+
updatedVerification.follow_up_idea_ids = [
|
|
2571
|
+
...existingVerification.follow_up_idea_ids,
|
|
2572
|
+
...followUpIds
|
|
2573
|
+
];
|
|
2574
|
+
const ideaIndex = ideasData.ideas.findIndex((i) => i.id === ideaId);
|
|
2575
|
+
if (ideaIndex !== -1) {
|
|
2576
|
+
ideasData.ideas[ideaIndex].verification = updatedVerification;
|
|
2577
|
+
ideasData.ideas[ideaIndex].updated_at = now;
|
|
2578
|
+
const comments = ideasData.ideas[ideaIndex].comments || [];
|
|
2579
|
+
comments.push({
|
|
2580
|
+
id: `comment-eval-${Date.now().toString(36)}`,
|
|
2581
|
+
created_at: now,
|
|
2582
|
+
author: "ai",
|
|
2583
|
+
author_name: "Evaluation Agent",
|
|
2584
|
+
content: `**Post-Ship Evaluation #${updatedVerification.evaluation_count}**
|
|
2585
|
+
|
|
2586
|
+
**Status:** ${result.status.toUpperCase()}
|
|
2587
|
+
**Confidence:** ${result.confidence}
|
|
2588
|
+
|
|
2589
|
+
${result.summary}
|
|
2590
|
+
|
|
2591
|
+
**Metric Results:**
|
|
2592
|
+
${result.metric_evaluations.map((m) => `- ${m.status.toUpperCase()}: ${m.metric} \u2014 ${m.evidence}`).join("\n")}${followUpIds.length > 0 ? `
|
|
2593
|
+
|
|
2594
|
+
**Follow-up ideas created:** ${followUpIds.join(", ")}` : ""}
|
|
2595
|
+
|
|
2596
|
+
**Next evaluation:** ${nextEvalDate.toISOString().split("T")[0]}`
|
|
2597
|
+
});
|
|
2598
|
+
ideasData.ideas[ideaIndex].comments = comments;
|
|
2599
|
+
}
|
|
2600
|
+
saveJson(IDEAS_FILE, ideasData);
|
|
2601
|
+
log(`Evaluation saved for ${ideaId}: status=${result.status}, next_eval=${nextEvalDate.toISOString().split("T")[0]}`);
|
|
2602
|
+
return true;
|
|
2603
|
+
}
|
|
2604
|
+
function generateResearchTasks(idea, config, businessContext) {
|
|
2605
|
+
const tasks = [];
|
|
2606
|
+
const ideaContext = `
|
|
2607
|
+
Title: ${idea.title}
|
|
2608
|
+
Summary: ${idea.summary}
|
|
2609
|
+
Category: ${idea.category}
|
|
2610
|
+
Context: ${idea.context || "N/A"}
|
|
2611
|
+
Rationale: ${idea.rationale || "N/A"}
|
|
2612
|
+
Implementation Plan: ${idea.implementation_plan}
|
|
2613
|
+
`;
|
|
2614
|
+
const competitors = businessContext?.competitors?.join(", ") || "industry competitors";
|
|
2615
|
+
const locale = businessContext?.product?.locale;
|
|
2616
|
+
const searchLang = locale?.startsWith("pt") ? "Search in both English and Portuguese for Brazil-specific approaches" : "Search for market-specific approaches";
|
|
2617
|
+
const repoList = config?.repos?.map((r) => `- ${r.path} (${r.name}, ${r.type})`).join("\n") || "- Check available codebases";
|
|
2618
|
+
const regulatory = businessContext?.regulatory;
|
|
2619
|
+
const regulatorySection = regulatory?.length ? regulatory.map((r) => `- ${r}`).join("\n") : "- Consider regulatory and compliance requirements for this domain";
|
|
2620
|
+
tasks.push({
|
|
2621
|
+
id: "rt-001",
|
|
2622
|
+
type: "competitor_analysis",
|
|
2623
|
+
topic: `How do competitors solve: ${idea.title}`,
|
|
2624
|
+
prompt: `You are researching competitor approaches to inform a product decision.
|
|
2625
|
+
|
|
2626
|
+
## Idea Under Review
|
|
2627
|
+
${ideaContext}
|
|
2628
|
+
|
|
2629
|
+
## Your Task
|
|
2630
|
+
Use WebSearch to research:
|
|
2631
|
+
1. How do competitors (${competitors}) solve this problem?
|
|
2632
|
+
2. What are industry best practices for this type of feature?
|
|
2633
|
+
3. ${searchLang}
|
|
2634
|
+
|
|
2635
|
+
Respond with JSON only:
|
|
2636
|
+
{
|
|
2637
|
+
"competitors_researched": ["name1", "name2"],
|
|
2638
|
+
"findings": "Detailed markdown summary of what you found",
|
|
2639
|
+
"best_practices": ["practice1", "practice2"],
|
|
2640
|
+
"confidence": "high|medium|low",
|
|
2641
|
+
"recommendation": "What we should learn from competitors"
|
|
2642
|
+
}`,
|
|
2643
|
+
status: "pending",
|
|
2644
|
+
started_at: null,
|
|
2645
|
+
completed_at: null,
|
|
2646
|
+
findings: null,
|
|
2647
|
+
confidence: null,
|
|
2648
|
+
error_message: null
|
|
2649
|
+
});
|
|
2650
|
+
tasks.push({
|
|
2651
|
+
id: "rt-002",
|
|
2652
|
+
type: "codebase_verification",
|
|
2653
|
+
topic: `Verify codebase state for: ${idea.title}`,
|
|
2654
|
+
prompt: `You are verifying assumptions about the codebase before implementing a feature.
|
|
2655
|
+
|
|
2656
|
+
## Idea Under Review
|
|
2657
|
+
${ideaContext}
|
|
2658
|
+
|
|
2659
|
+
## Your Task
|
|
2660
|
+
Use Glob, Grep, and Read tools to verify:
|
|
2661
|
+
1. Do the files/services mentioned in the implementation plan actually exist?
|
|
2662
|
+
2. What is the current state of related functionality?
|
|
2663
|
+
3. Are there any existing implementations we'd be duplicating?
|
|
2664
|
+
4. What dependencies or patterns should we follow?
|
|
2665
|
+
|
|
2666
|
+
Check these codebases:
|
|
2667
|
+
${repoList}
|
|
2668
|
+
|
|
2669
|
+
Respond with JSON only:
|
|
2670
|
+
{
|
|
2671
|
+
"files_verified": ["path1", "path2"],
|
|
2672
|
+
"existing_implementations": "What already exists",
|
|
2673
|
+
"gaps_identified": "What's missing that we need",
|
|
2674
|
+
"patterns_to_follow": ["pattern1", "pattern2"],
|
|
2675
|
+
"confidence": "high|medium|low",
|
|
2676
|
+
"recommendation": "Whether implementation plan is accurate"
|
|
2677
|
+
}`,
|
|
2678
|
+
status: "pending",
|
|
2679
|
+
started_at: null,
|
|
2680
|
+
completed_at: null,
|
|
2681
|
+
findings: null,
|
|
2682
|
+
confidence: null,
|
|
2683
|
+
error_message: null
|
|
2684
|
+
});
|
|
2685
|
+
tasks.push({
|
|
2686
|
+
id: "rt-003",
|
|
2687
|
+
type: "risk_assessment",
|
|
2688
|
+
topic: `Identify risks for: ${idea.title}`,
|
|
2689
|
+
prompt: `You are a risk analyst reviewing a product feature before implementation.
|
|
2690
|
+
|
|
2691
|
+
## Idea Under Review
|
|
2692
|
+
${ideaContext}
|
|
2693
|
+
|
|
2694
|
+
## Your Task
|
|
2695
|
+
Analyze potential risks:
|
|
2696
|
+
1. Technical risks (scalability, reliability, dependencies)
|
|
2697
|
+
2. Business risks (user adoption, cost, regulatory compliance)
|
|
2698
|
+
3. Security risks (data exposure, abuse potential)
|
|
2699
|
+
4. Operational risks (maintenance burden, monitoring needs)
|
|
2700
|
+
5. What could go wrong during implementation?
|
|
2701
|
+
|
|
2702
|
+
Regulatory & compliance considerations:
|
|
2703
|
+
${regulatorySection}
|
|
2704
|
+
|
|
2705
|
+
Respond with JSON only:
|
|
2706
|
+
{
|
|
2707
|
+
"technical_risks": [{"risk": "...", "severity": "high|medium|low", "mitigation": "..."}],
|
|
2708
|
+
"business_risks": [{"risk": "...", "severity": "high|medium|low", "mitigation": "..."}],
|
|
2709
|
+
"security_risks": [{"risk": "...", "severity": "high|medium|low", "mitigation": "..."}],
|
|
2710
|
+
"confidence": "high|medium|low",
|
|
2711
|
+
"overall_risk_level": "high|medium|low",
|
|
2712
|
+
"recommendation": "proceed|revise|reject with reasoning"
|
|
2713
|
+
}`,
|
|
2714
|
+
status: "pending",
|
|
2715
|
+
started_at: null,
|
|
2716
|
+
completed_at: null,
|
|
2717
|
+
findings: null,
|
|
2718
|
+
confidence: null,
|
|
2719
|
+
error_message: null
|
|
2720
|
+
});
|
|
2721
|
+
if (idea.effort === "m" || idea.effort === "l" || idea.effort === "xl") {
|
|
2722
|
+
tasks.push({
|
|
2723
|
+
id: "rt-004",
|
|
2724
|
+
type: "alternative_approaches",
|
|
2725
|
+
topic: `Alternative solutions for: ${idea.title}`,
|
|
2726
|
+
prompt: `You are exploring alternative approaches to solve a problem.
|
|
2727
|
+
|
|
2728
|
+
## Idea Under Review
|
|
2729
|
+
${ideaContext}
|
|
2730
|
+
|
|
2731
|
+
## Your Task
|
|
2732
|
+
Research and propose 2-3 alternative approaches:
|
|
2733
|
+
1. What are different ways to solve this problem?
|
|
2734
|
+
2. What are the trade-offs of each approach?
|
|
2735
|
+
3. Is the proposed solution the best one, or is there a simpler/better way?
|
|
2736
|
+
|
|
2737
|
+
Consider:
|
|
2738
|
+
- Build vs Buy (existing services, APIs)
|
|
2739
|
+
- Simpler MVP versions
|
|
2740
|
+
- Different technical approaches
|
|
2741
|
+
- Quick wins vs comprehensive solutions
|
|
2742
|
+
|
|
2743
|
+
Respond with JSON only:
|
|
2744
|
+
{
|
|
2745
|
+
"current_approach_summary": "Brief summary of proposed solution",
|
|
2746
|
+
"alternatives": [
|
|
2747
|
+
{
|
|
2748
|
+
"name": "Alternative name",
|
|
2749
|
+
"description": "How it works",
|
|
2750
|
+
"pros": ["pro1", "pro2"],
|
|
2751
|
+
"cons": ["con1", "con2"],
|
|
2752
|
+
"effort_estimate": "xs|s|m|l|xl"
|
|
2753
|
+
}
|
|
2754
|
+
],
|
|
2755
|
+
"confidence": "high|medium|low",
|
|
2756
|
+
"recommendation": "Which approach to pursue and why"
|
|
2757
|
+
}`,
|
|
2758
|
+
status: "pending",
|
|
2759
|
+
started_at: null,
|
|
2760
|
+
completed_at: null,
|
|
2761
|
+
findings: null,
|
|
2762
|
+
confidence: null,
|
|
2763
|
+
error_message: null
|
|
2764
|
+
});
|
|
2765
|
+
}
|
|
2766
|
+
const searchPaths = (config?.repos || []).map((r) => {
|
|
2767
|
+
if (r.type === "nextjs") return `Search in ${r.path}:
|
|
2768
|
+
- ${r.path}/src/app/**/*{keyword}*/**/*.tsx
|
|
2769
|
+
- ${r.path}/src/components/**/*{keyword}*.tsx
|
|
2770
|
+
- ${r.path}/src/lib/**/*{keyword}*.ts`;
|
|
2771
|
+
if (r.type === "fastapi") return `Search in ${r.path}:
|
|
2772
|
+
- ${r.path}/app/**/*{keyword}*.py
|
|
2773
|
+
- Grep for function names, route decorators, service classes`;
|
|
2774
|
+
return `Search in ${r.path}:
|
|
2775
|
+
- ${r.path}/**/*{keyword}*`;
|
|
2776
|
+
}).join("\n\n");
|
|
2777
|
+
tasks.push({
|
|
2778
|
+
id: "rt-005",
|
|
2779
|
+
type: "duplicate_detection",
|
|
2780
|
+
topic: `Check if already implemented: ${idea.title}`,
|
|
2781
|
+
prompt: `You are checking whether a proposed feature already exists in the codebase. This prevents wasting effort on duplicate implementations.
|
|
2782
|
+
|
|
2783
|
+
## Idea Under Review
|
|
2784
|
+
${ideaContext}
|
|
2785
|
+
|
|
2786
|
+
## Your Task
|
|
2787
|
+
|
|
2788
|
+
### Step 1: Extract Keywords
|
|
2789
|
+
Extract keywords from the title and summary. Generate search variations:
|
|
2790
|
+
- Singular/plural forms
|
|
2791
|
+
- With/without hyphens and case variations
|
|
2792
|
+
- Abbreviations
|
|
2793
|
+
|
|
2794
|
+
### Step 2: Search Codebases
|
|
2795
|
+
${searchPaths || "Search available codebases for matching files and patterns."}
|
|
2796
|
+
|
|
2797
|
+
### Step 3: Functionality Search
|
|
2798
|
+
Use Grep to find related code patterns:
|
|
2799
|
+
- Hook names, function names, type definitions
|
|
2800
|
+
- API client methods
|
|
2801
|
+
- Check recent git log for commits that may have shipped this feature
|
|
2802
|
+
|
|
2803
|
+
### Step 4: Verdict
|
|
2804
|
+
Assess overlap percentage (0-100%) and classify:
|
|
2805
|
+
- **PROCEED** (0-20% overlap): No duplicates found. Safe to implement.
|
|
2806
|
+
- **EXTEND** (20-70% overlap): Found existing code that partially does this. Recommend extending.
|
|
2807
|
+
- **INVESTIGATE** (70-90% overlap): Very similar implementation exists. Clarify scope first.
|
|
2808
|
+
- **STOP** (90-100% overlap): Feature already exists. Do not implement.
|
|
2809
|
+
|
|
2810
|
+
Respond with JSON only:
|
|
2811
|
+
{
|
|
2812
|
+
"keywords_searched": ["keyword1", "keyword2"],
|
|
2813
|
+
"existing_routes": [{"path": "/route", "file": "...", "purpose": "..."}],
|
|
2814
|
+
"existing_components": [{"name": "Component", "file": "...", "purpose": "..."}],
|
|
2815
|
+
"existing_functions": [{"name": "functionName", "file": "...", "purpose": "..."}],
|
|
2816
|
+
"backend_matches": [{"name": "service/endpoint", "file": "...", "purpose": "..."}],
|
|
2817
|
+
"overlap_percentage": 0,
|
|
2818
|
+
"verdict": "proceed|extend|investigate|stop",
|
|
2819
|
+
"confidence": "high|medium|low",
|
|
2820
|
+
"recommendation": "Detailed explanation of what exists and what's genuinely new"
|
|
2821
|
+
}`,
|
|
2822
|
+
status: "pending",
|
|
2823
|
+
started_at: null,
|
|
2824
|
+
completed_at: null,
|
|
2825
|
+
findings: null,
|
|
2826
|
+
confidence: null,
|
|
2827
|
+
error_message: null
|
|
2828
|
+
});
|
|
2829
|
+
return tasks;
|
|
2830
|
+
}
|
|
2831
|
+
async function executeSingleResearchTask(task) {
|
|
2832
|
+
const TIMEOUT_MS = 3e5;
|
|
2833
|
+
log(` Starting research task: ${task.type} - ${task.topic}`);
|
|
2834
|
+
task.status = "running";
|
|
2835
|
+
task.started_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
2836
|
+
return new Promise((resolve) => {
|
|
2837
|
+
const claude = (0, import_child_process3.spawn)("claude", ["--print", "--dangerously-skip-permissions"], {
|
|
2838
|
+
cwd: ROOT_DIR,
|
|
2839
|
+
env: process.env,
|
|
2840
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
2841
|
+
});
|
|
2842
|
+
claude.stdin.write(task.prompt);
|
|
2843
|
+
claude.stdin.end();
|
|
2844
|
+
let output = "";
|
|
2845
|
+
let errorOutput = "";
|
|
2846
|
+
const timeout = setTimeout(() => {
|
|
2847
|
+
claude.kill("SIGTERM");
|
|
2848
|
+
task.status = "failed";
|
|
2849
|
+
task.completed_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
2850
|
+
task.error_message = "Timed out after 5 minutes";
|
|
2851
|
+
log(` Research task timed out: ${task.type}`);
|
|
2852
|
+
resolve(task);
|
|
2853
|
+
}, TIMEOUT_MS);
|
|
2854
|
+
claude.stdout.on("data", (data) => {
|
|
2855
|
+
output += data.toString();
|
|
2856
|
+
});
|
|
2857
|
+
claude.stderr.on("data", (data) => {
|
|
2858
|
+
errorOutput += data.toString();
|
|
2859
|
+
});
|
|
2860
|
+
claude.on("close", (code) => {
|
|
2861
|
+
clearTimeout(timeout);
|
|
2862
|
+
task.completed_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
2863
|
+
if (code === 0 && output.trim()) {
|
|
2864
|
+
try {
|
|
2865
|
+
let jsonStr = output.trim();
|
|
2866
|
+
const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
2867
|
+
if (jsonMatch) jsonStr = jsonMatch[1].trim();
|
|
2868
|
+
const objectMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
2869
|
+
if (objectMatch) {
|
|
2870
|
+
const parsed = JSON.parse(objectMatch[0]);
|
|
2871
|
+
task.status = "completed";
|
|
2872
|
+
task.findings = JSON.stringify(parsed, null, 2);
|
|
2873
|
+
task.confidence = parsed.confidence || "medium";
|
|
2874
|
+
log(` Research task completed: ${task.type} (confidence: ${task.confidence})`);
|
|
2875
|
+
} else {
|
|
2876
|
+
task.status = "completed";
|
|
2877
|
+
task.findings = output.trim();
|
|
2878
|
+
task.confidence = "low";
|
|
2879
|
+
log(` Research task completed (raw output): ${task.type}`);
|
|
2880
|
+
}
|
|
2881
|
+
} catch {
|
|
2882
|
+
task.status = "completed";
|
|
2883
|
+
task.findings = output.trim();
|
|
2884
|
+
task.confidence = "low";
|
|
2885
|
+
log(` Research task completed (parse error): ${task.type}`);
|
|
2886
|
+
}
|
|
2887
|
+
} else {
|
|
2888
|
+
task.status = "failed";
|
|
2889
|
+
task.error_message = errorOutput || `Exited with code ${code}`;
|
|
2890
|
+
log(` Research task failed: ${task.type} - ${task.error_message}`);
|
|
2891
|
+
}
|
|
2892
|
+
resolve(task);
|
|
2893
|
+
});
|
|
2894
|
+
claude.on("error", (error) => {
|
|
2895
|
+
clearTimeout(timeout);
|
|
2896
|
+
task.status = "failed";
|
|
2897
|
+
task.completed_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
2898
|
+
task.error_message = error.message;
|
|
2899
|
+
log(` Research task error: ${task.type} - ${error.message}`);
|
|
2900
|
+
resolve(task);
|
|
2901
|
+
});
|
|
2902
|
+
});
|
|
2903
|
+
}
|
|
2904
|
+
async function executeParallelResearch(idea, config, businessContext) {
|
|
2905
|
+
log(`Starting parallel research for idea: ${idea.id}`);
|
|
2906
|
+
const research = {
|
|
2907
|
+
started_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2908
|
+
completed_at: null,
|
|
2909
|
+
tasks: generateResearchTasks(idea, config, businessContext),
|
|
2910
|
+
summary: null,
|
|
2911
|
+
recommendation: null
|
|
2912
|
+
};
|
|
2913
|
+
log(`Generated ${research.tasks.length} research tasks, executing in parallel...`);
|
|
2914
|
+
const completedTasks = await Promise.all(
|
|
2915
|
+
research.tasks.map((task) => executeSingleResearchTask(task))
|
|
2916
|
+
);
|
|
2917
|
+
research.tasks = completedTasks;
|
|
2918
|
+
research.completed_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
2919
|
+
const successfulTasks = completedTasks.filter((t) => t.status === "completed");
|
|
2920
|
+
const failedTasks = completedTasks.filter((t) => t.status === "failed");
|
|
2921
|
+
log(`Research complete: ${successfulTasks.length}/${completedTasks.length} tasks succeeded`);
|
|
2922
|
+
if (successfulTasks.length > 0) {
|
|
2923
|
+
await aggregateResearchFindings(research);
|
|
2924
|
+
}
|
|
2925
|
+
if (failedTasks.length === completedTasks.length) {
|
|
2926
|
+
research.recommendation = "revise";
|
|
2927
|
+
research.summary = "All research tasks failed. Manual review required.";
|
|
2928
|
+
}
|
|
2929
|
+
return research;
|
|
2930
|
+
}
|
|
2931
|
+
async function aggregateResearchFindings(research) {
|
|
2932
|
+
const TIMEOUT_MS = 12e4;
|
|
2933
|
+
const findingsSummary = research.tasks.filter((t) => t.status === "completed" && t.findings).map((t) => `### ${t.type}
|
|
2934
|
+
${t.findings}`).join("\n\n");
|
|
2935
|
+
const prompt = `You are synthesizing research findings to make a recommendation.
|
|
2936
|
+
|
|
2937
|
+
## Research Findings
|
|
2938
|
+
|
|
2939
|
+
${findingsSummary}
|
|
2940
|
+
|
|
2941
|
+
## Your Task
|
|
2942
|
+
|
|
2943
|
+
Synthesize these findings into:
|
|
2944
|
+
1. A brief executive summary (2-3 sentences)
|
|
2945
|
+
2. Key insights from each research track
|
|
2946
|
+
3. An overall recommendation: proceed, revise, or reject
|
|
2947
|
+
|
|
2948
|
+
IMPORTANT: If the duplicate_detection task found significant overlap (verdict: "stop" or "investigate"), you MUST recommend "reject" and explain what already exists. Only recommend "proceed" if duplicate detection confirms no significant overlap.
|
|
2949
|
+
|
|
2950
|
+
Respond with JSON only:
|
|
2951
|
+
{
|
|
2952
|
+
"executive_summary": "2-3 sentence summary",
|
|
2953
|
+
"key_insights": ["insight1", "insight2", "insight3"],
|
|
2954
|
+
"risks_identified": ["risk1", "risk2"],
|
|
2955
|
+
"recommendation": "proceed|revise|reject",
|
|
2956
|
+
"recommendation_reasoning": "Why this recommendation"
|
|
2957
|
+
}`;
|
|
2958
|
+
return new Promise((resolve) => {
|
|
2959
|
+
const claude = (0, import_child_process3.spawn)("claude", ["--print"], {
|
|
2960
|
+
cwd: ROOT_DIR,
|
|
2961
|
+
env: process.env,
|
|
2962
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
2963
|
+
});
|
|
2964
|
+
claude.stdin.write(prompt);
|
|
2965
|
+
claude.stdin.end();
|
|
2966
|
+
let output = "";
|
|
2967
|
+
const timeout = setTimeout(() => {
|
|
2968
|
+
claude.kill("SIGTERM");
|
|
2969
|
+
research.summary = findingsSummary;
|
|
2970
|
+
research.recommendation = "revise";
|
|
2971
|
+
resolve();
|
|
2972
|
+
}, TIMEOUT_MS);
|
|
2973
|
+
claude.stdout.on("data", (data) => {
|
|
2974
|
+
output += data.toString();
|
|
2975
|
+
});
|
|
2976
|
+
claude.on("close", (code) => {
|
|
2977
|
+
clearTimeout(timeout);
|
|
2978
|
+
if (code === 0 && output.trim()) {
|
|
2979
|
+
try {
|
|
2980
|
+
let jsonStr = output.trim();
|
|
2981
|
+
const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
2982
|
+
if (jsonMatch) jsonStr = jsonMatch[1].trim();
|
|
2983
|
+
const objectMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
2984
|
+
if (objectMatch) {
|
|
2985
|
+
const parsed = JSON.parse(objectMatch[0]);
|
|
2986
|
+
research.summary = `**Executive Summary:** ${parsed.executive_summary}
|
|
2987
|
+
|
|
2988
|
+
**Key Insights:**
|
|
2989
|
+
${parsed.key_insights.map((i) => `- ${i}`).join("\n")}
|
|
2990
|
+
|
|
2991
|
+
**Risks:**
|
|
2992
|
+
${parsed.risks_identified?.map((r) => `- ${r}`).join("\n") || "None identified"}
|
|
2993
|
+
|
|
2994
|
+
**Reasoning:** ${parsed.recommendation_reasoning}`;
|
|
2995
|
+
research.recommendation = parsed.recommendation;
|
|
2996
|
+
log(`Research aggregation complete: ${research.recommendation}`);
|
|
2997
|
+
}
|
|
2998
|
+
} catch {
|
|
2999
|
+
research.summary = findingsSummary;
|
|
3000
|
+
research.recommendation = "revise";
|
|
3001
|
+
}
|
|
3002
|
+
} else {
|
|
3003
|
+
research.summary = findingsSummary;
|
|
3004
|
+
research.recommendation = "revise";
|
|
3005
|
+
}
|
|
3006
|
+
resolve();
|
|
3007
|
+
});
|
|
3008
|
+
claude.on("error", () => {
|
|
3009
|
+
clearTimeout(timeout);
|
|
3010
|
+
research.summary = findingsSummary;
|
|
3011
|
+
research.recommendation = "revise";
|
|
3012
|
+
resolve();
|
|
3013
|
+
});
|
|
3014
|
+
});
|
|
3015
|
+
}
|
|
3016
|
+
async function executeIdeaResearch(ideaId, config, businessContext) {
|
|
3017
|
+
log(`Executing parallel research for idea: ${ideaId}`);
|
|
3018
|
+
const ideasData = loadJson(IDEAS_FILE, { ideas: [] });
|
|
3019
|
+
const idea = ideasData.ideas.find((i) => i.id === ideaId);
|
|
3020
|
+
if (!idea) {
|
|
3021
|
+
log(`Idea not found: ${ideaId}`);
|
|
3022
|
+
return false;
|
|
3023
|
+
}
|
|
3024
|
+
if (idea.stage !== "under_review") {
|
|
3025
|
+
if (idea.stage === "inbox") {
|
|
3026
|
+
log(`Auto-transitioning idea ${ideaId} from inbox to under_review for research`);
|
|
3027
|
+
idea.stage = "under_review";
|
|
3028
|
+
idea.updated_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
3029
|
+
saveJson(IDEAS_FILE, ideasData);
|
|
3030
|
+
} else {
|
|
3031
|
+
log(`Idea ${ideaId} is not in under_review stage (current: ${idea.stage})`);
|
|
3032
|
+
return false;
|
|
3033
|
+
}
|
|
3034
|
+
}
|
|
3035
|
+
if (idea.research?.completed_at) {
|
|
3036
|
+
log(`Research already completed for idea ${ideaId}`);
|
|
3037
|
+
return true;
|
|
3038
|
+
}
|
|
3039
|
+
const research = await executeParallelResearch(idea, config, businessContext);
|
|
3040
|
+
idea.research = research;
|
|
3041
|
+
idea.updated_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
3042
|
+
const dupTask = research.tasks.find((t) => t.type === "duplicate_detection" && t.status === "completed" && t.findings);
|
|
3043
|
+
if (dupTask?.findings) {
|
|
3044
|
+
try {
|
|
3045
|
+
let jsonStr = dupTask.findings;
|
|
3046
|
+
const objectMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
3047
|
+
if (objectMatch) {
|
|
3048
|
+
const parsed = JSON.parse(objectMatch[0]);
|
|
3049
|
+
const verdict = parsed.verdict;
|
|
3050
|
+
if (["proceed", "extend", "investigate", "stop"].includes(verdict)) {
|
|
3051
|
+
idea.verification_status = verdict;
|
|
3052
|
+
log(`Duplicate detection verdict for ${ideaId}: ${verdict} (${parsed.overlap_percentage}% overlap)`);
|
|
3053
|
+
}
|
|
3054
|
+
}
|
|
3055
|
+
} catch {
|
|
3056
|
+
log(`Failed to parse duplicate detection findings for ${ideaId}`);
|
|
3057
|
+
}
|
|
3058
|
+
}
|
|
3059
|
+
if (research.summary) {
|
|
3060
|
+
const comments = idea.comments || [];
|
|
3061
|
+
comments.push({
|
|
3062
|
+
id: `comment-research-${Date.now().toString(36)}`,
|
|
3063
|
+
created_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
3064
|
+
author: "ai",
|
|
3065
|
+
author_name: "Research Agent",
|
|
3066
|
+
content: `**Parallel Research Complete**
|
|
3067
|
+
|
|
3068
|
+
${research.summary}
|
|
3069
|
+
|
|
3070
|
+
**Recommendation:** ${research.recommendation?.toUpperCase() || "REVIEW NEEDED"}`
|
|
3071
|
+
});
|
|
3072
|
+
idea.comments = comments;
|
|
3073
|
+
}
|
|
3074
|
+
saveJson(IDEAS_FILE, ideasData);
|
|
3075
|
+
log(`Research saved for idea ${ideaId}: recommendation = ${research.recommendation}`);
|
|
3076
|
+
return true;
|
|
3077
|
+
}
|
|
3078
|
+
async function executeTask(task, config, businessContext) {
|
|
3079
|
+
const taskId = "task_id" in task ? task.task_id : task.id;
|
|
3080
|
+
const taskDesc = "task_id" in task ? task.description : task.description;
|
|
3081
|
+
log(`Executing task: ${taskId} \u2014 ${taskDesc}`);
|
|
3082
|
+
const taskTypePrefix = taskId.split("-").slice(0, 2).join("-");
|
|
3083
|
+
if (DRY_RUN) {
|
|
3084
|
+
log("[DRY RUN] Would execute task but skipping");
|
|
3085
|
+
return true;
|
|
3086
|
+
}
|
|
3087
|
+
try {
|
|
3088
|
+
switch (taskId) {
|
|
3089
|
+
case "review-inbox":
|
|
3090
|
+
await executeReviewInbox();
|
|
3091
|
+
return true;
|
|
3092
|
+
case "refresh-kpis":
|
|
3093
|
+
log("KPIs already refreshed in this heartbeat");
|
|
3094
|
+
return true;
|
|
3095
|
+
case "quick-analysis":
|
|
3096
|
+
await runAnalysis("quick");
|
|
3097
|
+
return true;
|
|
3098
|
+
case "deep-analysis":
|
|
3099
|
+
await runAnalysis("deep");
|
|
3100
|
+
return true;
|
|
3101
|
+
case "metrics-analysis":
|
|
3102
|
+
await runAnalysis("metrics");
|
|
3103
|
+
return true;
|
|
3104
|
+
case "seo-audit":
|
|
3105
|
+
await runAnalysis("seo");
|
|
3106
|
+
return true;
|
|
3107
|
+
default:
|
|
3108
|
+
if (taskId.startsWith("evaluate-shipped-")) {
|
|
3109
|
+
const ideaId = taskId.replace("evaluate-shipped-", "");
|
|
3110
|
+
return await executeShippedEvaluation(ideaId);
|
|
3111
|
+
}
|
|
3112
|
+
if (taskId.startsWith("implement-")) {
|
|
3113
|
+
const ideaId = taskId.replace("implement-", "");
|
|
3114
|
+
return await executeAutonomousImplementation(ideaId);
|
|
3115
|
+
}
|
|
3116
|
+
if (taskId.startsWith("goal-gap-research-")) {
|
|
3117
|
+
const goalId = taskId.replace("goal-gap-research-", "");
|
|
3118
|
+
return await executeGoalGapResearch(goalId);
|
|
3119
|
+
}
|
|
3120
|
+
if (taskId.startsWith("research-idea-")) {
|
|
3121
|
+
const ideaId = taskId.replace("research-idea-", "");
|
|
3122
|
+
return await executeIdeaResearch(ideaId, config, businessContext);
|
|
3123
|
+
}
|
|
3124
|
+
if (taskId.startsWith("research-")) {
|
|
3125
|
+
return await executeResearchTask(taskId, taskDesc);
|
|
3126
|
+
}
|
|
3127
|
+
if (isBusinessIntelTask(taskId)) {
|
|
3128
|
+
const result = await executeBusinessIntelTask(taskId, taskDesc, businessContext);
|
|
3129
|
+
log(`Business intel task result: ${result.success ? "SUCCESS" : "FAILED"} \u2014 ${result.output.slice(0, 200)}`);
|
|
3130
|
+
trackEvent("heartbeat_task", { taskType: taskTypePrefix, success: result.success });
|
|
3131
|
+
return result.success;
|
|
3132
|
+
}
|
|
3133
|
+
if (isContentTask(taskId)) {
|
|
3134
|
+
const contentflowConfig = businessContext?.contentflow;
|
|
3135
|
+
const result = await executeContentTask(taskId, taskDesc, contentflowConfig);
|
|
3136
|
+
log(`Content task result: ${result.success ? "SUCCESS" : "FAILED"} \u2014 ${result.output.slice(0, 200)}`);
|
|
3137
|
+
trackEvent("heartbeat_task", { taskType: taskTypePrefix, success: result.success });
|
|
3138
|
+
return result.success;
|
|
3139
|
+
}
|
|
3140
|
+
return await executeMetaTask(taskId, taskDesc, businessContext);
|
|
3141
|
+
}
|
|
3142
|
+
} catch (error) {
|
|
3143
|
+
log(`Task failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
3144
|
+
trackEvent("heartbeat_task", { taskType: taskTypePrefix, success: false, errorType: error instanceof Error ? error.constructor.name : "unknown" });
|
|
3145
|
+
return false;
|
|
3146
|
+
}
|
|
3147
|
+
}
|
|
3148
|
+
async function executeReviewInbox() {
|
|
3149
|
+
const ideasData = loadJson(IDEAS_FILE, { ideas: [] });
|
|
3150
|
+
const inboxIdeas = ideasData.ideas.filter((i) => i.stage === "inbox");
|
|
3151
|
+
if (inboxIdeas.length === 0) {
|
|
3152
|
+
log("No ideas in inbox to review");
|
|
3153
|
+
return;
|
|
3154
|
+
}
|
|
3155
|
+
log(`Reviewing ${inboxIdeas.length} ideas in inbox...`);
|
|
3156
|
+
for (const idea of inboxIdeas) {
|
|
3157
|
+
const days = daysSince(idea.created_at);
|
|
3158
|
+
log(` - ${idea.id}: "${idea.title}" (${days} days old)`);
|
|
3159
|
+
}
|
|
3160
|
+
log("Inbox review complete (manual prioritization needed)");
|
|
3161
|
+
}
|
|
3162
|
+
async function runAnalysis(type) {
|
|
3163
|
+
return new Promise((resolve, reject) => {
|
|
3164
|
+
log(`Running ${type} analysis...`);
|
|
3165
|
+
const { command: runCmd, args: runArgs } = resolveScript(__dirname, "analyze.ts");
|
|
3166
|
+
const childProcess = (0, import_child_process3.spawn)(runCmd, [...runArgs, `--type=${type}`], {
|
|
3167
|
+
cwd: ROOT_DIR,
|
|
3168
|
+
stdio: "inherit"
|
|
3169
|
+
});
|
|
3170
|
+
childProcess.on("close", (code) => {
|
|
3171
|
+
if (code === 0) {
|
|
3172
|
+
log(`${type} analysis completed successfully`);
|
|
3173
|
+
resolve();
|
|
3174
|
+
} else {
|
|
3175
|
+
reject(new Error(`Analysis exited with code ${code}`));
|
|
3176
|
+
}
|
|
3177
|
+
});
|
|
3178
|
+
childProcess.on("error", (error) => {
|
|
3179
|
+
reject(error);
|
|
3180
|
+
});
|
|
3181
|
+
});
|
|
3182
|
+
}
|
|
3183
|
+
function updateTodoFile(taskId, completed) {
|
|
3184
|
+
try {
|
|
3185
|
+
let content = fs6.readFileSync(TODO_FILE, "utf-8");
|
|
3186
|
+
const uncheckedPattern = new RegExp(`- \\[ \\] \`${taskId}\``, "g");
|
|
3187
|
+
const checkedPattern = new RegExp(`- \\[x\\] \`${taskId}\``, "g");
|
|
3188
|
+
if (completed) {
|
|
3189
|
+
content = content.replace(uncheckedPattern, `- [x] \`${taskId}\``);
|
|
3190
|
+
} else {
|
|
3191
|
+
content = content.replace(checkedPattern, `- [ ] \`${taskId}\``);
|
|
3192
|
+
}
|
|
3193
|
+
fs6.writeFileSync(TODO_FILE, content);
|
|
3194
|
+
log(`Updated TODO.md: ${taskId} marked as ${completed ? "completed" : "pending"}`);
|
|
3195
|
+
} catch (error) {
|
|
3196
|
+
log(`Failed to update TODO.md: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
3197
|
+
}
|
|
3198
|
+
}
|
|
3199
|
+
function generateStatusContent(state, alerts, nextTask, reasoning) {
|
|
3200
|
+
const now = /* @__PURE__ */ new Date();
|
|
3201
|
+
const currentGoal = state.goals[0];
|
|
3202
|
+
const goalSection = currentGoal ? `- **Goal:** ${currentGoal.title} (${currentGoal.target_value}${currentGoal.target_unit} by Q2 2026)
|
|
3203
|
+
- **Status:** ${currentGoal.status}
|
|
3204
|
+
- **Current Value:** ${currentGoal.current_value !== null ? `${currentGoal.current_value}${currentGoal.target_unit}` : "Not yet measured"}
|
|
3205
|
+
- **Progress:** ${currentGoal.current_value !== null ? `${Math.round(currentGoal.current_value / currentGoal.target_value * 100)}%` : "N/A"}` : "- No active goals";
|
|
3206
|
+
const kpiRows = currentGoal?.kpis.map((k) => {
|
|
3207
|
+
const status = k.current_value !== null && k.target_value !== null ? k.direction === "higher_is_better" ? k.current_value >= k.target_value ? "\u2705" : "\u26A0\uFE0F" : k.current_value <= k.target_value ? "\u2705" : "\u26A0\uFE0F" : "\u2014";
|
|
3208
|
+
return `| ${k.name} | ${k.current_value ?? "\u2014"} | ${k.target_value ?? "\u2014"} | ${k.unit} | ${status} |`;
|
|
3209
|
+
}).join("\n") || "| \u2014 | \u2014 | \u2014 | \u2014 | \u2014 |";
|
|
3210
|
+
const activeIdeas = state.ideas.filter((i) => i.stage === "in_progress");
|
|
3211
|
+
const activeWorkRows = activeIdeas.length > 0 ? activeIdeas.map((i) => `| ${i.id} | ${i.title} | in_progress | ${i.implementation.branch_name || "\u2014"} |`).join("\n") : "| \u2014 | No active work | \u2014 | \u2014 |";
|
|
3212
|
+
const inboxIdeas = state.ideas.filter((i) => i.stage === "inbox");
|
|
3213
|
+
const pendingRows = inboxIdeas.length > 0 ? inboxIdeas.map((i) => `| ${i.id} | ${i.title} | ${daysSince(i.created_at)} |`).join("\n") : "| \u2014 | No ideas pending review | \u2014 |";
|
|
3214
|
+
const alertsSection = alerts.length > 0 ? alerts.map((a) => `- ${a}`).join("\n") : "- None";
|
|
3215
|
+
const analysisSection = reasoning ? `**Analysis:** ${reasoning.analysis}
|
|
3216
|
+
|
|
3217
|
+
**Critical Issue:** ${reasoning.critical_issue || "None identified"}
|
|
3218
|
+
|
|
3219
|
+
**Recommended Action:** ${reasoning.next_action ? `${reasoning.next_action.task_id} \u2014 ${reasoning.next_action.description}` : "None"}` : "*Claude reasoning was skipped*";
|
|
3220
|
+
const recentSessions = state.sessions.filter((s) => s.status === "completed").slice(-5).reverse();
|
|
3221
|
+
const activityRows = [
|
|
3222
|
+
`| ${formatDate(now)} | Heartbeat check-in |`,
|
|
3223
|
+
...recentSessions.map(
|
|
3224
|
+
(s) => `| ${formatDate(new Date(s.completed_at || s.created_at))} | ${s.type} analysis completed (${s.ideas_generated.length} ideas) |`
|
|
3225
|
+
)
|
|
3226
|
+
].join("\n");
|
|
3227
|
+
const nextScheduled = nextTask ? `${nextTask.description}` : "No scheduled tasks pending";
|
|
3228
|
+
return `# Analyst Status
|
|
3229
|
+
|
|
3230
|
+
**Last Heartbeat:** ${formatDateTime(now)}
|
|
3231
|
+
**Next Scheduled:** ${nextScheduled}
|
|
3232
|
+
|
|
3233
|
+
## Current Focus
|
|
3234
|
+
|
|
3235
|
+
${goalSection}
|
|
3236
|
+
|
|
3237
|
+
## KPI Dashboard
|
|
3238
|
+
|
|
3239
|
+
| KPI | Current | Target | Unit | Status |
|
|
3240
|
+
|-----|---------|--------|------|--------|
|
|
3241
|
+
${kpiRows}
|
|
3242
|
+
|
|
3243
|
+
## AI Analysis
|
|
3244
|
+
|
|
3245
|
+
${analysisSection}
|
|
3246
|
+
|
|
3247
|
+
## Active Work
|
|
3248
|
+
|
|
3249
|
+
| ID | Title | Stage | Branch |
|
|
3250
|
+
|----|-------|-------|--------|
|
|
3251
|
+
${activeWorkRows}
|
|
3252
|
+
|
|
3253
|
+
## Pending Review
|
|
3254
|
+
|
|
3255
|
+
| ID | Title | Days in Inbox |
|
|
3256
|
+
|----|-------|---------------|
|
|
3257
|
+
${pendingRows}
|
|
3258
|
+
|
|
3259
|
+
## Alerts
|
|
3260
|
+
|
|
3261
|
+
${alertsSection}
|
|
3262
|
+
|
|
3263
|
+
## Recent Activity
|
|
3264
|
+
|
|
3265
|
+
| Date | Event |
|
|
3266
|
+
|------|-------|
|
|
3267
|
+
${activityRows}
|
|
3268
|
+
|
|
3269
|
+
---
|
|
3270
|
+
|
|
3271
|
+
*This file is updated automatically by the heartbeat script.*
|
|
3272
|
+
`;
|
|
3273
|
+
}
|
|
3274
|
+
async function runSingleHeartbeat(beatNumber = 1) {
|
|
3275
|
+
const startTime = Date.now();
|
|
3276
|
+
const startedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
3277
|
+
capturedLogs = [];
|
|
3278
|
+
isCapturingLogs = true;
|
|
3279
|
+
try {
|
|
3280
|
+
log("=== Heartbeat Check-in Started ===");
|
|
3281
|
+
const commandsDir = path6.join(PROJECT_DIR, ".claude", "commands");
|
|
3282
|
+
if (!fs6.existsSync(commandsDir)) {
|
|
3283
|
+
log("Slash commands missing \u2014 auto-scaffolding...");
|
|
3284
|
+
scaffoldSlashCommands(PROJECT_DIR);
|
|
3285
|
+
}
|
|
3286
|
+
if (DRY_RUN) {
|
|
3287
|
+
log("Running in DRY RUN mode \u2014 no changes will be made");
|
|
3288
|
+
}
|
|
3289
|
+
if (SKIP_REASONING) {
|
|
3290
|
+
log("Skipping Claude reasoning step");
|
|
3291
|
+
}
|
|
3292
|
+
const state = loadState();
|
|
3293
|
+
const businessContext = loadBusinessContext();
|
|
3294
|
+
const heartbeatConfig = loadConfig();
|
|
3295
|
+
log(`Loaded state: ${state.ideas.length} ideas, ${state.goals.length} goals, ${state.sessions.length} sessions`);
|
|
3296
|
+
if (!DRY_RUN) {
|
|
3297
|
+
archiveCompletedTodos();
|
|
3298
|
+
pruneStaleScheduledTodos(state);
|
|
3299
|
+
}
|
|
3300
|
+
const alerts = checkAlerts(state);
|
|
3301
|
+
if (alerts.length > 0) {
|
|
3302
|
+
log(`Found ${alerts.length} alert(s):`);
|
|
3303
|
+
alerts.forEach((a) => log(` - ${a}`));
|
|
3304
|
+
} else {
|
|
3305
|
+
log("No alerts");
|
|
3306
|
+
}
|
|
3307
|
+
const backendHealthy = await checkBackendHealth();
|
|
3308
|
+
const liveKPIs = backendHealthy ? await fetchLiveKPIs() : null;
|
|
3309
|
+
state.liveData = {
|
|
3310
|
+
kpis: liveKPIs,
|
|
3311
|
+
backendHealthy
|
|
3312
|
+
};
|
|
3313
|
+
if (liveKPIs && !DRY_RUN) {
|
|
3314
|
+
updateGoalsWithKPIs(liveKPIs);
|
|
3315
|
+
const updatedGoals = loadJson(GOALS_FILE, { goals: [] });
|
|
3316
|
+
state.goals = updatedGoals.goals;
|
|
3317
|
+
updateBusinessContext(businessContext, liveKPIs);
|
|
3318
|
+
log("Updated business context with live KPIs");
|
|
3319
|
+
}
|
|
3320
|
+
let reasoning = null;
|
|
3321
|
+
if (!SKIP_REASONING) {
|
|
3322
|
+
reasoning = await runClaudeReasoning(state, alerts, businessContext);
|
|
3323
|
+
}
|
|
3324
|
+
let taskToDo = null;
|
|
3325
|
+
if (reasoning?.next_action) {
|
|
3326
|
+
log(`Claude recommends: ${reasoning.next_action.task_id} \u2014 ${reasoning.next_action.description}`);
|
|
3327
|
+
const existingTask = state.todos.find((t) => t.id === reasoning.next_action.task_id);
|
|
3328
|
+
if (existingTask) {
|
|
3329
|
+
taskToDo = existingTask;
|
|
3330
|
+
} else {
|
|
3331
|
+
const success = await executeTask(reasoning.next_action, heartbeatConfig, businessContext);
|
|
3332
|
+
if (!success) {
|
|
3333
|
+
taskToDo = determineWork(state);
|
|
3334
|
+
}
|
|
3335
|
+
}
|
|
3336
|
+
} else {
|
|
3337
|
+
taskToDo = determineWork(state);
|
|
3338
|
+
}
|
|
3339
|
+
if (taskToDo) {
|
|
3340
|
+
log(`Task to do: ${taskToDo.id} \u2014 ${taskToDo.description}`);
|
|
3341
|
+
const success = await executeTask(taskToDo, heartbeatConfig, businessContext);
|
|
3342
|
+
if (success && !DRY_RUN) {
|
|
3343
|
+
if (!["quick-analysis", "deep-analysis", "metrics-analysis", "seo-audit"].includes(taskToDo.id)) {
|
|
3344
|
+
updateTodoFile(taskToDo.id, true);
|
|
3345
|
+
}
|
|
3346
|
+
} else if (!success && !taskToDo.id.startsWith("implement-")) {
|
|
3347
|
+
const config = loadConfig();
|
|
3348
|
+
if (config.autonomy?.enabled) {
|
|
3349
|
+
const inProgressIdeas = state.ideas.filter((i) => i.stage === "in_progress");
|
|
3350
|
+
for (const idea of inProgressIdeas) {
|
|
3351
|
+
const subTasks = idea.implementation.sub_tasks || [];
|
|
3352
|
+
const hasPending = subTasks.some((st) => st.status === "pending");
|
|
3353
|
+
const hasFailed = subTasks.some((st) => st.status === "failed");
|
|
3354
|
+
if ((subTasks.length === 0 || hasPending) && !hasFailed) {
|
|
3355
|
+
log(`Falling through to autonomy: implement-${idea.id}`);
|
|
3356
|
+
await executeAutonomousImplementation(idea.id);
|
|
3357
|
+
break;
|
|
3358
|
+
}
|
|
3359
|
+
}
|
|
3360
|
+
if (!inProgressIdeas.some((i) => (i.implementation.sub_tasks || []).some((st) => st.status === "pending"))) {
|
|
3361
|
+
const approvedIdeas = state.ideas.filter((i) => i.stage === "approved");
|
|
3362
|
+
if (approvedIdeas.length > 0) {
|
|
3363
|
+
log(`Falling through to autonomy: implement-${approvedIdeas[0].id}`);
|
|
3364
|
+
await executeAutonomousImplementation(approvedIdeas[0].id);
|
|
3365
|
+
}
|
|
3366
|
+
}
|
|
3367
|
+
}
|
|
3368
|
+
}
|
|
3369
|
+
} else {
|
|
3370
|
+
log("No tasks to do right now");
|
|
3371
|
+
}
|
|
3372
|
+
if (reasoning?.new_todos && reasoning.new_todos.length > 0 && !DRY_RUN) {
|
|
3373
|
+
addTasksToTodo(reasoning.new_todos);
|
|
3374
|
+
}
|
|
3375
|
+
if (reasoning?.learnings && reasoning.learnings.length > 0 && !DRY_RUN) {
|
|
3376
|
+
appendToMemory(reasoning.learnings);
|
|
3377
|
+
}
|
|
3378
|
+
if (!DRY_RUN) {
|
|
3379
|
+
const statusContent = generateStatusContent(state, alerts, taskToDo, reasoning);
|
|
3380
|
+
fs6.writeFileSync(STATUS_FILE, statusContent);
|
|
3381
|
+
log("Updated STATUS.md");
|
|
3382
|
+
} else {
|
|
3383
|
+
log("[DRY RUN] Would update STATUS.md");
|
|
3384
|
+
}
|
|
3385
|
+
log("=== Heartbeat Check-in Complete ===");
|
|
3386
|
+
isCapturingLogs = false;
|
|
3387
|
+
return {
|
|
3388
|
+
heartbeat_number: beatNumber,
|
|
3389
|
+
started_at: startedAt,
|
|
3390
|
+
completed_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
3391
|
+
duration_ms: Date.now() - startTime,
|
|
3392
|
+
alerts_count: alerts.length,
|
|
3393
|
+
kpis_updated: !!liveKPIs,
|
|
3394
|
+
claude_analysis: reasoning?.analysis || null,
|
|
3395
|
+
task_executed: taskToDo?.id || null,
|
|
3396
|
+
todos_added: reasoning?.new_todos?.length || 0,
|
|
3397
|
+
learnings_added: reasoning?.learnings?.length || 0,
|
|
3398
|
+
success: true,
|
|
3399
|
+
error_message: null,
|
|
3400
|
+
logs: [...capturedLogs]
|
|
3401
|
+
};
|
|
3402
|
+
} catch (error) {
|
|
3403
|
+
isCapturingLogs = false;
|
|
3404
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
3405
|
+
log(`ERROR: Heartbeat failed \u2014 ${errorMessage}`);
|
|
3406
|
+
if (error instanceof Error && error.stack) {
|
|
3407
|
+
log(error.stack);
|
|
3408
|
+
}
|
|
3409
|
+
return {
|
|
3410
|
+
heartbeat_number: beatNumber,
|
|
3411
|
+
started_at: startedAt,
|
|
3412
|
+
completed_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
3413
|
+
duration_ms: Date.now() - startTime,
|
|
3414
|
+
alerts_count: 0,
|
|
3415
|
+
kpis_updated: false,
|
|
3416
|
+
claude_analysis: null,
|
|
3417
|
+
task_executed: null,
|
|
3418
|
+
todos_added: 0,
|
|
3419
|
+
learnings_added: 0,
|
|
3420
|
+
success: false,
|
|
3421
|
+
error_message: errorMessage,
|
|
3422
|
+
logs: [...capturedLogs]
|
|
3423
|
+
};
|
|
3424
|
+
}
|
|
3425
|
+
}
|
|
3426
|
+
function generateSessionSummary(sessionId, startedAt, heartbeats) {
|
|
3427
|
+
const completedAt = /* @__PURE__ */ new Date();
|
|
3428
|
+
const durations = heartbeats.map((h) => h.duration_ms);
|
|
3429
|
+
return {
|
|
3430
|
+
id: sessionId,
|
|
3431
|
+
started_at: startedAt.toISOString(),
|
|
3432
|
+
completed_at: completedAt.toISOString(),
|
|
3433
|
+
duration_seconds: Math.round((completedAt.getTime() - startedAt.getTime()) / 1e3),
|
|
3434
|
+
interval_minutes: INTERVAL_MINUTES,
|
|
3435
|
+
total_heartbeats: heartbeats.length,
|
|
3436
|
+
successful_heartbeats: heartbeats.filter((h) => h.success).length,
|
|
3437
|
+
failed_heartbeats: heartbeats.filter((h) => !h.success).length,
|
|
3438
|
+
total_alerts: heartbeats.reduce((sum, h) => sum + h.alerts_count, 0),
|
|
3439
|
+
total_kpi_updates: heartbeats.filter((h) => h.kpis_updated).length,
|
|
3440
|
+
total_todos_added: heartbeats.reduce((sum, h) => sum + h.todos_added, 0),
|
|
3441
|
+
total_learnings: heartbeats.reduce((sum, h) => sum + h.learnings_added, 0),
|
|
3442
|
+
tasks_executed: heartbeats.map((h) => h.task_executed).filter(Boolean),
|
|
3443
|
+
key_insights: heartbeats.map((h) => h.claude_analysis).filter(Boolean),
|
|
3444
|
+
avg_heartbeat_ms: durations.length > 0 ? Math.round(durations.reduce((a, b) => a + b, 0) / durations.length) : 0,
|
|
3445
|
+
min_heartbeat_ms: durations.length > 0 ? Math.min(...durations) : 0,
|
|
3446
|
+
max_heartbeat_ms: durations.length > 0 ? Math.max(...durations) : 0,
|
|
3447
|
+
heartbeats
|
|
3448
|
+
};
|
|
3449
|
+
}
|
|
3450
|
+
function printSessionSummary(summary) {
|
|
3451
|
+
console.log(`
|
|
3452
|
+
${"=".repeat(60)}`);
|
|
3453
|
+
console.log(` SESSION COMPLETE: ${summary.id}`);
|
|
3454
|
+
console.log(`${"=".repeat(60)}`);
|
|
3455
|
+
console.log(`
|
|
3456
|
+
Duration: ${Math.round(summary.duration_seconds / 60)} minutes
|
|
3457
|
+
Heartbeats: ${summary.successful_heartbeats}/${summary.total_heartbeats} successful
|
|
3458
|
+
|
|
3459
|
+
ACTIVITY:
|
|
3460
|
+
- Alerts detected: ${summary.total_alerts}
|
|
3461
|
+
- KPI updates: ${summary.total_kpi_updates}
|
|
3462
|
+
- TODOs added: ${summary.total_todos_added}
|
|
3463
|
+
- Learnings recorded: ${summary.total_learnings}
|
|
3464
|
+
- Tasks executed: ${summary.tasks_executed.length}
|
|
3465
|
+
|
|
3466
|
+
TIMING:
|
|
3467
|
+
- Avg heartbeat: ${Math.round(summary.avg_heartbeat_ms / 1e3)}s
|
|
3468
|
+
- Min heartbeat: ${Math.round(summary.min_heartbeat_ms / 1e3)}s
|
|
3469
|
+
- Max heartbeat: ${Math.round(summary.max_heartbeat_ms / 1e3)}s`);
|
|
3470
|
+
if (summary.key_insights.length > 0) {
|
|
3471
|
+
console.log("\nKEY INSIGHTS:");
|
|
3472
|
+
summary.key_insights.forEach((insight, i) => {
|
|
3473
|
+
const truncated = insight.length > 100 ? insight.substring(0, 100) + "..." : insight;
|
|
3474
|
+
console.log(` ${i + 1}. ${truncated}`);
|
|
3475
|
+
});
|
|
3476
|
+
}
|
|
3477
|
+
if (summary.tasks_executed.length > 0) {
|
|
3478
|
+
console.log("\nTASKS EXECUTED:");
|
|
3479
|
+
summary.tasks_executed.forEach((task) => {
|
|
3480
|
+
console.log(` - ${task}`);
|
|
3481
|
+
});
|
|
3482
|
+
}
|
|
3483
|
+
const failedBeats = summary.heartbeats.filter((h) => !h.success);
|
|
3484
|
+
if (failedBeats.length > 0) {
|
|
3485
|
+
console.log("\nFAILED HEARTBEATS:");
|
|
3486
|
+
failedBeats.forEach((h) => {
|
|
3487
|
+
console.log(` - #${h.heartbeat_number}: ${h.error_message}`);
|
|
3488
|
+
});
|
|
3489
|
+
}
|
|
3490
|
+
console.log(`
|
|
3491
|
+
${"=".repeat(60)}
|
|
3492
|
+
`);
|
|
3493
|
+
}
|
|
3494
|
+
function saveSessionToJson(summary) {
|
|
3495
|
+
const sessionsFile = path6.join(DATA_DIR, "heartbeat-sessions.json");
|
|
3496
|
+
const sessionsData = loadJson(sessionsFile, { sessions: [] });
|
|
3497
|
+
sessionsData.sessions.push(summary);
|
|
3498
|
+
if (sessionsData.sessions.length > 50) {
|
|
3499
|
+
sessionsData.sessions = sessionsData.sessions.slice(-50);
|
|
3500
|
+
}
|
|
3501
|
+
saveJson(sessionsFile, sessionsData);
|
|
3502
|
+
log(`Session saved to ${sessionsFile}`);
|
|
3503
|
+
}
|
|
3504
|
+
async function runContinuousSession() {
|
|
3505
|
+
const sessionId = `session-${(/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")}`;
|
|
3506
|
+
const startedAt = /* @__PURE__ */ new Date();
|
|
3507
|
+
const durationMs = DURATION_MINUTES * 60 * 1e3;
|
|
3508
|
+
const intervalMs = INTERVAL_MINUTES * 60 * 1e3;
|
|
3509
|
+
const endTime = HEARTBEAT_COUNT > 0 ? Infinity : startedAt.getTime() + durationMs;
|
|
3510
|
+
const maxBeats = HEARTBEAT_COUNT > 0 ? HEARTBEAT_COUNT : Math.ceil(DURATION_MINUTES / INTERVAL_MINUTES);
|
|
3511
|
+
console.log(`
|
|
3512
|
+
${"=".repeat(60)}`);
|
|
3513
|
+
console.log(` CONTINUOUS SESSION: ${sessionId}`);
|
|
3514
|
+
if (HEARTBEAT_COUNT > 0) {
|
|
3515
|
+
console.log(` Count: ${HEARTBEAT_COUNT} heartbeats | Interval: ${INTERVAL_MINUTES} minutes`);
|
|
3516
|
+
} else {
|
|
3517
|
+
console.log(` Duration: ${DURATION_MINUTES} minutes | Interval: ${INTERVAL_MINUTES} minutes`);
|
|
3518
|
+
}
|
|
3519
|
+
console.log(` Max heartbeats: ${maxBeats}`);
|
|
3520
|
+
console.log(`${"=".repeat(60)}
|
|
3521
|
+
`);
|
|
3522
|
+
const heartbeats = [];
|
|
3523
|
+
let beatNumber = 0;
|
|
3524
|
+
while (Date.now() < endTime && (HEARTBEAT_COUNT === 0 || beatNumber < HEARTBEAT_COUNT)) {
|
|
3525
|
+
beatNumber++;
|
|
3526
|
+
const beatStart = Date.now();
|
|
3527
|
+
console.log(`
|
|
3528
|
+
--- Heartbeat #${beatNumber} ---
|
|
3529
|
+
`);
|
|
3530
|
+
const result = await runSingleHeartbeat(beatNumber);
|
|
3531
|
+
heartbeats.push(result);
|
|
3532
|
+
if (!result.success) {
|
|
3533
|
+
log(`Heartbeat #${beatNumber} failed: ${result.error_message}`);
|
|
3534
|
+
}
|
|
3535
|
+
const isLastBeat = HEARTBEAT_COUNT > 0 ? beatNumber >= HEARTBEAT_COUNT : Date.now() + intervalMs > endTime;
|
|
3536
|
+
if (!isLastBeat) {
|
|
3537
|
+
const elapsed = Date.now() - beatStart;
|
|
3538
|
+
const waitTime = Math.max(0, intervalMs - elapsed);
|
|
3539
|
+
if (waitTime > 0) {
|
|
3540
|
+
const nextBeatAt = new Date(Date.now() + waitTime);
|
|
3541
|
+
console.log(`
|
|
3542
|
+
[SESSION] Next heartbeat in ${Math.round(waitTime / 1e3)}s (${nextBeatAt.toLocaleTimeString()})`);
|
|
3543
|
+
await sleep(waitTime);
|
|
3544
|
+
}
|
|
3545
|
+
}
|
|
3546
|
+
}
|
|
3547
|
+
const summary = generateSessionSummary(sessionId, startedAt, heartbeats);
|
|
3548
|
+
saveSessionToJson(summary);
|
|
3549
|
+
printSessionSummary(summary);
|
|
3550
|
+
return summary;
|
|
3551
|
+
}
|
|
3552
|
+
async function main() {
|
|
3553
|
+
if (SESSION_MODE) {
|
|
3554
|
+
await runContinuousSession();
|
|
3555
|
+
} else {
|
|
3556
|
+
await runSingleHeartbeat();
|
|
3557
|
+
}
|
|
3558
|
+
}
|
|
3559
|
+
main().catch((error) => {
|
|
3560
|
+
console.error("Heartbeat failed:", error);
|
|
3561
|
+
process.exit(1);
|
|
3562
|
+
});
|