|
10 | 10 |
|
11 | 11 | from openviking.session.memory.dataclass import MemoryFile, StoredLink |
12 | 12 | from openviking.session.memory.utils.memory_file_utils import MemoryFileUtils |
| 13 | +from openviking.session.skill.session_skill_context_provider import ( |
| 14 | + SESSION_SKILL_MEMORY_TYPE, |
| 15 | + load_skill_extract_registry, |
| 16 | +) |
13 | 17 | from openviking.session.train import ( |
14 | 18 | ContentHashPolicySnapshotter, |
15 | 19 | DryRunPolicyUpdater, |
@@ -718,7 +722,10 @@ async def run(self): |
718 | 722 | [], |
719 | 723 | ) |
720 | 724 |
|
721 | | - monkeypatch.setattr("openviking.session.train.components.policy_optimizer.ExtractLoop", FakeExtractLoop) |
| 725 | + monkeypatch.setattr( |
| 726 | + "openviking.session.train.components.policy_optimizer.ExtractLoop", |
| 727 | + FakeExtractLoop, |
| 728 | + ) |
722 | 729 |
|
723 | 730 | plan = await PatchMergePolicyOptimizer(viking_fs=FakeVikingFS({}), vlm=object()).plan( |
724 | 731 | [gradient], |
@@ -1074,3 +1081,79 @@ async def run(self): |
1074 | 1081 | assert captured["constructed"] is True |
1075 | 1082 | assert plan.metadata["patch_gradient_count"] == 1 |
1076 | 1083 | assert plan.items[0].after_content == "merged update" |
| 1084 | + |
| 1085 | + |
| 1086 | +@pytest.mark.asyncio |
| 1087 | +async def test_patch_merge_policy_optimizer_uses_session_skill_registry(monkeypatch): |
| 1088 | + from openviking.session.memory.dataclass import ( |
| 1089 | + ResolvedOperation, |
| 1090 | + ResolvedOperations, |
| 1091 | + ) |
| 1092 | + |
| 1093 | + skill_uri = "viking://user/u/skills/code-review/SKILL.md" |
| 1094 | + policy_set = ExperienceSet(root_uri="viking://user/u/skills", policies=[]) |
| 1095 | + gradient = PatchSemanticGradient( |
| 1096 | + before_file=None, |
| 1097 | + after_file=MemoryFile( |
| 1098 | + uri=skill_uri, |
| 1099 | + content="Use this skill to review code changes.", |
| 1100 | + memory_type=SESSION_SKILL_MEMORY_TYPE, |
| 1101 | + extra_fields={ |
| 1102 | + "memory_type": SESSION_SKILL_MEMORY_TYPE, |
| 1103 | + "skill_name": "code-review", |
| 1104 | + }, |
| 1105 | + ), |
| 1106 | + base_version=None, |
| 1107 | + rationale="test", |
| 1108 | + links=[], |
| 1109 | + confidence=0.9, |
| 1110 | + metadata={}, |
| 1111 | + ) |
| 1112 | + captured = {} |
| 1113 | + |
| 1114 | + class FakeExtractLoop: |
| 1115 | + def __init__(self, **kwargs): |
| 1116 | + captured.update(kwargs) |
| 1117 | + |
| 1118 | + async def run(self): |
| 1119 | + return ( |
| 1120 | + ResolvedOperations( |
| 1121 | + upsert_operations=[ |
| 1122 | + ResolvedOperation( |
| 1123 | + old_memory_file_content=None, |
| 1124 | + memory_fields={ |
| 1125 | + "skill_name": "code-review", |
| 1126 | + "content": "Merged skill content.", |
| 1127 | + }, |
| 1128 | + memory_type=SESSION_SKILL_MEMORY_TYPE, |
| 1129 | + uris=[skill_uri], |
| 1130 | + ) |
| 1131 | + ], |
| 1132 | + delete_file_contents=[], |
| 1133 | + errors=[], |
| 1134 | + ), |
| 1135 | + [], |
| 1136 | + ) |
| 1137 | + |
| 1138 | + monkeypatch.setattr( |
| 1139 | + "openviking.session.train.components.policy_optimizer.ExtractLoop", |
| 1140 | + FakeExtractLoop, |
| 1141 | + ) |
| 1142 | + |
| 1143 | + plan = await PatchMergePolicyOptimizer( |
| 1144 | + viking_fs=FakeVikingFS({}), |
| 1145 | + vlm=object(), |
| 1146 | + memory_type=SESSION_SKILL_MEMORY_TYPE, |
| 1147 | + memory_registry=load_skill_extract_registry(), |
| 1148 | + ).plan( |
| 1149 | + [gradient], |
| 1150 | + policy_set, |
| 1151 | + PatchMergePolicyOptimizerContext(request_context=fake_request_context()), |
| 1152 | + ) |
| 1153 | + |
| 1154 | + assert captured["isolation_handler"].allowed_memory_types == {SESSION_SKILL_MEMORY_TYPE} |
| 1155 | + assert len(plan.items) == 1 |
| 1156 | + assert plan.items[0].memory_type == SESSION_SKILL_MEMORY_TYPE |
| 1157 | + assert plan.items[0].target_name == "code-review" |
| 1158 | + assert plan.items[0].target_uri == skill_uri |
| 1159 | + assert plan.items[0].after_content == "Merged skill content." |
0 commit comments