Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions .env.docker-example
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ DASHSCOPE_API_KEY='sk-YOUR_API_KEY'
# frontend_multi_user
PLANEXE_FRONTEND_MULTIUSER_ADMIN_USERNAME='admin'
PLANEXE_FRONTEND_MULTIUSER_ADMIN_PASSWORD='admin'
# Gunicorn worker count (default: 4)
# PLANEXE_FRONTEND_MULTIUSER_WORKERS=4
# Flask session security (REQUIRED for production)
# Generate with: python -c 'import secrets; print(secrets.token_hex(32))'
# PLANEXE_FRONTEND_MULTIUSER_SECRET_KEY='your-generated-secret-key-here'
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ PlanExe exposes an MCP server for AI agents at [https://mcp.planexe.org/](https:

Assuming you have an MCP-compatible client ([Claude](https://docs.planexe.org/mcp/claude/), [Cursor](https://docs.planexe.org/mcp/cursor/), [Codex](https://docs.planexe.org/mcp/codex/), [LM Studio](https://docs.planexe.org/mcp/lm_studio/), [Windsurf](https://docs.planexe.org/mcp/windsurf/), OpenClaw, [Antigravity](https://docs.planexe.org/mcp/antigravity/)).

The Tool workflow (tools-only, not MCP tasks protocol)
The Tool workflow

1. `example_plans` (optional, preview what PlanExe output looks like)
2. `example_prompts`
Expand Down Expand Up @@ -164,9 +164,9 @@ If you want artifacts saved directly to your disk from your MCP client, run the

- Setup overview: [https://docs.planexe.org/mcp/mcp_setup/](https://docs.planexe.org/mcp/mcp_setup/)
- Tool details and flow: [https://docs.planexe.org/mcp/mcp_details/](https://docs.planexe.org/mcp/mcp_details/)
- MCP Inspector guide: [https://docs.planexe.org/mcp/inspector/](https://docs.planexe.org/mcp/inspector/)
- Cursor setup: [https://docs.planexe.org/mcp/cursor/](https://docs.planexe.org/mcp/cursor/)
- Codex setup: [https://docs.planexe.org/mcp/codex/](https://docs.planexe.org/mcp/codex/)
- Claude: [https://docs.planexe.org/mcp/claude/](https://docs.planexe.org/mcp/claude/)
- Cursor: [https://docs.planexe.org/mcp/cursor/](https://docs.planexe.org/mcp/cursor/)
- Codex: [https://docs.planexe.org/mcp/codex/](https://docs.planexe.org/mcp/codex/)
- PlanExe MCP interface: [https://docs.planexe.org/mcp/planexe_mcp_interface/](https://docs.planexe.org/mcp/planexe_mcp_interface/)
- MCP Registry publishing metadata (`server.json`): `mcp_cloud/server.json`
- `llms.txt`: [https://mcp.planexe.org/llms.txt](https://mcp.planexe.org/llms.txt)
Expand Down
7 changes: 6 additions & 1 deletion frontend_multi_user/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,9 @@ WORKDIR /app/frontend_multi_user

EXPOSE 5000

CMD ["python", "/app/frontend_multi_user/src/app.py"]
ENV PLANEXE_FRONTEND_MULTIUSER_WORKERS=4

CMD gunicorn wsgi:app \
--bind 0.0.0.0:${PLANEXE_FRONTEND_MULTIUSER_PORT:-5000} \
--workers ${PLANEXE_FRONTEND_MULTIUSER_WORKERS} \
--chdir /app/frontend_multi_user/src
3 changes: 2 additions & 1 deletion frontend_multi_user/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ dependencies = [
"stripe>=10.7.0",
"python-dotenv>=1.0.1",
"sqlalchemy-utils>=0.41.1",
"WTForms==3.1.2" # This is an older version of WTForms. Since WTForms 3.2.1 breaks the "edit" button in the admin panel.
"WTForms==3.1.2", # This is an older version of WTForms. Since WTForms 3.2.1 breaks the "edit" button in the admin panel.
"gunicorn>=23.0.0"
]

[build-system]
Expand Down
23 changes: 23 additions & 0 deletions frontend_multi_user/src/wsgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""
Gunicorn entry point for the multi-user frontend.

Usage:
gunicorn src.wsgi:app --bind 0.0.0.0:5000 --workers 4
"""
import logging
import sys

logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(threadName)s - %(message)s'
)

logger = logging.getLogger(__name__)

try:
from app import MyFlaskApp # type: ignore[reportAttributeAccessIssue]
flask_app_instance = MyFlaskApp()
app = flask_app_instance.app
except ValueError as exc:
logger.critical("Configuration error – service will not start: %s", exc)
sys.exit(1)
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{"id": "ce2fbf38-9700-4ed1-814e-78772f7b7700", "prompt": "Arla Foods, Denmark's largest dairy cooperative, loses approximately 270,000 of its iconic green plastic milk crates every year because they never return from supermarket delivery routes — consumers repurpose them as storage boxes, garden furniture, playground building blocks, and countless other second lives. Each crate is engineered to last 20 years, so every unreturned unit represents wasted material and energy; the replacement production alone generates an estimated 106 tonnes of CO2 annually. Arla now wants to run a nationwide return campaign throughout 2026 to recover as many of these crates as possible, using a charitable donation as the behavioural nudge: for every green Arla crate handed back, the company will donate five Danish kroner to Arla Foundation, which funds children's nutrition education programmes across Denmark.\n\nThe campaign's return infrastructure spans two channels: consumers can drop off crates at participating supermarket chains (the same stores that receive Arla deliveries) and at Denmark's network of municipal recycling stations (genbrugsstationer). Logistics must handle collection, inspection, cleaning, and reintroduction of returned crates into the existing dairy supply chain, while crates that are too damaged for reuse need to be routed to plastics recycling. The programme should define clear visual identification guidance so consumers can distinguish an Arla crate from look-alikes, and supermarkets need simple in-store procedures — signage, a designated drop-off point, and a lightweight count-and-report mechanism — without burdening staff or disrupting normal operations. Recycling stations need similar low-friction intake instructions.\n\nStakeholders include Arla Foods (programme owner and funder), Arla Foundation (donation recipient and co-communicator), major Danish supermarket groups such as Salling Group, Coop Danmark, and Rema 1000, municipal waste authorities operating the recycling stations, and the Danish public as participants. The campaign's marketing should be provocative enough to cut through everyday noise — these crates are a culturally familiar object in Denmark, and the message should tap into that recognition with humour or surprise while emphasising both the environmental upside (CO2 reduction) and the charitable angle (children's nutrition). Social media virality and earned press coverage are explicit goals; paid media should be supplementary rather than primary.\n\nBudget is estimated at 5 DKK × up to 270,000 crate returns = 1.35 million DKK in maximum donation outlay, plus campaign marketing, logistics infrastructure, and supermarket coordination costs — assume a total programme budget ceiling of 4 million DKK. Timeline: campaign concept and logistics design by end of Q1 2026, pilot launch in select regions during Q2, and nationwide rollout from Q3 through end of 2026. Success criteria: recover at least 40% of the annual loss volume (108,000 crates) in year one, achieve measurable reduction in new-crate production orders for 2027, generate at least 20 million organic social media impressions, and donate a minimum of 500,000 DKK to Arla Foundation. Pick a realistic, low-risk scenario — this is a CSR-driven logistics campaign, not a moonshot. Banned words: blockchain, NFT, AI, VR, AR.", "tags": ["denmark", "plastic", "waste", "pollution", "business"]}
{"id": "0942b98c-8590-4fb8-a98b-51a0bfc50cbe", "prompt": "This project establishes a first-of-its-kind immersive entertainment prototype inspired by the Westworld concept: a multi-zone, narrative-driven theme park experience in Japan populated by autonomous humanoid robots capable of natural conversation, emotional expression, and unscripted interaction with paying visitors. The facility will serve as both a commercial pilot and a technology demonstrator, proving that current-generation humanoid robotics and large language model-driven AI can sustain believable, safe, multi-hour guest experiences within themed Western-frontier, feudal Japanese, and near-future urban environments — three distinct zones selected to leverage Japan's cultural strengths in period set design and robotics aesthetics.\n\nThe prototype facility targets approximately 2,000–3,000 m² of indoor-outdoor hybrid space, housing three themed zones with a combined fleet of 30–50 humanoid robot \"hosts,\" each capable of bipedal locomotion, facial expression, spoken Japanese and English dialogue, and contextual memory of guest interactions within a single visit. Robots will be sourced primarily from existing commercial humanoid platforms available in the Japanese market — candidates include units from Kawasaki, Unitree, 1X, or Figure — with custom skin, costuming, and facial animatronics layered on top to achieve uncanny-valley-crossing realism. A centralized narrative engine, running on cloud infrastructure with local edge compute for latency-critical responses, will orchestrate storylines, manage robot assignments, and ensure guest safety through behavioral guardrails and real-time monitoring by a human operations team. Each zone will support a self-contained 60–90 minute narrative arc with branching paths, and guests will be limited to groups of 10–15 per zone per session to maintain immersion and safety ratios.\n\nThe site will be located in a suburban or semi-rural area of Japan — candidate regions include the outskirts of Osaka, northern Kyushu, or the Chiba corridor near Tokyo — chosen to balance land cost, transport access, and proximity to robotics supplier ecosystems. The facility requires Japanese building code compliance, fire safety certification for mixed human-robot occupancy, and alignment with Japan's Robot Safety regulatory framework including ISO 13482 for personal care robots and any applicable METI guidelines for entertainment robotics. All robot-guest physical interactions must pass risk assessment under ISO 10218 collaborative robot safety standards, and the facility must carry appropriate liability insurance.\n\nThe budget is ¥10 billion (approximately $65 million USD), allocated across four gated phases over a 30-month timeline: Phase 1 (months 1–8) covers R&D, robot platform selection, AI narrative engine development, and site acquisition; Phase 2 (months 9–16) covers facility construction, robot customization, and integration testing; Phase 3 (months 17–24) covers closed beta testing with invited guests, safety certification, and iterative refinement; Phase 4 (months 25–30) is soft launch with limited ticketing, targeting 200 guests per day at ¥15,000–25,000 per ticket. Key stakeholders include a founding robotics engineering team, a Japanese construction and theming contractor, an AI/ML team for the narrative engine, a hospitality and guest experience team, regulatory consultants, and investor relations given the scale of capital required. Success criteria for the prototype phase are: achieve a net promoter score above 60 from beta guests, demonstrate sustained autonomous robot operation for 8-hour daily cycles with fewer than 2 manual interventions per robot per day, maintain zero serious safety incidents through soft launch, and generate sufficient visitor demand data to justify a ¥30B+ Series A expansion to a full-scale facility. Banned words: metaverse, crypto, NFT, blockchain. The plan should pick a realistic, risk-conscious scenario — this is a prototype, not a final product — and explicitly address the regulatory, cultural, and ethical dimensions of deploying humanoid robots in a public entertainment context in Japan.", "tags": ["japan", "westworld", "robot", "entertainment", "business"]}
{"id": "691517a7-c9e3-4128-9956-c248e379d66d", "prompt": "As in the movie \"Face off\". Make a facility for transplanting the face between people. Location: New Zealand. The users pay a subscription fee every month they wear another persons face.", "tags": ["newzealand", "face", "transplant", "darkcomedy", "business"]}
{"id": "e543e384-45f0-4d89-8ed1-b424a7d6e8c3", "prompt": "Clay Workshop, Nuuk, Greenland. A community clay workshop located near Katuaq Cultural Centre offering weekly drop-in sessions and recurring courses in hand-building and wheel work. It should feel like a social \"third place\" where people return regularly to work with clay and socialize. The workshop targets locals (Nuuk ~20,000) and tourists, with seasonal peaks in summer (June–October) and winter. Staff the teaching team with four part-time instructors so that illness or absence does not cancel sessions. Operational setup includes open-studio hours, fixed 4–6 week courses, and a mix of memberships and drop-ins. The location near Katuaq and Nuuk Center provides visibility and cultural alignment. Greenland-specific factors: higher costs for shipping clay and equipment from Denmark/Iceland; heating and drying space for clay; strong seasonal demand; long supplier lead times. Budget: 2 million DKK for Year 1 (startup, equipment, fit-out, rent, four teachers, utilities, supplies, marketing). Pick a realistic, low-risk scenario. Avoid overly ambitious scenarios.", "tags": ["clay", "art", "greenland", "nuuk", "social", "friends", "business"]}
Expand Down
11 changes: 1 addition & 10 deletions worker_plan/worker_plan_internal/plan/run_plan_pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@
from worker_plan_internal.schedule.schedule import ProjectSchedule
from worker_plan_internal.schedule.export_gantt_dhtmlx import ExportGanttDHTMLX
from worker_plan_internal.schedule.export_gantt_csv import ExportGanttCSV
from worker_plan_internal.schedule.export_gantt_mermaid import ExportGanttMermaid
# from worker_plan_internal.schedule.export_gantt_mermaid import ExportGanttMermaid
from worker_plan_internal.llm_util.llm_executor import LLMExecutor, LLMModelFromName, ShouldStopCallbackParameters, PipelineStopRequested
from worker_plan_internal.llm_factory import get_llm_names_by_priority, SPECIAL_AUTO_ID, is_valid_llm_name
from worker_plan_api.model_profile import ModelProfileEnum, normalize_model_profile
Expand Down Expand Up @@ -3157,7 +3157,6 @@ def run_inner(self):
class CreateScheduleTask(PlanTask):
def output(self):
return {
'mermaid_html': self.local_target(FilenameEnum.SCHEDULE_GANTT_MERMAID_HTML),
'dhtmlx_html': self.local_target(FilenameEnum.SCHEDULE_GANTT_DHTMLX_HTML),
'machai_csv': self.local_target(FilenameEnum.SCHEDULE_GANTT_MACHAI_CSV)
}
Expand Down Expand Up @@ -3237,13 +3236,6 @@ def run_inner(self):
# task_ids_to_treat_as_project_activities=task_ids_to_treat_as_project_activities
# )

# Export the Gantt chart to Mermaid.
ExportGanttMermaid.save(
project_schedule=project_schedule,
path=self.output()['mermaid_html'].path,
project_start=project_start
)

# Export the Gantt chart to DHTMLX.
ExportGanttDHTMLX.save(
project_schedule=project_schedule,
Expand Down Expand Up @@ -3715,7 +3707,6 @@ def run_inner(self):

rg = ReportGenerator()
rg.append_markdown('Executive Summary', self.input()['executive_summary']['markdown'].path)
rg.append_html('Gantt Overview', self.input()['create_schedule']['mermaid_html'].path)
rg.append_html('Gantt Interactive', self.input()['create_schedule']['dhtmlx_html'].path)
rg.append_markdown('Pitch', self.input()['pitch_markdown']['markdown'].path)
rg.append_markdown('Project Plan', self.input()['project_plan']['markdown'].path)
Expand Down
5 changes: 5 additions & 0 deletions worker_plan/worker_plan_internal/self_audit/self_audit.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
Some of the checklist items overlaps with each other, and I don't care about things being mutually exclusive where things are not supposed to overlap.
I care about what problems I observe in the generated reports.

ISSUE: Violates Known Physics - false positive
https://planexe.org/20260303_crate_recovery_campaign_report.html
gemini-2.5-flash-lite-preview-09-2025, though that the laws of physics were violated, because a plan mentioned "CSR driven logistics".
corporate social responsibility (CSR), which has nothing to do with faster than light travel, but was flagged as "violates known physics".

PROMPT> python -u -m worker_plan_internal.self_audit.self_audit | tee output.txt
"""
import json
Expand Down