fix: BUG-073 (broken imports), BUG-009 (contact folders id=None), BUG-014 (tags assign 500), BUG-016 (search performance use_ai), BUG-030 (user delete GRANT DELETE), BUG-052 (miniapps response), BUG-047 (approval_requests columns), BUG-037 (compliance refresh), prestart.sh GRANT DELETE
Check Cross-Plugin Imports / check (push) Has been cancelled
Check Cross-Plugin Imports / check (push) Has been cancelled
This commit is contained in:
+1
-1
@@ -258,7 +258,7 @@ async def invalidate_session(redis: aioredis.Redis, session_id: str) -> None:
|
|||||||
from sqlalchemy import delete
|
from sqlalchemy import delete
|
||||||
|
|
||||||
from app.core.db import get_session_factory
|
from app.core.db import get_session_factory
|
||||||
from app.models.session import SessionModel
|
from app.models.session import Session as SessionModel
|
||||||
factory = get_session_factory()
|
factory = get_session_factory()
|
||||||
async with factory() as db:
|
async with factory() as db:
|
||||||
await db.execute(
|
await db.execute(
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ async def list_miniapps(
|
|||||||
from app.plugins.builtins.kommunikation.contracts import get_miniapp_registry
|
from app.plugins.builtins.kommunikation.contracts import get_miniapp_registry
|
||||||
registry = get_miniapp_registry()
|
registry = get_miniapp_registry()
|
||||||
items = registry.list_apps()
|
items = registry.list_apps()
|
||||||
return {"items": items, "total": len(items)}
|
return items
|
||||||
|
|
||||||
|
|
||||||
@router.post(
|
@router.post(
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ async def assign_tag(
|
|||||||
):
|
):
|
||||||
"""Assign a tag to an entity."""
|
"""Assign a tag to an entity."""
|
||||||
tenant_id = uuid.UUID(current_user["tenant_id"])
|
tenant_id = uuid.UUID(current_user["tenant_id"])
|
||||||
user_id = uuid.UUID(current_user["id"])
|
user_id = uuid.UUID(current_user["user_id"])
|
||||||
tag_id = _parse_uuid(body.tag_id, "tag_id")
|
tag_id = _parse_uuid(body.tag_id, "tag_id")
|
||||||
entity_id = _parse_uuid(body.entity_id, "entity_id")
|
entity_id = _parse_uuid(body.entity_id, "entity_id")
|
||||||
|
|
||||||
@@ -247,7 +247,7 @@ async def unassign_tag(
|
|||||||
):
|
):
|
||||||
"""Remove a tag assignment from an entity."""
|
"""Remove a tag assignment from an entity."""
|
||||||
tenant_id = uuid.UUID(current_user["tenant_id"])
|
tenant_id = uuid.UUID(current_user["tenant_id"])
|
||||||
user_id = uuid.UUID(current_user["id"])
|
user_id = uuid.UUID(current_user["user_id"])
|
||||||
tag_id = _parse_uuid(body.tag_id, "tag_id")
|
tag_id = _parse_uuid(body.tag_id, "tag_id")
|
||||||
entity_id = _parse_uuid(body.entity_id, "entity_id")
|
entity_id = _parse_uuid(body.entity_id, "entity_id")
|
||||||
|
|
||||||
|
|||||||
@@ -148,8 +148,13 @@ async def _do_search(
|
|||||||
user_id = uuid.UUID(current_user["user_id"])
|
user_id = uuid.UUID(current_user["user_id"])
|
||||||
is_system_admin = current_user.get("is_system_admin", False)
|
is_system_admin = current_user.get("is_system_admin", False)
|
||||||
|
|
||||||
# KI query understanding
|
# KI query understanding (skip if use_ai=False for performance)
|
||||||
query_analysis = await llm_analyze_query(req.query, db=db, tenant_id=tenant_id)
|
use_ai = getattr(req, "use_ai", True)
|
||||||
|
if use_ai:
|
||||||
|
query_analysis = await llm_analyze_query(req.query, db=db, tenant_id=tenant_id)
|
||||||
|
else:
|
||||||
|
from app.plugins.builtins.unified_search.query_understanding import _fallback_query_analysis
|
||||||
|
query_analysis = _fallback_query_analysis(req.query)
|
||||||
|
|
||||||
# Hybrid search with visibility filtering
|
# Hybrid search with visibility filtering
|
||||||
results = await hybrid_search(
|
results = await hybrid_search(
|
||||||
@@ -176,8 +181,12 @@ async def _do_search(
|
|||||||
"event": "calendar",
|
"event": "calendar",
|
||||||
}
|
}
|
||||||
|
|
||||||
# KI result aggregation
|
# KI result aggregation (skip if use_ai=False for performance)
|
||||||
aggregation = await llm_aggregate_results(results, req.query, db=db, tenant_id=tenant_id)
|
if use_ai:
|
||||||
|
aggregation = await llm_aggregate_results(results, req.query, db=db, tenant_id=tenant_id)
|
||||||
|
else:
|
||||||
|
from app.plugins.builtins.unified_search.query_understanding import _fallback_aggregate
|
||||||
|
aggregation = _fallback_aggregate(results, req.query)
|
||||||
|
|
||||||
search_results = [
|
search_results = [
|
||||||
SearchResult(
|
SearchResult(
|
||||||
|
|||||||
@@ -330,10 +330,10 @@ async def create_incident(
|
|||||||
changes={"title": body.title, "incident_type": body.incident_type, "status": body.status},
|
changes={"title": body.title, "incident_type": body.incident_type, "status": body.status},
|
||||||
)
|
)
|
||||||
db.add(audit)
|
db.add(audit)
|
||||||
|
await db.flush()
|
||||||
|
result = _incident_to_dict(incident)
|
||||||
await db.commit()
|
await db.commit()
|
||||||
await db.refresh(incident)
|
return result
|
||||||
|
|
||||||
return _incident_to_dict(incident)
|
|
||||||
|
|
||||||
|
|
||||||
@router.patch(
|
@router.patch(
|
||||||
|
|||||||
@@ -473,7 +473,7 @@ async def approve_workflow_step(
|
|||||||
body = {}
|
body = {}
|
||||||
comment = body.get("comment", "")
|
comment = body.get("comment", "")
|
||||||
|
|
||||||
from app.core.approval import create_approval_request, decide_approval
|
from app.core.approval import create_approval_request, resolve_approval_request
|
||||||
from app.models.workflow import WorkflowInstance
|
from app.models.workflow import WorkflowInstance
|
||||||
from sqlalchemy import select
|
from sqlalchemy import select
|
||||||
|
|
||||||
@@ -500,9 +500,9 @@ async def approve_workflow_step(
|
|||||||
requested_by=user_id,
|
requested_by=user_id,
|
||||||
requested_by_type="user",
|
requested_by_type="user",
|
||||||
)
|
)
|
||||||
await decide_approval(
|
await resolve_approval_request(
|
||||||
db=db,
|
db=db,
|
||||||
approval_id=approval["id"],
|
request_id=approval["id"],
|
||||||
decision="approved",
|
decision="approved",
|
||||||
decided_by=user_id,
|
decided_by=user_id,
|
||||||
comment=comment,
|
comment=comment,
|
||||||
@@ -536,7 +536,7 @@ async def reject_workflow_step(
|
|||||||
body = {}
|
body = {}
|
||||||
comment = body.get("comment", "")
|
comment = body.get("comment", "")
|
||||||
|
|
||||||
from app.core.approval import create_approval_request, decide_approval
|
from app.core.approval import create_approval_request, resolve_approval_request
|
||||||
from app.models.workflow import WorkflowInstance
|
from app.models.workflow import WorkflowInstance
|
||||||
from sqlalchemy import select
|
from sqlalchemy import select
|
||||||
|
|
||||||
@@ -563,9 +563,9 @@ async def reject_workflow_step(
|
|||||||
requested_by=user_id,
|
requested_by=user_id,
|
||||||
requested_by_type="user",
|
requested_by_type="user",
|
||||||
)
|
)
|
||||||
await decide_approval(
|
await resolve_approval_request(
|
||||||
db=db,
|
db=db,
|
||||||
approval_id=approval["id"],
|
request_id=approval["id"],
|
||||||
decision="rejected",
|
decision="rejected",
|
||||||
decided_by=user_id,
|
decided_by=user_id,
|
||||||
comment=comment,
|
comment=comment,
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ async def create_folder(
|
|||||||
sort_order=max_order + 1,
|
sort_order=max_order + 1,
|
||||||
)
|
)
|
||||||
db.add(folder)
|
db.add(folder)
|
||||||
|
await db.flush()
|
||||||
result = _serialize_folder(folder)
|
result = _serialize_folder(folder)
|
||||||
await db.commit()
|
await db.commit()
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -444,14 +444,15 @@ async def _handle_crm(
|
|||||||
result = await update_contact(db, tenant_id, uuid.UUID(entity_id), data)
|
result = await update_contact(db, tenant_id, uuid.UUID(entity_id), data)
|
||||||
return StepResult(output={"contact": result} if result else {})
|
return StepResult(output={"contact": result} if result else {})
|
||||||
elif action == "create_company":
|
elif action == "create_company":
|
||||||
from app.services.company_service import create_company
|
from app.services.contact_service import create_contact
|
||||||
result = await create_company(db, tenant_id, data)
|
company_data = {**data, "type": "company"}
|
||||||
|
result = await create_contact(db, tenant_id, company_data)
|
||||||
return StepResult(output={"company": result} if result else {})
|
return StepResult(output={"company": result} if result else {})
|
||||||
elif action == "update_company":
|
elif action == "update_company":
|
||||||
from app.services.company_service import update_company
|
from app.services.contact_service import update_contact
|
||||||
if not entity_id:
|
if not entity_id:
|
||||||
return StepResult(error="update_company requires entity_id", abort=True)
|
return StepResult(error="update_company requires entity_id", abort=True)
|
||||||
result = await update_company(db, tenant_id, uuid.UUID(entity_id), data)
|
result = await update_contact(db, tenant_id, uuid.UUID(entity_id), data)
|
||||||
return StepResult(output={"company": result} if result else {})
|
return StepResult(output={"company": result} if result else {})
|
||||||
else:
|
else:
|
||||||
return StepResult(error=f"unknown crm action: {action}", abort=True)
|
return StepResult(error=f"unknown crm action: {action}", abort=True)
|
||||||
|
|||||||
+30
@@ -70,6 +70,36 @@ PYEOF
|
|||||||
python3 /tmp/set_role_passwords.py
|
python3 /tmp/set_role_passwords.py
|
||||||
rm -f /tmp/set_role_passwords.py
|
rm -f /tmp/set_role_passwords.py
|
||||||
|
|
||||||
|
# Grant DELETE on all tables to crm_api, crm_auth, crm_worker (BUG-030 fix)
|
||||||
|
echo "[prestart] Granting DELETE on all tables to crm_api, crm_auth, crm_worker..."
|
||||||
|
python3 -c "
|
||||||
|
import asyncio, os
|
||||||
|
from sqlalchemy.ext.asyncio import create_async_engine
|
||||||
|
from sqlalchemy import text
|
||||||
|
|
||||||
|
async def grant_delete():
|
||||||
|
db_url = os.environ.get('MIGRATION_DATABASE_URL', os.environ.get('DATABASE_URL', ''))
|
||||||
|
if not db_url:
|
||||||
|
print('[prestart] No DATABASE_URL found, skipping GRANT DELETE')
|
||||||
|
return
|
||||||
|
engine = create_async_engine(db_url)
|
||||||
|
try:
|
||||||
|
async with engine.begin() as conn:
|
||||||
|
for role in ['crm_api', 'crm_auth', 'crm_worker']:
|
||||||
|
try:
|
||||||
|
await conn.execute(text(f'GRANT DELETE ON ALL TABLES IN SCHEMA public TO {role}'))
|
||||||
|
print(f'[prestart] GRANT DELETE to {role} OK')
|
||||||
|
except Exception as e:
|
||||||
|
print(f'[prestart] WARNING: Could not GRANT DELETE to {role}: {e}')
|
||||||
|
print('[prestart] GRANT DELETE complete.')
|
||||||
|
except Exception as e:
|
||||||
|
print(f'[prestart] WARNING: Could not GRANT DELETE: {e}')
|
||||||
|
finally:
|
||||||
|
await engine.dispose()
|
||||||
|
|
||||||
|
asyncio.run(grant_delete())
|
||||||
|
"
|
||||||
|
|
||||||
# Set crm_runtime password if RUNTIME_DB_PASSWORD is set (legacy support)
|
# Set crm_runtime password if RUNTIME_DB_PASSWORD is set (legacy support)
|
||||||
if [ -n "$RUNTIME_DB_PASSWORD" ]; then
|
if [ -n "$RUNTIME_DB_PASSWORD" ]; then
|
||||||
echo "[prestart] Setting crm_runtime password..."
|
echo "[prestart] Setting crm_runtime password..."
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"timestamp": "2026-08-17T07:22:14.401718",
|
"timestamp": "2026-08-21T23:28:32.357773",
|
||||||
"total_time": 5.85,
|
"total_time": 3.8,
|
||||||
"total_scripts": 7,
|
"total_scripts": 7,
|
||||||
"total_issues": 1173,
|
"total_issues": 1287,
|
||||||
"passed": 1,
|
"passed": 1,
|
||||||
"failed": 6,
|
"failed": 6,
|
||||||
"skipped": 0,
|
"skipped": 0,
|
||||||
@@ -11,24 +11,24 @@
|
|||||||
"name": "trace_api_contracts",
|
"name": "trace_api_contracts",
|
||||||
"description": "Frontend\u2194Backend API Contracts",
|
"description": "Frontend\u2194Backend API Contracts",
|
||||||
"status": "FAIL",
|
"status": "FAIL",
|
||||||
"exit_code": 246,
|
"exit_code": 91,
|
||||||
"elapsed": 0.22,
|
"elapsed": 0.12,
|
||||||
"issues": 758
|
"issues": 859
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "trace_hooks",
|
"name": "trace_hooks",
|
||||||
"description": "Hook Registrations vs Triggers",
|
"description": "Hook Registrations vs Triggers",
|
||||||
"status": "FAIL",
|
"status": "FAIL",
|
||||||
"exit_code": 64,
|
"exit_code": 70,
|
||||||
"elapsed": 0.29,
|
"elapsed": 0.14,
|
||||||
"issues": 64
|
"issues": 70
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "trace_functions",
|
"name": "trace_functions",
|
||||||
"description": "Dead Functions (defined but never called)",
|
"description": "Dead Functions (defined but never called)",
|
||||||
"status": "FAIL",
|
"status": "FAIL",
|
||||||
"exit_code": 3,
|
"exit_code": 3,
|
||||||
"elapsed": 2.47,
|
"elapsed": 1.58,
|
||||||
"issues": 3
|
"issues": 3
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
"description": "Unused Store Actions/State",
|
"description": "Unused Store Actions/State",
|
||||||
"status": "FAIL",
|
"status": "FAIL",
|
||||||
"exit_code": 67,
|
"exit_code": 67,
|
||||||
"elapsed": 0.09,
|
"elapsed": 0.04,
|
||||||
"issues": 323
|
"issues": 323
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -44,24 +44,24 @@
|
|||||||
"description": "Contract Attribute Mismatches",
|
"description": "Contract Attribute Mismatches",
|
||||||
"status": "PASS",
|
"status": "PASS",
|
||||||
"exit_code": 0,
|
"exit_code": 0,
|
||||||
"elapsed": 1.41,
|
"elapsed": 0.93,
|
||||||
"issues": 0
|
"issues": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "trace_plugins",
|
"name": "trace_plugins",
|
||||||
"description": "Plugin\u2192Manifest\u2192Frontend Verkabelung",
|
"description": "Plugin\u2192Manifest\u2192Frontend Verkabelung",
|
||||||
"status": "FAIL",
|
"status": "FAIL",
|
||||||
"exit_code": 24,
|
"exit_code": 27,
|
||||||
"elapsed": 0.11,
|
"elapsed": 0.06,
|
||||||
"issues": 24
|
"issues": 27
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "trace_imports",
|
"name": "trace_imports",
|
||||||
"description": "Broken/Missing Imports",
|
"description": "Broken/Missing Imports",
|
||||||
"status": "FAIL",
|
"status": "FAIL",
|
||||||
"exit_code": 1,
|
"exit_code": 5,
|
||||||
"elapsed": 1.24,
|
"elapsed": 0.92,
|
||||||
"issues": 1
|
"issues": 5
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -321,6 +321,11 @@
|
|||||||
"contract": "DmsContract",
|
"contract": "DmsContract",
|
||||||
"attribute": "DmsFile",
|
"attribute": "DmsFile",
|
||||||
"file": "app/plugins/builtins/permissions/public_routes.py"
|
"file": "app/plugins/builtins/permissions/public_routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"contract": "KommunikationContract",
|
||||||
|
"attribute": "send_message",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/services.py"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"mismatches": []
|
"mismatches": []
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"py_defs": 1575,
|
"py_defs": 1773,
|
||||||
"py_dead": 627,
|
"py_dead": 692,
|
||||||
"ts_defs": 959,
|
"ts_defs": 1020,
|
||||||
"ts_dead": 442,
|
"ts_dead": 457,
|
||||||
"critical_dead": [
|
"critical_dead": [
|
||||||
{
|
{
|
||||||
"name": "seed_default_workspace",
|
"name": "seed_default_workspace",
|
||||||
|
|||||||
@@ -32,6 +32,10 @@
|
|||||||
"file": "app/plugins/builtins/mail/plugin.py",
|
"file": "app/plugins/builtins/mail/plugin.py",
|
||||||
"hook_name": "mail.after_delete"
|
"hook_name": "mail.after_delete"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"file": "app/plugins/builtins/wiki/plugin.py",
|
||||||
|
"hook_name": "wiki"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"file": "app/plugins/builtins/contacts/plugin.py",
|
"file": "app/plugins/builtins/contacts/plugin.py",
|
||||||
"hook_name": "contact.after_create"
|
"hook_name": "contact.after_create"
|
||||||
@@ -67,6 +71,18 @@
|
|||||||
{
|
{
|
||||||
"file": "app/plugins/builtins/calendar/plugin.py",
|
"file": "app/plugins/builtins/calendar/plugin.py",
|
||||||
"hook_name": "calendar_entry.after_delete"
|
"hook_name": "calendar_entry.after_delete"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "app/plugins/builtins/knowledge/plugin.py",
|
||||||
|
"hook_name": "wiki.article.created"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "app/plugins/builtins/knowledge/plugin.py",
|
||||||
|
"hook_name": "wiki.article.updated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "app/plugins/builtins/knowledge/plugin.py",
|
||||||
|
"hook_name": "knowledge"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"triggers": [
|
"triggers": [
|
||||||
@@ -94,6 +110,14 @@
|
|||||||
"file": "app/routes/companies.py",
|
"file": "app/routes/companies.py",
|
||||||
"hook_name": "company.after_delete"
|
"hook_name": "company.after_delete"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"file": "app/ai/agent_loop.py",
|
||||||
|
"hook_name": "agent.step"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "app/ai/agent_loop.py",
|
||||||
|
"hook_name": "agent.step"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"file": "app/services/contact_service.py",
|
"file": "app/services/contact_service.py",
|
||||||
"hook_name": "contact.before_create"
|
"hook_name": "contact.before_create"
|
||||||
@@ -407,7 +431,24 @@
|
|||||||
"hook_name": "tag.after_delete"
|
"hook_name": "tag.after_delete"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"orphan_registrations": [],
|
"orphan_registrations": [
|
||||||
|
{
|
||||||
|
"file": "app/plugins/builtins/wiki/plugin.py",
|
||||||
|
"hook_name": "wiki"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "app/plugins/builtins/knowledge/plugin.py",
|
||||||
|
"hook_name": "wiki.article.created"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "app/plugins/builtins/knowledge/plugin.py",
|
||||||
|
"hook_name": "wiki.article.updated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "app/plugins/builtins/knowledge/plugin.py",
|
||||||
|
"hook_name": "knowledge"
|
||||||
|
}
|
||||||
|
],
|
||||||
"orphan_triggers": [
|
"orphan_triggers": [
|
||||||
{
|
{
|
||||||
"file": "app/routes/companies.py",
|
"file": "app/routes/companies.py",
|
||||||
@@ -433,6 +474,14 @@
|
|||||||
"file": "app/routes/companies.py",
|
"file": "app/routes/companies.py",
|
||||||
"hook_name": "company.after_delete"
|
"hook_name": "company.after_delete"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"file": "app/ai/agent_loop.py",
|
||||||
|
"hook_name": "agent.step"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "app/ai/agent_loop.py",
|
||||||
|
"hook_name": "agent.step"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"file": "app/services/contact_service.py",
|
"file": "app/services/contact_service.py",
|
||||||
"hook_name": "contact.before_update"
|
"hook_name": "contact.before_update"
|
||||||
|
|||||||
@@ -1,6 +1,34 @@
|
|||||||
{
|
{
|
||||||
"total_imports": 2251,
|
"total_imports": 2556,
|
||||||
"broken": [
|
"broken": [
|
||||||
|
{
|
||||||
|
"file": "app/workflows/step_handlers.py",
|
||||||
|
"module": "app.services.company_service",
|
||||||
|
"name": "create_company",
|
||||||
|
"line": 447,
|
||||||
|
"issue": "Module not found"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "app/workflows/step_handlers.py",
|
||||||
|
"module": "app.services.company_service",
|
||||||
|
"name": "update_company",
|
||||||
|
"line": 451,
|
||||||
|
"issue": "Module not found"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "app/routes/workflows.py",
|
||||||
|
"module": "app.core.approval",
|
||||||
|
"name": "decide_approval",
|
||||||
|
"line": 476,
|
||||||
|
"issue": "Name 'decide_approval' not found in module"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "app/routes/workflows.py",
|
||||||
|
"module": "app.core.approval",
|
||||||
|
"name": "decide_approval",
|
||||||
|
"line": 539,
|
||||||
|
"issue": "Name 'decide_approval' not found in module"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"file": "app/core/auth.py",
|
"file": "app/core/auth.py",
|
||||||
"module": "app.models.session",
|
"module": "app.models.session",
|
||||||
|
|||||||
@@ -30,6 +30,11 @@
|
|||||||
"path": "app/plugins/builtins/migrations",
|
"path": "app/plugins/builtins/migrations",
|
||||||
"has_manifest": false
|
"has_manifest": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "wiki",
|
||||||
|
"path": "app/plugins/builtins/wiki",
|
||||||
|
"has_manifest": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "tests",
|
"name": "tests",
|
||||||
"path": "app/plugins/builtins/tests",
|
"path": "app/plugins/builtins/tests",
|
||||||
@@ -80,6 +85,11 @@
|
|||||||
"path": "app/plugins/builtins/system_notif",
|
"path": "app/plugins/builtins/system_notif",
|
||||||
"has_manifest": false
|
"has_manifest": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "knowledge",
|
||||||
|
"path": "app/plugins/builtins/knowledge",
|
||||||
|
"has_manifest": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "entity_links",
|
"name": "entity_links",
|
||||||
"path": "app/plugins/builtins/entity_links",
|
"path": "app/plugins/builtins/entity_links",
|
||||||
@@ -119,6 +129,11 @@
|
|||||||
"name": "ai_ui_control",
|
"name": "ai_ui_control",
|
||||||
"path": "app/plugins/builtins/ai_ui_control",
|
"path": "app/plugins/builtins/ai_ui_control",
|
||||||
"has_manifest": false
|
"has_manifest": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "self_improvement",
|
||||||
|
"path": "app/plugins/builtins/self_improvement",
|
||||||
|
"has_manifest": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"frontend_refs": {},
|
"frontend_refs": {},
|
||||||
@@ -268,6 +283,26 @@
|
|||||||
"path": "/subtasks/aggregate",
|
"path": "/subtasks/aggregate",
|
||||||
"file": "app/plugins/builtins/automation/routes.py"
|
"file": "app/plugins/builtins/automation/routes.py"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/",
|
||||||
|
"file": "app/plugins/builtins/automation/skill_routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"path": "/{skill_id}",
|
||||||
|
"file": "app/plugins/builtins/automation/skill_routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "PATCH",
|
||||||
|
"path": "/{skill_id}",
|
||||||
|
"file": "app/plugins/builtins/automation/skill_routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "DELETE",
|
||||||
|
"path": "/{skill_id}",
|
||||||
|
"file": "app/plugins/builtins/automation/skill_routes.py"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"method": "POST",
|
"method": "POST",
|
||||||
"path": "/",
|
"path": "/",
|
||||||
@@ -293,6 +328,16 @@
|
|||||||
"path": "/{agent_id}",
|
"path": "/{agent_id}",
|
||||||
"file": "app/plugins/builtins/automation/agent_routes.py"
|
"file": "app/plugins/builtins/automation/agent_routes.py"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"path": "/{agent_id}/ai-use-case",
|
||||||
|
"file": "app/plugins/builtins/automation/agent_routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "PATCH",
|
||||||
|
"path": "/{agent_id}/ai-use-case",
|
||||||
|
"file": "app/plugins/builtins/automation/agent_routes.py"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"method": "DELETE",
|
"method": "DELETE",
|
||||||
"path": "/{agent_id}",
|
"path": "/{agent_id}",
|
||||||
@@ -328,6 +373,11 @@
|
|||||||
"path": "/{id}/send-message",
|
"path": "/{id}/send-message",
|
||||||
"file": "app/plugins/builtins/automation/agent_routes.py"
|
"file": "app/plugins/builtins/automation/agent_routes.py"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/{id}/stream",
|
||||||
|
"file": "app/plugins/builtins/automation/agent_routes.py"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"method": "GET",
|
"method": "GET",
|
||||||
"path": "/folders",
|
"path": "/folders",
|
||||||
@@ -673,6 +723,51 @@
|
|||||||
"path": "/{mail_id}",
|
"path": "/{mail_id}",
|
||||||
"file": "app/plugins/builtins/mail/routes.py"
|
"file": "app/plugins/builtins/mail/routes.py"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"path": "/articles",
|
||||||
|
"file": "app/plugins/builtins/wiki/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/articles",
|
||||||
|
"file": "app/plugins/builtins/wiki/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"path": "/articles/{article_id}",
|
||||||
|
"file": "app/plugins/builtins/wiki/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "PATCH",
|
||||||
|
"path": "/articles/{article_id}",
|
||||||
|
"file": "app/plugins/builtins/wiki/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "DELETE",
|
||||||
|
"path": "/articles/{article_id}",
|
||||||
|
"file": "app/plugins/builtins/wiki/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"path": "/articles/{article_id}/versions",
|
||||||
|
"file": "app/plugins/builtins/wiki/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/articles/{article_id}/versions/{version}/restore",
|
||||||
|
"file": "app/plugins/builtins/wiki/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"path": "/categories",
|
||||||
|
"file": "app/plugins/builtins/wiki/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/categories",
|
||||||
|
"file": "app/plugins/builtins/wiki/routes.py"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"method": "GET",
|
"method": "GET",
|
||||||
"path": "/{task_id}",
|
"path": "/{task_id}",
|
||||||
@@ -698,6 +793,31 @@
|
|||||||
"path": "/{task_id}/status",
|
"path": "/{task_id}/status",
|
||||||
"file": "app/plugins/builtins/tasks/routes.py"
|
"file": "app/plugins/builtins/tasks/routes.py"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/{task_id}/subtasks",
|
||||||
|
"file": "app/plugins/builtins/tasks/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"path": "/{task_id}/subtasks",
|
||||||
|
"file": "app/plugins/builtins/tasks/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/{task_id}/dependencies",
|
||||||
|
"file": "app/plugins/builtins/tasks/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "DELETE",
|
||||||
|
"path": "/{task_id}/dependencies/{depends_on}",
|
||||||
|
"file": "app/plugins/builtins/tasks/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/{task_id}/decompose",
|
||||||
|
"file": "app/plugins/builtins/tasks/routes.py"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"method": "GET",
|
"method": "GET",
|
||||||
"path": "/calendar/entries",
|
"path": "/calendar/entries",
|
||||||
@@ -928,6 +1048,26 @@
|
|||||||
"path": "/{report_id}/download",
|
"path": "/{report_id}/download",
|
||||||
"file": "app/plugins/builtins/report_generator/routes.py"
|
"file": "app/plugins/builtins/report_generator/routes.py"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/extract",
|
||||||
|
"file": "app/plugins/builtins/knowledge/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/ask",
|
||||||
|
"file": "app/plugins/builtins/knowledge/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"path": "/review",
|
||||||
|
"file": "app/plugins/builtins/knowledge/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/review/{extraction_id}",
|
||||||
|
"file": "app/plugins/builtins/knowledge/routes.py"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"method": "POST",
|
"method": "POST",
|
||||||
"path": "/files/{file_id}/link",
|
"path": "/files/{file_id}/link",
|
||||||
@@ -1198,36 +1338,6 @@
|
|||||||
"path": "/tools",
|
"path": "/tools",
|
||||||
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"method": "GET",
|
|
||||||
"path": "/sessions",
|
|
||||||
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"method": "POST",
|
|
||||||
"path": "/sessions",
|
|
||||||
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"method": "PUT",
|
|
||||||
"path": "/sessions/{session_id}",
|
|
||||||
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"method": "DELETE",
|
|
||||||
"path": "/sessions/{session_id}",
|
|
||||||
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"method": "GET",
|
|
||||||
"path": "/sessions/{session_id}/messages",
|
|
||||||
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"method": "POST",
|
|
||||||
"path": "/sessions/{session_id}/stream",
|
|
||||||
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"method": "GET",
|
"method": "GET",
|
||||||
"path": "/folders",
|
"path": "/folders",
|
||||||
@@ -1250,17 +1360,12 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"method": "POST",
|
"method": "POST",
|
||||||
"path": "/sessions/{session_id}/attachments",
|
"path": "/conversations/{conversation_id}/stream",
|
||||||
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"method": "GET",
|
"method": "GET",
|
||||||
"path": "/sessions/{session_id}/attachments",
|
"path": "/conversations/{conversation_id}/messages",
|
||||||
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"method": "GET",
|
|
||||||
"path": "/attachments/{attachment_id}/download",
|
|
||||||
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
"file": "app/plugins/builtins/ai_assistant/routes.py"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1362,6 +1467,66 @@
|
|||||||
"method": "GET",
|
"method": "GET",
|
||||||
"path": "/online-users",
|
"path": "/online-users",
|
||||||
"file": "app/plugins/builtins/ai_ui_control/routes.py"
|
"file": "app/plugins/builtins/ai_ui_control/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/signals/collect",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"path": "/signals",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/patterns/detect",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"path": "/patterns",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/proposals",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"path": "/proposals",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"path": "/proposals/{proposal_id}",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/proposals/{proposal_id}/evaluate",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/proposals/{proposal_id}/request-approval",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/proposals/{proposal_id}/activate",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/proposals/{proposal_id}/rollback",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/routes.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "POST",
|
||||||
|
"path": "/proposals/{proposal_id}/measure",
|
||||||
|
"file": "app/plugins/builtins/self_improvement/routes.py"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"issues": [
|
"issues": [
|
||||||
@@ -1395,6 +1560,11 @@
|
|||||||
"issue": "No manifest.py",
|
"issue": "No manifest.py",
|
||||||
"severity": "HIGH"
|
"severity": "HIGH"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"plugin": "wiki",
|
||||||
|
"issue": "No manifest.py",
|
||||||
|
"severity": "HIGH"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"plugin": "tests",
|
"plugin": "tests",
|
||||||
"issue": "No manifest.py",
|
"issue": "No manifest.py",
|
||||||
@@ -1445,6 +1615,11 @@
|
|||||||
"issue": "No manifest.py",
|
"issue": "No manifest.py",
|
||||||
"severity": "HIGH"
|
"severity": "HIGH"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"plugin": "knowledge",
|
||||||
|
"issue": "No manifest.py",
|
||||||
|
"severity": "HIGH"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"plugin": "entity_links",
|
"plugin": "entity_links",
|
||||||
"issue": "No manifest.py",
|
"issue": "No manifest.py",
|
||||||
@@ -1484,6 +1659,11 @@
|
|||||||
"plugin": "ai_ui_control",
|
"plugin": "ai_ui_control",
|
||||||
"issue": "No manifest.py",
|
"issue": "No manifest.py",
|
||||||
"severity": "HIGH"
|
"severity": "HIGH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"plugin": "self_improvement",
|
||||||
|
"issue": "No manifest.py",
|
||||||
|
"severity": "HIGH"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user