- frontend/src/views/SimulationView.vue: remove onMounted auto-stop of running
simulations. Step 3's handleGoBack() already stops the sim when the user
explicitly clicks 'Back', so onMounted only killed sims when users opened
the sim URL directly or refreshed Step 2 (the 'loading error' symptom).
- backend/scripts/run_parallel_simulation.py: lower OASIS semaphore from 30
to 8 to fit the 8GB host's memory budget.
- backend/vendor/camel-oasis/oasis/social_agent/agents_generator.py: add
.get() defaults for mbti/gender/age/country to handle sparse agent
profiles (KeyError: 'mbti' bug).
Frontend (.vue, .js, .ts):
- All Chinese in HTML comments, JS comments, CSS comments translated
- All hardcoded Chinese UI strings (titles, alerts, console errors) translated
- The few remaining Chinese fragments in Step2EnvSetup.vue (4) and
Step4Report.vue (77) are intentional: stage-name identifiers that
must match what the backend emits, and LLM-output parser patterns
that match Chinese section headers in the LLM response.
Backend (Python):
- All # comments, """ and ''' docstrings translated
- All log/print/raise/error message strings translated
- All LLM system prompts (ONTOLOGY_SYSTEM_PROMPT, _PROMPT, _INSTRUCTION,
_TEMPLATE, _TASK_PROMPT, _EXTRACTOR, _PLANNER, _REPORTER, _SUMMARY,
_OUTLINE, _SYNTHESIS, _REWRITE, _SEARCH_PROMPT, _INTERVIEW, _REFLECTION,
_REACT, _ROLE, _CONTEXT, _GUIDELINES, _AGENT, _MESSAGE, _EXAMPLE,
_SYNTHESIZER, _WRITER, _CRITIQUE, _REVISION, _FEEDBACK, _PERSONA,
_FORMAT, _JUDGE, _ROUTER, _SECTION_PLANNER, _PARSER, _EXTRACT,
_RATIONALE variables) translated
- stage-name string literals in zep_graph_memory_updater.py (return
values used as Zep episode content) translated
- LLM-output parser patterns in zep_tools.py and report_agent.py
(e.g. text.match(/分析问题:/) and section headers like
'### 【关键事实】') kept as Chinese, because they match the
LLM's output format.
i18n:
- locales/zh.json: kept as source of truth for Chinese strings
- locales/en.json: kept (was already a complete English translation)
- locales/nl.json: NEW — full Dutch (Nederlands) translation of
en.json (633 leaf keys, all interpolation placeholders preserved)
- locales/languages.json: added 'nl' entry with label 'Nederlands'
and llmInstruction 'Antwoord in het Nederlands.'
Frontend i18n config:
- frontend/src/i18n/index.js: default locale changed from 'zh' to 'nl',
fallback locale from 'zh' to 'en'. Dutch is now the default UI
language; English is the fallback.
Misc:
- package.json: description translated
- docker-compose.yml: inline comment translated
- README.md / README-ZH.md / locales/zh.json / locales/languages.json:
Chinese content intentionally preserved (bilingual readme pointers
and language-metadata source of truth)
Files: 59 changed, +6810 / -6102
Co-authored-by: hermes <hermes@profikid.nl>
- New GraphView.vue: lightweight page at /graph/<id> that resolves a
graph_id back to its owning project_id via /api/graph/project/list,
then router-replaces to /process/<projectId> so the existing project
page handles the full graph visualisation.
- HistoryDatabase.vue: fetch /api/simulation/history and /api/graph/project/list
in parallel and merge by project_id (sims win on conflict, project list
fills the gap so home history is non-empty for users who only built
graphs). Newest first by created_at.
- frontend/src/api/graph.js: add listProjects(limit) wrapper.
- frontend/src/router/index.js: register /graph/:id route, props: true.
- frontend/src/api/index.js: switch VITE_API_BASE_URL fallback from ||
to ?? so an empty string is honoured (Vite uses empty to mean 'same
origin', letting Traefik reverse-proxy /api/* to the backend container
without an absolute baseURL).
- Dockerfile: VITE_API_BASE_URL="" baked in at build time (default).
- graphiti_service.py: strip lowercase <think> / <antmlthinking> reasoning
blocks in addition to <think> (M2.7 vs M3/Qwen emit different
reasoning tags); accept M2.7's 'entity_types' plural list shape in
_normalize_extraction_payload.
The browser lives at /docker/falkordb-browser/ on the host (separate from
the MiroFish stack so they can be restarted independently). It joins the
mirofish_net bridge network as 'external' and dials the same FalkorDB
sidecar the MiroFish app uses. Users sign in via the browser UI by entering
host=falkordb, port=6379, empty user/pass — the connection is server-side
from inside the browser container, so the user's machine doesn't need
direct access to the Docker network.
- backend/app/api/graph.py: add POST /api/graph/ingest_text
(one-call: project + ontology + async build + returns project_id/task_id)
Designed for cron automations that need to ingest a markdown briefing
without the 3-step project -> ontology -> build dance.
- backend/app/services/ontology_generator.py: bump max_tokens 4096->16384
and add a retry-with-compact-prompt path on JSON parse failure.
M3 truncates long entity-attribute arrays; the retry asks for a stripped
schema (no attributes, 6 entity types max, 6 edge types max).
- deploy/Dockerfile.e2e: build context is the project root, so COPY
needs the deploy/ prefix; entrypoint uses 'uv run python' because
the MiroFish image is uv-managed (flask/graphiti/falkordb all live
under /app/backend/.venv).
- README.md: replace Zep + Qwen references with the Graphiti+FalkorDB
stack and MiniMax M-series LLMs; add 'About this fork' section
documenting the deploy overlay, ingest_text API, and cron integration.
The Shanda sponsor logo's alt text was `666ghj%2MiroFish | Shanda`,
missing the `F` from the URL-encoded `/`. Every other badge in both
READMEs uses the correct `666ghj%2FMiroFish`. Bring this one in line
with the rest.
- Add return type annotation (list[str]) to Config.validate()
- Add type annotations (msg: str, -> None) to logger convenience functions
- Add FileParser.is_supported() classmethod for checking file format support
- Add sans-serif font for English left-pane (status, workflow sections)
- Shorten English workflow step descriptions
- Reduce English report title font-size from 36px to 28px
- Use sans-serif font for English titles, descriptions and navbar
- Shorten English hero text to avoid overflow
- Fix :global() scoped CSS issue that was setting root font-size to 3.5rem
- Use separate unscoped style block for html[lang] selectors
Background threads (graph building, simulation prep, report generation,
profile generation) now inherit the requesting user's locale preference.
Previously these fell back to 'zh' because Flask request context was
unavailable in spawned threads.
Ensure poster_type stays PascalCase English and stance stays English enum
values regardless of language setting. Only natural language fields follow
the user's language preference.
The language instruction was causing LLM to change entity/relation naming
conventions. Now explicitly enforce PascalCase/UPPER_SNAKE_CASE for technical
identifiers while only applying language preference to description fields.