lar1semantic 0.3.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.
- lar1/__init__.py +21 -0
- lar1/cli.py +85 -0
- lar1/enums.py +55 -0
- lar1/errors.py +7 -0
- lar1/langgraph.py +60 -0
- lar1/parse.py +67 -0
- lar1/serialize.py +42 -0
- lar1/validate.py +34 -0
- lar1semantic-0.3.0.dist-info/METADATA +63 -0
- lar1semantic-0.3.0.dist-info/RECORD +12 -0
- lar1semantic-0.3.0.dist-info/WHEEL +4 -0
- lar1semantic-0.3.0.dist-info/entry_points.txt +2 -0
lar1/__init__.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""LAR-1 semantic overlay — reference Python SDK."""
|
|
2
|
+
|
|
3
|
+
from lar1.errors import Lar1ParseError
|
|
4
|
+
from lar1.parse import parse, parse_envelope
|
|
5
|
+
from lar1.serialize import compact, deserialize, deserialize_fields, serialize
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"Lar1ParseError",
|
|
9
|
+
"parse",
|
|
10
|
+
"parse_envelope",
|
|
11
|
+
"validate",
|
|
12
|
+
"validate_envelope",
|
|
13
|
+
"serialize",
|
|
14
|
+
"deserialize",
|
|
15
|
+
"deserialize_fields",
|
|
16
|
+
"compact",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
from lar1.validate import validate, validate_envelope
|
|
20
|
+
|
|
21
|
+
__version__ = "0.3.0"
|
lar1/cli.py
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""LAR-1 command-line interface."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import json
|
|
7
|
+
import sys
|
|
8
|
+
|
|
9
|
+
from lar1 import compact, deserialize_fields, parse, serialize, validate
|
|
10
|
+
from lar1.errors import Lar1ParseError
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _read_input(path: str | None) -> str:
|
|
14
|
+
if path and path != "-":
|
|
15
|
+
with open(path, encoding="utf-8") as f:
|
|
16
|
+
return f.read()
|
|
17
|
+
return sys.stdin.read()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def cmd_validate(args: argparse.Namespace) -> int:
|
|
21
|
+
raw = _read_input(args.file).strip()
|
|
22
|
+
try:
|
|
23
|
+
if raw.startswith("{"):
|
|
24
|
+
data = deserialize_fields(raw)
|
|
25
|
+
else:
|
|
26
|
+
data = parse(raw)
|
|
27
|
+
if validate(data):
|
|
28
|
+
print("OK")
|
|
29
|
+
return 0
|
|
30
|
+
print("INVALID", file=sys.stderr)
|
|
31
|
+
return 1
|
|
32
|
+
except (Lar1ParseError, ValueError) as exc:
|
|
33
|
+
code = getattr(exc, "code", "INVALID")
|
|
34
|
+
print(code, file=sys.stderr)
|
|
35
|
+
return 1
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def cmd_compact(args: argparse.Namespace) -> int:
|
|
39
|
+
raw = _read_input(args.file).strip()
|
|
40
|
+
try:
|
|
41
|
+
if raw.startswith("{"):
|
|
42
|
+
data = deserialize_fields(raw)
|
|
43
|
+
else:
|
|
44
|
+
data = parse(raw)
|
|
45
|
+
print(compact(data))
|
|
46
|
+
return 0
|
|
47
|
+
except (Lar1ParseError, ValueError) as exc:
|
|
48
|
+
code = getattr(exc, "code", str(exc))
|
|
49
|
+
print(code, file=sys.stderr)
|
|
50
|
+
return 1
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def cmd_json(args: argparse.Namespace) -> int:
|
|
54
|
+
raw = _read_input(args.file).strip()
|
|
55
|
+
try:
|
|
56
|
+
data = parse(raw)
|
|
57
|
+
print(serialize(data))
|
|
58
|
+
return 0
|
|
59
|
+
except Lar1ParseError as exc:
|
|
60
|
+
print(exc.code, file=sys.stderr)
|
|
61
|
+
return 1
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def main() -> None:
|
|
65
|
+
parser = argparse.ArgumentParser(prog="lar1", description="LAR-1 semantic overlay CLI")
|
|
66
|
+
sub = parser.add_subparsers(dest="command", required=True)
|
|
67
|
+
|
|
68
|
+
p_validate = sub.add_parser("validate", help="Validate compact or JSON input")
|
|
69
|
+
p_validate.add_argument("file", nargs="?", default="-", help="File path or - for stdin")
|
|
70
|
+
p_validate.set_defaults(func=cmd_validate)
|
|
71
|
+
|
|
72
|
+
p_compact = sub.add_parser("compact", help="Output canonical compact string")
|
|
73
|
+
p_compact.add_argument("file", nargs="?", default="-")
|
|
74
|
+
p_compact.set_defaults(func=cmd_compact)
|
|
75
|
+
|
|
76
|
+
p_json = sub.add_parser("json", help="Convert compact to application/lar+json")
|
|
77
|
+
p_json.add_argument("file", nargs="?", default="-")
|
|
78
|
+
p_json.set_defaults(func=cmd_json)
|
|
79
|
+
|
|
80
|
+
args = parser.parse_args()
|
|
81
|
+
raise SystemExit(args.func(args))
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
if __name__ == "__main__":
|
|
85
|
+
main()
|
lar1/enums.py
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""LAR-1 v0.2 field enums."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Final, Literal, TypedDict
|
|
6
|
+
|
|
7
|
+
TemporalFrame = Literal["now", "past", "recall", "future"]
|
|
8
|
+
SpatialFrame = Literal["here", "there", "meta"]
|
|
9
|
+
CognitionStance = Literal["obs", "hyp", "mem", "det", "inf", "rev"]
|
|
10
|
+
EvidenceGrounding = Literal["direct", "derived", "aggregated", "reported"]
|
|
11
|
+
VerificationStatus = Literal[
|
|
12
|
+
"unverified", "verified_human", "verified_tool", "verified_crossref"
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
Lar1ErrorCode = Literal[
|
|
16
|
+
"EMPTY_INPUT",
|
|
17
|
+
"MISSING_PREFIX",
|
|
18
|
+
"NO_PAIRS",
|
|
19
|
+
"UNKNOWN_KEY",
|
|
20
|
+
"INVALID_ENUM",
|
|
21
|
+
"INVALID_LIKELIHOOD",
|
|
22
|
+
"DUPLICATE_KEY",
|
|
23
|
+
"MALFORMED_PAIR",
|
|
24
|
+
"EMPTY_OBJECT",
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Lar1Fields(TypedDict, total=False):
|
|
29
|
+
T: TemporalFrame
|
|
30
|
+
S: SpatialFrame
|
|
31
|
+
C: CognitionStance
|
|
32
|
+
E: EvidenceGrounding
|
|
33
|
+
L: float
|
|
34
|
+
V: VerificationStatus
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
Lar1Envelope = TypedDict("Lar1Envelope", {"LAR-1": Lar1Fields})
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
ENUMS: Final[dict[str, tuple[str, ...]]] = {
|
|
41
|
+
"T": ("now", "past", "recall", "future"),
|
|
42
|
+
"S": ("here", "there", "meta"),
|
|
43
|
+
"C": ("obs", "hyp", "mem", "det", "inf", "rev"),
|
|
44
|
+
"E": ("direct", "derived", "aggregated", "reported"),
|
|
45
|
+
"V": (
|
|
46
|
+
"unverified",
|
|
47
|
+
"verified_human",
|
|
48
|
+
"verified_tool",
|
|
49
|
+
"verified_crossref",
|
|
50
|
+
),
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
VALID_KEYS: Final[frozenset[str]] = frozenset({"T", "S", "C", "E", "L", "V"})
|
|
54
|
+
FIELD_ORDER: Final[tuple[str, ...]] = ("T", "S", "C", "E", "L", "V")
|
|
55
|
+
PREFIX: Final[str] = "LAR:"
|
lar1/errors.py
ADDED
lar1/langgraph.py
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""LangGraph / LangChain message integration for LAR-1."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from lar1 import validate
|
|
8
|
+
|
|
9
|
+
LAR1_KEY = "lar-1"
|
|
10
|
+
|
|
11
|
+
# Default cognitive tags by node role name (substring match)
|
|
12
|
+
NODE_COGNITION: dict[str, str] = {
|
|
13
|
+
"research": "obs",
|
|
14
|
+
"retrieve": "obs",
|
|
15
|
+
"critic": "rev",
|
|
16
|
+
"review": "rev",
|
|
17
|
+
"synth": "inf",
|
|
18
|
+
"merge": "inf",
|
|
19
|
+
"plan": "hyp",
|
|
20
|
+
"memory": "mem",
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def attach_lar1_message(message: Any, fields: dict[str, Any]) -> Any:
|
|
25
|
+
"""Attach LAR-1 to LangChain message additional_kwargs."""
|
|
26
|
+
if not validate(fields):
|
|
27
|
+
raise ValueError("Invalid LAR-1 fields")
|
|
28
|
+
kwargs = dict(getattr(message, "additional_kwargs", {}) or {})
|
|
29
|
+
kwargs[LAR1_KEY] = fields
|
|
30
|
+
return message.model_copy(update={"additional_kwargs": kwargs})
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def read_lar1_message(message: Any) -> dict[str, Any] | None:
|
|
34
|
+
block = getattr(message, "additional_kwargs", {}).get(LAR1_KEY)
|
|
35
|
+
if isinstance(block, dict) and validate(block):
|
|
36
|
+
return block
|
|
37
|
+
return None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def lar1_for_node(node_name: str, *, likelihood: float = 0.75) -> dict[str, Any]:
|
|
41
|
+
"""Suggest LAR-1 fields from LangGraph node name."""
|
|
42
|
+
name = node_name.lower()
|
|
43
|
+
cognition = "inf"
|
|
44
|
+
for key, c in NODE_COGNITION.items():
|
|
45
|
+
if key in name:
|
|
46
|
+
cognition = c
|
|
47
|
+
break
|
|
48
|
+
return {
|
|
49
|
+
"T": "now",
|
|
50
|
+
"S": "here",
|
|
51
|
+
"C": cognition,
|
|
52
|
+
"E": "derived" if cognition == "inf" else "direct",
|
|
53
|
+
"L": likelihood,
|
|
54
|
+
"V": "unverified",
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def middleware_tag_node(node_name: str, message: Any) -> Any:
|
|
59
|
+
"""Auto-tag agent message from node name (LangGraph middleware helper)."""
|
|
60
|
+
return attach_lar1_message(message, lar1_for_node(node_name))
|
lar1/parse.py
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""Parse LAR-1 compact strings."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from lar1.enums import ENUMS, PREFIX, VALID_KEYS, Lar1Fields
|
|
6
|
+
from lar1.errors import Lar1ParseError
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _assert_enum(key: str, value: str) -> str:
|
|
10
|
+
allowed = ENUMS[key]
|
|
11
|
+
if value not in allowed:
|
|
12
|
+
raise Lar1ParseError("INVALID_ENUM", f"Invalid {key}={value}")
|
|
13
|
+
return value
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _parse_likelihood(raw: str) -> float:
|
|
17
|
+
try:
|
|
18
|
+
n = float(raw)
|
|
19
|
+
except ValueError:
|
|
20
|
+
raise Lar1ParseError("INVALID_LIKELIHOOD", f"Invalid L={raw}") from None
|
|
21
|
+
if n < 0 or n > 1:
|
|
22
|
+
raise Lar1ParseError("INVALID_LIKELIHOOD", f"L out of range: {n}")
|
|
23
|
+
return n
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def parse(compact: str) -> Lar1Fields:
|
|
27
|
+
"""Parse compact string into inner LAR-1 fields."""
|
|
28
|
+
trimmed = compact.strip()
|
|
29
|
+
if trimmed == "":
|
|
30
|
+
raise Lar1ParseError("EMPTY_INPUT")
|
|
31
|
+
if not trimmed.startswith(PREFIX):
|
|
32
|
+
raise Lar1ParseError("MISSING_PREFIX")
|
|
33
|
+
|
|
34
|
+
body = trimmed[len(PREFIX) :]
|
|
35
|
+
if body == "":
|
|
36
|
+
raise Lar1ParseError("NO_PAIRS")
|
|
37
|
+
|
|
38
|
+
pairs = body.split(",")
|
|
39
|
+
if not pairs or (len(pairs) == 1 and pairs[0] == ""):
|
|
40
|
+
raise Lar1ParseError("NO_PAIRS")
|
|
41
|
+
|
|
42
|
+
seen: set[str] = set()
|
|
43
|
+
data: Lar1Fields = {}
|
|
44
|
+
|
|
45
|
+
for pair in pairs:
|
|
46
|
+
if "=" not in pair:
|
|
47
|
+
raise Lar1ParseError("MALFORMED_PAIR", f"Missing '=': {pair}")
|
|
48
|
+
key, _, value = pair.partition("=")
|
|
49
|
+
key = key.strip()
|
|
50
|
+
value = value.strip()
|
|
51
|
+
|
|
52
|
+
if key not in VALID_KEYS:
|
|
53
|
+
raise Lar1ParseError("UNKNOWN_KEY", f"Unknown key: {key}")
|
|
54
|
+
if key in seen:
|
|
55
|
+
raise Lar1ParseError("DUPLICATE_KEY", f"Duplicate key: {key}")
|
|
56
|
+
seen.add(key)
|
|
57
|
+
|
|
58
|
+
if key == "L":
|
|
59
|
+
data["L"] = _parse_likelihood(value)
|
|
60
|
+
elif key in ENUMS:
|
|
61
|
+
data[key] = _assert_enum(key, value) # type: ignore[literal-required]
|
|
62
|
+
|
|
63
|
+
return data
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def parse_envelope(compact: str) -> dict[str, Lar1Fields]:
|
|
67
|
+
return {"LAR-1": parse(compact)}
|
lar1/serialize.py
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Serialize and deserialize LAR-1 data."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
|
|
7
|
+
from lar1.enums import FIELD_ORDER, PREFIX, Lar1Fields
|
|
8
|
+
from lar1.validate import validate, validate_envelope
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def serialize(data: Lar1Fields) -> str:
|
|
12
|
+
return json.dumps({"LAR-1": data}, separators=(",", ":"))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def deserialize(json_str: str) -> dict[str, Lar1Fields]:
|
|
16
|
+
try:
|
|
17
|
+
parsed = json.loads(json_str)
|
|
18
|
+
except json.JSONDecodeError as exc:
|
|
19
|
+
raise ValueError("Invalid JSON") from exc
|
|
20
|
+
if not validate_envelope(parsed):
|
|
21
|
+
raise ValueError("Invalid LAR-1 envelope")
|
|
22
|
+
return parsed
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def deserialize_fields(json_str: str) -> Lar1Fields:
|
|
26
|
+
return deserialize(json_str)["LAR-1"]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _format_value(key: str, value: object) -> str:
|
|
30
|
+
if key == "L" and isinstance(value, float) and value == int(value):
|
|
31
|
+
return str(int(value))
|
|
32
|
+
return str(value)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def compact(data: Lar1Fields) -> str:
|
|
36
|
+
parts: list[str] = []
|
|
37
|
+
for key in FIELD_ORDER:
|
|
38
|
+
if key in data:
|
|
39
|
+
parts.append(f"{key}={_format_value(key, data[key])}")
|
|
40
|
+
if not parts:
|
|
41
|
+
raise ValueError("Cannot compact empty LAR-1 object")
|
|
42
|
+
return PREFIX + ",".join(parts)
|
lar1/validate.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Validate LAR-1 fields."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from lar1.enums import ENUMS, Lar1Fields
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _is_likelihood(value: Any) -> bool:
|
|
11
|
+
return isinstance(value, (int, float)) and not isinstance(value, bool) and 0 <= value <= 1
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def validate(data: Lar1Fields | Any) -> bool:
|
|
15
|
+
if not isinstance(data, dict) or not data:
|
|
16
|
+
return False
|
|
17
|
+
|
|
18
|
+
for key, value in data.items():
|
|
19
|
+
if key in ENUMS:
|
|
20
|
+
if value not in ENUMS[key]:
|
|
21
|
+
return False
|
|
22
|
+
elif key == "L":
|
|
23
|
+
if not _is_likelihood(value):
|
|
24
|
+
return False
|
|
25
|
+
else:
|
|
26
|
+
return False
|
|
27
|
+
|
|
28
|
+
return True
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def validate_envelope(envelope: Any) -> bool:
|
|
32
|
+
if not isinstance(envelope, dict) or "LAR-1" not in envelope:
|
|
33
|
+
return False
|
|
34
|
+
return validate(envelope["LAR-1"])
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: lar1semantic
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Reference Python implementation of LAR-1 semantic overlay
|
|
5
|
+
Project-URL: Homepage, https://github.com/carlsonchik/larone
|
|
6
|
+
Project-URL: Repository, https://github.com/carlsonchik/larone
|
|
7
|
+
Project-URL: Documentation, https://github.com/carlsonchik/larone/blob/main/SPEC.md
|
|
8
|
+
Author: LAR-1 contributors
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
Keywords: a2a,agent,lar-1,mcp,semantic-overlay
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Provides-Extra: dev
|
|
18
|
+
Requires-Dist: langchain-core>=0.3.0; extra == 'dev'
|
|
19
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
|
|
22
|
+
# lar-1 (Python)
|
|
23
|
+
|
|
24
|
+
Reference Python implementation of **LAR-1** v0.2 semantic overlay.
|
|
25
|
+
|
|
26
|
+
## Install
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install lar-1
|
|
30
|
+
# or from monorepo:
|
|
31
|
+
cd packages/lar1-python && pip install -e ".[dev]"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## API
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
from lar1 import parse, validate, compact, serialize, deserialize_fields
|
|
38
|
+
|
|
39
|
+
data = parse("LAR:T=now,C=obs,L=0.9,V=verified_tool")
|
|
40
|
+
validate(data) # True
|
|
41
|
+
compact(data) # canonical LAR: string
|
|
42
|
+
serialize(data) # application/lar+json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## CLI
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
lar1 validate 'LAR:C=obs,L=0.9'
|
|
49
|
+
lar1 compact message.json
|
|
50
|
+
lar1 json 'LAR:T=now,C=inf,L=0.7'
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Tests
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pytest
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Runs the same 74+ conformance fixtures as `@lar-1/core`.
|
|
60
|
+
|
|
61
|
+
## License
|
|
62
|
+
|
|
63
|
+
MIT
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
lar1/__init__.py,sha256=maN2Z7Gni_lnzXOi_fFdmvNSLy5SY4WIAVPKr0mvmTs,487
|
|
2
|
+
lar1/cli.py,sha256=NmQjrqdhLB_0D-74J99ZZju_Ip9ozkTEqkY1N2S7cwA,2462
|
|
3
|
+
lar1/enums.py,sha256=bv0AlJY7RzgW3ZjOwQ4TNL50P6axQJi1zjiHBHsl4LY,1457
|
|
4
|
+
lar1/errors.py,sha256=UQaYuCCSKYc_6s43u-9djTXA4NCWGCXam5U3NbrSJUY,199
|
|
5
|
+
lar1/langgraph.py,sha256=Lx6FNleounSeADswN2NGODDWYoTogC3_hYr2QKUBULE,1739
|
|
6
|
+
lar1/parse.py,sha256=jQXxTKk5Rf_-Mi-54TPXWYeBfva5xXBfT0KxzzP0MTs,1962
|
|
7
|
+
lar1/serialize.py,sha256=7pyx4gmdAmbJNW6Hc24-BAM1m7TVdTtANFT6ii-BJes,1186
|
|
8
|
+
lar1/validate.py,sha256=b9q_Ih13UEsQeIKVbzXp4CB9KvhbMu3SCmKpjbwLzeY,841
|
|
9
|
+
lar1semantic-0.3.0.dist-info/METADATA,sha256=CAHzccSNY5_leDxf0dJi9s-bohT7SFHP2bxYx8NEx1U,1523
|
|
10
|
+
lar1semantic-0.3.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
|
|
11
|
+
lar1semantic-0.3.0.dist-info/entry_points.txt,sha256=wHhgI9GMzcOgqSGvJXHHuD7bI9prrS146iGw8kg6PBU,39
|
|
12
|
+
lar1semantic-0.3.0.dist-info/RECORD,,
|