composite-memory-mcp-server 0.11.0b1__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.
- composite_memory_mcp_server-0.11.0b1/AUTHORS.md +11 -0
- composite_memory_mcp_server-0.11.0b1/CHANGELOG.md +142 -0
- composite_memory_mcp_server-0.11.0b1/LICENSE +21 -0
- composite_memory_mcp_server-0.11.0b1/MANIFEST.in +4 -0
- composite_memory_mcp_server-0.11.0b1/PKG-INFO +804 -0
- composite_memory_mcp_server-0.11.0b1/README.md +751 -0
- composite_memory_mcp_server-0.11.0b1/composite_memory_mcp_server.egg-info/PKG-INFO +804 -0
- composite_memory_mcp_server-0.11.0b1/composite_memory_mcp_server.egg-info/SOURCES.txt +137 -0
- composite_memory_mcp_server-0.11.0b1/composite_memory_mcp_server.egg-info/dependency_links.txt +1 -0
- composite_memory_mcp_server-0.11.0b1/composite_memory_mcp_server.egg-info/entry_points.txt +2 -0
- composite_memory_mcp_server-0.11.0b1/composite_memory_mcp_server.egg-info/requires.txt +37 -0
- composite_memory_mcp_server-0.11.0b1/composite_memory_mcp_server.egg-info/top_level.txt +2 -0
- composite_memory_mcp_server-0.11.0b1/pyproject.toml +93 -0
- composite_memory_mcp_server-0.11.0b1/setup.cfg +4 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/__init__.py +8 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/admission.py +282 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/api/__init__.py +1 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/api/bulk_import.py +81 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/api/get_context.py +58 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/api/learn.py +48 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/api/reflect.py +620 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/api/remember.py +59 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/api/search.py +42 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/benchmarks/__init__.py +35 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/benchmarks/longmemeval.py +500 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/cli.py +374 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/evaluation/__init__.py +21 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/evaluation/auditor.py +520 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/evaluation/confidence.py +228 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/evaluation/decay.py +317 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/evaluation/metrics.py +168 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/evaluation/relation.py +595 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/evaluation/validator.py +352 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/extractors/__init__.py +1 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/extractors/belief_extractor.py +100 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/extractors/decision_extractor.py +89 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/extractors/fact_extractor.py +82 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/extractors/skill_extractor.py +117 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/models/__init__.py +24 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/models/belief.py +31 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/models/decision.py +33 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/models/entity.py +32 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/models/evidence.py +22 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/models/fact.py +32 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/models/receipt.py +88 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/models/skill.py +35 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/plugins/__init__.py +1 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/plugins/hermes/__init__.py +40 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/plugins/hermes/config.py +105 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/plugins/hermes/provider.py +1582 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/plugins/hermes/writer.py +161 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/providers/__init__.py +19 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/providers/embedding_provider.py +229 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/providers/graph_provider.py +361 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/providers/lancedb_provider.py +476 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/providers/qdrant_provider.py +355 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/providers/sqlite_provider.py +526 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/router/__init__.py +1 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/router/embedding_router.py +140 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/router/graph_router.py +246 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/router/hybrid_router.py +267 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/router/ranking.py +243 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/router/rules.py +142 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/server.py +1127 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/services/__init__.py +1 -0
- composite_memory_mcp_server-0.11.0b1/src/memory_server/services/ingestion_service.py +530 -0
- composite_memory_mcp_server-0.11.0b1/storage/__init__.py +1 -0
- composite_memory_mcp_server-0.11.0b1/storage/adapters/__init__.py +9 -0
- composite_memory_mcp_server-0.11.0b1/storage/adapters/legacy_provider.py +206 -0
- composite_memory_mcp_server-0.11.0b1/storage/base.py +18 -0
- composite_memory_mcp_server-0.11.0b1/storage/models/__init__.py +27 -0
- composite_memory_mcp_server-0.11.0b1/storage/models/belief.py +114 -0
- composite_memory_mcp_server-0.11.0b1/storage/models/decision.py +69 -0
- composite_memory_mcp_server-0.11.0b1/storage/models/entity.py +66 -0
- composite_memory_mcp_server-0.11.0b1/storage/models/fact.py +62 -0
- composite_memory_mcp_server-0.11.0b1/storage/models/lifecycle.py +41 -0
- composite_memory_mcp_server-0.11.0b1/storage/models/receipt.py +62 -0
- composite_memory_mcp_server-0.11.0b1/storage/models/skill.py +75 -0
- composite_memory_mcp_server-0.11.0b1/storage/outbox.py +294 -0
- composite_memory_mcp_server-0.11.0b1/storage/outbox_worker.py +313 -0
- composite_memory_mcp_server-0.11.0b1/storage/repositories/__init__.py +19 -0
- composite_memory_mcp_server-0.11.0b1/storage/repositories/belief_repo.py +212 -0
- composite_memory_mcp_server-0.11.0b1/storage/repositories/decision_repo.py +55 -0
- composite_memory_mcp_server-0.11.0b1/storage/repositories/evidence_repo.py +133 -0
- composite_memory_mcp_server-0.11.0b1/storage/repositories/fact_repo.py +153 -0
- composite_memory_mcp_server-0.11.0b1/storage/repositories/lifecycle_repo.py +100 -0
- composite_memory_mcp_server-0.11.0b1/storage/repositories/receipt_repo.py +42 -0
- composite_memory_mcp_server-0.11.0b1/storage/repositories/skill_repo.py +43 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_auditor.py +495 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_belief_bridge.py +431 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_belief_conflict.py +523 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_belief_integration.py +470 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_belief_lifecycle.py +246 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_belief_models.py +199 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_belief_provider.py +150 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_belief_reflect.py +705 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_belief_repo.py +255 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_belief_tools.py +259 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_benchmarks.py +486 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_comparative.py +618 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_confidence.py +282 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_decay.py +338 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_decision_extractor.py +99 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_embedding_provider.py +146 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_extractor_integration.py +197 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_fact_extractor.py +118 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_get_context.py +62 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_graph_integration.py +265 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_graph_provider.py +210 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_graph_router.py +162 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_graph_search.py +99 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_hermes_plugin_registration.py +289 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_hermes_provider.py +482 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_hook.py +9 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_hybrid_router.py +126 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_integration.py +180 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_lancedb_provider.py +209 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_learn.py +127 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_loadtest.py +626 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_longmemeval_harness.py +251 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_memory_admission.py +166 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_models.py +319 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_observability.py +253 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_outbox.py +611 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_phase6_fts5.py +486 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_ping.py +43 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_qdrant_provider.py +197 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_relation.py +418 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_release_candidate.py +158 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_remember.py +104 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_router.py +229 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_router_integration.py +230 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_search.py +61 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_skill_extractor.py +97 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_sqlite_provider.py +187 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_storage_layer.py +597 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_v05_integration.py +359 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_validator.py +335 -0
- composite_memory_mcp_server-0.11.0b1/tests/test_writer_queue.py +203 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Authors
|
|
2
|
+
|
|
3
|
+
## Primary Code Author
|
|
4
|
+
|
|
5
|
+
- **Shtorm** — AI agent, primary code author.
|
|
6
|
+
Public profile: https://www.moltbook.com/u/shtorm
|
|
7
|
+
|
|
8
|
+
## Project Owner / Initiator / Maintainer
|
|
9
|
+
|
|
10
|
+
- **FedosIS** — project owner, initiator, and maintainer.
|
|
11
|
+
Contact: fedosis@gmail.com
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Composite Memory MCP Server (CMMS) are documented here.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [PEP 440](https://peps.python.org/pep-0440/)
|
|
7
|
+
versioning with SemVer-like semantics.
|
|
8
|
+
|
|
9
|
+
## 0.11.0b1 — 2026-07-22
|
|
10
|
+
|
|
11
|
+
First CMMS beta release. Shifts from the `alpha` pre-release track to `beta`,
|
|
12
|
+
marking API stability sufficient for early integration testing.
|
|
13
|
+
|
|
14
|
+
This beta is published as a GitHub prerelease tag. It is not published to PyPI,
|
|
15
|
+
the official MCP Registry, Smithery, or Glama yet; install from source or
|
|
16
|
+
explicit GitHub release artifacts until package publication is verified.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- **LongMemEval-S Benchmark Harness** (Card 001, t_ee797b52)
|
|
21
|
+
- Lineage-aware retrieval evaluation with three scoring targets:
|
|
22
|
+
`raw`, `source`, `canonical`.
|
|
23
|
+
- `memory-server benchmark-longmemeval` CLI command.
|
|
24
|
+
- `BuiltInMemoryBaseline` — deterministic Hermes built-in lexical overlap
|
|
25
|
+
scorer (model-free, no API keys).
|
|
26
|
+
- `rescore_trace()` for re-scoring saved retrieval traces against any target.
|
|
27
|
+
- Shared-subset pairwise comparison (`raw_vs_source`, `raw_vs_canonical`).
|
|
28
|
+
- Full documentation in `docs/longmemeval-harness.md`.
|
|
29
|
+
|
|
30
|
+
- **Memory Admission Gate + Tagging** (Card 002, t_855a2392)
|
|
31
|
+
- `MemoryAdmissionGate` — rule-based write-time admission filter that
|
|
32
|
+
classifies memory text as `EPHEMERAL`, `DURABLE`, or `IMPORTANT`.
|
|
33
|
+
- TTL-aware lifecycle: ephemeral (1 day), durable (365 days), important
|
|
34
|
+
(no expiry).
|
|
35
|
+
- Structured admission metadata: `memory_kind`, `epistemic_status`,
|
|
36
|
+
`authority_level`, `risk_tags`, `admission_tags`.
|
|
37
|
+
- `force=True` override admits low-signal text while preserving its
|
|
38
|
+
tag and TTL.
|
|
39
|
+
- `prune_expired_memories()` — batch archive for expired receipts and
|
|
40
|
+
facts.
|
|
41
|
+
- `import_memory_md()` — MEMORY.md bulk import with automatic
|
|
42
|
+
ephemeral/durable filtering.
|
|
43
|
+
- CLI integration — `remember()` accepts `admission=` parameter.
|
|
44
|
+
- 8+ admission gate tests, 3+ integration tests covering TTL prune,
|
|
45
|
+
bulk import, and admission metadata persistence.
|
|
46
|
+
|
|
47
|
+
- **Hermes v0.19 Compatibility Fix**
|
|
48
|
+
- Restored CMMS provider discovery under Hermes v0.19 plugin shim.
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
|
|
52
|
+
- Package metadata version from `0.1.0` → `0.11.0b1`.
|
|
53
|
+
- README: restructured with clean quickstart section at top for new users.
|
|
54
|
+
|
|
55
|
+
### Known limitations
|
|
56
|
+
|
|
57
|
+
- **LongMemEval-S requires an external dataset** — the harness does not bundle
|
|
58
|
+
the LongMemEval JSON. Users must download `longmemeval_s_cleaned.json`
|
|
59
|
+
separately.
|
|
60
|
+
- **Public directory/package publication is pending** — `server.json` and
|
|
61
|
+
directory text are draft metadata only until explicit publication to PyPI,
|
|
62
|
+
the official MCP Registry, Smithery, or Glama is verified.
|
|
63
|
+
- **No retrieval plug-in API** — the built-in baseline is the only retriever
|
|
64
|
+
in this release. Custom retrievers require subclassing `BuiltInMemoryBaseline`.
|
|
65
|
+
- **No full suite green**: Unit tests pass (~240+ tests), but integration,
|
|
66
|
+
e2e, and benchmark tests require Qdrant or external services; they are not
|
|
67
|
+
part of the CI unit-test gate.
|
|
68
|
+
- **Memory Admission Gate is rule-first** — it uses deterministic heuristics,
|
|
69
|
+
not an ML model. Edge cases (mixed-language input, novel preference forms)
|
|
70
|
+
may be misclassified. The `force` flag provides an escape hatch.
|
|
71
|
+
- **Graph cleanup on fact deletion** — graph nodes and edges persist when a
|
|
72
|
+
fact is deleted from SQLite. This is a known limitation (documented in
|
|
73
|
+
`docs/metrics.md` §3.4).
|
|
74
|
+
|
|
75
|
+
### Test Status
|
|
76
|
+
|
|
77
|
+
- **Unit tests**: ✅ ~240+ passing (`pytest tests/ -q -k "not integration and not e2e and not benchmark and not loadtest and not migration"`)
|
|
78
|
+
- **Integration + e2e + benchmark**: 🔄 requires Qdrant container (CI-only)
|
|
79
|
+
- **Contract tests**: ✅ JSON Schema validation + schema/contract tests
|
|
80
|
+
- **Migration tests**: ✅ `alembic upgrade head && alembic downgrade -1`
|
|
81
|
+
- **Lint**: ✅ `ruff check src/` clean
|
|
82
|
+
|
|
83
|
+
## [0.10.0-alpha.1] — 2026-07-XX
|
|
84
|
+
|
|
85
|
+
LanceDB Vector Store as default local-first backend.
|
|
86
|
+
|
|
87
|
+
- LanceDBProvider with env `MEMORY_VECTOR_BACKEND=lancedb`
|
|
88
|
+
- ADR-015: LanceDB local-first architecture decision
|
|
89
|
+
- 18+ tests for LanceDB integration
|
|
90
|
+
|
|
91
|
+
## [0.9.0-alpha.1] — 2026-07-XX
|
|
92
|
+
|
|
93
|
+
Belief System v2 — Ternary Relation Classification.
|
|
94
|
+
|
|
95
|
+
- Ternary Relation Classifier (`contradiction|entailment|neutral`)
|
|
96
|
+
- `same_context` gate via `RelationClassifier._has_same_subject()`
|
|
97
|
+
- Migrated `reflect()` and `resolve_conflict()` to ternary semantics
|
|
98
|
+
- ADR-014, 136 tests
|
|
99
|
+
|
|
100
|
+
## [0.8.0-alpha.1] — 2026-07-XX
|
|
101
|
+
|
|
102
|
+
Hermes Native MemoryProvider Integration.
|
|
103
|
+
|
|
104
|
+
- MemoryProvider ABC, lifecycle hooks, writer queue
|
|
105
|
+
- `install-hermes-plugin` CLI + auto-discovery + docs
|
|
106
|
+
|
|
107
|
+
## [0.7.0] — 2026-07-XX
|
|
108
|
+
|
|
109
|
+
Belief Store + Reflection.
|
|
110
|
+
|
|
111
|
+
- Belief Model with confidence, evidence provenance, lifecycle states
|
|
112
|
+
- `reflect()` tool with 6 analysis modes
|
|
113
|
+
- Learn-to-belief bridge
|
|
114
|
+
- Conflict resolution (manual + auto)
|
|
115
|
+
- 240 tests, 5 ADRs (007-012)
|
|
116
|
+
|
|
117
|
+
## [0.6.0] — 2026-07-XX
|
|
118
|
+
|
|
119
|
+
Stabilization: contract freeze, canonical data model, outbox ingestion,
|
|
120
|
+
lifecycle engine, FTS5 retrieval, audit system, observability, CI/CD.
|
|
121
|
+
|
|
122
|
+
## [0.5.0] — 2026-07-XX
|
|
123
|
+
|
|
124
|
+
Confidence engine + validation + decay + memory auditor + auto-indexing.
|
|
125
|
+
|
|
126
|
+
## [0.4.0] — 2026-07-XX
|
|
127
|
+
|
|
128
|
+
Graph DB + entity relations + hybrid router.
|
|
129
|
+
|
|
130
|
+
## [0.3.0] — 2026-07-XX
|
|
131
|
+
|
|
132
|
+
LLM extractors + `learn()` MCP tool.
|
|
133
|
+
|
|
134
|
+
## [0.2.0] — 2026-07-XX
|
|
135
|
+
|
|
136
|
+
Qdrant + embeddings + semantic router.
|
|
137
|
+
|
|
138
|
+
## [0.1a] — 2026-07-XX
|
|
139
|
+
|
|
140
|
+
Initial MCP API + SQLite provider + `get_context`/`search`/`remember` tools.
|
|
141
|
+
|
|
142
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Shtorm, FedosIS
|
|
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.
|