campaign-rpg-engine 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. campaign_rpg_engine/__init__.py +210 -0
  2. campaign_rpg_engine/action_outcome.py +19 -0
  3. campaign_rpg_engine/actions/__init__.py +15 -0
  4. campaign_rpg_engine/actions/emote.py +24 -0
  5. campaign_rpg_engine/actions/interact.py +621 -0
  6. campaign_rpg_engine/actions/move.py +350 -0
  7. campaign_rpg_engine/actions/speak.py +19 -0
  8. campaign_rpg_engine/agent.py +98 -0
  9. campaign_rpg_engine/area.py +384 -0
  10. campaign_rpg_engine/area_edit.py +1308 -0
  11. campaign_rpg_engine/area_edit_parse.py +38 -0
  12. campaign_rpg_engine/area_event.py +29 -0
  13. campaign_rpg_engine/compound_arg_parse.py +110 -0
  14. campaign_rpg_engine/coordinates.py +54 -0
  15. campaign_rpg_engine/emote_phrasing.py +40 -0
  16. campaign_rpg_engine/game_profile.py +177 -0
  17. campaign_rpg_engine/grid.py +9 -0
  18. campaign_rpg_engine/interact_templates.py +71 -0
  19. campaign_rpg_engine/interaction_handlers/__init__.py +24 -0
  20. campaign_rpg_engine/interaction_handlers/base.py +27 -0
  21. campaign_rpg_engine/interaction_handlers/registry.py +111 -0
  22. campaign_rpg_engine/llm/__init__.py +4 -0
  23. campaign_rpg_engine/llm/client.py +143 -0
  24. campaign_rpg_engine/llm/memory_summary.py +88 -0
  25. campaign_rpg_engine/llm/prompt.py +44 -0
  26. campaign_rpg_engine/llm/prompt_context.py +258 -0
  27. campaign_rpg_engine/llm/schemas.py +149 -0
  28. campaign_rpg_engine/llm/text_truncation.py +111 -0
  29. campaign_rpg_engine/llm/token_estimate.py +16 -0
  30. campaign_rpg_engine/llm/types.py +21 -0
  31. campaign_rpg_engine/log_utils/__init__.py +14 -0
  32. campaign_rpg_engine/log_utils/logger.py +152 -0
  33. campaign_rpg_engine/lorebook/__init__.py +29 -0
  34. campaign_rpg_engine/lorebook/factory.py +37 -0
  35. campaign_rpg_engine/lorebook/import_st.py +70 -0
  36. campaign_rpg_engine/lorebook/listing.py +17 -0
  37. campaign_rpg_engine/lorebook/matcher.py +111 -0
  38. campaign_rpg_engine/lorebook/models.py +123 -0
  39. campaign_rpg_engine/lorebook/scan_config.py +90 -0
  40. campaign_rpg_engine/lorebook/st_defaults.py +99 -0
  41. campaign_rpg_engine/memory.py +156 -0
  42. campaign_rpg_engine/memory_modules/__init__.py +28 -0
  43. campaign_rpg_engine/memory_modules/base.py +85 -0
  44. campaign_rpg_engine/memory_modules/consolidation_runner.py +179 -0
  45. campaign_rpg_engine/memory_modules/formatting/__init__.py +34 -0
  46. campaign_rpg_engine/memory_modules/formatting/common.py +93 -0
  47. campaign_rpg_engine/memory_modules/formatting/salient.py +34 -0
  48. campaign_rpg_engine/memory_modules/formatting/summary.py +32 -0
  49. campaign_rpg_engine/memory_modules/loader.py +106 -0
  50. campaign_rpg_engine/memory_modules/recent_turns.py +100 -0
  51. campaign_rpg_engine/memory_modules/registry.py +267 -0
  52. campaign_rpg_engine/memory_modules/rolling_summary.py +297 -0
  53. campaign_rpg_engine/memory_modules/salient_turns.py +286 -0
  54. campaign_rpg_engine/memory_modules/serialization.py +101 -0
  55. campaign_rpg_engine/move_target.py +288 -0
  56. campaign_rpg_engine/object.py +135 -0
  57. campaign_rpg_engine/object_action.py +42 -0
  58. campaign_rpg_engine/observations.py +121 -0
  59. campaign_rpg_engine/occupancy.py +244 -0
  60. campaign_rpg_engine/pathfinding.py +155 -0
  61. campaign_rpg_engine/pathing.py +57 -0
  62. campaign_rpg_engine/perception.py +431 -0
  63. campaign_rpg_engine/prompt_blocks.py +462 -0
  64. campaign_rpg_engine/prompt_template.py +57 -0
  65. campaign_rpg_engine/reserved_names.py +80 -0
  66. campaign_rpg_engine/session.py +1149 -0
  67. campaign_rpg_engine/session_area_edit.py +254 -0
  68. campaign_rpg_engine/session_persistence.py +351 -0
  69. campaign_rpg_engine/simulation.py +288 -0
  70. campaign_rpg_engine/snapshot.py +213 -0
  71. campaign_rpg_engine/triggers.py +119 -0
  72. campaign_rpg_engine/turn_record.py +33 -0
  73. campaign_rpg_engine/utils/__init__.py +6 -0
  74. campaign_rpg_engine/vision_bearing.py +94 -0
  75. campaign_rpg_engine/world_edit_api.py +460 -0
  76. campaign_rpg_engine-1.0.0.dist-info/METADATA +114 -0
  77. campaign_rpg_engine-1.0.0.dist-info/RECORD +81 -0
  78. campaign_rpg_engine-1.0.0.dist-info/WHEEL +4 -0
  79. campaign_rpg_engine-1.0.0.dist-info/licenses/LICENSE +21 -0
  80. profiles/default_compound/few_shots.txt +63 -0
  81. profiles/default_compound/template.txt +17 -0
@@ -0,0 +1,210 @@
1
+ """
2
+ campaign_rpg_engine — public engine API for CampAIgn-RPG-Engine (1.0.0).
3
+
4
+ Import from this package in application code.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import tomllib
10
+ from pathlib import Path
11
+
12
+ from campaign_rpg_engine.agent import Agent
13
+ from campaign_rpg_engine.area import Area, GridBounds, create_area, create_initial_area
14
+ from campaign_rpg_engine.area_edit import (
15
+ delete_agent_by_id,
16
+ format_agents_list,
17
+ format_full_list,
18
+ format_objects_list,
19
+ parse_position,
20
+ )
21
+ from campaign_rpg_engine.game_profile import GameProfile, default_compound_profile, load_profile
22
+ from campaign_rpg_engine.interact_templates import interact_template_var_help
23
+ from campaign_rpg_engine.llm.client import LLMParseError, get_compound_turn
24
+ from campaign_rpg_engine.llm.prompt_context import PromptContext, build_prompt_context
25
+ from campaign_rpg_engine.llm.schemas import AgentCompoundTurn
26
+ from campaign_rpg_engine.llm.token_estimate import estimate_prompt_tokens
27
+ from campaign_rpg_engine.llm.types import LLMResponse
28
+ from campaign_rpg_engine.lorebook import (
29
+ DEFAULT_LOREBOOK_CHAR_BUDGET,
30
+ Lorebook,
31
+ LoreEntry,
32
+ LorebookScanConfig,
33
+ ST_ENTRY_DEFAULTS,
34
+ build_scan_corpus,
35
+ derive_lorebook_id_from_filename,
36
+ describe_scan_sources,
37
+ load_lorebook_from_dict,
38
+ load_lorebook_from_path,
39
+ match_lorebook_entries,
40
+ new_st_entry_dict,
41
+ render_lorebook,
42
+ with_st_entry_defaults,
43
+ )
44
+ from campaign_rpg_engine.lorebook.factory import create_empty_lorebook
45
+ from campaign_rpg_engine.memory import TurnRecord
46
+ from campaign_rpg_engine.memory_modules.base import MemoryModule
47
+ from campaign_rpg_engine.memory_modules.recent_turns import DEFAULT_WINDOW, MAX_WINDOW, MIN_WINDOW
48
+ from campaign_rpg_engine.memory_modules.registry import (
49
+ clear_custom_memory_registrations,
50
+ default_module_id,
51
+ format_memory_modules_list,
52
+ get_custom_module_metadata,
53
+ loaded_module_ids,
54
+ register_memory_module_from_path,
55
+ register_memory_module_from_source,
56
+ )
57
+ from campaign_rpg_engine.memory_modules.rolling_summary import (
58
+ DEFAULT_MAX_SUMMARY_CHARS,
59
+ DEFAULT_SUMMARY_INTERVAL,
60
+ DEFAULT_SUMMARY_TAIL,
61
+ MAX_MAX_SUMMARY_CHARS,
62
+ MIN_MAX_SUMMARY_CHARS,
63
+ MIN_SUMMARY_INTERVAL,
64
+ MIN_SUMMARY_TAIL,
65
+ RollingSummaryModule,
66
+ )
67
+ from campaign_rpg_engine.memory_modules.salient_turns import (
68
+ DEFAULT_CHAR_BUDGET,
69
+ MAX_CHAR_BUDGET,
70
+ MIN_CHAR_BUDGET,
71
+ )
72
+ from campaign_rpg_engine.object import Object, object_footprint_tiles
73
+ from campaign_rpg_engine.object_action import ActionKind, ObjectAction
74
+ from campaign_rpg_engine.perception import build_passive_vision
75
+ from campaign_rpg_engine.prompt_blocks import (
76
+ PromptBlock,
77
+ default_prompt_blocks,
78
+ enrich_blocks_with_previews,
79
+ prompt_block_catalog,
80
+ prompt_blocks_from_dicts,
81
+ prompt_slot_catalog,
82
+ validate_prompt_blocks,
83
+ )
84
+ from campaign_rpg_engine.session import Session, SessionResult, TurnResult
85
+ from campaign_rpg_engine.session_area_edit import (
86
+ AreaMutationResult,
87
+ delete_area_by_id,
88
+ )
89
+ from campaign_rpg_engine.simulation import run_compound_turn
90
+ from campaign_rpg_engine.session_persistence import build_save_snapshot, load_session_from_snapshot
91
+ from campaign_rpg_engine.interaction_handlers import (
92
+ format_handlers_list,
93
+ get_handler_registration,
94
+ is_handler_registered,
95
+ list_registered_handlers,
96
+ register_interaction_handler,
97
+ run_interaction_handler,
98
+ )
99
+ from campaign_rpg_engine.snapshot import DEFAULT_AREA_ID, build_area_snapshot, build_session_snapshot
100
+ from campaign_rpg_engine.world_edit_api import WorldMutationResult
101
+
102
+ __all__ = [
103
+ "__version__",
104
+ "ActionKind",
105
+ "Agent",
106
+ "AgentCompoundTurn",
107
+ "Area",
108
+ "AreaMutationResult",
109
+ "DEFAULT_AREA_ID",
110
+ "DEFAULT_CHAR_BUDGET",
111
+ "DEFAULT_LOREBOOK_CHAR_BUDGET",
112
+ "DEFAULT_MAX_SUMMARY_CHARS",
113
+ "DEFAULT_SUMMARY_INTERVAL",
114
+ "DEFAULT_SUMMARY_TAIL",
115
+ "DEFAULT_WINDOW",
116
+ "GameProfile",
117
+ "GridBounds",
118
+ "LLMParseError",
119
+ "LLMResponse",
120
+ "Lorebook",
121
+ "LoreEntry",
122
+ "LorebookScanConfig",
123
+ "MAX_CHAR_BUDGET",
124
+ "MAX_MAX_SUMMARY_CHARS",
125
+ "MAX_WINDOW",
126
+ "MemoryModule",
127
+ "MIN_CHAR_BUDGET",
128
+ "MIN_MAX_SUMMARY_CHARS",
129
+ "MIN_SUMMARY_INTERVAL",
130
+ "MIN_SUMMARY_TAIL",
131
+ "MIN_WINDOW",
132
+ "Object",
133
+ "ObjectAction",
134
+ "PromptBlock",
135
+ "PromptContext",
136
+ "RollingSummaryModule",
137
+ "Session",
138
+ "SessionResult",
139
+ "ST_ENTRY_DEFAULTS",
140
+ "TurnRecord",
141
+ "TurnResult",
142
+ "WorldMutationResult",
143
+ "build_area_snapshot",
144
+ "build_passive_vision",
145
+ "build_prompt_context",
146
+ "build_save_snapshot",
147
+ "build_scan_corpus",
148
+ "build_session_snapshot",
149
+ "clear_custom_memory_registrations",
150
+ "create_area",
151
+ "create_empty_lorebook",
152
+ "create_initial_area",
153
+ "default_compound_profile",
154
+ "default_module_id",
155
+ "default_prompt_blocks",
156
+ "delete_area_by_id",
157
+ "derive_lorebook_id_from_filename",
158
+ "describe_scan_sources",
159
+ "enrich_blocks_with_previews",
160
+ "estimate_prompt_tokens",
161
+ "format_agents_list",
162
+ "format_full_list",
163
+ "format_handlers_list",
164
+ "format_memory_modules_list",
165
+ "format_objects_list",
166
+ "get_compound_turn",
167
+ "get_custom_module_metadata",
168
+ "get_handler_registration",
169
+ "interact_template_var_help",
170
+ "is_handler_registered",
171
+ "list_registered_handlers",
172
+ "load_lorebook_from_dict",
173
+ "load_lorebook_from_path",
174
+ "load_profile",
175
+ "load_session_from_snapshot",
176
+ "loaded_module_ids",
177
+ "match_lorebook_entries",
178
+ "new_st_entry_dict",
179
+ "object_footprint_tiles",
180
+ "parse_position",
181
+ "prompt_block_catalog",
182
+ "prompt_blocks_from_dicts",
183
+ "prompt_slot_catalog",
184
+ "register_interaction_handler",
185
+ "register_memory_module_from_path",
186
+ "register_memory_module_from_source",
187
+ "render_lorebook",
188
+ "run_compound_turn",
189
+ "run_interaction_handler",
190
+ "validate_prompt_blocks",
191
+ "with_st_entry_defaults",
192
+ ]
193
+
194
+ _ROOT = Path(__file__).resolve().parent.parent
195
+
196
+
197
+ def _read_version() -> str:
198
+ try:
199
+ from importlib.metadata import version as _pkg_version
200
+
201
+ return _pkg_version("campaign-rpg-engine")
202
+ except Exception:
203
+ pass
204
+ pyproject_path = _ROOT / "pyproject.toml"
205
+ if pyproject_path.is_file():
206
+ return tomllib.loads(pyproject_path.read_text(encoding="utf-8"))["project"]["version"]
207
+ return "0.0.0"
208
+
209
+
210
+ __version__ = _read_version()
@@ -0,0 +1,19 @@
1
+ """Action result types — first-person result for the actor, passive for observers."""
2
+ from __future__ import annotations
3
+
4
+ from dataclasses import dataclass
5
+
6
+
7
+ @dataclass(frozen=True)
8
+ class ActionOutcome:
9
+ """Result of executing one action."""
10
+
11
+ result: str
12
+ """First-person feedback for the acting agent (stored in TurnRecord)."""
13
+
14
+ passive_result: str = ""
15
+ """
16
+ Third-person summary for other agents' passive vision.
17
+
18
+ Empty when the action did not succeed or has nothing observable.
19
+ """
@@ -0,0 +1,15 @@
1
+ """
2
+ Actions package.
3
+
4
+ Contains move, speak, and interact implementations. Look is implemented in
5
+ perception.py (perform_look) because it shares vision/memory logic.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ from campaign_rpg_engine.actions.emote import emote as do_emote
10
+ from campaign_rpg_engine.actions.interact import interact as do_interact
11
+ from campaign_rpg_engine.actions.interact import interact_phases as do_interact_phases
12
+ from campaign_rpg_engine.actions.move import move as do_move
13
+ from campaign_rpg_engine.actions.speak import speak as do_speak
14
+
15
+ __all__ = ["do_emote", "do_interact", "do_interact_phases", "do_move", "do_speak"]
@@ -0,0 +1,24 @@
1
+ """Emote turn action — gesture at an entity or free-text target (V0.4.2)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from campaign_rpg_engine.action_outcome import ActionOutcome
6
+ from campaign_rpg_engine.agent import Agent
7
+ from campaign_rpg_engine.area import Area
8
+ from campaign_rpg_engine.emote_phrasing import (
9
+ emote_target_phrase_for_actor,
10
+ emote_target_phrase_neutral,
11
+ format_emote_line,
12
+ )
13
+
14
+
15
+ def emote(agent: Agent, area: Area, target: str, action_name: str) -> ActionOutcome:
16
+ """Perform a past-tense emote directed at *target*."""
17
+ verb = action_name.strip()
18
+ target_id = target.strip()
19
+ actor_phrase = emote_target_phrase_for_actor(area, agent, target_id)
20
+ neutral_phrase = emote_target_phrase_neutral(area, target_id)
21
+ return ActionOutcome(
22
+ result=f"You {verb} at {actor_phrase}.",
23
+ passive_result=format_emote_line(agent.name, verb, neutral_phrase),
24
+ )