fullstop 0.2.1__tar.gz → 0.2.2__tar.gz
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.
- {fullstop-0.2.1 → fullstop-0.2.2}/PKG-INFO +3 -1
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/__init__.py +1 -1
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/tools/__init__.py +11 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop.egg-info/PKG-INFO +3 -1
- {fullstop-0.2.1 → fullstop-0.2.2}/pyproject.toml +5 -1
- {fullstop-0.2.1 → fullstop-0.2.2}/LICENSE +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/README.md +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/__main__.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/activity.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/agent.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/cli.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/gate.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/manifest.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/policy.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/protocol.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/provider.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/redact.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/resolve.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/sandbox.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/state.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/tools/base.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/tools/browser.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/tools/file.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/tools/note.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/tools/shell.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/tools/web.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/types.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/ui_approver.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/ui_assets.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/ui_model.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/ui_server.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/ui_strings.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop/ui_wizard.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop.egg-info/SOURCES.txt +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop.egg-info/dependency_links.txt +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/fullstop.egg-info/top_level.txt +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/setup.cfg +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_activity_log.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_agent_loop.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_cli.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_credentials.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_examples.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_01_crash_resume.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_02_config_tamper.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_03_context_exhaustion.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_04_goal_override.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_05_redirect_chain.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_06_approval_display.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_07_shell_allowlist.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_08_activity_log_rotation.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_09_file_read_cap.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_10_unattended_stop.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_11_redactor_call_time.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_12_note_symlink.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_13_file_list_protected.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_14_gate_classification_label.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_15_observation_delimiters.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_16_log_truncate_wiring.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_17_19_readme_honesty.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_20_live_user_seed.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_21_fence_not_line_anchored.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_22_resume_seed_guard.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_fix_23_parser_stray_marker_cliffs.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_imports.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_manifest_policy.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_policy_gate.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_protocol.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_provider.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_r2_01_replay_dedup_keys.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_r2_02_provider_context_body.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_r2_03_log_oversize_wedge.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_r2_04_readme_allow_config_change.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_r2_05_error_observation_frame.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_sandbox.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_state.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_tools.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_ui_approver.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_ui_assets.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_ui_cli.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_ui_model.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_ui_server.py +0 -0
- {fullstop-0.2.1 → fullstop-0.2.2}/tests/test_ui_wizard.py +0 -0
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fullstop
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: A zero-dependency Python runtime for always-on agents: identity manifests, a default-deny policy gate with human approval, a fenced tool-call protocol, a hash-chained activity log, and crash-safe checkpoint/resume with replay
|
|
5
5
|
License: MIT
|
|
6
|
+
Project-URL: Homepage, https://www.321ai.xyz
|
|
7
|
+
Project-URL: Repository, https://github.com/321-AI-Labs/fullstop
|
|
6
8
|
Requires-Python: >=3.11
|
|
7
9
|
Description-Content-Type: text/markdown
|
|
8
10
|
License-File: LICENSE
|
|
@@ -4,6 +4,7 @@ Threads the fetch seam (tests/smoke inject a fake; the CLI passes None ->
|
|
|
4
4
|
default real fetch) and the credential env scrubbing for shell children.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
+
import os
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
from typing import Callable
|
|
9
10
|
|
|
@@ -26,6 +27,16 @@ def build_registry(
|
|
|
26
27
|
fetch: Callable[[str, float], tuple[int, str, bytes]] | None = None,
|
|
27
28
|
scrub_env: tuple[str, ...] = (),
|
|
28
29
|
) -> ToolRegistry:
|
|
30
|
+
# Canonicalize the root ONCE, here at the composition root: every
|
|
31
|
+
# filesystem tool stores this spelling and compares rel_posix(root,
|
|
32
|
+
# resolved) against it, while resolve_in_sandbox returns
|
|
33
|
+
# realpath-normalized targets. A root spelled through an 8.3 short name
|
|
34
|
+
# (GitHub Windows runners: C:\Users\RUNNER~1) or a junction/symlink
|
|
35
|
+
# differs from its realpath, so every write-equality check would fail
|
|
36
|
+
# closed with "path resolves elsewhere in workspace" (the Windows CI
|
|
37
|
+
# red of 2026-09-30..2026-10-19). User-supplied PATHS still fail closed
|
|
38
|
+
# on unusual spellings; the root is harness config, not user input.
|
|
39
|
+
sandbox_root = Path(os.path.realpath(sandbox_root))
|
|
29
40
|
registry = ToolRegistry(verify=verify)
|
|
30
41
|
registry.register(FileReadTool(sandbox_root, redactor, policy))
|
|
31
42
|
registry.register(FileWriteTool(sandbox_root, redactor, policy))
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fullstop
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: A zero-dependency Python runtime for always-on agents: identity manifests, a default-deny policy gate with human approval, a fenced tool-call protocol, a hash-chained activity log, and crash-safe checkpoint/resume with replay
|
|
5
5
|
License: MIT
|
|
6
|
+
Project-URL: Homepage, https://www.321ai.xyz
|
|
7
|
+
Project-URL: Repository, https://github.com/321-AI-Labs/fullstop
|
|
6
8
|
Requires-Python: >=3.11
|
|
7
9
|
Description-Content-Type: text/markdown
|
|
8
10
|
License-File: LICENSE
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fullstop"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.2"
|
|
4
4
|
description = "A zero-dependency Python runtime for always-on agents: identity manifests, a default-deny policy gate with human approval, a fenced tool-call protocol, a hash-chained activity log, and crash-safe checkpoint/resume with replay"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { text = "MIT" }
|
|
7
7
|
requires-python = ">=3.11"
|
|
8
8
|
dependencies = []
|
|
9
|
+
|
|
10
|
+
[project.urls]
|
|
11
|
+
Homepage = "https://www.321ai.xyz"
|
|
12
|
+
Repository = "https://github.com/321-AI-Labs/fullstop"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|