Skip to content

Feature/ai agents backend #2131

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 51 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
eefd231
intial ui
amitpanwar789 Feb 16, 2025
1494fe6
test-library page
amitpanwar789 Feb 17, 2025
ade412a
unnecessary file deleted
amitpanwar789 Feb 17, 2025
becf70b
Merge pull request #2106 from amitpanwar789/feature/test_library
notlazykid Feb 17, 2025
eb787cd
dynamic_severity text fixed
amitpanwar789 Feb 17, 2025
cbaa0ff
severity header tooltip added and other things
amitpanwar789 Feb 18, 2025
426d170
removed testingMethod filter
amitpanwar789 Feb 18, 2025
0e3ad0e
testing method filter added again with proper fixing
amitpanwar789 Feb 18, 2025
66d12e1
Merge pull request #2107 from amitpanwar789/feature/test_library
notlazykid Feb 18, 2025
ee6f03b
severity header modified
amitpanwar789 Feb 18, 2025
12535dc
Merge pull request #2110 from amitpanwar789/feature/test_library
notlazykid Feb 18, 2025
21cb084
load time reduced made and api to only fetch test content
amitpanwar789 Feb 18, 2025
a720539
Merge pull request #2118 from amitpanwar789/feature/test_library
notlazykid Feb 18, 2025
856bfaa
add cleanup cron
notshivansh Feb 19, 2025
9f4d84a
compliance added
amitpanwar789 Feb 20, 2025
67b7a0c
Merge pull request #2121 from amitpanwar789/feature/test_library
notlazykid Feb 20, 2025
901eded
Merge pull request #2120 from akto-api-security/feature/clear_maybe_c…
ayushaga14 Feb 20, 2025
37377aa
Fixing changes
Ark2307 Feb 20, 2025
4829afb
Merge pull request #2119 from akto-api-security/feature/test_library
Ark2307 Feb 20, 2025
5af975a
handle gzip compression
ayushaga14 Feb 20, 2025
eed617d
Merge pull request #2122 from akto-api-security/jira_encoding_fix
ayushaga14 Feb 20, 2025
e0bccb4
Fixing count on testing pagE
Ark2307 Feb 20, 2025
731f5a4
Revert "Test library Screen"
ayushaga14 Feb 20, 2025
b54aeb2
Merge pull request #2123 from akto-api-security/revert-2119-feature/t…
Ark2307 Feb 20, 2025
0029067
Merge pull request #2124 from akto-api-security/hotfix/fix_count_test…
Ark2307 Feb 20, 2025
1176815
Added fix for pagination
Ark2307 Feb 21, 2025
460955a
Merge pull request #2126 from akto-api-security/hotfix/fix_pagination
notshivansh Feb 21, 2025
e24e488
Revert "Revert "Test library Screen""
Ark2307 Feb 21, 2025
552aaf8
Merge pull request #2127 from akto-api-security/revert-2123-revert-21…
ayushaga14 Feb 21, 2025
a7e99c4
add data structure and APIs for agents
notshivansh Feb 20, 2025
9307850
add backend APIs for dashboard
notshivansh Feb 21, 2025
b635a0b
Merge branch 'feature/ai-agents' into feature/ai-agents-backend
notshivansh Feb 21, 2025
34e3cac
chore:enable hot module replacement
devendershekhawat Feb 23, 2025
4ef183b
Add all files
devendershekhawat Feb 23, 2025
eda575b
chore: add rimraf dist
devendershekhawat Feb 23, 2025
05c3a8c
cleanup
devendershekhawat Feb 23, 2025
cae936f
remove writeToDisk from webpack config
devendershekhawat Feb 24, 2025
a8430da
Merge branch 'chore/enable-hot-module-replacement' into devshekhawat/…
devendershekhawat Feb 24, 2025
0d7a8ed
enable typescript in dev mode
devendershekhawat Feb 24, 2025
776fc6c
remove include from webpack config
devendershekhawat Feb 24, 2025
e1da146
feature:add prompt composer
devendershekhawat Feb 24, 2025
05f829a
cleanup:remove unused imports
devendershekhawat Feb 24, 2025
33aaaf5
feat:add animations
devendershekhawat Feb 24, 2025
949fbd9
Add paused and thinking state
devendershekhawat Feb 25, 2025
f986d8e
Merge branch 'devshekhawat/ai-agents' into feature/ai-agents-backend
notshivansh Feb 25, 2025
9fb8f54
fix animations
devendershekhawat Feb 25, 2025
cc1f57d
add subprocess composer
devendershekhawat Feb 25, 2025
bdf6380
Add AuthOptions component
devendershekhawat Feb 25, 2025
0100f19
change auth option styles
devendershekhawat Feb 25, 2025
f1d396f
add first page
notshivansh Feb 27, 2025
626c3a7
Merge branch 'devshekhawat/ai-agents' into feature/ai-agents-backend
notshivansh Feb 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion apps/dashboard/src/main/java/com/akto/action/HomeAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ public String verifyEmail(){
@Override
public String execute() {

try {
String nodeEnv = System.getenv("NODE_ENV");
servletRequest.setAttribute("nodeEnv", nodeEnv != null ? nodeEnv : "production");
} catch(Exception e){
}

servletRequest.setAttribute("isSaas", InitializerListener.isSaas);
if(DashboardMode.isOnPremDeployment()){
if (GithubLogin.getGithubUrl() != null) {
Expand Down Expand Up @@ -93,7 +99,6 @@ public String execute() {
}
return redirectToAuth0(servletRequest, servletResponse, accessToken, new BasicDBObject());
}
// Use existing flow

return "SUCCESS";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import com.akto.log.LoggerMaker;
import com.akto.log.LoggerMaker.LogDb;
import com.akto.parsers.HttpCallParser;
import com.akto.test_editor.Utils;
import com.akto.testing.ApiExecutor;
import com.akto.util.Constants;
import com.akto.util.http_util.CoreHTTPClient;
Expand Down Expand Up @@ -90,6 +91,7 @@ public String testIntegration() {

Request.Builder builder = new Request.Builder();
builder.addHeader("Authorization", "Basic " + authHeader);
builder.addHeader("Accept-Encoding", "gzip");
builder = builder.url(url);
Request okHttpRequest = builder.build();
Call call = client.newCall(okHttpRequest);
Expand All @@ -103,6 +105,19 @@ public String testIntegration() {
loggerMaker.errorAndAddToDb("error while testing jira integration, received null response", LoggerMaker.LogDb.DASHBOARD);
return Action.ERROR.toUpperCase();
}
if (!Utils.isJsonPayload(responsePayload)) {
builder.removeHeader("Accept-Encoding");
builder = builder.url(url);
okHttpRequest = builder.build();
call = client.newCall(okHttpRequest);
response = call.execute();
responsePayload = response.body().string();
if (responsePayload == null) {
addActionError("Error while testing jira integration, received null response");
loggerMaker.errorAndAddToDb("error while testing jira integration, received null response", LoggerMaker.LogDb.DASHBOARD);
return Action.ERROR.toUpperCase();
}
}
} catch (Exception e) {
e.printStackTrace();
addActionError("Error while testing jira integration, error making call\"");
Expand Down
283 changes: 283 additions & 0 deletions apps/dashboard/src/main/java/com/akto/action/agents/AgentAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,283 @@
package com.akto.action.agents;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.bson.conversions.Bson;

import com.akto.action.UserAction;
import com.akto.dao.agents.AgentRunDao;
import com.akto.dao.agents.AgentSubProcessSingleAttemptDao;
import com.akto.dao.context.Context;
import com.akto.dto.agents.*;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import com.opensymphony.xwork2.Action;

public class AgentAction extends UserAction {

Map<String, Object> data;
String agent;

public String createAgentRun() {

if (data == null || data.isEmpty()) {
addActionError("Agent Init document is empty");
return Action.ERROR.toUpperCase();
}

if (agent == null || agent.isEmpty()) {
addActionError("Agent is empty");
return Action.ERROR.toUpperCase();
}

Agent agentModule;
try {
agentModule = Agent.valueOf(agent);
} catch (Exception e) {
addActionError("Invalid agent");
return Action.ERROR.toUpperCase();
}

AgentRun existingScheduledOrRunningRuns = AgentRunDao.instance.findOne(Filters.nin(
AgentRun._STATE, Arrays.asList(State.SCHEDULED, State.RUNNING)));

if (existingScheduledOrRunningRuns != null) {
addActionError("An existing agent run is running or scheduled. " +
"Let it complete or stop it before starting another");
return Action.ERROR.toUpperCase();
}

String processId = UUID.randomUUID().toString();

agentRun = new AgentRun(processId, data, agentModule,
Context.now(), 0, 0, State.SCHEDULED);

AgentRunDao.instance.insertOne(agentRun);

return Action.SUCCESS.toUpperCase();
}

Agent[] agents;

AgentRun agentRun;

String processId;
int subProcessId;
int attemptId;
String state;

AgentSubProcessSingleAttempt subprocess;

public String getMemberAgents() {
agents = Agent.values();
return Action.SUCCESS.toUpperCase();
}

Model[] models;

public String getAgentModels() {
models = Model.values();
return Action.SUCCESS.toUpperCase();
}

List<AgentSubProcessSingleAttempt> subProcesses;

public String getAllSubProcesses() {
if (processId == null || processId.isEmpty()) {
addActionError("Process id is invalid");
return Action.ERROR.toUpperCase();
}
Bson processIdFilter = Filters.eq(AgentRun.PROCESS_ID, processId);

agentRun = AgentRunDao.instance.findOne(processIdFilter);

if (agentRun == null) {
addActionError("No process found");
return Action.ERROR.toUpperCase();
}

subProcesses = AgentSubProcessSingleAttemptDao.instance.findAll(processIdFilter);
return Action.SUCCESS.toUpperCase();
}

public String getSubProcess() {

if (processId == null || processId.isEmpty()) {
addActionError("Process id is invalid");
return Action.ERROR.toUpperCase();
}

Bson processIdFilter = Filters.eq(AgentRun.PROCESS_ID, processId);

agentRun = AgentRunDao.instance.findOne(processIdFilter);

if (agentRun == null) {
addActionError("No process found");
return Action.ERROR.toUpperCase();
}

Bson filter = AgentSubProcessSingleAttemptDao.instance.getFiltersForAgentSubProcess(processId, subProcessId,
attemptId);
subprocess = AgentSubProcessSingleAttemptDao.instance.findOne(filter);

return Action.SUCCESS.toUpperCase();

}

public String updateAgentSubprocess() {

if (processId == null || processId.isEmpty()) {
addActionError("Process id is invalid");
return Action.ERROR.toUpperCase();
}

Bson processIdFilter = Filters.eq(AgentRun.PROCESS_ID, processId);

agentRun = AgentRunDao.instance.findOne(processIdFilter);

if (agentRun == null) {
addActionError("No process found");
return Action.ERROR.toUpperCase();
}

Bson filter = AgentSubProcessSingleAttemptDao.instance.getFiltersForAgentSubProcess(processId, subProcessId,
attemptId);

List<Bson> updates = new ArrayList<>();

updates.add(Updates.setOnInsert(AgentSubProcessSingleAttempt.CREATED_TIMESTAMP, Context.now()));
updates.add(Updates.setOnInsert(AgentSubProcessSingleAttempt._STATE, State.SCHEDULED));

State updatedState = null;
try {
updatedState = State.valueOf(state);
} catch (Exception e) {
}

if (updatedState != null) {
AgentSubProcessSingleAttempt subProcess = AgentSubProcessSingleAttemptDao.instance.findOne(filter);
if (subProcess == null) {
addActionError("No subprocess found");
return Action.ERROR.toUpperCase();
}

if (State.COMPLETED.equals(subProcess.getState())
&& (State.ACCEPTED.equals(updatedState) || State.DISCARDED.equals(updatedState))) {
updates.add(Updates.set(AgentSubProcessSingleAttempt._STATE, updatedState));
} else {
addActionError("Invalid state");
return Action.ERROR.toUpperCase();
}
}

/*
* For a new subprocess.
*/
if (data != null) {
updates.add(Updates.set(AgentSubProcessSingleAttempt.USER_INPUT, data));
}

/*
* Upsert: true.
* Since state management is through dashboard,
* all subprocess' are created here and only modified using the agent-module
*/
subprocess = AgentSubProcessSingleAttemptDao.instance.updateOne(filter, Updates.combine(updates));

return Action.SUCCESS.toUpperCase();
}

public Map<String, Object> getData() {
return data;
}

public void setData(Map<String, Object> data) {
this.data = data;
}

public String getAgent() {
return agent;
}

public void setAgent(String agent) {
this.agent = agent;
}

public Agent[] getAgents() {
return agents;
}

public void setAgents(Agent[] agents) {
this.agents = agents;
}

public AgentRun getAgentRun() {
return agentRun;
}

public void setAgentRun(AgentRun agentRun) {
this.agentRun = agentRun;
}

public String getProcessId() {
return processId;
}

public void setProcessId(String processId) {
this.processId = processId;
}

public int getSubProcessId() {
return subProcessId;
}

public void setSubProcessId(int subProcessId) {
this.subProcessId = subProcessId;
}

public int getAttemptId() {
return attemptId;
}

public void setAttemptId(int attemptId) {
this.attemptId = attemptId;
}

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public AgentSubProcessSingleAttempt getSubprocess() {
return subprocess;
}

public void setSubprocess(AgentSubProcessSingleAttempt subprocess) {
this.subprocess = subprocess;
}

public List<AgentSubProcessSingleAttempt> getSubProcesses() {
return subProcesses;
}

public void setSubProcesses(List<AgentSubProcessSingleAttempt> subProcesses) {
this.subProcesses = subProcesses;
}

public Model[] getModels() {
return models;
}

public void setModels(Model[] models) {
this.models = models;
}


}
Loading
Loading