autonoesis 0.2.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.
autonoesis/__init__.py ADDED
@@ -0,0 +1,57 @@
1
+ """Autonoesis: self-modeling and phenomenology primitives for cognitive agents."""
2
+
3
+ from autonoesis.episodic import (
4
+ SelfModelEpisode,
5
+ episode_summary,
6
+ predict_next,
7
+ surprise,
8
+ )
9
+ from autonoesis.models import (
10
+ AgencyAttribution,
11
+ BoundaryState,
12
+ OwnershipAttribution,
13
+ PerspectiveState,
14
+ PhenomenalState,
15
+ SelfModel,
16
+ TransparencyLevel,
17
+ )
18
+ from autonoesis.operators import (
19
+ assess_agency,
20
+ assess_ownership,
21
+ boundary_integrity,
22
+ surprise_to_observation_match,
23
+ transparency_audit,
24
+ update_attribution_from_observation,
25
+ update_ownership_from_observation,
26
+ update_precision,
27
+ update_self_model,
28
+ )
29
+ from autonoesis.store import (
30
+ InMemorySelfModelStore,
31
+ SelfModelStore,
32
+ )
33
+
34
+ __all__ = [
35
+ "AgencyAttribution",
36
+ "BoundaryState",
37
+ "InMemorySelfModelStore",
38
+ "OwnershipAttribution",
39
+ "PerspectiveState",
40
+ "PhenomenalState",
41
+ "SelfModel",
42
+ "SelfModelEpisode",
43
+ "SelfModelStore",
44
+ "TransparencyLevel",
45
+ "assess_agency",
46
+ "assess_ownership",
47
+ "boundary_integrity",
48
+ "episode_summary",
49
+ "predict_next",
50
+ "surprise",
51
+ "surprise_to_observation_match",
52
+ "transparency_audit",
53
+ "update_attribution_from_observation",
54
+ "update_ownership_from_observation",
55
+ "update_precision",
56
+ "update_self_model",
57
+ ]
autonoesis/episodic.py ADDED
@@ -0,0 +1,111 @@
1
+ """Successor-stream primitives over ``SelfModel``.
2
+
3
+ The episodic layer records a subject's self-model trajectory as a frozen,
4
+ append-only sequence. It does not journal to disk or schedule updates; those
5
+ concerns belong to host adapters (see ``autonoesis.store``) and to active
6
+ inference (see ``autonoesis.operators``).
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from collections.abc import Mapping
12
+ from dataclasses import dataclass
13
+ from types import MappingProxyType
14
+
15
+ from autonoesis.models import (
16
+ SelfModel,
17
+ TransparencyLevel,
18
+ _clamp,
19
+ )
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class SelfModelEpisode:
24
+ """A monotonic, append-only sequence of ``SelfModel`` snapshots."""
25
+
26
+ subject_id: str
27
+ history: tuple[SelfModel, ...] = ()
28
+
29
+ def __post_init__(self) -> None:
30
+ for snapshot in self.history:
31
+ if snapshot.subject_id != self.subject_id:
32
+ raise ValueError(
33
+ f"snapshot subject_id {snapshot.subject_id!r} does not match "
34
+ f"episode subject_id {self.subject_id!r}"
35
+ )
36
+ for prev, curr in zip(self.history, self.history[1:], strict=False):
37
+ if curr.revision <= prev.revision:
38
+ raise ValueError(
39
+ "episode revisions must strictly increase: "
40
+ f"{prev.revision} -> {curr.revision}"
41
+ )
42
+
43
+ def extended(self, snapshot: SelfModel) -> SelfModelEpisode:
44
+ """Return a successor episode with ``snapshot`` appended."""
45
+ if snapshot.subject_id != self.subject_id:
46
+ raise ValueError(
47
+ f"snapshot subject_id {snapshot.subject_id!r} does not match "
48
+ f"episode subject_id {self.subject_id!r}"
49
+ )
50
+ if self.history and snapshot.revision <= self.history[-1].revision:
51
+ raise ValueError(
52
+ f"snapshot revision {snapshot.revision} must exceed "
53
+ f"current tail revision {self.history[-1].revision}"
54
+ )
55
+ return SelfModelEpisode(
56
+ subject_id=self.subject_id,
57
+ history=(*self.history, snapshot),
58
+ )
59
+
60
+
61
+ def episode_summary(episode: SelfModelEpisode) -> Mapping[str, float]:
62
+ """Return a read-only summary mapping over an episode's history."""
63
+ history = episode.history
64
+ if not history:
65
+ return MappingProxyType(
66
+ {
67
+ "length": 0.0,
68
+ "mean_salience": 0.0,
69
+ "mean_arousal": 0.0,
70
+ "peak_arousal": 0.0,
71
+ "transparent_fraction": 0.0,
72
+ }
73
+ )
74
+ n = len(history)
75
+ salience_sum = sum(s.phenomenal.salience for s in history)
76
+ arousal_sum = sum(s.phenomenal.arousal for s in history)
77
+ peak_arousal = max(s.phenomenal.arousal for s in history)
78
+ transparent_count = sum(
79
+ 1 for s in history if s.phenomenal.transparency is TransparencyLevel.TRANSPARENT
80
+ )
81
+ return MappingProxyType(
82
+ {
83
+ "length": float(n),
84
+ "mean_salience": _clamp(salience_sum / n),
85
+ "mean_arousal": _clamp(arousal_sum / n),
86
+ "peak_arousal": _clamp(peak_arousal),
87
+ "transparent_fraction": _clamp(transparent_count / n),
88
+ }
89
+ )
90
+
91
+
92
+ def predict_next(episode: SelfModelEpisode) -> SelfModel | None:
93
+ """Return the v0.2 baseline prediction for the next snapshot.
94
+
95
+ Returns ``None`` when ``history`` is empty, otherwise the last snapshot.
96
+ """
97
+ if not episode.history:
98
+ return None
99
+ return episode.history[-1]
100
+
101
+
102
+ def surprise(predicted: SelfModel, actual: SelfModel) -> float:
103
+ """Return a clamped ``[0, 1]`` distance between two ``SelfModel`` snapshots."""
104
+ components = (
105
+ abs(predicted.phenomenal.salience - actual.phenomenal.salience),
106
+ abs(predicted.phenomenal.valence - actual.phenomenal.valence) / 2.0,
107
+ abs(predicted.phenomenal.arousal - actual.phenomenal.arousal),
108
+ abs(predicted.agency.confidence - actual.agency.confidence),
109
+ abs(predicted.ownership.confidence - actual.ownership.confidence),
110
+ )
111
+ return _clamp(sum(components) / len(components))
autonoesis/models.py ADDED
@@ -0,0 +1,126 @@
1
+ """Typed self-model and phenomenology records.
2
+
3
+ The records in this module are intentionally frozen. Host systems should create
4
+ successor records instead of mutating cognitive state in place.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from collections.abc import Mapping
10
+ from dataclasses import dataclass, field, replace
11
+ from enum import StrEnum
12
+ from types import MappingProxyType
13
+ from typing import Any
14
+
15
+
16
+ def _frozen_metadata(metadata: Mapping[str, Any] | None) -> Mapping[str, Any]:
17
+ return MappingProxyType(dict(metadata or {}))
18
+
19
+
20
+ class TransparencyLevel(StrEnum):
21
+ """How available a process is to the agent's self-model."""
22
+
23
+ TRANSPARENT = "transparent"
24
+ PARTLY_OPAQUE = "partly_opaque"
25
+ OPAQUE = "opaque"
26
+
27
+
28
+ @dataclass(frozen=True)
29
+ class PhenomenalState:
30
+ """Current phenomenal field summary for an agent."""
31
+
32
+ salience: float = 0.0
33
+ valence: float = 0.0
34
+ arousal: float = 0.0
35
+ perspective: str = "first_person"
36
+ transparency: TransparencyLevel = TransparencyLevel.PARTLY_OPAQUE
37
+ metadata: Mapping[str, Any] = field(default_factory=dict)
38
+
39
+ def __post_init__(self) -> None:
40
+ object.__setattr__(self, "salience", _clamp(self.salience))
41
+ object.__setattr__(self, "valence", _clamp(self.valence, -1.0, 1.0))
42
+ object.__setattr__(self, "arousal", _clamp(self.arousal))
43
+ object.__setattr__(self, "metadata", _frozen_metadata(self.metadata))
44
+
45
+
46
+ @dataclass(frozen=True)
47
+ class AgencyAttribution:
48
+ """Attribution that an event/action is controlled by the subject."""
49
+
50
+ confidence: float = 0.0
51
+ intention_strength: float = 0.0
52
+ outcome_match: float = 0.0
53
+ external_override: float = 0.0
54
+
55
+ def __post_init__(self) -> None:
56
+ object.__setattr__(self, "confidence", _clamp(self.confidence))
57
+ object.__setattr__(self, "intention_strength", _clamp(self.intention_strength))
58
+ object.__setattr__(self, "outcome_match", _clamp(self.outcome_match))
59
+ object.__setattr__(self, "external_override", _clamp(self.external_override))
60
+
61
+
62
+ @dataclass(frozen=True)
63
+ class OwnershipAttribution:
64
+ """Attribution that a state, action, or representation is mine."""
65
+
66
+ confidence: float = 0.0
67
+ continuity: float = 0.0
68
+ source_alignment: float = 0.0
69
+ alienation: float = 0.0
70
+
71
+ def __post_init__(self) -> None:
72
+ object.__setattr__(self, "confidence", _clamp(self.confidence))
73
+ object.__setattr__(self, "continuity", _clamp(self.continuity))
74
+ object.__setattr__(self, "source_alignment", _clamp(self.source_alignment))
75
+ object.__setattr__(self, "alienation", _clamp(self.alienation))
76
+
77
+
78
+ @dataclass(frozen=True)
79
+ class BoundaryState:
80
+ """Subject/world boundary estimate."""
81
+
82
+ self_world_separation: float = 1.0
83
+ tool_incorporation: float = 0.0
84
+ social_permeability: float = 0.0
85
+
86
+ def __post_init__(self) -> None:
87
+ object.__setattr__(self, "self_world_separation", _clamp(self.self_world_separation))
88
+ object.__setattr__(self, "tool_incorporation", _clamp(self.tool_incorporation))
89
+ object.__setattr__(self, "social_permeability", _clamp(self.social_permeability))
90
+
91
+
92
+ @dataclass(frozen=True)
93
+ class PerspectiveState:
94
+ """The agent's perspective and temporal continuity marker."""
95
+
96
+ vantage: str = "first_person"
97
+ temporal_continuity: float = 1.0
98
+ embodied_anchor: str | None = None
99
+
100
+ def __post_init__(self) -> None:
101
+ object.__setattr__(self, "temporal_continuity", _clamp(self.temporal_continuity))
102
+
103
+
104
+ @dataclass(frozen=True)
105
+ class SelfModel:
106
+ """A compact phenomenal self-model snapshot."""
107
+
108
+ subject_id: str
109
+ phenomenal: PhenomenalState = field(default_factory=PhenomenalState)
110
+ agency: AgencyAttribution = field(default_factory=AgencyAttribution)
111
+ ownership: OwnershipAttribution = field(default_factory=OwnershipAttribution)
112
+ boundary: BoundaryState = field(default_factory=BoundaryState)
113
+ perspective: PerspectiveState = field(default_factory=PerspectiveState)
114
+ revision: int = 0
115
+ metadata: Mapping[str, Any] = field(default_factory=dict)
116
+
117
+ def __post_init__(self) -> None:
118
+ object.__setattr__(self, "metadata", _frozen_metadata(self.metadata))
119
+
120
+ def evolved(self, **changes: Any) -> SelfModel:
121
+ """Return a successor self-model with ``revision`` incremented."""
122
+ return replace(self, revision=self.revision + 1, **changes)
123
+
124
+
125
+ def _clamp(value: float, lower: float = 0.0, upper: float = 1.0) -> float:
126
+ return min(upper, max(lower, float(value)))
@@ -0,0 +1,161 @@
1
+ """Pure operators over Autonoesis records."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from autonoesis.models import (
6
+ AgencyAttribution,
7
+ BoundaryState,
8
+ OwnershipAttribution,
9
+ PerspectiveState,
10
+ PhenomenalState,
11
+ SelfModel,
12
+ TransparencyLevel,
13
+ _clamp,
14
+ )
15
+
16
+
17
+ def assess_agency(
18
+ *,
19
+ intention_strength: float,
20
+ outcome_match: float,
21
+ external_override: float = 0.0,
22
+ ) -> AgencyAttribution:
23
+ """Estimate agency from intention, outcome fit, and override pressure."""
24
+ intention_strength = _clamp(intention_strength)
25
+ outcome_match = _clamp(outcome_match)
26
+ external_override = _clamp(external_override)
27
+ confidence = _clamp(
28
+ (0.45 * intention_strength)
29
+ + (0.45 * outcome_match)
30
+ - (0.35 * external_override)
31
+ )
32
+ return AgencyAttribution(
33
+ confidence=confidence,
34
+ intention_strength=intention_strength,
35
+ outcome_match=outcome_match,
36
+ external_override=external_override,
37
+ )
38
+
39
+
40
+ def assess_ownership(
41
+ *,
42
+ continuity: float,
43
+ source_alignment: float,
44
+ alienation: float = 0.0,
45
+ ) -> OwnershipAttribution:
46
+ """Estimate mineness/ownership for a state or representation."""
47
+ continuity = _clamp(continuity)
48
+ source_alignment = _clamp(source_alignment)
49
+ alienation = _clamp(alienation)
50
+ confidence = _clamp((0.5 * continuity) + (0.4 * source_alignment) - (0.45 * alienation))
51
+ return OwnershipAttribution(
52
+ confidence=confidence,
53
+ continuity=continuity,
54
+ source_alignment=source_alignment,
55
+ alienation=alienation,
56
+ )
57
+
58
+
59
+ def boundary_integrity(boundary: BoundaryState) -> float:
60
+ """Return a compact integrity score for the subject/world boundary."""
61
+ return _clamp(
62
+ (0.65 * boundary.self_world_separation)
63
+ + (0.2 * (1.0 - boundary.social_permeability))
64
+ + (0.15 * (1.0 - boundary.tool_incorporation))
65
+ )
66
+
67
+
68
+ def transparency_audit(state: PhenomenalState) -> TransparencyLevel:
69
+ """Classify transparency from salience/arousal balance.
70
+
71
+ Highly salient, highly aroused states tend to be less available for calm
72
+ inspection, so this conservative default marks them as more opaque.
73
+ """
74
+ load = (state.salience + state.arousal) / 2.0
75
+ if load >= 0.75:
76
+ return TransparencyLevel.OPAQUE
77
+ if load >= 0.35:
78
+ return TransparencyLevel.PARTLY_OPAQUE
79
+ return TransparencyLevel.TRANSPARENT
80
+
81
+
82
+ def update_precision(
83
+ prior: float,
84
+ observation_match: float,
85
+ learning_rate: float = 0.2,
86
+ ) -> float:
87
+ """Return a precision/confidence update under an observation.
88
+
89
+ Pure formula::
90
+
91
+ clamp(prior + learning_rate * (observation_match - prior))
92
+
93
+ All inputs are clamped to ``[0.0, 1.0]`` before use. ``learning_rate == 0``
94
+ returns the prior unchanged; ``learning_rate == 1`` returns
95
+ ``observation_match`` unchanged.
96
+ """
97
+ prior = _clamp(prior)
98
+ observation_match = _clamp(observation_match)
99
+ learning_rate = _clamp(learning_rate)
100
+ return _clamp(prior + learning_rate * (observation_match - prior))
101
+
102
+
103
+ def update_attribution_from_observation(
104
+ attr: AgencyAttribution,
105
+ observation_match: float,
106
+ learning_rate: float = 0.2,
107
+ ) -> AgencyAttribution:
108
+ """Return a successor ``AgencyAttribution`` with updated confidence."""
109
+ return AgencyAttribution(
110
+ confidence=update_precision(attr.confidence, observation_match, learning_rate),
111
+ intention_strength=attr.intention_strength,
112
+ outcome_match=attr.outcome_match,
113
+ external_override=attr.external_override,
114
+ )
115
+
116
+
117
+ def update_ownership_from_observation(
118
+ attr: OwnershipAttribution,
119
+ observation_match: float,
120
+ learning_rate: float = 0.2,
121
+ ) -> OwnershipAttribution:
122
+ """Return a successor ``OwnershipAttribution`` with updated confidence."""
123
+ return OwnershipAttribution(
124
+ confidence=update_precision(attr.confidence, observation_match, learning_rate),
125
+ continuity=attr.continuity,
126
+ source_alignment=attr.source_alignment,
127
+ alienation=attr.alienation,
128
+ )
129
+
130
+
131
+ def surprise_to_observation_match(surprise_value: float) -> float:
132
+ """Default mapping from ``surprise`` to ``observation_match``."""
133
+ return 1.0 - _clamp(surprise_value)
134
+
135
+
136
+ def update_self_model(
137
+ model: SelfModel,
138
+ phenomenal: PhenomenalState,
139
+ *,
140
+ agency: AgencyAttribution | None = None,
141
+ ownership: OwnershipAttribution | None = None,
142
+ boundary: BoundaryState | None = None,
143
+ perspective: PerspectiveState | None = None,
144
+ ) -> SelfModel:
145
+ """Return a successor self-model with updated phenomenal and attribution state."""
146
+ if phenomenal.transparency is TransparencyLevel.PARTLY_OPAQUE:
147
+ phenomenal = PhenomenalState(
148
+ salience=phenomenal.salience,
149
+ valence=phenomenal.valence,
150
+ arousal=phenomenal.arousal,
151
+ perspective=phenomenal.perspective,
152
+ transparency=transparency_audit(phenomenal),
153
+ metadata=phenomenal.metadata,
154
+ )
155
+ return model.evolved(
156
+ phenomenal=phenomenal,
157
+ agency=agency or model.agency,
158
+ ownership=ownership or model.ownership,
159
+ boundary=boundary or model.boundary,
160
+ perspective=perspective or model.perspective,
161
+ )
autonoesis/py.typed ADDED
File without changes
autonoesis/store.py ADDED
@@ -0,0 +1,64 @@
1
+ """Adapter seam for journaling ``SelfModel`` snapshots.
2
+
3
+ Hosts may implement ``SelfModelStore`` against any backend (file, database,
4
+ queue, in-memory). The kernel never depends on a concrete implementation.
5
+ ``InMemorySelfModelStore`` is shipped as a stdlib-only reference adapter
6
+ suitable for tests, prototypes, and host-driven aggregation.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from typing import Protocol, runtime_checkable
12
+
13
+ from autonoesis.models import SelfModel
14
+
15
+
16
+ @runtime_checkable
17
+ class SelfModelStore(Protocol):
18
+ """Structural adapter contract for journaling ``SelfModel`` snapshots."""
19
+
20
+ def save(self, snapshot: SelfModel) -> None:
21
+ """Persist a snapshot.
22
+
23
+ Implementations must raise ``ValueError`` when ``snapshot.revision``
24
+ is less than or equal to the most recent stored revision for the
25
+ same subject.
26
+ """
27
+ ...
28
+
29
+ def load_latest(self, subject_id: str) -> SelfModel | None:
30
+ """Return the highest-revision snapshot for ``subject_id``, or ``None``."""
31
+ ...
32
+
33
+ def load_history(self, subject_id: str) -> tuple[SelfModel, ...]:
34
+ """Return all snapshots for ``subject_id``, oldest first, newest last."""
35
+ ...
36
+
37
+
38
+ class InMemorySelfModelStore:
39
+ """Reference ``SelfModelStore`` using an in-memory dict.
40
+
41
+ Stdlib only. No thread-safety guarantees in v0.2.
42
+ """
43
+
44
+ def __init__(self) -> None:
45
+ self._by_subject: dict[str, list[SelfModel]] = {}
46
+
47
+ def save(self, snapshot: SelfModel) -> None:
48
+ history = self._by_subject.setdefault(snapshot.subject_id, [])
49
+ if history and snapshot.revision <= history[-1].revision:
50
+ raise ValueError(
51
+ f"snapshot revision {snapshot.revision} must exceed "
52
+ f"current tail revision {history[-1].revision} for subject "
53
+ f"{snapshot.subject_id!r}"
54
+ )
55
+ history.append(snapshot)
56
+
57
+ def load_latest(self, subject_id: str) -> SelfModel | None:
58
+ history = self._by_subject.get(subject_id)
59
+ if not history:
60
+ return None
61
+ return history[-1]
62
+
63
+ def load_history(self, subject_id: str) -> tuple[SelfModel, ...]:
64
+ return tuple(self._by_subject.get(subject_id, ()))
@@ -0,0 +1,85 @@
1
+ Metadata-Version: 2.4
2
+ Name: autonoesis
3
+ Version: 0.2.0
4
+ Summary: A self-modeling and phenomenology kernel for cognitive agents.
5
+ Project-URL: Homepage, https://github.com/bionicbutterfly13/autonoesis
6
+ Project-URL: Repository, https://github.com/bionicbutterfly13/autonoesis
7
+ Project-URL: Issues, https://github.com/bionicbutterfly13/autonoesis/issues
8
+ Author: Bionic Butterfly
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: agency,ai-agents,cognitive-architecture,metacognition,phenomenology,self-modeling
12
+ Classifier: Development Status :: 2 - Pre-Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Typing :: Typed
19
+ Requires-Python: >=3.11
20
+ Description-Content-Type: text/markdown
21
+
22
+ # Autonoesis
23
+
24
+ A self-modeling and phenomenology kernel for cognitive agents.
25
+
26
+ Autonoesis provides small, typed primitives for representing and updating an
27
+ agent's model of itself as a subject situated in a world. It is designed to be
28
+ embedded inside larger cognitive architectures without bringing a database, web
29
+ framework, agent runtime, or storage backend.
30
+
31
+ ## What It Owns
32
+
33
+ - Phenomenal state records
34
+ - Self-model state records
35
+ - Agency and ownership attribution
36
+ - First-person perspective state
37
+ - Boundary and mineness checks
38
+ - Transparency / opacity markers
39
+ - Pure self-model update operations
40
+
41
+ ## What It Does Not Own
42
+
43
+ - Memory storage
44
+ - Agent orchestration
45
+ - LLM prompting infrastructure
46
+ - Active inference policy selection
47
+ - Safety policy systems
48
+ - Product runtime surfaces
49
+
50
+ ## Install
51
+
52
+ ```bash
53
+ pip install autonoesis
54
+ ```
55
+
56
+ ## Minimal Example
57
+
58
+ ```python
59
+ from autonoesis import PhenomenalState, SelfModel, assess_agency, update_self_model
60
+
61
+ state = PhenomenalState(
62
+ salience=0.8,
63
+ valence=0.2,
64
+ arousal=0.4,
65
+ perspective="first_person",
66
+ )
67
+
68
+ model = SelfModel(subject_id="agent")
69
+ agency = assess_agency(intention_strength=0.9, outcome_match=0.7, external_override=0.0)
70
+ updated = update_self_model(model, state, agency=agency)
71
+
72
+ assert updated.agency.confidence > 0.0
73
+ ```
74
+
75
+ ## Design Rule
76
+
77
+ Autonoesis is a kernel. It should stay pure, typed, dependency-light, and easy to
78
+ test. Host systems should attach storage, orchestration, LLM calls, and runtime
79
+ policy through adapters.
80
+
81
+ ## Project Docs
82
+
83
+ - [Product requirements](docs/prd.md)
84
+ - [v0.1 self-model kernel spec](docs/specs/v0.1-self-model-kernel.md)
85
+ - [Testing and TDD](docs/testing.md)
@@ -0,0 +1,10 @@
1
+ autonoesis/__init__.py,sha256=acaTPr1-4mRvkJ6BbwOcz729t4wSXMzjfhrLDuJ_1PI,1325
2
+ autonoesis/episodic.py,sha256=pboRkdXpvtQGE9HiHxVJoqEwS6TZbZrrUMd5LYVEtys,4104
3
+ autonoesis/models.py,sha256=cz3MVcSsE-exOi_513p5cljzhjAbazl1Z7L_LlojU6g,4479
4
+ autonoesis/operators.py,sha256=eiu0hbOssGk6b11qu4c68DwgTDiNa0xGWqFYm8utNrQ,5230
5
+ autonoesis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ autonoesis/store.py,sha256=NgGToGtyUIVdbR4tm-bY_jpWWzR-htAade4sCcNZ3Pc,2227
7
+ autonoesis-0.2.0.dist-info/METADATA,sha256=VVv0HMugxgrWrxI3lUz2nZSbu8ZkXcpwqzTJ_19ymgE,2549
8
+ autonoesis-0.2.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
9
+ autonoesis-0.2.0.dist-info/licenses/LICENSE,sha256=yvXLyy21nFLrzQkxoGzNOZ5fJPsk-6HlH2ISir6wz2s,1073
10
+ autonoesis-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Bionic Butterfly
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.