devflow-engine 1.2.2__py3-none-any.whl → 1.2.4__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.
- devflow_engine/errors/error_solver_dag.py +56 -2
- {devflow_engine-1.2.2.dist-info → devflow_engine-1.2.4.dist-info}/METADATA +1 -1
- {devflow_engine-1.2.2.dist-info → devflow_engine-1.2.4.dist-info}/RECORD +5 -5
- {devflow_engine-1.2.2.dist-info → devflow_engine-1.2.4.dist-info}/WHEEL +0 -0
- {devflow_engine-1.2.2.dist-info → devflow_engine-1.2.4.dist-info}/entry_points.txt +0 -0
|
@@ -244,7 +244,49 @@ def _validate_ui_fix_proof(
|
|
|
244
244
|
return True, normalized, None
|
|
245
245
|
|
|
246
246
|
|
|
247
|
-
def
|
|
247
|
+
def _artifact_under_observability_sandbox(artifact: str, *, error_task_id: str) -> bool:
|
|
248
|
+
normalized = artifact.replace("\\", "/").strip()
|
|
249
|
+
allowed_prefixes = (
|
|
250
|
+
f".devflow/observability/{error_task_id}/",
|
|
251
|
+
".devflow/observability/<id>/",
|
|
252
|
+
)
|
|
253
|
+
if any(normalized.startswith(prefix) for prefix in allowed_prefixes):
|
|
254
|
+
return True
|
|
255
|
+
marker = f"/.devflow/observability/{error_task_id}/"
|
|
256
|
+
return marker in normalized
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def _command_targets_observability_sandbox(command: str, *, error_task_id: str) -> bool:
|
|
260
|
+
normalized = command.replace("\\", "/").strip()
|
|
261
|
+
allowed_fragments = (
|
|
262
|
+
f".devflow/observability/{error_task_id}/",
|
|
263
|
+
".devflow/observability/<id>/",
|
|
264
|
+
f"/.devflow/observability/{error_task_id}/",
|
|
265
|
+
)
|
|
266
|
+
return any(fragment in normalized for fragment in allowed_fragments)
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def _repro_tests_under_observability_sandbox(
|
|
270
|
+
repro_tests: object,
|
|
271
|
+
*,
|
|
272
|
+
error_task_id: str,
|
|
273
|
+
) -> bool:
|
|
274
|
+
if not isinstance(repro_tests, list):
|
|
275
|
+
return True
|
|
276
|
+
for test in repro_tests:
|
|
277
|
+
if not isinstance(test, dict):
|
|
278
|
+
continue
|
|
279
|
+
path = str(test.get("file") or test.get("path") or "").strip()
|
|
280
|
+
if path and not _artifact_under_observability_sandbox(path, error_task_id=error_task_id):
|
|
281
|
+
return False
|
|
282
|
+
return True
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def _validate_ui_observability_repro(
|
|
286
|
+
observation: dict[str, Any],
|
|
287
|
+
*,
|
|
288
|
+
error_task_id: str,
|
|
289
|
+
) -> tuple[bool, str | None]:
|
|
248
290
|
artifact = str(observation.get("repro_artifact_path") or "").strip()
|
|
249
291
|
command = str(observation.get("repro_run_command") or "").strip()
|
|
250
292
|
output = str(observation.get("repro_output") or "").strip()
|
|
@@ -256,6 +298,15 @@ def _validate_ui_observability_repro(observation: dict[str, Any]) -> tuple[bool,
|
|
|
256
298
|
return False, "ui_observability_missing_playwright_repro_artifact"
|
|
257
299
|
if "playwright" not in command.lower():
|
|
258
300
|
return False, "ui_observability_requires_playwright_repro_command"
|
|
301
|
+
if not _artifact_under_observability_sandbox(artifact, error_task_id=error_task_id):
|
|
302
|
+
return False, "ui_observability_repro_artifact_outside_sandbox"
|
|
303
|
+
if not _command_targets_observability_sandbox(command, error_task_id=error_task_id):
|
|
304
|
+
return False, "ui_observability_repro_command_outside_sandbox"
|
|
305
|
+
if not _repro_tests_under_observability_sandbox(
|
|
306
|
+
observation.get("repro_tests"),
|
|
307
|
+
error_task_id=error_task_id,
|
|
308
|
+
):
|
|
309
|
+
return False, "ui_observability_repro_test_outside_sandbox"
|
|
259
310
|
if not output:
|
|
260
311
|
return False, "ui_observability_missing_repro_output"
|
|
261
312
|
if not isinstance(oracles, list) or not any(str(o or "").strip() for o in oracles):
|
|
@@ -876,7 +927,10 @@ class BuildObservabilityNode(Node):
|
|
|
876
927
|
else {}
|
|
877
928
|
)
|
|
878
929
|
if observed_flag and _ui_proof_required({"runtimeContext": user_report_context_for_ui}):
|
|
879
|
-
ui_repro_ok, ui_repro_failure_reason = _validate_ui_observability_repro(
|
|
930
|
+
ui_repro_ok, ui_repro_failure_reason = _validate_ui_observability_repro(
|
|
931
|
+
observation,
|
|
932
|
+
error_task_id=error_task_id,
|
|
933
|
+
)
|
|
880
934
|
|
|
881
935
|
# Split deferred questions via LLM classifier (v1.1.22).
|
|
882
936
|
# An injectable hook is used when present so tests can
|
|
@@ -32,7 +32,7 @@ devflow_engine/devin2/agent_definition.py,sha256=pCp915tojwPlepRpvjlU1DoPuT_anxR
|
|
|
32
32
|
devflow_engine/devin2/pi_runner.py,sha256=xRl-qA3RgMFgiR5fnG6fTwwL95PMk6zVdRdFa-fXy2E,7466
|
|
33
33
|
devflow_engine/error/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
34
|
devflow_engine/error/remediation.py,sha256=Z4LJQzZPzb7_6tea_XtasDvFYQiEdpkFlyxoCEO1I2k,548
|
|
35
|
-
devflow_engine/errors/error_solver_dag.py,sha256=
|
|
35
|
+
devflow_engine/errors/error_solver_dag.py,sha256=jwFewUFxZPUurHrT2WGk85antB5w2S5TEMCUq9sy3k0,61429
|
|
36
36
|
devflow_engine/errors/question_classifier.py,sha256=oBJ29hszG--TUna62BQHnNmi6hPwf-wEE8eGLmgS624,9729
|
|
37
37
|
devflow_engine/errors/repo_quality_judge.py,sha256=LVBaXN6AsID-x8qb-IriQKYY1c9AMMRNo-tWMeiuMaA,9962
|
|
38
38
|
devflow_engine/errors/runtime_observability.py,sha256=Do93Ah3vxLEocYtC0JpnRIRQN6uNAOkYjBz0pmOqg5g,29719
|
|
@@ -382,7 +382,7 @@ devflow_engine/prompts/source_doc_mutation/source_doc_enrichment_coherence/promp
|
|
|
382
382
|
devflow_engine/prompts/source_doc_mutation/user_workflows/prompt.md,sha256=2Bv-EkZwzxtPSsDGdw9YuuuzT1c_2R9c6HPSMdP-MD0,406
|
|
383
383
|
devflow_engine/prompts/source_scope/doctrine/prompt.md,sha256=AJk1gfePTdaBSw5DHvCr7Sigsk2orGaRVNZ3Dj3NdcQ,837
|
|
384
384
|
devflow_engine/prompts/ui_grounding/doctrine/prompt.md,sha256=0L5y-QjjquPABqxAHZNPkcjyHMZQSDRVncNDQa2app0,409
|
|
385
|
-
devflow_engine-1.2.
|
|
386
|
-
devflow_engine-1.2.
|
|
387
|
-
devflow_engine-1.2.
|
|
388
|
-
devflow_engine-1.2.
|
|
385
|
+
devflow_engine-1.2.4.dist-info/METADATA,sha256=6RFdShXKS6HOlHJ7MWGIukO1KPwM--VG8Bz8TSx-3fU,7755
|
|
386
|
+
devflow_engine-1.2.4.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
|
|
387
|
+
devflow_engine-1.2.4.dist-info/entry_points.txt,sha256=U5Pw4y4v4u4xcRS5DbXfemBg0RKp74kMxcnEoL0MACY,99
|
|
388
|
+
devflow_engine-1.2.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|