Commit Graph

136 Commits

Author SHA1 Message Date
anadoris007 a7bc6ef148
Merge 484689735f into b5b53acc57 2026-08-09 03:06:10 -04:00
666ghj f0d487f310 fix: harden ontology JSON generation 2026-07-23 02:08:17 +08:00
666ghj 407c391f35 fix: keep Zep timeouts internal 2026-07-23 00:32:53 +08:00
666ghj 54bd7a3d4e fix: validate complete Zep entity context 2026-07-23 00:20:50 +08:00
666ghj e4aa38dff2 fix: modernize Zep Cloud integration 2026-07-23 00:20:28 +08:00
666ghj 0d8c23a3c2 fix: use the supported Zep node-edge method 2026-07-22 20:08:18 +08:00
666ghj d2f9e56eea fix: enforce Zep ontology contract limits 2026-07-22 19:53:59 +08:00
666ghj 9506e6f5e0 fix: normalize ontology attributes centrally 2026-07-22 19:51:41 +08:00
octo-patch a07841e91b fix: handle string attributes in graph ontology to prevent TypeError crash (fixes #135)
When the LLM returns ontology attributes as plain strings instead of
dicts, set_ontology() crashes with "TypeError: string indices must be
integers, not 'str'" at attr_def["name"].

Two-layer fix:
1. ontology_generator.py: normalize string attrs to {"name", "type",
   "description"} dicts during validation, so downstream code always
   receives well-formed structures.
2. graph_builder.py: add isinstance guard as a safety net in
   set_ontology() for both entity and edge attribute loops.

Co-Authored-By: Octopus <liyuan851277048@icloud.com>
2026-07-22 19:51:19 +08:00
666ghj c415387995 style: remove trailing whitespace from profile model 2026-07-22 19:50:18 +08:00
666ghj 9f80ad66fd fix: normalize profile fields at construction 2026-07-22 19:49:33 +08:00
ygh1254 41fc932b62 fix: normalize structured LLM profile fields before serialization 2026-07-22 19:49:33 +08:00
666ghj e67a52e80f fix: keep GPT-5 compatibility handling narrow 2026-07-22 19:48:32 +08:00
IagoMelo01 f7138e09fb Correction GPT-5 family error 500 2026-07-22 19:48:32 +08:00
666ghj 05bea4a330 fix: stop Step2 polling after preparation failure 2026-07-22 19:47:20 +08:00
666ghj f0e379471a fix: sanitize fabricated tool results everywhere 2026-07-22 19:46:23 +08:00
MiroFish Contributor 1d96b09875 fix: strip fabricated tool_result blocks to prevent LLM hallucination
When the LLM generates a <tool_call> block followed by a self-generated
<tool_result> block in the same response, the fake result must be stripped
before appending to message history. The real tool result will be injected
separately by the system.

This fixes a React Hallucination bug where models could fabricate tool
results that didn't actually come from tool invocations.
2026-07-22 19:46:23 +08:00
666ghj b651883d66 fix: load Twitter profiles from CSV 2026-07-22 19:45:30 +08:00
karesansui aaf3ea0a09 Fix silent data loss when platform defaults to reddit for Twitter-only simulations
The API retrieval layer hardcoded reddit as the default platform in 11+ locations. When a Twitter-only simulation was run, all data retrieval APIs silently returned empty results because they looked for reddit_simulation.db which did not exist. This commit reads the simulation enable_twitter/enable_reddit config to determine the correct default platform.

Fixes #150
2026-07-22 19:45:30 +08:00
666ghj 7d6f6bb135 fix: preserve edge paging call compatibility 2026-07-22 19:42:00 +08:00
harshitanand e58d4f1cc5 fix: add max_items limit to fetch_all_edges to prevent unbounded memory growth (#513)
fetch_all_nodes already had a max_items guard (default 2000) but
fetch_all_edges had no such safeguard, allowing unbounded memory growth
on graphs with large numbers of edges.

Add _MAX_EDGES = 5000 constant and mirror the same loop-guard pattern
from fetch_all_nodes: cap the result list, emit a warning log, and
break pagination once the limit is reached.
2026-07-22 19:42:00 +08:00
BaiFu 53af276f4e
Merge pull request #584: sample long ontology input across the document
Replace first-50000-character truncation with deterministic sampling under the same context budget.
2026-07-22 19:40:54 +08:00
BaiFu 231ec22bea
Merge pull request #445: disable Flask debug mode by default
Default Flask debug mode to false while preserving explicit opt-in through FLASK_DEBUG.
2026-07-22 19:40:39 +08:00
BaiFu cbfd03db69
Merge pull request #727: upgrade NLTK to 3.10.0
Upgrade the transitive Python dependency NLTK from 3.9.2 to 3.10.0 to address CVE-2025-14009. The contributor title said 3.9.3, but the reviewed lockfile resolves 3.10.0.
2026-07-22 19:40:34 +08:00
BaiFu 086f1fb5e8
Merge pull request #305: fix graph tasks endpoint crash
Remove the redundant to_dict call because TaskManager.list_tasks already returns dictionaries.
2026-07-22 19:39:57 +08:00
orbisai0security fe2fd5b164 fix: CVE-2025-14009 security vulnerability
Automated dependency upgrade by OrbisAI Security
2026-07-21 09:08:09 +00:00
BaiFu 96096ea0ff
Merge pull request #640 from lllopic/fix/add-type-hints-and-helper-method
refactor: add type hints and FileParser.is_supported() helper
2026-05-25 00:48:57 +08:00
666ghj 3f4d56116c fix(backend): constrain Python version to 3.11-3.12 2026-05-24 22:59:36 +08:00
lllopic daec4b6be4 refactor: add type hints and FileParser.is_supported() helper
- 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
2026-05-23 14:57:46 +08:00
Sami Rusani f0e936ae43 fix: sample long text for ontology generation 2026-04-26 23:01:02 +02:00
anadoris007 484689735f feat(narrative): add GodModeView, WorldBuilderView, cinematic locations
- New Vue views: GodModeView (inject event, modify emotions with
  preloaded current values, kill character with typed-name
  confirmation) and WorldBuilderView (rules editor, locations with
  cinematic atmosphere field, event log viewer)
- Shared sim-nav strip across Story/GodMode/World views
- Location schema extended with optional atmosphere field — a short
  mood phrase that anchors the opening visual of every scene set there
- Translator's _format_world_locations surfaces atmosphere to the LLM
  prompt so the field actually influences generation
- Routes added for /godmode/:simId and /world/:simId

Tests: 39/39 passing (added test_location_atmosphere_surfaces_in_prompt).
Frontend builds clean.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 15:01:08 +05:30
anadoris007 2eb98a00bd feat(narrative): add world + god mode API endpoints
Six new endpoints under /api/narrative/*:
- GET  /world/<sim_id>                       — full world state
- POST /world/<sim_id>/rules                 — replace rules list
- POST /world/<sim_id>/locations             — upsert location
- POST /godmode/<sim_id>/inject-event        — inject world event
- POST /godmode/<sim_id>/modify-emotion      — overwrite emotions
- POST /godmode/<sim_id>/kill                — kill character

Validation:
- 400 on missing required fields (description, character_id, rules)
- 400 on invalid round (must be non-negative int or null)
- 404 on character not found (from ValueError in handlers)

Smoke-tested via Flask test client — all 11 response codes correct.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 14:56:36 +05:30
anadoris007 aabe9b42a2 test(narrative): fix dead-filter e2e test — need living actor in round 2
When Marcus (the only round-2 actor) was killed, generate_prose
short-circuited on empty actions without calling the LLM, so
mock_llm.call_args_list only had one entry. Added Elena as a
second round-2 actor to exercise the filter with a live participant.
2026-04-22 14:55:28 +05:30
anadoris007 c223d77267 test(narrative): add e2e tests for event injection and kill 2026-04-22 14:55:03 +05:30
anadoris007 d3bec344c7 feat(narrative): extend translator with world context + dead filter
- PROSE_PROMPT_TEMPLATE extended with world_rules, world_events,
  world_locations, and event_enforcement substitution fields
- EVENT_ENFORCEMENT_STRENGTH set to "hard" — opening line MUST
  reference the most recent world event (aligns with existing
  punchy, cinematic voice)
- Character summaries now resolve location id → name for prompts
- translate_round loads world_state and filters dead characters
  from both the roster and the action list before prose generation
- User-supplied strings (rules, events, locations) brace-escaped
  before str.format() to prevent KeyError on stray { or }

Tests: 36/36 passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 14:54:22 +05:30
anadoris007 a569976d55 feat(narrative): add god_mode.kill_character with auto-death event 2026-04-20 22:25:24 +05:30
anadoris007 f25f68837c feat(narrative): add god_mode.modify_emotion with audit logging 2026-04-20 22:24:54 +05:30
anadoris007 f91dd00f37 feat(narrative): add god_mode.inject_event handler 2026-04-20 22:24:28 +05:30
anadoris007 16b7ef7521 feat(narrative): set status=alive on new characters 2026-04-20 22:23:59 +05:30
anadoris007 1a73b7f672 feat(narrative): add WorldStateStore for rules, locations, event log 2026-04-20 22:23:38 +05:30
anadoris007 d651cb830b test(narrative): add end-to-end pipeline test
Full-pipeline test: fake simulation dir → actions.jsonl → two
translate_round calls → assertions on beat persistence, character
evolution, and translator offset advancement.

Final test suite: 20/20 passing across action mapper, character
engine, story store, translator (read + prose + orchestration), and
E2E.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 22:05:08 +05:30
anadoris007 727f4403e3 feat(narrative): add narrative API blueprint
Five endpoints under /api/narrative/*:
- GET  /story/<sim_id>                — full story so far
- GET  /story/<sim_id>/round/<num>    — single round
- POST /translate                     — translate a round on demand
- GET  /characters/<sim_id>           — roster with emotional state
- POST /characters/<sim_id>/init      — bootstrap from OASIS profiles

Blueprint registered alongside existing graph/simulation/report
blueprints following the established pattern. Smoke-tested via Flask
test client.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 22:02:16 +05:30
anadoris007 caec8b5c77 feat(narrative): orchestrate round translation with state updates
translate_round() ties together:
  - reading the round's actions from actions.jsonl
  - generating prose via the LLM
  - updating per-character emotional state
  - persisting the beat, characters, and file offset

Full test suite now at 19/19 passing across action mapper, character
engine, story store, and translator.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 22:01:19 +05:30
anadoris007 9db7b399cc feat(narrative): add LLM-driven prose generation
Module-level call_llm() wrapper (patchable by tests) drives
PROSE_PROMPT_TEMPLATE rendering with character summaries, actions,
previous beats, and user-selected tone. Prompt tuned for punchy,
cinematic, dialogue-heavy voice.

Tests: 5/5 passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 22:00:29 +05:30
anadoris007 052fd87acd feat(narrative): add actions.jsonl round reader
Reads one round's worth of agent actions from the OASIS log file,
tracking file offset so callers can resume across translation calls.
Handles missing files, malformed JSON lines, and non-target rounds
gracefully.

Tests: 3/3 passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 21:29:15 +05:30
anadoris007 6b9e6eeeb2 feat(narrative): add CharacterEngine with emotional state tracking
Character profiles now track a six-dimension emotional state (anger,
fear, joy, sadness, trust, surprise) that evolves based on actions
taken. Initial deltas for all 13 OASIS actions chosen as a balanced
baseline (see module docstring for tuning guidance).

Tests: 5/5 passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 21:28:30 +05:30
anadoris007 05aa9f149e feat(narrative): add StoryStore for file-based narrative persistence
Three JSON files per simulation under narrative/ subdir:
- story_beats.json: chronological story passages
- translator_state.json: per-platform file offsets
- characters.json: extended character profiles

Tests: 4/4 passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 20:50:55 +05:30
anadoris007 2d782f04c1 feat(narrative): add action-to-verb mapping for OASIS actions
New narrative package with action_mapper module that maps the 13 OASIS
action types (CREATE_POST, LIKE_POST, REPOST, etc.) to narrative verbs
and interpretations used when generating story prose.

Tests: 4/4 passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 20:50:05 +05:30
ChinhLee e9cac5f8ee fix(security): flask debug mode enabled by default, exposed on 0.0.0.0
DEBUG defaults to True (FLASK_DEBUG env var is 'True' unless overridden) and the server binds to 0.0.0.0. When debug mode is active, Flask enables the Werkzeug interactive debugger, which allows arbitrary Python code execution via the browser-accessible debugger console if an exception is triggered. Combined with the public bind address this creates a remote code execution vector on any deployment that forgets to set FLASK_DEBUG=False.

Affected files: config.py

Signed-off-by: ChinhLee <76194645+chinhkrb113@users.noreply.github.com>
2026-04-02 21:20:56 +07:00
BaiFu af71244974
Merge pull request #428 from Ghostubborn/feat/i18n
feat(i18n): 添加多语言切换功能,支持中英文
2026-04-02 14:27:04 +08:00