From fe4eddc4747c9de1c2e98434a9bdeda2c142037d Mon Sep 17 00:00:00 2001 From: Immanuel G Date: Tue, 9 Sep 2025 21:30:09 +0530 Subject: [PATCH 1/2] Code Updated --- .DS_Store | Bin 8196 -> 8196 bytes DIT.git/HEAD | 1 - DIT.git/config | 9 - DIT.git/description | 1 - DIT.git/filter-repo/already_ran | 3 - DIT.git/filter-repo/changed-refs | 0 DIT.git/filter-repo/commit-map | 1 - DIT.git/filter-repo/first-changed-commits | 0 DIT.git/filter-repo/ref-map | 1 - DIT.git/filter-repo/suboptimal-issues | 1 - DIT.git/hooks/applypatch-msg.sample | 15 -- DIT.git/hooks/commit-msg.sample | 24 --- DIT.git/hooks/fsmonitor-watchman.sample | 174 ---------------- DIT.git/hooks/post-update.sample | 8 - DIT.git/hooks/pre-applypatch.sample | 14 -- DIT.git/hooks/pre-commit.sample | 49 ----- DIT.git/hooks/pre-merge-commit.sample | 13 -- DIT.git/hooks/pre-push.sample | 53 ----- DIT.git/hooks/pre-rebase.sample | 169 ---------------- DIT.git/hooks/pre-receive.sample | 24 --- DIT.git/hooks/prepare-commit-msg.sample | 42 ---- DIT.git/hooks/push-to-checkout.sample | 78 -------- DIT.git/hooks/sendemail-validate.sample | 77 ------- DIT.git/hooks/update.sample | 128 ------------ DIT.git/info/exclude | 6 - DIT.git/info/refs | 0 DIT.git/objects/info/packs | 1 - DIT.git/packed-refs | 1 - app.py | 4 +- embed_fonts.py | 59 ------ layout/tabs_comparison.py | 71 ++++--- layout/tabs_single.py | 96 +++------ mongo_db/check_saved_chats.py | 54 ++--- mongo_db/db.py | 20 +- mongo_db/mongo.py | 48 ++--- mongo_db/mongo_handler.py | 176 ++++++++-------- mongo_db/mongo_ops.py | 234 +++++++++++----------- requirements.txt | 21 +- tour.py | 156 +++++++++++---- utils/groq_handler.py | 44 +--- utils/insight_generator.py | 48 +++-- utils/insight_suggester.py | 136 ++++++++----- utils/llm_selector.py | 4 - utils/ml_engine.py | 134 +++++++++++++ 44 files changed, 722 insertions(+), 1476 deletions(-) delete mode 100644 DIT.git/HEAD delete mode 100644 DIT.git/config delete mode 100644 DIT.git/description delete mode 100644 DIT.git/filter-repo/already_ran delete mode 100644 DIT.git/filter-repo/changed-refs delete mode 100644 DIT.git/filter-repo/commit-map delete mode 100644 DIT.git/filter-repo/first-changed-commits delete mode 100644 DIT.git/filter-repo/ref-map delete mode 100644 DIT.git/filter-repo/suboptimal-issues delete mode 100755 DIT.git/hooks/applypatch-msg.sample delete mode 100755 DIT.git/hooks/commit-msg.sample delete mode 100755 DIT.git/hooks/fsmonitor-watchman.sample delete mode 100755 DIT.git/hooks/post-update.sample delete mode 100755 DIT.git/hooks/pre-applypatch.sample delete mode 100755 DIT.git/hooks/pre-commit.sample delete mode 100755 DIT.git/hooks/pre-merge-commit.sample delete mode 100755 DIT.git/hooks/pre-push.sample delete mode 100755 DIT.git/hooks/pre-rebase.sample delete mode 100755 DIT.git/hooks/pre-receive.sample delete mode 100755 DIT.git/hooks/prepare-commit-msg.sample delete mode 100755 DIT.git/hooks/push-to-checkout.sample delete mode 100755 DIT.git/hooks/sendemail-validate.sample delete mode 100755 DIT.git/hooks/update.sample delete mode 100644 DIT.git/info/exclude delete mode 100644 DIT.git/info/refs delete mode 100644 DIT.git/objects/info/packs delete mode 100644 DIT.git/packed-refs delete mode 100644 embed_fonts.py create mode 100644 utils/ml_engine.py diff --git a/.DS_Store b/.DS_Store index 3ec8ad2052d9ae559744fd999c0b10ceb22fecd6..b915c507059a7b383a3d747df99a8ecf26daeecd 100644 GIT binary patch delta 46 zcmZp1XmOa}gHU^hRb@@5_ZX{OCng^E}w7UXSam-xoQSTwm$Kw@)?XfxBqf@}a` C?hkAL delta 134 zcmZp1XmOa}aFU^hRb>Si7RX{KZjhE#?Mh609sh9ZU%AUnk~CqFqUCqIdSfkA+Q zfhnDVfsyY&7yv~W82A~|fvWO=xQHPUqJtqGs6Pj2LJ31Lrf!CLn`MM*SvRvwd}G<% IFT&0Y054!71ONa4 diff --git a/DIT.git/HEAD b/DIT.git/HEAD deleted file mode 100644 index b870d82..0000000 --- a/DIT.git/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/main diff --git a/DIT.git/config b/DIT.git/config deleted file mode 100644 index 2d7bf8a..0000000 --- a/DIT.git/config +++ /dev/null @@ -1,9 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = https://github.com/Immanuel2004/DIT.git - fetch = +refs/heads/*:refs/remotes/origin/* diff --git a/DIT.git/description b/DIT.git/description deleted file mode 100644 index 498b267..0000000 --- a/DIT.git/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/DIT.git/filter-repo/already_ran b/DIT.git/filter-repo/already_ran deleted file mode 100644 index db0c327..0000000 --- a/DIT.git/filter-repo/already_ran +++ /dev/null @@ -1,3 +0,0 @@ -This file exists to allow you to filter again without --force, -and to specify that metadata files should be updated instead -of rewritten \ No newline at end of file diff --git a/DIT.git/filter-repo/changed-refs b/DIT.git/filter-repo/changed-refs deleted file mode 100644 index e69de29..0000000 diff --git a/DIT.git/filter-repo/commit-map b/DIT.git/filter-repo/commit-map deleted file mode 100644 index f664cf4..0000000 --- a/DIT.git/filter-repo/commit-map +++ /dev/null @@ -1 +0,0 @@ -old new diff --git a/DIT.git/filter-repo/first-changed-commits b/DIT.git/filter-repo/first-changed-commits deleted file mode 100644 index e69de29..0000000 diff --git a/DIT.git/filter-repo/ref-map b/DIT.git/filter-repo/ref-map deleted file mode 100644 index 893874e..0000000 --- a/DIT.git/filter-repo/ref-map +++ /dev/null @@ -1 +0,0 @@ -old new ref diff --git a/DIT.git/filter-repo/suboptimal-issues b/DIT.git/filter-repo/suboptimal-issues deleted file mode 100644 index 701e20c..0000000 --- a/DIT.git/filter-repo/suboptimal-issues +++ /dev/null @@ -1 +0,0 @@ -No filtering problems encountered. diff --git a/DIT.git/hooks/applypatch-msg.sample b/DIT.git/hooks/applypatch-msg.sample deleted file mode 100755 index a5d7b84..0000000 --- a/DIT.git/hooks/applypatch-msg.sample +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -# -# An example hook script to check the commit log message taken by -# applypatch from an e-mail message. -# -# The hook should exit with non-zero status after issuing an -# appropriate message if it wants to stop the commit. The hook is -# allowed to edit the commit message file. -# -# To enable this hook, rename this file to "applypatch-msg". - -. git-sh-setup -commitmsg="$(git rev-parse --git-path hooks/commit-msg)" -test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} -: diff --git a/DIT.git/hooks/commit-msg.sample b/DIT.git/hooks/commit-msg.sample deleted file mode 100755 index b58d118..0000000 --- a/DIT.git/hooks/commit-msg.sample +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# -# An example hook script to check the commit log message. -# Called by "git commit" with one argument, the name of the file -# that has the commit message. The hook should exit with non-zero -# status after issuing an appropriate message if it wants to stop the -# commit. The hook is allowed to edit the commit message file. -# -# To enable this hook, rename this file to "commit-msg". - -# Uncomment the below to add a Signed-off-by line to the message. -# Doing this in a hook is a bad idea in general, but the prepare-commit-msg -# hook is more suited to it. -# -# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') -# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" - -# This example catches duplicate Signed-off-by lines. - -test "" = "$(grep '^Signed-off-by: ' "$1" | - sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { - echo >&2 Duplicate Signed-off-by lines. - exit 1 -} diff --git a/DIT.git/hooks/fsmonitor-watchman.sample b/DIT.git/hooks/fsmonitor-watchman.sample deleted file mode 100755 index 23e856f..0000000 --- a/DIT.git/hooks/fsmonitor-watchman.sample +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use IPC::Open2; - -# An example hook script to integrate Watchman -# (https://facebook.github.io/watchman/) with git to speed up detecting -# new and modified files. -# -# The hook is passed a version (currently 2) and last update token -# formatted as a string and outputs to stdout a new update token and -# all files that have been modified since the update token. Paths must -# be relative to the root of the working tree and separated by a single NUL. -# -# To enable this hook, rename this file to "query-watchman" and set -# 'git config core.fsmonitor .git/hooks/query-watchman' -# -my ($version, $last_update_token) = @ARGV; - -# Uncomment for debugging -# print STDERR "$0 $version $last_update_token\n"; - -# Check the hook interface version -if ($version ne 2) { - die "Unsupported query-fsmonitor hook version '$version'.\n" . - "Falling back to scanning...\n"; -} - -my $git_work_tree = get_working_dir(); - -my $retry = 1; - -my $json_pkg; -eval { - require JSON::XS; - $json_pkg = "JSON::XS"; - 1; -} or do { - require JSON::PP; - $json_pkg = "JSON::PP"; -}; - -launch_watchman(); - -sub launch_watchman { - my $o = watchman_query(); - if (is_work_tree_watched($o)) { - output_result($o->{clock}, @{$o->{files}}); - } -} - -sub output_result { - my ($clockid, @files) = @_; - - # Uncomment for debugging watchman output - # open (my $fh, ">", ".git/watchman-output.out"); - # binmode $fh, ":utf8"; - # print $fh "$clockid\n@files\n"; - # close $fh; - - binmode STDOUT, ":utf8"; - print $clockid; - print "\0"; - local $, = "\0"; - print @files; -} - -sub watchman_clock { - my $response = qx/watchman clock "$git_work_tree"/; - die "Failed to get clock id on '$git_work_tree'.\n" . - "Falling back to scanning...\n" if $? != 0; - - return $json_pkg->new->utf8->decode($response); -} - -sub watchman_query { - my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') - or die "open2() failed: $!\n" . - "Falling back to scanning...\n"; - - # In the query expression below we're asking for names of files that - # changed since $last_update_token but not from the .git folder. - # - # To accomplish this, we're using the "since" generator to use the - # recency index to select candidate nodes and "fields" to limit the - # output to file names only. Then we're using the "expression" term to - # further constrain the results. - my $last_update_line = ""; - if (substr($last_update_token, 0, 1) eq "c") { - $last_update_token = "\"$last_update_token\""; - $last_update_line = qq[\n"since": $last_update_token,]; - } - my $query = <<" END"; - ["query", "$git_work_tree", {$last_update_line - "fields": ["name"], - "expression": ["not", ["dirname", ".git"]] - }] - END - - # Uncomment for debugging the watchman query - # open (my $fh, ">", ".git/watchman-query.json"); - # print $fh $query; - # close $fh; - - print CHLD_IN $query; - close CHLD_IN; - my $response = do {local $/; }; - - # Uncomment for debugging the watch response - # open ($fh, ">", ".git/watchman-response.json"); - # print $fh $response; - # close $fh; - - die "Watchman: command returned no output.\n" . - "Falling back to scanning...\n" if $response eq ""; - die "Watchman: command returned invalid output: $response\n" . - "Falling back to scanning...\n" unless $response =~ /^\{/; - - return $json_pkg->new->utf8->decode($response); -} - -sub is_work_tree_watched { - my ($output) = @_; - my $error = $output->{error}; - if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { - $retry--; - my $response = qx/watchman watch "$git_work_tree"/; - die "Failed to make watchman watch '$git_work_tree'.\n" . - "Falling back to scanning...\n" if $? != 0; - $output = $json_pkg->new->utf8->decode($response); - $error = $output->{error}; - die "Watchman: $error.\n" . - "Falling back to scanning...\n" if $error; - - # Uncomment for debugging watchman output - # open (my $fh, ">", ".git/watchman-output.out"); - # close $fh; - - # Watchman will always return all files on the first query so - # return the fast "everything is dirty" flag to git and do the - # Watchman query just to get it over with now so we won't pay - # the cost in git to look up each individual file. - my $o = watchman_clock(); - $error = $output->{error}; - - die "Watchman: $error.\n" . - "Falling back to scanning...\n" if $error; - - output_result($o->{clock}, ("/")); - $last_update_token = $o->{clock}; - - eval { launch_watchman() }; - return 0; - } - - die "Watchman: $error.\n" . - "Falling back to scanning...\n" if $error; - - return 1; -} - -sub get_working_dir { - my $working_dir; - if ($^O =~ 'msys' || $^O =~ 'cygwin') { - $working_dir = Win32::GetCwd(); - $working_dir =~ tr/\\/\//; - } else { - require Cwd; - $working_dir = Cwd::cwd(); - } - - return $working_dir; -} diff --git a/DIT.git/hooks/post-update.sample b/DIT.git/hooks/post-update.sample deleted file mode 100755 index ec17ec1..0000000 --- a/DIT.git/hooks/post-update.sample +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# -# An example hook script to prepare a packed repository for use over -# dumb transports. -# -# To enable this hook, rename this file to "post-update". - -exec git update-server-info diff --git a/DIT.git/hooks/pre-applypatch.sample b/DIT.git/hooks/pre-applypatch.sample deleted file mode 100755 index 4142082..0000000 --- a/DIT.git/hooks/pre-applypatch.sample +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -# -# An example hook script to verify what is about to be committed -# by applypatch from an e-mail message. -# -# The hook should exit with non-zero status after issuing an -# appropriate message if it wants to stop the commit. -# -# To enable this hook, rename this file to "pre-applypatch". - -. git-sh-setup -precommit="$(git rev-parse --git-path hooks/pre-commit)" -test -x "$precommit" && exec "$precommit" ${1+"$@"} -: diff --git a/DIT.git/hooks/pre-commit.sample b/DIT.git/hooks/pre-commit.sample deleted file mode 100755 index 29ed5ee..0000000 --- a/DIT.git/hooks/pre-commit.sample +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/sh -# -# An example hook script to verify what is about to be committed. -# Called by "git commit" with no arguments. The hook should -# exit with non-zero status after issuing an appropriate message if -# it wants to stop the commit. -# -# To enable this hook, rename this file to "pre-commit". - -if git rev-parse --verify HEAD >/dev/null 2>&1 -then - against=HEAD -else - # Initial commit: diff against an empty tree object - against=$(git hash-object -t tree /dev/null) -fi - -# If you want to allow non-ASCII filenames set this variable to true. -allownonascii=$(git config --type=bool hooks.allownonascii) - -# Redirect output to stderr. -exec 1>&2 - -# Cross platform projects tend to avoid non-ASCII filenames; prevent -# them from being added to the repository. We exploit the fact that the -# printable range starts at the space character and ends with tilde. -if [ "$allownonascii" != "true" ] && - # Note that the use of brackets around a tr range is ok here, (it's - # even required, for portability to Solaris 10's /usr/bin/tr), since - # the square bracket bytes happen to fall in the designated range. - test $(git diff-index --cached --name-only --diff-filter=A -z $against | - LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 -then - cat <<\EOF -Error: Attempt to add a non-ASCII file name. - -This can cause problems if you want to work with people on other platforms. - -To be portable it is advisable to rename the file. - -If you know what you are doing you can disable this check using: - - git config hooks.allownonascii true -EOF - exit 1 -fi - -# If there are whitespace errors, print the offending file names and fail. -exec git diff-index --check --cached $against -- diff --git a/DIT.git/hooks/pre-merge-commit.sample b/DIT.git/hooks/pre-merge-commit.sample deleted file mode 100755 index 399eab1..0000000 --- a/DIT.git/hooks/pre-merge-commit.sample +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# -# An example hook script to verify what is about to be committed. -# Called by "git merge" with no arguments. The hook should -# exit with non-zero status after issuing an appropriate message to -# stderr if it wants to stop the merge commit. -# -# To enable this hook, rename this file to "pre-merge-commit". - -. git-sh-setup -test -x "$GIT_DIR/hooks/pre-commit" && - exec "$GIT_DIR/hooks/pre-commit" -: diff --git a/DIT.git/hooks/pre-push.sample b/DIT.git/hooks/pre-push.sample deleted file mode 100755 index 4ce688d..0000000 --- a/DIT.git/hooks/pre-push.sample +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/sh - -# An example hook script to verify what is about to be pushed. Called by "git -# push" after it has checked the remote status, but before anything has been -# pushed. If this script exits with a non-zero status nothing will be pushed. -# -# This hook is called with the following parameters: -# -# $1 -- Name of the remote to which the push is being done -# $2 -- URL to which the push is being done -# -# If pushing without using a named remote those arguments will be equal. -# -# Information about the commits which are being pushed is supplied as lines to -# the standard input in the form: -# -# -# -# This sample shows how to prevent push of commits where the log message starts -# with "WIP" (work in progress). - -remote="$1" -url="$2" - -zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" - exit 1 - fi - fi -done - -exit 0 diff --git a/DIT.git/hooks/pre-rebase.sample b/DIT.git/hooks/pre-rebase.sample deleted file mode 100755 index 6cbef5c..0000000 --- a/DIT.git/hooks/pre-rebase.sample +++ /dev/null @@ -1,169 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2006, 2008 Junio C Hamano -# -# The "pre-rebase" hook is run just before "git rebase" starts doing -# its job, and can prevent the command from running by exiting with -# non-zero status. -# -# The hook is called with the following parameters: -# -# $1 -- the upstream the series was forked from. -# $2 -- the branch being rebased (or empty when rebasing the current branch). -# -# This sample shows how to prevent topic branches that are already -# merged to 'next' branch from getting rebased, because allowing it -# would result in rebasing already published history. - -publish=next -basebranch="$1" -if test "$#" = 2 -then - topic="refs/heads/$2" -else - topic=`git symbolic-ref HEAD` || - exit 0 ;# we do not interrupt rebasing detached HEAD -fi - -case "$topic" in -refs/heads/??/*) - ;; -*) - exit 0 ;# we do not interrupt others. - ;; -esac - -# Now we are dealing with a topic branch being rebased -# on top of master. Is it OK to rebase it? - -# Does the topic really exist? -git show-ref -q "$topic" || { - echo >&2 "No such branch $topic" - exit 1 -} - -# Is topic fully merged to master? -not_in_master=`git rev-list --pretty=oneline ^master "$topic"` -if test -z "$not_in_master" -then - echo >&2 "$topic is fully merged to master; better remove it." - exit 1 ;# we could allow it, but there is no point. -fi - -# Is topic ever merged to next? If so you should not be rebasing it. -only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` -only_next_2=`git rev-list ^master ${publish} | sort` -if test "$only_next_1" = "$only_next_2" -then - not_in_topic=`git rev-list "^$topic" master` - if test -z "$not_in_topic" - then - echo >&2 "$topic is already up to date with master" - exit 1 ;# we could allow it, but there is no point. - else - exit 0 - fi -else - not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` - /usr/bin/perl -e ' - my $topic = $ARGV[0]; - my $msg = "* $topic has commits already merged to public branch:\n"; - my (%not_in_next) = map { - /^([0-9a-f]+) /; - ($1 => 1); - } split(/\n/, $ARGV[1]); - for my $elem (map { - /^([0-9a-f]+) (.*)$/; - [$1 => $2]; - } split(/\n/, $ARGV[2])) { - if (!exists $not_in_next{$elem->[0]}) { - if ($msg) { - print STDERR $msg; - undef $msg; - } - print STDERR " $elem->[1]\n"; - } - } - ' "$topic" "$not_in_next" "$not_in_master" - exit 1 -fi - -<<\DOC_END - -This sample hook safeguards topic branches that have been -published from being rewound. - -The workflow assumed here is: - - * Once a topic branch forks from "master", "master" is never - merged into it again (either directly or indirectly). - - * Once a topic branch is fully cooked and merged into "master", - it is deleted. If you need to build on top of it to correct - earlier mistakes, a new topic branch is created by forking at - the tip of the "master". This is not strictly necessary, but - it makes it easier to keep your history simple. - - * Whenever you need to test or publish your changes to topic - branches, merge them into "next" branch. - -The script, being an example, hardcodes the publish branch name -to be "next", but it is trivial to make it configurable via -$GIT_DIR/config mechanism. - -With this workflow, you would want to know: - -(1) ... if a topic branch has ever been merged to "next". Young - topic branches can have stupid mistakes you would rather - clean up before publishing, and things that have not been - merged into other branches can be easily rebased without - affecting other people. But once it is published, you would - not want to rewind it. - -(2) ... if a topic branch has been fully merged to "master". - Then you can delete it. More importantly, you should not - build on top of it -- other people may already want to - change things related to the topic as patches against your - "master", so if you need further changes, it is better to - fork the topic (perhaps with the same name) afresh from the - tip of "master". - -Let's look at this example: - - o---o---o---o---o---o---o---o---o---o "next" - / / / / - / a---a---b A / / - / / / / - / / c---c---c---c B / - / / / \ / - / / / b---b C \ / - / / / / \ / - ---o---o---o---o---o---o---o---o---o---o---o "master" - - -A, B and C are topic branches. - - * A has one fix since it was merged up to "next". - - * B has finished. It has been fully merged up to "master" and "next", - and is ready to be deleted. - - * C has not merged to "next" at all. - -We would want to allow C to be rebased, refuse A, and encourage -B to be deleted. - -To compute (1): - - git rev-list ^master ^topic next - git rev-list ^master next - - if these match, topic has not merged in next at all. - -To compute (2): - - git rev-list master..topic - - if this is empty, it is fully merged to "master". - -DOC_END diff --git a/DIT.git/hooks/pre-receive.sample b/DIT.git/hooks/pre-receive.sample deleted file mode 100755 index a1fd29e..0000000 --- a/DIT.git/hooks/pre-receive.sample +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# -# An example hook script to make use of push options. -# The example simply echoes all push options that start with 'echoback=' -# and rejects all pushes when the "reject" push option is used. -# -# To enable this hook, rename this file to "pre-receive". - -if test -n "$GIT_PUSH_OPTION_COUNT" -then - i=0 - while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" - do - eval "value=\$GIT_PUSH_OPTION_$i" - case "$value" in - echoback=*) - echo "echo from the pre-receive-hook: ${value#*=}" >&2 - ;; - reject) - exit 1 - esac - i=$((i + 1)) - done -fi diff --git a/DIT.git/hooks/prepare-commit-msg.sample b/DIT.git/hooks/prepare-commit-msg.sample deleted file mode 100755 index 10fa14c..0000000 --- a/DIT.git/hooks/prepare-commit-msg.sample +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh -# -# An example hook script to prepare the commit log message. -# Called by "git commit" with the name of the file that has the -# commit message, followed by the description of the commit -# message's source. The hook's purpose is to edit the commit -# message file. If the hook fails with a non-zero status, -# the commit is aborted. -# -# To enable this hook, rename this file to "prepare-commit-msg". - -# This hook includes three examples. The first one removes the -# "# Please enter the commit message..." help message. -# -# The second includes the output of "git diff --name-status -r" -# into the message, just before the "git status" output. It is -# commented because it doesn't cope with --amend or with squashed -# commits. -# -# The third example adds a Signed-off-by line to the message, that can -# still be edited. This is rarely a good idea. - -COMMIT_MSG_FILE=$1 -COMMIT_SOURCE=$2 -SHA1=$3 - -/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" - -# case "$COMMIT_SOURCE,$SHA1" in -# ,|template,) -# /usr/bin/perl -i.bak -pe ' -# print "\n" . `git diff --cached --name-status -r` -# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; -# *) ;; -# esac - -# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') -# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" -# if test -z "$COMMIT_SOURCE" -# then -# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" -# fi diff --git a/DIT.git/hooks/push-to-checkout.sample b/DIT.git/hooks/push-to-checkout.sample deleted file mode 100755 index af5a0c0..0000000 --- a/DIT.git/hooks/push-to-checkout.sample +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh - -# An example hook script to update a checked-out tree on a git push. -# -# This hook is invoked by git-receive-pack(1) when it reacts to git -# push and updates reference(s) in its repository, and when the push -# tries to update the branch that is currently checked out and the -# receive.denyCurrentBranch configuration variable is set to -# updateInstead. -# -# By default, such a push is refused if the working tree and the index -# of the remote repository has any difference from the currently -# checked out commit; when both the working tree and the index match -# the current commit, they are updated to match the newly pushed tip -# of the branch. This hook is to be used to override the default -# behaviour; however the code below reimplements the default behaviour -# as a starting point for convenient modification. -# -# The hook receives the commit with which the tip of the current -# branch is going to be updated: -commit=$1 - -# It can exit with a non-zero status to refuse the push (when it does -# so, it must not modify the index or the working tree). -die () { - echo >&2 "$*" - exit 1 -} - -# Or it can make any necessary changes to the working tree and to the -# index to bring them to the desired state when the tip of the current -# branch is updated to the new commit, and exit with a zero status. -# -# For example, the hook can simply run git read-tree -u -m HEAD "$1" -# in order to emulate git fetch that is run in the reverse direction -# with git push, as the two-tree form of git read-tree -u -m is -# essentially the same as git switch or git checkout that switches -# branches while keeping the local changes in the working tree that do -# not interfere with the difference between the branches. - -# The below is a more-or-less exact translation to shell of the C code -# for the default behaviour for git's push-to-checkout hook defined in -# the push_to_deploy() function in builtin/receive-pack.c. -# -# Note that the hook will be executed from the repository directory, -# not from the working tree, so if you want to perform operations on -# the working tree, you will have to adapt your code accordingly, e.g. -# by adding "cd .." or using relative paths. - -if ! git update-index -q --ignore-submodules --refresh -then - die "Up-to-date check failed" -fi - -if ! git diff-files --quiet --ignore-submodules -- -then - die "Working directory has unstaged changes" -fi - -# This is a rough translation of: -# -# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX -if git cat-file -e HEAD 2>/dev/null -then - head=HEAD -else - head=$(git hash-object -t tree --stdin &2 - exit 1 -} - -unset GIT_DIR GIT_WORK_TREE -cd "$worktree" && - -if grep -q "^diff --git " "$1" -then - validate_patch "$1" -else - validate_cover_letter "$1" -fi && - -if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" -then - git config --unset-all sendemail.validateWorktree && - trap 'git worktree remove -ff "$worktree"' EXIT && - validate_series -fi diff --git a/DIT.git/hooks/update.sample b/DIT.git/hooks/update.sample deleted file mode 100755 index c4d426b..0000000 --- a/DIT.git/hooks/update.sample +++ /dev/null @@ -1,128 +0,0 @@ -#!/bin/sh -# -# An example hook script to block unannotated tags from entering. -# Called by "git receive-pack" with arguments: refname sha1-old sha1-new -# -# To enable this hook, rename this file to "update". -# -# Config -# ------ -# hooks.allowunannotated -# This boolean sets whether unannotated tags will be allowed into the -# repository. By default they won't be. -# hooks.allowdeletetag -# This boolean sets whether deleting tags will be allowed in the -# repository. By default they won't be. -# hooks.allowmodifytag -# This boolean sets whether a tag may be modified after creation. By default -# it won't be. -# hooks.allowdeletebranch -# This boolean sets whether deleting branches will be allowed in the -# repository. By default they won't be. -# hooks.denycreatebranch -# This boolean sets whether remotely creating branches will be denied -# in the repository. By default this is allowed. -# - -# --- Command line -refname="$1" -oldrev="$2" -newrev="$3" - -# --- Safety check -if [ -z "$GIT_DIR" ]; then - echo "Don't run this script from the command line." >&2 - echo " (if you want, you could supply GIT_DIR then run" >&2 - echo " $0 )" >&2 - exit 1 -fi - -if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then - echo "usage: $0 " >&2 - exit 1 -fi - -# --- Config -allowunannotated=$(git config --type=bool hooks.allowunannotated) -allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) -denycreatebranch=$(git config --type=bool hooks.denycreatebranch) -allowdeletetag=$(git config --type=bool hooks.allowdeletetag) -allowmodifytag=$(git config --type=bool hooks.allowmodifytag) - -# check for no description -projectdesc=$(sed -e '1q' "$GIT_DIR/description") -case "$projectdesc" in -"Unnamed repository"* | "") - echo "*** Project description file hasn't been set" >&2 - exit 1 - ;; -esac - -# --- Check types -# if $newrev is 0000...0000, it's a commit to delete a ref. -zero=$(git hash-object --stdin &2 - echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 - exit 1 - fi - ;; - refs/tags/*,delete) - # delete tag - if [ "$allowdeletetag" != "true" ]; then - echo "*** Deleting a tag is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/tags/*,tag) - # annotated tag - if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 - then - echo "*** Tag '$refname' already exists." >&2 - echo "*** Modifying a tag is not allowed in this repository." >&2 - exit 1 - fi - ;; - refs/heads/*,commit) - # branch - if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then - echo "*** Creating a branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/heads/*,delete) - # delete branch - if [ "$allowdeletebranch" != "true" ]; then - echo "*** Deleting a branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/remotes/*,commit) - # tracking branch - ;; - refs/remotes/*,delete) - # delete tracking branch - if [ "$allowdeletebranch" != "true" ]; then - echo "*** Deleting a tracking branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - *) - # Anything else (is there anything else?) - echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 - exit 1 - ;; -esac - -# --- Finished -exit 0 diff --git a/DIT.git/info/exclude b/DIT.git/info/exclude deleted file mode 100644 index a5196d1..0000000 --- a/DIT.git/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# git ls-files --others --exclude-from=.git/info/exclude -# Lines that start with '#' are comments. -# For a project mostly in C, the following would be a good set of -# exclude patterns (uncomment them if you want to use them): -# *.[oa] -# *~ diff --git a/DIT.git/info/refs b/DIT.git/info/refs deleted file mode 100644 index e69de29..0000000 diff --git a/DIT.git/objects/info/packs b/DIT.git/objects/info/packs deleted file mode 100644 index 8b13789..0000000 --- a/DIT.git/objects/info/packs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/DIT.git/packed-refs b/DIT.git/packed-refs deleted file mode 100644 index 250f187..0000000 --- a/DIT.git/packed-refs +++ /dev/null @@ -1 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted diff --git a/app.py b/app.py index c7c37f4..80bc3c2 100644 --- a/app.py +++ b/app.py @@ -105,7 +105,7 @@ def inject_auth_css(): st.stop() -st.set_page_config(page_title="Dynamic Impact Tool", layout="wide") +st.set_page_config(page_title="data-2-Decision", layout="wide") if "has_seen_tour" not in st.session_state: st.session_state.has_seen_tour = False @@ -164,7 +164,7 @@ def inject_auth_css(): view_logs() elif navigation == "Dashboard": - st.title("Dynamic Impact Tool") + st.title("data-2-Decision") render_sidebar() render_upload_area() diff --git a/embed_fonts.py b/embed_fonts.py deleted file mode 100644 index 43069bf..0000000 --- a/embed_fonts.py +++ /dev/null @@ -1,59 +0,0 @@ -# from fpdf import FPDF -# from fpdf.enums import XPos, YPos -# import os - -# font_dir = "assets/fonts" -# font_files = [ -# ("DejaVu", "", "DejaVuSans.ttf"), -# ("DejaVu", "B", "DejaVuSans-Bold.ttf"), -# ("DejaVu", "I", "DejaVuSans-Oblique.ttf") -# ] - -# pdf = FPDF() -# pdf.add_page() - -# for family, style, font_file in font_files: -# font_path = os.path.join(font_dir, font_file) -# pdf.add_font(family, style, font_path) # Removed `uni=True` (deprecated) -# print(f"✅ Font registered: {font_file}") - -# pdf.set_font("DejaVu", size=12) -# pdf.cell(0, 10, "Fonts embedded and working ✅", new_x=XPos.LMARGIN, new_y=YPos.NEXT) - -# pdf.output("test_fonts.pdf") - - -# import zipfile -# import os - -# zip_path = "/Users/joshua/Desktop/Immanuel/Internship_/DIT/dejavu-fonts-ttf-2.37.zip" # Replace with your actual zip file name -# extract_to = "/Users/joshua/Desktop/Immanuel/Internship_/DIT/assets/fonts" # Folder to extract contents into - -# # Create the folder if it doesn't exist -# os.makedirs(extract_to, exist_ok=True) - -# # Extract all contents -# with zipfile.ZipFile(zip_path, 'r') as zip_ref: -# zip_ref.extractall(extract_to) - -# print(f"✅ Extracted '{zip_path}' to '{extract_to}/'") - - -import zipfile -import os - -zip_path = "dejavu-fonts-ttf-2.37.zip" -extract_to = "assets/fonts" - -# Ensure target dir exists -os.makedirs(extract_to, exist_ok=True) - -# Clean extract -try: - with zipfile.ZipFile(zip_path, 'r') as zip_ref: - zip_ref.extractall(extract_to) - print(f"✅ Successfully extracted to: {extract_to}") -except zipfile.BadZipFile: - print("❌ ERROR: Not a valid zip file or it is corrupted.") -except Exception as e: - print(f"❌ ERROR: {e}") diff --git a/layout/tabs_comparison.py b/layout/tabs_comparison.py index c62813a..dc885b0 100644 --- a/layout/tabs_comparison.py +++ b/layout/tabs_comparison.py @@ -19,7 +19,7 @@ from utils.column_selector import get_important_columns from utils.llm_selector import get_llm from utils.pdf_exporter_comparision import generate_pdf_report_comparison -import matplotlib.pylab as plt +import matplotlib.pyplot as plt import hashlib from utils.visualizer import visualize_comparison_overlay @@ -160,8 +160,15 @@ def render_comparison_tabs(): df2 = compare_session["df2"] st.success(f"Currently Comparing: {compare_key}") + tab1, tab2, tab3, tab4, tab5 = st.tabs([ + "Dataset Previews", + "ML Model Training & Evaluation", + "Comparison Insights", + "Visualizations", + "Business Dashboard & Export" + ]) + - tab1, tab2, tab3 = st.tabs(["Dataset Previews", "Comparison Insights", "Visualizations"]) with tab1: st.header("Dataset Previews") @@ -206,32 +213,12 @@ def render_comparison_tabs(): if not common_cols: st.warning("No common columns found between both datasets.") st.stop() - - - with tab3: - st.header("Comparison Visualizations") - x_axis = st.selectbox("Select X-Axis for Comparison", common_cols, key="compare_x_axis") - y_axis = st.selectbox("Select Y-Axis for Comparison", common_cols, key="compare_y_axis") - chart_type = st.selectbox("Chart Type", ["bar", "line", "scatter"], key="compare_chart") - layout = st.radio("Layout", ["Overlay", "Side-by-Side"], horizontal=True, key="compare_layout") - - if x_axis and y_axis: - try: - if layout == "Overlay": - fig, explanation = visualize_comparison_overlay(df1, df2, x_axis, y_axis, "Dataset 1", "Dataset 2", chart_type) - st.plotly_chart(fig, use_container_width=True) - compare_session["visualization_history"].append(f"{chart_type} chart: {x_axis} vs {y_axis} (Overlay)") - st.caption(explanation) - else: - fig1, fig2 = visualize_comparison_side_by_side(df1, df2, x_axis, y_axis, chart_type) - col1, col2 = st.columns(2) - col1.plotly_chart(fig1, use_container_width=True) - col2.plotly_chart(fig2, use_container_width=True) - compare_session["visualization_history"].append(f"{chart_type} chart: {x_axis} vs {y_axis} (Side-by-Side)") - except Exception as e: - st.error(f"Comparison visualization failed: {e}") with tab2: + st.header('ML Model Training & Evaluation') + + + with tab3: st.header("Comparison Insights") merged_df = pd.concat([df1.assign(dataset="Dataset 1"), df2.assign(dataset="Dataset 2")]) @@ -246,9 +233,7 @@ def render_comparison_tabs(): st.markdown(f"**{insight['question']}**") st.markdown(insight["result"]) if any(term in insight["result"].lower() for term in ["graph", "visual", "chart", "plot"]): - # if "graph" in insight["result"].lower() or "visual" in insight["result"].lower() or "chart" in insight["result"].lower() or "plot" in insight["result"].lower(): try: - # Very basic detection of x/y axis from the answer text x_axis, y_axis = None, None for col in compare_session["final_cols1"]: if col.lower() in insight["result"].lower(): @@ -279,10 +264,6 @@ def render_comparison_tabs(): image_path_2 = f"generated_plots/{hash_name}_2.png" pio.write_image(fig2, image_path_2) - # image_path_1 = f"generated_plots/{hashlib.md5(insight['question'].encode()).hexdigest()}.png" - # image_path_2 = f"generated_plots/{hashlib.md5((insight['question'] + '_2').encode()).hexdigest()}.png" - # pio.write_image(fig1, image_path_1) # save first plot as representation\ - # pio.write_image(fig2, image_path_2.replace(".png", "_2.png")) # save second plot as representation insight["image_path_1"] = image_path_1 insight["image_path_2"] = image_path_2 @@ -516,3 +497,29 @@ def render_comparison_tabs(): st.error("PDF generation failed. Please ensure datasets and insights are available.") except Exception as e: st.error(f"Failed to export PDF: {e}") + + with tab4: + st.header("Comparison Visualizations") + x_axis = st.selectbox("Select X-Axis for Comparison", common_cols, key="compare_x_axis") + y_axis = st.selectbox("Select Y-Axis for Comparison", common_cols, key="compare_y_axis") + chart_type = st.selectbox("Chart Type", ["bar", "line", "scatter"], key="compare_chart") + layout = st.radio("Layout", ["Overlay", "Side-by-Side"], horizontal=True, key="compare_layout") + + if x_axis and y_axis: + try: + if layout == "Overlay": + fig, explanation = visualize_comparison_overlay(df1, df2, x_axis, y_axis, "Dataset 1", "Dataset 2", chart_type) + st.plotly_chart(fig, use_container_width=True) + compare_session["visualization_history"].append(f"{chart_type} chart: {x_axis} vs {y_axis} (Overlay)") + st.caption(explanation) + else: + fig1, fig2 = visualize_comparison_side_by_side(df1, df2, x_axis, y_axis, chart_type) + col1, col2 = st.columns(2) + col1.plotly_chart(fig1, use_container_width=True) + col2.plotly_chart(fig2, use_container_width=True) + compare_session["visualization_history"].append(f"{chart_type} chart: {x_axis} vs {y_axis} (Side-by-Side)") + except Exception as e: + st.error(f"Comparison visualization failed: {e}") + + with tab5: + st.header('Business Dashboard & Export') \ No newline at end of file diff --git a/layout/tabs_single.py b/layout/tabs_single.py index 319acaf..29a415d 100644 --- a/layout/tabs_single.py +++ b/layout/tabs_single.py @@ -11,7 +11,13 @@ from utils.chat_handler import handle_user_query_dynamic from utils.error_handler import safe_llm_call from utils.pdf_exporter import generate_pdf_report, export_to_pptx +from utils.ml_engine import save_trained_model,run_ml,explain_model import plotly.express as px +from sklearn.impute import SimpleImputer +from sklearn.cluster import KMeans +from sklearn.decomposition import PCA + + # from mongo_db.mongo_handler import save_chat,load_user_chats def inject_auth_css(): st.markdown(""" @@ -110,29 +116,23 @@ def render_single_tabs(): session = st.session_state["dataset_sessions"][st.session_state["current_session"]] df = session["df"] - tab1, tab2, tab3 = st.tabs(["Data Preview", "Insights", "Visualizations"]) - - with tab1: - st.header("Dataset Summary & Column Selection") - - st.write(f"Total Rows: {df.shape[0]}") - st.write(f"Total Columns: {df.shape[1]}") + tab1, tab2, tab3, tab4, tab5 = st.tabs([ + "Data Information & EDA", + "ML Model Training & Evaluation", + "Insights", + "Model Visualizations", + "Business Dashboard & Export" +]) - st.subheader("Dataset Preview") - sample_rows = st.slider("Preview Rows Limit", 0, 100, 10, key="sample_rows_single") - st.dataframe(df.head(sample_rows), use_container_width=True) - st.subheader("Column Selection") - important_cols = get_important_columns(df.to_csv(index=False)) - user_selected_cols = st.multiselect("Select Additional Columns", df.columns.tolist(), default=important_cols) + with tab1: + st.header("📊 Dataset Summary & Column Selection") - final_cols = list(set(important_cols + user_selected_cols)) - session["column_selection"] = final_cols - st.write(f"Selected Columns: {final_cols}") - st.dataframe(df[final_cols].head(), use_container_width=True) - with tab2: + st.header("ML Model Training & Evaluation") + + with tab3: st.header("Insights") col_left, col_right = st.columns([7, 3], gap="large") @@ -203,7 +203,7 @@ def render_single_tabs(): except Exception as e: st.error(f"Insight generation failed: {e}") st.markdown("", unsafe_allow_html=True) - with tab3: + with tab4: st.header("Visualizations") if not session.get("column_selection"): @@ -352,7 +352,6 @@ def render_single_tabs(): if st.button("Export PDF Report"): formatted_chat = format_chat_for_pdf(st.session_state.get("chat_history", [])) - # ✅ Ensure insights is always a list insights_dict = st.session_state.get("insights", {}) insights = list(insights_dict.values()) if isinstance(insights_dict, dict) else insights_dict @@ -368,7 +367,7 @@ def render_single_tabs(): output_path = generate_pdf_report( session=session, filename="final_analysis_report.pdf", - model_source="groq" # ✅ pass the model source explicitly + model_source="groq" ) with open(output_path, "rb") as f: @@ -380,58 +379,9 @@ def render_single_tabs(): file_name="final_analysis_report.pdf", mime="application/pdf" ) - st.success("✅ PDF exported successfully!") + st.success("PDF exported successfully!") st.session_state["report_counter"] += 1 st.balloons() - - - - # with col2: - # if st.button("Export PPTX (Single Dataset)", key="export_single_pptx"): - # try: - # pptx_path = export_to_pptx(session) - # with open(pptx_path, "rb") as f: - # st.download_button("Download PPTX", f, file_name="single_dataset_report.pptx") - # except Exception as e: - # st.error(f"Failed to export PPTX: {e}") - - # if "email" in st.session_state: - # user_email = st.session_state["email"] - # upload_history = get_user_uploads(user_email) - # chat_history = get_user_chats(user_email) - # else: - # upload_history = [] - # chat_history = [] - - # with tab4: - # st.markdown("### 📁 Upload History") - # if upload_history: - # for item in upload_history: - # with st.container(): - # col1, col2 = st.columns([1, 3]) - # with col1: - # st.markdown("📄") - # with col2: - # st.markdown(f"**Filename:** `{item.get('filename', 'N/A')}`") - # st.markdown(f"**Uploaded on:** `{item.get('timestamp', 'N/A')}`") - # st.markdown("---") - # else: - # st.info("No uploads found.") - - # st.markdown("### 💬 Chat History") - # if chat_history: - # for chat in chat_history: - # with st.container(): - # st.markdown( - # f""" - #
- # 🕒 {chat.get("timestamp", "N/A")}
- # 💬 User: {chat.get("prompt", "")}
- # 🤖 Assistant: {chat.get("response", "")} - #
- # """, - # unsafe_allow_html=True, - # ) - # else: - # st.info("No chat history found.") \ No newline at end of file + with tab5: + st.subheader('Business Dashboard') diff --git a/mongo_db/check_saved_chats.py b/mongo_db/check_saved_chats.py index ae692ff..580d5ab 100644 --- a/mongo_db/check_saved_chats.py +++ b/mongo_db/check_saved_chats.py @@ -1,36 +1,36 @@ -# mongo_db/check_saved_chats.py -from mongo_db.mongo import get_mongo_client -import os -from dotenv import load_dotenv -load_dotenv() +# # mongo_db/check_saved_chats.py +# from mongo_db.mongo import get_mongo_client +# import os +# from dotenv import load_dotenv +# load_dotenv() -mongo_uri = os.getenv("MONGO_URI") -username = "data_comparison" +# mongo_uri = os.getenv("MONGO_URI") +# username = "data_comparison" -client = get_mongo_client() -db = client["chat_db"] # or whatever your DB name is -collection = db["chat_history"] # 👈 make sure this is chat_history +# client = get_mongo_client() +# db = client["chat_db"] # or whatever your DB name is +# collection = db["chat_history"] # 👈 make sure this is chat_history -history = list(collection.find({"username": username})) +# history = list(collection.find({"username": username})) -if history: - print(f"Found {len(history)} messages for {username} in chat_history") - for msg in history: - print(msg) -else: - print("No chat history found in chat_history.") +# if history: +# print(f"Found {len(history)} messages for {username} in chat_history") +# for msg in history: +# print(msg) +# else: +# print("No chat history found in chat_history.") -from mongo_db.mongo import get_chat_history_collection +# from mongo_db.mongo import get_chat_history_collection -username = "data_comparison" -collection = get_chat_history_collection() +# username = "data_comparison" +# collection = get_chat_history_collection() -history = list(collection.find({"username": username})) +# history = list(collection.find({"username": username})) -if history: - print(f"Found {len(history)} messages for {username} in chat_history") - for msg in history: - print(msg) -else: - print("No chat history found in chat_history.") +# if history: +# print(f"Found {len(history)} messages for {username} in chat_history") +# for msg in history: +# print(msg) +# else: +# print("No chat history found in chat_history.") diff --git a/mongo_db/db.py b/mongo_db/db.py index be080f7..f022c84 100644 --- a/mongo_db/db.py +++ b/mongo_db/db.py @@ -1,13 +1,13 @@ -# mongo_db/db.py -from pymongo import MongoClient -import os -from dotenv import load_dotenv -load_dotenv() -mongo_uri = os.getenv("MONGO_URI") +# # mongo_db/db.py +# from pymongo import MongoClient +# import os +# from dotenv import load_dotenv +# load_dotenv() +# mongo_uri = os.getenv("MONGO_URI") -def get_db(): - client = MongoClient("mongodb://localhost:27017/") - db = client["dynamic_impact_tool"] - return db +# def get_db(): +# client = MongoClient("mongodb://localhost:27017/") +# db = client["dynamic_impact_tool"] +# return db diff --git a/mongo_db/mongo.py b/mongo_db/mongo.py index cc057fa..2916973 100644 --- a/mongo_db/mongo.py +++ b/mongo_db/mongo.py @@ -1,36 +1,36 @@ -# mongo_db/mongo.py -from pymongo import MongoClient -import os -from dotenv import load_dotenv -from mongo_db.db import get_db -load_dotenv() -mongo_uri = os.getenv("MONGO_URI") +# # mongo_db/mongo.py +# from pymongo import MongoClient +# import os +# from dotenv import load_dotenv +# from mongo_db.db import get_db +# load_dotenv() +# mongo_uri = os.getenv("MONGO_URI") -load_dotenv() +# load_dotenv() -MONGO_URI = os.getenv("MONGO_URI", "mongodb://localhost:27017") -client = MongoClient(os.getenv("MONGO_URI")) +# MONGO_URI = os.getenv("MONGO_URI", "mongodb://localhost:27017") +# client = MongoClient(os.getenv("MONGO_URI")) -# You can name your DB anything consistent -db = client["dynamic_impact_tool"] +# # You can name your DB anything consistent +# db = client["dynamic_impact_tool"] -def get_user_collection(): - return db["users"] +# def get_user_collection(): +# return db["users"] -def get_file_collection(): - return db["files"] +# def get_file_collection(): +# return db["files"] -def get_chat_collection(): - return db["chats"] +# def get_chat_collection(): +# return db["chats"] -def get_upload_collection(): - return db["uploads"] +# def get_upload_collection(): +# return db["uploads"] -def get_mongo_client(): - return MongoClient(MONGO_URI) +# def get_mongo_client(): +# return MongoClient(MONGO_URI) -def get_chat_history_collection(): - return db["chat_history"] +# def get_chat_history_collection(): +# return db["chat_history"] diff --git a/mongo_db/mongo_handler.py b/mongo_db/mongo_handler.py index 8f28130..d747fd0 100644 --- a/mongo_db/mongo_handler.py +++ b/mongo_db/mongo_handler.py @@ -1,4 +1,57 @@ -# # mongo_db/mongo_handler.py +# # # mongo_db/mongo_handler.py + +# # from mongo_db.mongo import get_chat_collection, get_file_collection +# # from datetime import datetime +# # from mongo_db.mongo import get_mongo_client + +# # def save_chat(username, message, response): +# # get_chat_collection().insert_one({ +# # "username": username, +# # "role": "user", +# # "content": message, +# # "timestamp": datetime.now() +# # }) +# # get_chat_collection().insert_one({ +# # "username": username, +# # "role": "ai", +# # "content": response, +# # "timestamp": datetime.now() +# # }) + +# # def load_user_chats(username): +# # return list(get_chat_collection().find({"username": username}).sort("timestamp", 1)) + +# # def save_uploaded_file(username, filename, metadata=None): +# # get_file_collection().insert_one({ +# # "username": username, +# # "filename": filename, +# # "metadata": metadata or {}, +# # "timestamp": datetime.now() +# # }) + +# # def load_user_files(username): +# # return list(get_file_collection().find({"username": username}).sort("timestamp", 1)) + + +# # def get_user_uploads(email: str): +# # client = get_mongo_client() +# # db = client["Dynamic_Impact_Tool"] +# # collection = db["uploads"] +# # uploads = list(collection.find({"email": email}, {"_id": 0})) +# # return uploads + + +# # def get_user_chats(email: str): +# # client = get_mongo_client() +# # db = client["Dynamic_Impact_Tool"] +# # collection = db["chats"] +# # chats = list(collection.find({"email": email}, {"_id": 0})) +# # return chats + +# import os +# from dotenv import load_dotenv +# load_dotenv() +# mongo_uri = os.getenv("MONGO_URI") # from mongo_db.mongo import get_chat_collection, get_file_collection # from datetime import datetime @@ -33,97 +86,44 @@ # return list(get_file_collection().find({"username": username}).sort("timestamp", 1)) -# def get_user_uploads(email: str): +# def get_user_uploads(username: str): # client = get_mongo_client() -# db = client["Dynamic_Impact_Tool"] -# collection = db["uploads"] -# uploads = list(collection.find({"email": email}, {"_id": 0})) +# db = client["dynamic_impact_tool"] +# collection = db["files"] +# uploads = list(collection.find({"username": username}, {"_id": 0})) # return uploads - -# def get_user_chats(email: str): +# def get_user_chats(username: str): # client = get_mongo_client() -# db = client["Dynamic_Impact_Tool"] +# db = client["dynamic_impact_tool"] # collection = db["chats"] -# chats = list(collection.find({"email": email}, {"_id": 0})) +# chats = list(collection.find({"username": username}, {"_id": 0})) # return chats -import os -from dotenv import load_dotenv -load_dotenv() -mongo_uri = os.getenv("MONGO_URI") - -from mongo_db.mongo import get_chat_collection, get_file_collection -from datetime import datetime -from mongo_db.mongo import get_mongo_client - -def save_chat(username, message, response): - get_chat_collection().insert_one({ - "username": username, - "role": "user", - "content": message, - "timestamp": datetime.now() - }) - get_chat_collection().insert_one({ - "username": username, - "role": "ai", - "content": response, - "timestamp": datetime.now() - }) - -def load_user_chats(username): - return list(get_chat_collection().find({"username": username}).sort("timestamp", 1)) - -def save_uploaded_file(username, filename, metadata=None): - get_file_collection().insert_one({ - "username": username, - "filename": filename, - "metadata": metadata or {}, - "timestamp": datetime.now() - }) - -def load_user_files(username): - return list(get_file_collection().find({"username": username}).sort("timestamp", 1)) - - -def get_user_uploads(username: str): - client = get_mongo_client() - db = client["dynamic_impact_tool"] - collection = db["files"] - uploads = list(collection.find({"username": username}, {"_id": 0})) - return uploads - -def get_user_chats(username: str): - client = get_mongo_client() - db = client["dynamic_impact_tool"] - collection = db["chats"] - chats = list(collection.find({"username": username}, {"_id": 0})) - return chats - - -from .mongo import get_user_collection - -def get_user_from_mongo(username): - user_collection = get_user_collection() - return user_collection.find_one({"username": username}) - -from mongo_db.mongo import get_chat_history_collection - -def save_chat_to_history(username, message, response): - get_chat_history_collection().insert_many([ - { - "username": username, - "role": "user", - "content": message, - "timestamp": datetime.now() - }, - { - "username": username, - "role": "ai", - "content": response, - "timestamp": datetime.now() - } - ]) - -def load_chat_history(username): - return list(get_chat_history_collection().find({"username": username}).sort("timestamp", 1)) + +# from .mongo import get_user_collection + +# def get_user_from_mongo(username): +# user_collection = get_user_collection() +# return user_collection.find_one({"username": username}) + +# from mongo_db.mongo import get_chat_history_collection + +# def save_chat_to_history(username, message, response): +# get_chat_history_collection().insert_many([ +# { +# "username": username, +# "role": "user", +# "content": message, +# "timestamp": datetime.now() +# }, +# { +# "username": username, +# "role": "ai", +# "content": response, +# "timestamp": datetime.now() +# } +# ]) + +# def load_chat_history(username): +# return list(get_chat_history_collection().find({"username": username}).sort("timestamp", 1)) diff --git a/mongo_db/mongo_ops.py b/mongo_db/mongo_ops.py index 5059c28..73480fb 100644 --- a/mongo_db/mongo_ops.py +++ b/mongo_db/mongo_ops.py @@ -1,37 +1,111 @@ -# from mongo_db.mongo import get_chat_collection, get_file_collection -# from pymongo import MongoClient +# # from mongo_db.mongo import get_chat_collection, get_file_collection +# # from pymongo import MongoClient +# # from datetime import datetime +# # from bson.json_util import dumps + +# # def save_chat(username, message, response): +# # get_chat_collection().insert_one({ +# # "username": username, +# # "message": message, +# # "response": response +# # }) + +# # def load_user_chats(username): +# # return list(get_chat_collection().find({"username": username})) + +# # def save_uploaded_file(username, filename, metadata=None): +# # get_file_collection().insert_one({ +# # "username": username, +# # "filename": filename, +# # "metadata": metadata or {} +# # }) + +# # def load_user_files(username): +# # return list(get_file_collection().find({"username": username})) + +# # client = MongoClient("mongodb://localhost:27017/") +# # db = client["streamlit_chat_db"] +# # chats_collection = db["chats"] + +# # def get_user_chats(username): +# # """ +# # Retrieve all chat sessions for a given user from MongoDB. +# # Returns a list of sessions with messages grouped by date. +# # """ +# # results = chats_collection.find({"username": username}).sort("timestamp", -1) +# # chat_sessions = [] + +# # for doc in results: +# # session = { +# # "date": doc.get("timestamp", datetime.now()).strftime("%Y-%m-%d %H:%M"), +# # "messages": doc.get("messages", []) +# # } +# # chat_sessions.append(session) + +# # return chat_sessions + +# # from mongo_db.mongo import get_mongo_client +# # from bson.binary import Binary + +# # def get_user_files(username): +# # client = get_mongo_client() +# # db = client['streamlit_chat_db'] +# # files_collection = db['files'] + +# # user_files = list(files_collection.find({"username": username})) + +# # # Optionally decode binary file content +# # for file in user_files: +# # if isinstance(file.get("content"), Binary): +# # file["content"] = file["content"] # Leave as-is or decode if needed + +# # return user_files + + +# # mongo_db/mongo_ops.py +# import os +# from dotenv import load_dotenv +# load_dotenv() +# mongo_uri = os.getenv("MONGO_URI") + +# from mongo_db.mongo import ( +# get_chat_collection, +# get_file_collection, +# get_mongo_client +# ) # from datetime import datetime -# from bson.json_util import dumps +# from bson.binary import Binary +# # === Save / Load Chats === # def save_chat(username, message, response): # get_chat_collection().insert_one({ # "username": username, # "message": message, -# "response": response +# "response": response, +# "timestamp": datetime.utcnow() # }) # def load_user_chats(username): -# return list(get_chat_collection().find({"username": username})) +# return list(get_chat_collection().find({"username": username}).sort("timestamp", 1)) +# # === Save / Load Uploaded Files === # def save_uploaded_file(username, filename, metadata=None): # get_file_collection().insert_one({ # "username": username, # "filename": filename, -# "metadata": metadata or {} +# "metadata": metadata or {}, +# "timestamp": datetime.utcnow() # }) # def load_user_files(username): -# return list(get_file_collection().find({"username": username})) - -# client = MongoClient("mongodb://localhost:27017/") -# db = client["streamlit_chat_db"] -# chats_collection = db["chats"] +# return list(get_file_collection().find({"username": username}).sort("timestamp", -1)) +# # === Get Chat Sessions (Grouped if needed) === # def get_user_chats(username): -# """ -# Retrieve all chat sessions for a given user from MongoDB. -# Returns a list of sessions with messages grouped by date. -# """ +# db = get_mongo_client()["dynamic_impact_tool"] + +# chats_collection = db["chats"] + # results = chats_collection.find({"username": username}).sort("timestamp", -1) # chat_sessions = [] @@ -44,111 +118,37 @@ # return chat_sessions -# from mongo_db.mongo import get_mongo_client -# from bson.binary import Binary - +# # === Get Uploaded Files === # def get_user_files(username): -# client = get_mongo_client() -# db = client['streamlit_chat_db'] -# files_collection = db['files'] - -# user_files = list(files_collection.find({"username": username})) - -# # Optionally decode binary file content +# db = get_mongo_client()["dynamic_impact_tool"] +# files_collection = db["files"] + +# user_files = list(files_collection.find({"username": username}).sort("timestamp", -1)) + # for file in user_files: # if isinstance(file.get("content"), Binary): -# file["content"] = file["content"] # Leave as-is or decode if needed - +# file["content"] = file["content"] # You can decode it if needed + # return user_files +# from mongo_db.mongo import get_chat_history_collection +# # === Save to Chat History === +# def save_chat_to_history(username, user_message, ai_response): +# get_chat_history_collection().insert_many([ +# { +# "username": username, +# "role": "user", +# "content": user_message, +# "timestamp": datetime.utcnow() +# }, +# { +# "username": username, +# "role": "ai", +# "content": ai_response, +# "timestamp": datetime.utcnow() +# } +# ]) -# mongo_db/mongo_ops.py -import os -from dotenv import load_dotenv -load_dotenv() -mongo_uri = os.getenv("MONGO_URI") - -from mongo_db.mongo import ( - get_chat_collection, - get_file_collection, - get_mongo_client -) -from datetime import datetime -from bson.binary import Binary - -# === Save / Load Chats === -def save_chat(username, message, response): - get_chat_collection().insert_one({ - "username": username, - "message": message, - "response": response, - "timestamp": datetime.utcnow() - }) - -def load_user_chats(username): - return list(get_chat_collection().find({"username": username}).sort("timestamp", 1)) - -# === Save / Load Uploaded Files === -def save_uploaded_file(username, filename, metadata=None): - get_file_collection().insert_one({ - "username": username, - "filename": filename, - "metadata": metadata or {}, - "timestamp": datetime.utcnow() - }) - -def load_user_files(username): - return list(get_file_collection().find({"username": username}).sort("timestamp", -1)) - -# === Get Chat Sessions (Grouped if needed) === -def get_user_chats(username): - db = get_mongo_client()["dynamic_impact_tool"] - - chats_collection = db["chats"] - - results = chats_collection.find({"username": username}).sort("timestamp", -1) - chat_sessions = [] - - for doc in results: - session = { - "date": doc.get("timestamp", datetime.now()).strftime("%Y-%m-%d %H:%M"), - "messages": doc.get("messages", []) - } - chat_sessions.append(session) - - return chat_sessions - -# === Get Uploaded Files === -def get_user_files(username): - db = get_mongo_client()["dynamic_impact_tool"] - files_collection = db["files"] - - user_files = list(files_collection.find({"username": username}).sort("timestamp", -1)) - - for file in user_files: - if isinstance(file.get("content"), Binary): - file["content"] = file["content"] # You can decode it if needed - - return user_files - -from mongo_db.mongo import get_chat_history_collection -# === Save to Chat History === -def save_chat_to_history(username, user_message, ai_response): - get_chat_history_collection().insert_many([ - { - "username": username, - "role": "user", - "content": user_message, - "timestamp": datetime.utcnow() - }, - { - "username": username, - "role": "ai", - "content": ai_response, - "timestamp": datetime.utcnow() - } - ]) - -# === Load Chat History === -def load_chat_history(username): - return list(get_chat_history_collection().find({"username": username}).sort("timestamp", 1)) +# # === Load Chat History === +# def load_chat_history(username): +# return list(get_chat_history_collection().find({"username": username}).sort("timestamp", 1)) diff --git a/requirements.txt b/requirements.txt index ac713a5..f4da951 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,5 +24,22 @@ fonttools python-pptx kaleido seaborn -langchain_community -certifi \ No newline at end of file +langchain-community +pycaret +plotly +shap +joblib + +numpy==2.2.0 +scipy==1.11.4 +scikit-learn==1.3.2 +joblib==1.3.2 +matplotlib==3.10.6 +seaborn==0.12.2 +flaml==2.2.0 +optuna==3.4.0 +evalml==0.50.0 +shap==0.46.0 +lime==0.2.0.1 +streamlit==1.38.0 + diff --git a/tour.py b/tour.py index a56e030..ec4f39e 100644 --- a/tour.py +++ b/tour.py @@ -1,4 +1,5 @@ import streamlit as st +import pandas as pd def inject_auth_css(): st.markdown("""