namel3ss 0.1.0a0__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.
- namel3ss/__init__.py +4 -0
- namel3ss/ast/__init__.py +5 -0
- namel3ss/ast/agents.py +13 -0
- namel3ss/ast/ai.py +23 -0
- namel3ss/ast/base.py +10 -0
- namel3ss/ast/expressions.py +55 -0
- namel3ss/ast/nodes.py +86 -0
- namel3ss/ast/pages.py +43 -0
- namel3ss/ast/program.py +22 -0
- namel3ss/ast/records.py +27 -0
- namel3ss/ast/statements.py +107 -0
- namel3ss/ast/tool.py +11 -0
- namel3ss/cli/__init__.py +2 -0
- namel3ss/cli/actions_mode.py +39 -0
- namel3ss/cli/app_loader.py +22 -0
- namel3ss/cli/commands/action.py +27 -0
- namel3ss/cli/commands/run.py +43 -0
- namel3ss/cli/commands/ui.py +26 -0
- namel3ss/cli/commands/validate.py +23 -0
- namel3ss/cli/format_mode.py +30 -0
- namel3ss/cli/io/json_io.py +19 -0
- namel3ss/cli/io/read_source.py +16 -0
- namel3ss/cli/json_io.py +21 -0
- namel3ss/cli/lint_mode.py +29 -0
- namel3ss/cli/main.py +135 -0
- namel3ss/cli/new_mode.py +146 -0
- namel3ss/cli/runner.py +28 -0
- namel3ss/cli/studio_mode.py +22 -0
- namel3ss/cli/ui_mode.py +14 -0
- namel3ss/config/__init__.py +4 -0
- namel3ss/config/dotenv.py +33 -0
- namel3ss/config/loader.py +83 -0
- namel3ss/config/model.py +49 -0
- namel3ss/errors/__init__.py +2 -0
- namel3ss/errors/base.py +34 -0
- namel3ss/errors/render.py +22 -0
- namel3ss/format/__init__.py +3 -0
- namel3ss/format/formatter.py +18 -0
- namel3ss/format/rules.py +97 -0
- namel3ss/ir/__init__.py +3 -0
- namel3ss/ir/lowering/__init__.py +4 -0
- namel3ss/ir/lowering/agents.py +42 -0
- namel3ss/ir/lowering/ai.py +45 -0
- namel3ss/ir/lowering/expressions.py +49 -0
- namel3ss/ir/lowering/flow.py +21 -0
- namel3ss/ir/lowering/pages.py +48 -0
- namel3ss/ir/lowering/program.py +34 -0
- namel3ss/ir/lowering/records.py +25 -0
- namel3ss/ir/lowering/statements.py +122 -0
- namel3ss/ir/lowering/tools.py +16 -0
- namel3ss/ir/model/__init__.py +50 -0
- namel3ss/ir/model/agents.py +33 -0
- namel3ss/ir/model/ai.py +31 -0
- namel3ss/ir/model/base.py +20 -0
- namel3ss/ir/model/expressions.py +50 -0
- namel3ss/ir/model/pages.py +43 -0
- namel3ss/ir/model/program.py +28 -0
- namel3ss/ir/model/statements.py +76 -0
- namel3ss/ir/model/tools.py +11 -0
- namel3ss/ir/nodes.py +88 -0
- namel3ss/lexer/__init__.py +2 -0
- namel3ss/lexer/lexer.py +152 -0
- namel3ss/lexer/tokens.py +98 -0
- namel3ss/lint/__init__.py +4 -0
- namel3ss/lint/engine.py +125 -0
- namel3ss/lint/semantic.py +45 -0
- namel3ss/lint/text_scan.py +70 -0
- namel3ss/lint/types.py +22 -0
- namel3ss/parser/__init__.py +3 -0
- namel3ss/parser/agent.py +78 -0
- namel3ss/parser/ai.py +113 -0
- namel3ss/parser/constraints.py +37 -0
- namel3ss/parser/core.py +166 -0
- namel3ss/parser/expressions.py +105 -0
- namel3ss/parser/flow.py +37 -0
- namel3ss/parser/pages.py +76 -0
- namel3ss/parser/program.py +45 -0
- namel3ss/parser/records.py +66 -0
- namel3ss/parser/statements/__init__.py +27 -0
- namel3ss/parser/statements/control_flow.py +116 -0
- namel3ss/parser/statements/core.py +66 -0
- namel3ss/parser/statements/data.py +17 -0
- namel3ss/parser/statements/letset.py +22 -0
- namel3ss/parser/statements.py +1 -0
- namel3ss/parser/tokens.py +35 -0
- namel3ss/parser/tool.py +29 -0
- namel3ss/runtime/__init__.py +3 -0
- namel3ss/runtime/ai/http/client.py +24 -0
- namel3ss/runtime/ai/mock_provider.py +5 -0
- namel3ss/runtime/ai/provider.py +29 -0
- namel3ss/runtime/ai/providers/__init__.py +18 -0
- namel3ss/runtime/ai/providers/_shared/errors.py +20 -0
- namel3ss/runtime/ai/providers/_shared/parse.py +18 -0
- namel3ss/runtime/ai/providers/anthropic.py +55 -0
- namel3ss/runtime/ai/providers/gemini.py +50 -0
- namel3ss/runtime/ai/providers/mistral.py +51 -0
- namel3ss/runtime/ai/providers/mock.py +23 -0
- namel3ss/runtime/ai/providers/ollama.py +39 -0
- namel3ss/runtime/ai/providers/openai.py +55 -0
- namel3ss/runtime/ai/providers/registry.py +38 -0
- namel3ss/runtime/ai/trace.py +18 -0
- namel3ss/runtime/executor/__init__.py +3 -0
- namel3ss/runtime/executor/agents.py +91 -0
- namel3ss/runtime/executor/ai_runner.py +90 -0
- namel3ss/runtime/executor/api.py +54 -0
- namel3ss/runtime/executor/assign.py +40 -0
- namel3ss/runtime/executor/context.py +31 -0
- namel3ss/runtime/executor/executor.py +77 -0
- namel3ss/runtime/executor/expr_eval.py +110 -0
- namel3ss/runtime/executor/records_ops.py +64 -0
- namel3ss/runtime/executor/result.py +13 -0
- namel3ss/runtime/executor/signals.py +6 -0
- namel3ss/runtime/executor/statements.py +99 -0
- namel3ss/runtime/memory/manager.py +52 -0
- namel3ss/runtime/memory/profile.py +17 -0
- namel3ss/runtime/memory/semantic.py +20 -0
- namel3ss/runtime/memory/short_term.py +18 -0
- namel3ss/runtime/records/service.py +105 -0
- namel3ss/runtime/store/__init__.py +2 -0
- namel3ss/runtime/store/memory_store.py +62 -0
- namel3ss/runtime/tools/registry.py +13 -0
- namel3ss/runtime/ui/__init__.py +2 -0
- namel3ss/runtime/ui/actions.py +124 -0
- namel3ss/runtime/validators/__init__.py +2 -0
- namel3ss/runtime/validators/constraints.py +126 -0
- namel3ss/schema/__init__.py +2 -0
- namel3ss/schema/records.py +52 -0
- namel3ss/studio/__init__.py +4 -0
- namel3ss/studio/api.py +115 -0
- namel3ss/studio/edit/__init__.py +3 -0
- namel3ss/studio/edit/ops.py +80 -0
- namel3ss/studio/edit/selectors.py +74 -0
- namel3ss/studio/edit/transform.py +39 -0
- namel3ss/studio/server.py +175 -0
- namel3ss/studio/session.py +11 -0
- namel3ss/studio/web/app.js +248 -0
- namel3ss/studio/web/index.html +44 -0
- namel3ss/studio/web/styles.css +42 -0
- namel3ss/templates/__init__.py +3 -0
- namel3ss/templates/__pycache__/__init__.cpython-312.pyc +0 -0
- namel3ss/templates/ai_assistant/.gitignore +1 -0
- namel3ss/templates/ai_assistant/README.md +10 -0
- namel3ss/templates/ai_assistant/app.ai +30 -0
- namel3ss/templates/crud/.gitignore +1 -0
- namel3ss/templates/crud/README.md +10 -0
- namel3ss/templates/crud/app.ai +26 -0
- namel3ss/templates/multi_agent/.gitignore +1 -0
- namel3ss/templates/multi_agent/README.md +10 -0
- namel3ss/templates/multi_agent/app.ai +43 -0
- namel3ss/ui/__init__.py +2 -0
- namel3ss/ui/manifest.py +220 -0
- namel3ss/utils/__init__.py +2 -0
- namel3ss-0.1.0a0.dist-info/METADATA +123 -0
- namel3ss-0.1.0a0.dist-info/RECORD +157 -0
- namel3ss-0.1.0a0.dist-info/WHEEL +5 -0
- namel3ss-0.1.0a0.dist-info/entry_points.txt +2 -0
- namel3ss-0.1.0a0.dist-info/top_level.txt +1 -0
namel3ss/ui/manifest.py
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
from namel3ss.errors.base import Namel3ssError
|
|
6
|
+
from namel3ss.ir import nodes as ir
|
|
7
|
+
from namel3ss.runtime.store.memory_store import MemoryStore
|
|
8
|
+
from namel3ss.schema import records as schema
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def build_manifest(program: ir.Program, *, state: dict | None = None, store: MemoryStore | None = None) -> dict:
|
|
12
|
+
record_map: Dict[str, schema.RecordSchema] = {rec.name: rec for rec in program.records}
|
|
13
|
+
pages = []
|
|
14
|
+
actions: Dict[str, dict] = {}
|
|
15
|
+
state = state or {}
|
|
16
|
+
for page in program.pages:
|
|
17
|
+
page_slug = _slugify(page.name)
|
|
18
|
+
elements = []
|
|
19
|
+
for idx, item in enumerate(page.items):
|
|
20
|
+
element, action_entry = _page_item_to_manifest(item, record_map, page.name, page_slug, idx, store)
|
|
21
|
+
elements.append(element)
|
|
22
|
+
if action_entry:
|
|
23
|
+
actions[action_entry["id"]] = action_entry
|
|
24
|
+
pages.append(
|
|
25
|
+
{
|
|
26
|
+
"name": page.name,
|
|
27
|
+
"slug": page_slug,
|
|
28
|
+
"elements": elements,
|
|
29
|
+
}
|
|
30
|
+
)
|
|
31
|
+
return {"pages": pages, "actions": actions}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _page_item_to_manifest(
|
|
35
|
+
item: ir.PageItem,
|
|
36
|
+
record_map: Dict[str, schema.RecordSchema],
|
|
37
|
+
page_name: str,
|
|
38
|
+
page_slug: str,
|
|
39
|
+
index: int,
|
|
40
|
+
store: MemoryStore | None,
|
|
41
|
+
) -> tuple[dict, dict | None]:
|
|
42
|
+
if isinstance(item, ir.TitleItem):
|
|
43
|
+
element_id = _title_element_id(page_slug, index)
|
|
44
|
+
return (
|
|
45
|
+
{
|
|
46
|
+
"type": "title",
|
|
47
|
+
"value": item.value,
|
|
48
|
+
"element_id": element_id,
|
|
49
|
+
"page": page_name,
|
|
50
|
+
"page_slug": page_slug,
|
|
51
|
+
"index": index,
|
|
52
|
+
"line": item.line,
|
|
53
|
+
"column": item.column,
|
|
54
|
+
},
|
|
55
|
+
None,
|
|
56
|
+
)
|
|
57
|
+
if isinstance(item, ir.TextItem):
|
|
58
|
+
element_id = _text_element_id(page_slug, index)
|
|
59
|
+
return (
|
|
60
|
+
{
|
|
61
|
+
"type": "text",
|
|
62
|
+
"value": item.value,
|
|
63
|
+
"element_id": element_id,
|
|
64
|
+
"page": page_name,
|
|
65
|
+
"page_slug": page_slug,
|
|
66
|
+
"index": index,
|
|
67
|
+
"line": item.line,
|
|
68
|
+
"column": item.column,
|
|
69
|
+
},
|
|
70
|
+
None,
|
|
71
|
+
)
|
|
72
|
+
if isinstance(item, ir.FormItem):
|
|
73
|
+
record = _require_record(item.record_name, record_map, item)
|
|
74
|
+
action_id = _form_action_id(page_name, item.record_name)
|
|
75
|
+
return (
|
|
76
|
+
{
|
|
77
|
+
"type": "form",
|
|
78
|
+
"element_id": _form_element_id(page_slug, index),
|
|
79
|
+
"id": action_id,
|
|
80
|
+
"action_id": action_id,
|
|
81
|
+
"record": record.name,
|
|
82
|
+
"fields": [_field_to_manifest(f) for f in record.fields],
|
|
83
|
+
"page": page_name,
|
|
84
|
+
"page_slug": page_slug,
|
|
85
|
+
"index": index,
|
|
86
|
+
"line": item.line,
|
|
87
|
+
"column": item.column,
|
|
88
|
+
},
|
|
89
|
+
{"id": action_id, "type": "submit_form", "record": record.name},
|
|
90
|
+
)
|
|
91
|
+
if isinstance(item, ir.TableItem):
|
|
92
|
+
record = _require_record(item.record_name, record_map, item)
|
|
93
|
+
table_id = _table_id(page_name, item.record_name)
|
|
94
|
+
rows = []
|
|
95
|
+
if store is not None:
|
|
96
|
+
rows = store.list_records(record)[:20]
|
|
97
|
+
return (
|
|
98
|
+
{
|
|
99
|
+
"type": "table",
|
|
100
|
+
"id": table_id,
|
|
101
|
+
"record": record.name,
|
|
102
|
+
"columns": [{"name": f.name, "type": f.type_name} for f in record.fields],
|
|
103
|
+
"rows": rows,
|
|
104
|
+
"element_id": _table_element_id(page_slug, index),
|
|
105
|
+
"page": page_name,
|
|
106
|
+
"page_slug": page_slug,
|
|
107
|
+
"index": index,
|
|
108
|
+
"line": item.line,
|
|
109
|
+
"column": item.column,
|
|
110
|
+
},
|
|
111
|
+
None,
|
|
112
|
+
)
|
|
113
|
+
if isinstance(item, ir.ButtonItem):
|
|
114
|
+
action_id = _button_action_id(page_name, item.label)
|
|
115
|
+
action_entry = {"id": action_id, "type": "call_flow", "flow": item.flow_name}
|
|
116
|
+
element_id = _button_element_id(page_slug, index)
|
|
117
|
+
element = {
|
|
118
|
+
"type": "button",
|
|
119
|
+
"label": item.label,
|
|
120
|
+
"id": action_id,
|
|
121
|
+
"action_id": action_id,
|
|
122
|
+
"action": {"type": "call_flow", "flow": item.flow_name},
|
|
123
|
+
"element_id": element_id,
|
|
124
|
+
"page": page_name,
|
|
125
|
+
"page_slug": page_slug,
|
|
126
|
+
"index": index,
|
|
127
|
+
"line": item.line,
|
|
128
|
+
"column": item.column,
|
|
129
|
+
}
|
|
130
|
+
return element, action_entry
|
|
131
|
+
raise Namel3ssError(f"Unsupported page item '{type(item)}'")
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _field_to_manifest(field: schema.FieldSchema) -> dict:
|
|
135
|
+
return {
|
|
136
|
+
"name": field.name,
|
|
137
|
+
"type": field.type_name,
|
|
138
|
+
"constraints": _constraints_to_manifest(field.constraint),
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _constraints_to_manifest(constraint: Optional[schema.FieldConstraint]) -> List[dict]:
|
|
143
|
+
if constraint is None:
|
|
144
|
+
return []
|
|
145
|
+
kind = constraint.kind
|
|
146
|
+
if kind == "present":
|
|
147
|
+
return [{"kind": "present"}]
|
|
148
|
+
if kind == "unique":
|
|
149
|
+
return [{"kind": "unique"}]
|
|
150
|
+
if kind == "pattern":
|
|
151
|
+
return [{"kind": "pattern", "value": constraint.pattern}]
|
|
152
|
+
if kind == "gt":
|
|
153
|
+
return [{"kind": "greater_than", "value": _literal_value(constraint.expression)}]
|
|
154
|
+
if kind == "lt":
|
|
155
|
+
return [{"kind": "less_than", "value": _literal_value(constraint.expression)}]
|
|
156
|
+
if kind == "len_min":
|
|
157
|
+
return [{"kind": "length_min", "value": _literal_value(constraint.expression)}]
|
|
158
|
+
if kind == "len_max":
|
|
159
|
+
return [{"kind": "length_max", "value": _literal_value(constraint.expression)}]
|
|
160
|
+
return []
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _literal_value(expr: ir.Expression | None) -> object:
|
|
164
|
+
if isinstance(expr, ir.Literal):
|
|
165
|
+
return expr.value
|
|
166
|
+
if expr is None:
|
|
167
|
+
return None
|
|
168
|
+
raise Namel3ssError("Manifest requires literal constraint values")
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def _require_record(name: str, record_map: Dict[str, schema.RecordSchema], item: ir.PageItem) -> schema.RecordSchema:
|
|
172
|
+
if name not in record_map:
|
|
173
|
+
raise Namel3ssError(
|
|
174
|
+
f"Page references unknown record '{name}'",
|
|
175
|
+
line=item.line,
|
|
176
|
+
column=item.column,
|
|
177
|
+
)
|
|
178
|
+
return record_map[name]
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def _button_action_id(page_name: str, label: str) -> str:
|
|
182
|
+
return f"page.{_slugify(page_name)}.button.{_slugify(label)}"
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def _form_action_id(page_name: str, record_name: str) -> str:
|
|
186
|
+
return f"page.{_slugify(page_name)}.form.{_slugify(record_name)}"
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _table_id(page_name: str, record_name: str) -> str:
|
|
190
|
+
return f"page.{_slugify(page_name)}.table.{_slugify(record_name)}"
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def _title_element_id(page_slug: str, index: int) -> str:
|
|
194
|
+
return f"page.{page_slug}.title.{index}"
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def _text_element_id(page_slug: str, index: int) -> str:
|
|
198
|
+
return f"page.{page_slug}.text.{index}"
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def _button_element_id(page_slug: str, index: int) -> str:
|
|
202
|
+
return f"page.{page_slug}.button_item.{index}"
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def _form_element_id(page_slug: str, index: int) -> str:
|
|
206
|
+
return f"page.{page_slug}.form_item.{index}"
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def _table_element_id(page_slug: str, index: int) -> str:
|
|
210
|
+
return f"page.{page_slug}.table.{index}"
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def _slugify(text: str) -> str:
|
|
214
|
+
import re
|
|
215
|
+
|
|
216
|
+
lowered = text.lower()
|
|
217
|
+
normalized = re.sub(r"[\s_-]+", "_", lowered)
|
|
218
|
+
cleaned = re.sub(r"[^a-z0-9_]", "", normalized)
|
|
219
|
+
collapsed = re.sub(r"_+", "_", cleaned).strip("_")
|
|
220
|
+
return collapsed
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: namel3ss
|
|
3
|
+
Version: 0.1.0a0
|
|
4
|
+
Summary: Namel3ss is an English-first, AI-native programming language for full-stack apps with inspectable AI.
|
|
5
|
+
Classifier: Programming Language :: Python :: 3
|
|
6
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
7
|
+
Classifier: Intended Audience :: Developers
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Requires-Python: >=3.10
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
Provides-Extra: dev
|
|
12
|
+
Requires-Dist: pytest>=7; extra == "dev"
|
|
13
|
+
|
|
14
|
+
# Namel3ss
|
|
15
|
+
|
|
16
|
+
Namel3ss is an English-first, AI-native programming language for building full-stack applications with deterministic behavior and inspectable AI.
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
pip install namel3ss
|
|
20
|
+
n3 new crud
|
|
21
|
+
n3 crud/app.ai studio
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- [Quickstart](docs/quickstart.md)
|
|
25
|
+
- [Examples](examples/)
|
|
26
|
+
- [Changelog](CHANGELOG.md)
|
|
27
|
+
|
|
28
|
+
## Installation
|
|
29
|
+
- Requires Python 3.10+
|
|
30
|
+
- `pip install namel3ss`
|
|
31
|
+
- `n3 --help` to confirm the CLI entrypoint after installation.
|
|
32
|
+
|
|
33
|
+
## Run with Ollama (local)
|
|
34
|
+
- Ensure Ollama is running locally.
|
|
35
|
+
- In your `.ai`, set `provider is "ollama"` and a local model (e.g., `model is "llama3.1"`). If omitted, the provider defaults to `mock`.
|
|
36
|
+
- Optional env overrides: `NAMEL3SS_OLLAMA_HOST`, `NAMEL3SS_OLLAMA_TIMEOUT_SECONDS`.
|
|
37
|
+
|
|
38
|
+
## Run with Tier-1 providers (cloud)
|
|
39
|
+
- Env-first config (config file optional).
|
|
40
|
+
- OpenAI: export `NAMEL3SS_OPENAI_API_KEY` (optional `NAMEL3SS_OPENAI_BASE_URL`, defaults to `https://api.openai.com`).
|
|
41
|
+
- Anthropic (Claude): export `NAMEL3SS_ANTHROPIC_API_KEY`.
|
|
42
|
+
- Gemini: export `NAMEL3SS_GEMINI_API_KEY`.
|
|
43
|
+
- Mistral: export `NAMEL3SS_MISTRAL_API_KEY`.
|
|
44
|
+
|
|
45
|
+
### Provider selection example (.ai)
|
|
46
|
+
```
|
|
47
|
+
ai "assistant":
|
|
48
|
+
provider is "openai"
|
|
49
|
+
model is "gpt-4.1"
|
|
50
|
+
system_prompt is "You are helpful."
|
|
51
|
+
|
|
52
|
+
flow "demo":
|
|
53
|
+
ask ai "assistant" with input: "Hello!" as reply
|
|
54
|
+
return reply
|
|
55
|
+
```
|
|
56
|
+
Swap `provider`/`model` to `anthropic`+`claude-3`, `gemini`+`gemini-1.5-flash`, `mistral`+`mistral-medium`, or `ollama`+`llama3.1`.
|
|
57
|
+
|
|
58
|
+
## Now / Next / Later
|
|
59
|
+
- Now: Phase 0 skeleton with docs, CI guardrails, and package scaffolding.
|
|
60
|
+
- Now: Core language contract captured for stable keywords and boundaries.
|
|
61
|
+
- Now: Editable install flow for local development and automation.
|
|
62
|
+
- Next: Lexer tokens, parser entrypoints, and AST node contracts.
|
|
63
|
+
- Next: Deterministic runtime shell with hooks for AI-augmented paths.
|
|
64
|
+
- Next: CLI stub for compile/run loops and ergonomic feedback.
|
|
65
|
+
- Later: IR lowering, optimizer passes, and reproducible execution traces.
|
|
66
|
+
- Later: Deterministic stdlib surface with sandboxed IO and tracing.
|
|
67
|
+
- Later: AI-augmented behaviors (prompted blocks, planners) gated and logged.
|
|
68
|
+
- Later: Performance profiling, caching, and correctness hardening toward v3.
|
|
69
|
+
|
|
70
|
+
## Getting Started
|
|
71
|
+
- Install editable package: `pip install -e .`
|
|
72
|
+
- Run tests: `python -m pytest -q`
|
|
73
|
+
- Compile check: `python -m compileall src -q`
|
|
74
|
+
- Enforce line limit: `python tools/line_limit_check.py`
|
|
75
|
+
|
|
76
|
+
## Start a New App
|
|
77
|
+
- Scaffold: `n3 new <template> [project_name]` (templates: `crud`, `ai-assistant`, `multi-agent`)
|
|
78
|
+
- Names default to the template; hyphens become underscores on disk.
|
|
79
|
+
- After scaffolding: `cd <project>` then `n3 app.ai studio` or `n3 app.ai actions`.
|
|
80
|
+
|
|
81
|
+
## Repository Layout
|
|
82
|
+
- `src/namel3ss/`: language packages (lexer, parser, ast, ir, runtime, cli, errors, utils)
|
|
83
|
+
- `tests/`: pytest suite (add coverage for every feature)
|
|
84
|
+
- `docs/`: roadmap and language contracts
|
|
85
|
+
- `tools/`: repo-level utilities (line-limit enforcement)
|
|
86
|
+
- `.github/workflows/`: CI automation
|
|
87
|
+
|
|
88
|
+
## Architecture at a Glance
|
|
89
|
+
- Lexer → Parser → AST → IR → Runtime executor pipeline with deterministic defaults and explicit AI boundaries.
|
|
90
|
+
- CLI is file-first (`n3 app.ai ...`) with modes for run, check, lint, format, actions, and studio UI.
|
|
91
|
+
- Runtime supports providers via registry (mock, ollama, openai, anthropic, gemini, mistral) with env-first config and standardized errors.
|
|
92
|
+
- Memory manager handles short-term, semantic, and profile contexts passed into AI calls.
|
|
93
|
+
- Templates (`n3 new ...`) ship starter apps plus `.env`-safe `.gitignore` for secrets.
|
|
94
|
+
|
|
95
|
+
## Development Notes
|
|
96
|
+
- Each source file must stay under 500 lines.
|
|
97
|
+
- One responsibility per file; if it grows, split into a folder with smaller modules.
|
|
98
|
+
- Prefer folder-first naming (e.g., `parser/core.py`, not `parser_core.py`).
|
|
99
|
+
|
|
100
|
+
### Migration note (buttons)
|
|
101
|
+
- Buttons are block-only (to avoid grammar chaos):
|
|
102
|
+
```
|
|
103
|
+
button "Run":
|
|
104
|
+
calls flow "demo"
|
|
105
|
+
```
|
|
106
|
+
- Old one-line form is rejected:
|
|
107
|
+
```
|
|
108
|
+
button "Run" calls flow "demo"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Docs
|
|
112
|
+
- [IR Reference](docs/ir.md)
|
|
113
|
+
- [Runtime Model](docs/runtime.md)
|
|
114
|
+
- [Error Reference](docs/errors.md)
|
|
115
|
+
- [Quickstart](docs/quickstart.md)
|
|
116
|
+
- [Providers](docs/providers.md)
|
|
117
|
+
- [Roadmap](docs/roadmap.md)
|
|
118
|
+
|
|
119
|
+
## Troubleshooting (providers)
|
|
120
|
+
- `Provider '<name>' requires <ENV_VAR>` → set the env var for that provider.
|
|
121
|
+
- `Provider '<name>' authentication failed` → check API key/permissions.
|
|
122
|
+
- `Provider '<name>' unreachable` → check network/DNS/firewall or ensure Ollama is running for local.
|
|
123
|
+
- `Provider '<name>' returned an invalid response` → verify model name, upstream status, and try again.
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
namel3ss/__init__.py,sha256=abLg0vEX1huvRlaVqY0eKit9D2BelIXvrvOYaFd9NEE,96
|
|
2
|
+
namel3ss/ast/__init__.py,sha256=rXStujIk6S1n7wjcnhC5WtRyWzifGxQ4s0cOxjGL8ms,120
|
|
3
|
+
namel3ss/ast/agents.py,sha256=Pny-svUZmNQv3gde8NuoDx1R74MWSJNWVnyywHj9z_w,234
|
|
4
|
+
namel3ss/ast/ai.py,sha256=wvqvZWJ1vxssVM0u4xinw3dNy_cJ4dWjlIgSmYT9lyk,422
|
|
5
|
+
namel3ss/ast/base.py,sha256=pHmMv9opzz4HDpTanEfpqNNnfORKW_dSejEHQ6sU_pM,173
|
|
6
|
+
namel3ss/ast/expressions.py,sha256=6DnBa_RUKllDtnkhnNPsobZGhXvrXqVc1CP4CeY8iYg,797
|
|
7
|
+
namel3ss/ast/nodes.py,sha256=Hs3VxG1TTiE5yfutsTUSfBqPjfqalY6cJRLzVgzLl1E,1636
|
|
8
|
+
namel3ss/ast/pages.py,sha256=ly8qrFpUMo3Pjn2Yy9-LJ1TSkauszSpXMAR-6Scq2Ss,554
|
|
9
|
+
namel3ss/ast/program.py,sha256=L3sj80rg7G9mVrOlHxqGFK_yvrRxhk4sM4o9au5a7Fw,401
|
|
10
|
+
namel3ss/ast/records.py,sha256=6HKu-bI9PApxyCmkxk3PExDaGHGItUqTi66kf5mzhR4,566
|
|
11
|
+
namel3ss/ast/statements.py,sha256=cMTzx1V7WorfTNpZ8rNSE_EtvsM3yxO3x1rQwuThFkA,1696
|
|
12
|
+
namel3ss/ast/tool.py,sha256=vXMtnsfSe-V6P2ZU8nalpMQm3izL0eOSCUTQqJKkNWA,169
|
|
13
|
+
namel3ss/cli/__init__.py,sha256=Nv6n4QQvEYzMwHU_lab7OALo0V5Fv-xEP6fZbxeOjuE,44
|
|
14
|
+
namel3ss/cli/actions_mode.py,sha256=LSsKcxVmvUm8QxpEYAHuN0OkdRQhcsnT1LVYSkFUze0,1501
|
|
15
|
+
namel3ss/cli/app_loader.py,sha256=ITySp_Tjqi1xYWDMor6EohfXMfMqxzswBnoL9gsh5iY,756
|
|
16
|
+
namel3ss/cli/format_mode.py,sha256=D8is3ep5etSjXRolyHjJyTRolLpa4zGB_Fw8sG3G7Nk,898
|
|
17
|
+
namel3ss/cli/json_io.py,sha256=GfyEnWi3FX7lGQXseN4zZfUxebfRoqamX3uIpn6ePjk,559
|
|
18
|
+
namel3ss/cli/lint_mode.py,sha256=x6rOI1oPzt-gcclFUDha6qoXV-wALBsdh6L40mAWni8,853
|
|
19
|
+
namel3ss/cli/main.py,sha256=Ti7I1LDtnxT2Z7hbI4keSe3XHs17xbAZWHWjsgDxak8,4878
|
|
20
|
+
namel3ss/cli/new_mode.py,sha256=ihyKvnG_UsmO9ruyOg-ZBHcdoEL0P68kyLwjQj7a4AE,4936
|
|
21
|
+
namel3ss/cli/runner.py,sha256=1wdPmCouXnZxoJOLMYbZcvD14Y64pTiI-BvfMKwsG1Q,1009
|
|
22
|
+
namel3ss/cli/studio_mode.py,sha256=TYVg8lDLT--jl14UVeST-vyyjsljAw--1MHwcbvtEv0,621
|
|
23
|
+
namel3ss/cli/ui_mode.py,sha256=3TCAuSEZLJnNfTL7SZ0XTG9yRAy3e_h_lJMxKHGOefg,532
|
|
24
|
+
namel3ss/cli/commands/action.py,sha256=o6w5ylgyVacNRelVmuy60GggtCRtSbcNVEEzQ_sdnv4,955
|
|
25
|
+
namel3ss/cli/commands/run.py,sha256=iP-dHqvsGjWMgXdYzRvj-RZ23o4NyRetV_Ba1JlHH2I,1516
|
|
26
|
+
namel3ss/cli/commands/ui.py,sha256=AHGVQ7Dxd_6b-Spj3Zu6pgD8a4YmPBcqLTGmLbJgEzA,851
|
|
27
|
+
namel3ss/cli/commands/validate.py,sha256=pKm4-HzGiOt7hTWNFj7ZJLaACW-JMnnD25dh6qdtMiA,614
|
|
28
|
+
namel3ss/cli/io/json_io.py,sha256=aGsNRwAzdCUNM-e9Tl73Rccqx77ELMJ0W-BZVYa7yFs,513
|
|
29
|
+
namel3ss/cli/io/read_source.py,sha256=a3QKPVwc1uq04FXxMdCBOPRpbPWJH2celkkuZl5gJQk,468
|
|
30
|
+
namel3ss/config/__init__.py,sha256=FxyMyOOtu0aSi8RYG5wdCff0KaljzU08qM8Svtz8Hyg,161
|
|
31
|
+
namel3ss/config/dotenv.py,sha256=vH6QNmj2cvNnBwzHLv8N98E1ogBIZk9qr7q9-e3thr4,917
|
|
32
|
+
namel3ss/config/loader.py,sha256=ld7yy8qK6vs-eVa16KJ-Pqe5OeyN1RC4qno4PrYJnh8,3136
|
|
33
|
+
namel3ss/config/model.py,sha256=Jm3p08nqK2EnjZZGPUqG0OLPl4R985mJcebSes1gJgA,980
|
|
34
|
+
namel3ss/errors/__init__.py,sha256=s3xDK-hqlhDDxm33OQ5-u9pCAWokZXT66e6tG41_Wdg,39
|
|
35
|
+
namel3ss/errors/base.py,sha256=ZRFXx1gFBXnAYinLam3lcR-hnCidGfqJJgn9PXyCExE,906
|
|
36
|
+
namel3ss/errors/render.py,sha256=dvcOojRmhjGIbDOEyCqyhKv1GFQC2lHbobhYwqR7Wvk,647
|
|
37
|
+
namel3ss/format/__init__.py,sha256=Ske2YabUJ0NsOULTSTu6mdsxbg-3AsBO50oLUXQr80o,81
|
|
38
|
+
namel3ss/format/formatter.py,sha256=BtB6ds_rmWjKoyVs5TCqKMVcBHDQue97g53mY6dAUME,645
|
|
39
|
+
namel3ss/format/rules.py,sha256=KVIFpsGSXhTXDT-xEQaApCUm1U5upgBkr9Oto5BDnW8,2884
|
|
40
|
+
namel3ss/ir/__init__.py,sha256=nwbGZILcOZWZeR8UZa4XTfDWOKgOvmLSqtPIuNS0oQs,100
|
|
41
|
+
namel3ss/ir/nodes.py,sha256=XZZopi-NZiFN_7AaEUl8JWFEYlNTXqEnz2s0Ra88MD4,1365
|
|
42
|
+
namel3ss/ir/lowering/__init__.py,sha256=EjHko9xnqhZfpbGTtRpjGufittNaB7N_-k9cUtt3bgQ,147
|
|
43
|
+
namel3ss/ir/lowering/agents.py,sha256=aTUl9yBbr2p09ARx8WZ2bQgZfaybKx5GA7BSBiU5n8Y,1842
|
|
44
|
+
namel3ss/ir/lowering/ai.py,sha256=yjEsm_VwH17OVW1EC0NGoMjcvRJBXi38QgnkwxY7RGY,1883
|
|
45
|
+
namel3ss/ir/lowering/expressions.py,sha256=ZF8Ttry6Uk3XnFpXJtz1J_qLDxg0lrFyEW5cbvzs18s,1963
|
|
46
|
+
namel3ss/ir/lowering/flow.py,sha256=kXleFwJufP26XeT19c1hwvJzD29Ia8yFO9F1MB6iLGI,658
|
|
47
|
+
namel3ss/ir/lowering/pages.py,sha256=iEV3qwA8fOgAPtH3Y7CS0ax5m6eWeltx3mbHwutBZhA,2162
|
|
48
|
+
namel3ss/ir/lowering/program.py,sha256=ybP5hS4FA2K1niiBQkZbGCns_DraY_NdH2W6mL0Hm20,1331
|
|
49
|
+
namel3ss/ir/lowering/records.py,sha256=s0QjohQIQ70wr-0JPUxcee14HKHW9yaD_KDKsy-S94o,885
|
|
50
|
+
namel3ss/ir/lowering/statements.py,sha256=4_zj68DyjLTA1nYf8Tv1gTFkj4LiaHQbByeRVnLCtDA,4371
|
|
51
|
+
namel3ss/ir/lowering/tools.py,sha256=muaMJBmbZvtG85o_--8zLtBJ7vsoWR5kiAqLY8WTuq8,603
|
|
52
|
+
namel3ss/ir/model/__init__.py,sha256=z66_jYkXT2M4QROpo3xbAsbMquqyh0SlnxrW9lCEfmg,1317
|
|
53
|
+
namel3ss/ir/model/agents.py,sha256=Yn5vyZHPPAvXghf1KtdplTZK2qKtDB81_bIfwQjqVt4,615
|
|
54
|
+
namel3ss/ir/model/ai.py,sha256=I0OvWf7meRE9WDgVw0dqLIW1JqQYvNO4dPwBZw7Cxfc,585
|
|
55
|
+
namel3ss/ir/model/base.py,sha256=A4fD_9f4KgZLOxBCKzY1EAQF13Zy4CqQZRgbZuc_ZsE,264
|
|
56
|
+
namel3ss/ir/model/expressions.py,sha256=Uo7au9bH4n-jgmDgatsmIYU8QVNABLFbBfeM9xQtNHI,738
|
|
57
|
+
namel3ss/ir/model/pages.py,sha256=JbLJc0Jf0n3P3G7x5r-dUyeoZt7Zw7QMfdVGIGmnASM,557
|
|
58
|
+
namel3ss/ir/model/program.py,sha256=OtsH0K_1PO6Yms_WoFkxNELSZFf_HS8yliw55AAujaY,690
|
|
59
|
+
namel3ss/ir/model/statements.py,sha256=4Gya1WYGo_BurWEep_vDzSgwf0X8kwNj12Y1HXyIRWE,1244
|
|
60
|
+
namel3ss/ir/model/tools.py,sha256=72GWEQyeBniS88U4t9G7agpG8_boSH9eozJWA6JqKSk,174
|
|
61
|
+
namel3ss/lexer/__init__.py,sha256=8rTDx7lGH5lGSq6qxEYLQxWi6EWMza2KFLkYTdoOQ2Y,48
|
|
62
|
+
namel3ss/lexer/lexer.py,sha256=yC_ObjmS_szMKaOvKmOeSO2TOi6G_4SDqAdFGpz5dDM,5064
|
|
63
|
+
namel3ss/lexer/tokens.py,sha256=zps8HZGsD8RaNlr7dVjQnU7Ej5IZgi5E30uXlnqZC1g,2317
|
|
64
|
+
namel3ss/lint/__init__.py,sha256=alx9nPtqMqK3O2cYBEYbDb6CA4468_imBrUa9PlqINk,123
|
|
65
|
+
namel3ss/lint/engine.py,sha256=NgYSGpEh0S7QCCOZn6CwgVGSrrNAS2qV0Sz6ZAAy2co,4607
|
|
66
|
+
namel3ss/lint/semantic.py,sha256=u_n3bdLRYRuPD0i7Oj5C52mSIk6no9mtLIObLI1n32g,1846
|
|
67
|
+
namel3ss/lint/text_scan.py,sha256=E5vT2Gi4XUPgnkFsC5FryRExEIrEfv0OHJ9XFaC33-s,2165
|
|
68
|
+
namel3ss/lint/types.py,sha256=oaSbySIs6H0bQXqYu400pRaGarvFx7cb37-bZ6_KBLY,467
|
|
69
|
+
namel3ss/parser/__init__.py,sha256=xzfvzvrLHJ0psi_5Rs6xqZHbOloMBQ3w2BfOmd34NG0,99
|
|
70
|
+
namel3ss/parser/agent.py,sha256=_0pgUsPL3hizf4rAc5TnLALFWdzLllI3EQc5NBSwWEY,4160
|
|
71
|
+
namel3ss/parser/ai.py,sha256=UFeXOvKBse7xBA6gFBUkb7Cmk-3s4Ylw0bVgZyQcsro,5764
|
|
72
|
+
namel3ss/parser/constraints.py,sha256=AZ50KDK5RJrDTTrMAHhvVp1Sxk1eCabeFkzdG95f-yg,1983
|
|
73
|
+
namel3ss/parser/core.py,sha256=7oEpvMn-4I8ixev-gLgZh0tJSb086wlKLITOyuCvE00,4540
|
|
74
|
+
namel3ss/parser/expressions.py,sha256=9VaXHCqmo2mq0tg-OyL-9-mU7bnUQuetAqWikApKDHk,4086
|
|
75
|
+
namel3ss/parser/flow.py,sha256=UEjkzO9acHaa8358m6CFkkxXRdkcSoqEizmapq0FyYE,1365
|
|
76
|
+
namel3ss/parser/pages.py,sha256=IFiBd0xQx3_cCRtsMOu_T_T6dl4Qr1ZmSvBR2WcVY3E,3506
|
|
77
|
+
namel3ss/parser/program.py,sha256=DYM3_N646ZGtuihpWeKQQVTrDXJBRfsqdaquIm350q8,1707
|
|
78
|
+
namel3ss/parser/records.py,sha256=7BvbA2Z6sC5zbG0Q8UwtsjQVRFCtImQSEUWKtByx1DU,2413
|
|
79
|
+
namel3ss/parser/statements.py,sha256=_-4i76tAEtYjZbqzRJaHD-HvxfQAxYJ9l-3JV1MuGqo,60
|
|
80
|
+
namel3ss/parser/tokens.py,sha256=-J3JQqblxbWl27oXmBDW23iI9dehaSjUoklMrYnkHEA,813
|
|
81
|
+
namel3ss/parser/tool.py,sha256=eAYIi-xHu-3IhQLUVF6WordXPS_4NMweieyJ18aBGRk,1286
|
|
82
|
+
namel3ss/parser/statements/__init__.py,sha256=T_sMd3HTPnJqkD8wRpA9JcTCf8L8aNu0F81JfZS3BWE,662
|
|
83
|
+
namel3ss/parser/statements/control_flow.py,sha256=Y6OV2Uz22sL4qUY8mBVzlb00u9ZZCcdYTSgsgzWrRNw,5365
|
|
84
|
+
namel3ss/parser/statements/core.py,sha256=XLIxZ_qytbFTlOsjOuCUZx4tuVV0rFSmHmqWswhVLrM,2427
|
|
85
|
+
namel3ss/parser/statements/data.py,sha256=b7hM3oPYzvCzQ6zxBswhKoqmIVs0-TGkOTwD83wq0bY,652
|
|
86
|
+
namel3ss/parser/statements/letset.py,sha256=grnwN9eNGbGQJKJ2oNoErwJrGVb95tr9YsAMV7Kp1rY,799
|
|
87
|
+
namel3ss/runtime/__init__.py,sha256=qBZSPz5u6Yt04jSTJcjYGzu4gQeikzxDRzR_3_Gd-zk,173
|
|
88
|
+
namel3ss/runtime/ai/mock_provider.py,sha256=o1jKUTX9tBIRtLSEiLu7-Xf_Zta2jJIOzC2H5Ay69Pk,124
|
|
89
|
+
namel3ss/runtime/ai/provider.py,sha256=7DR1geRj6zjWPJFPqsfU2p6ndbxvc8aEeRfi3tKgXaw,612
|
|
90
|
+
namel3ss/runtime/ai/trace.py,sha256=a3ffjqbO-lnRfoY7f8tXwU0E__YhEhWgdrQ6QC4l-9E,348
|
|
91
|
+
namel3ss/runtime/ai/http/client.py,sha256=vMZfBLN_h3eaEqtaYaIUnaDORBKhkJAluRu-T60O00U,1030
|
|
92
|
+
namel3ss/runtime/ai/providers/__init__.py,sha256=EatsX-MdubHzYE4djVNsDElBsCuy2ReaS_kryBPkOb8,673
|
|
93
|
+
namel3ss/runtime/ai/providers/anthropic.py,sha256=ullEsJckhQAvYjK2MaeOUbobqlCH57a6HPYcP02JrmI,2055
|
|
94
|
+
namel3ss/runtime/ai/providers/gemini.py,sha256=NzVPnscZjOHXynt9bl_OROJhF--9GR-h0NEkIgmYeN4,2206
|
|
95
|
+
namel3ss/runtime/ai/providers/mistral.py,sha256=amWBXY__to8EWyRKSACz0Cz5lGMnDJqdFdg84yBERjI,2096
|
|
96
|
+
namel3ss/runtime/ai/providers/mock.py,sha256=yjwAkB0UPpbhoVS_va_WsoD0km9vmJTHR7NmwHYt92s,986
|
|
97
|
+
namel3ss/runtime/ai/providers/ollama.py,sha256=M1XntvSbVJqnugTgvbHPgSimmF7-xvq8yePef0BsI7E,1730
|
|
98
|
+
namel3ss/runtime/ai/providers/openai.py,sha256=LOJ3_tjAIYRGh-Gxe1JLKHpDDwff9_2BLKIuGoAIiiM,2305
|
|
99
|
+
namel3ss/runtime/ai/providers/registry.py,sha256=t6syKjJ7b9kA_Gp2RautGQ-9Dxx7jLmHVgTKJko1uD8,1548
|
|
100
|
+
namel3ss/runtime/ai/providers/_shared/errors.py,sha256=bDYXWtmfCwy_loyWDgZiRxMK83B4ZLKrX9Z9IPAWb8E,874
|
|
101
|
+
namel3ss/runtime/ai/providers/_shared/parse.py,sha256=JwIYsg1QNaIlOzQtZ0MSJ6HjBMRgtVSSSD5fORkRHhQ,609
|
|
102
|
+
namel3ss/runtime/executor/__init__.py,sha256=Ld_pzwWXd5k7-YdqlGThDEJKa1Ezysd2VwTzZerF-ys,187
|
|
103
|
+
namel3ss/runtime/executor/agents.py,sha256=ERH-6-wjFiTcdAQXIozLiHc5nEZGpT32HGXzmYp1074,4019
|
|
104
|
+
namel3ss/runtime/executor/ai_runner.py,sha256=wP8mt83TxrOiocIg0WEm3QlBLla_Mtp7QxJLs9UO9bY,3866
|
|
105
|
+
namel3ss/runtime/executor/api.py,sha256=jfz9WQtfGSW5-HleTMkWA1j7E2X1SfPFmvM1R8BhRDE,1710
|
|
106
|
+
namel3ss/runtime/executor/assign.py,sha256=IJAgA716kKIOB_edIVL8EFoTen4kjDX4dEopFwuUDbE,1455
|
|
107
|
+
namel3ss/runtime/executor/context.py,sha256=N5UM1BjSovJ5j4RQuipCrcHDHeVQN5k-B5mQayzi-os,928
|
|
108
|
+
namel3ss/runtime/executor/executor.py,sha256=XdHWCAT1I2msJgE-AgDYiZDq5d7hOcSEEDroVwy4cj4,3147
|
|
109
|
+
namel3ss/runtime/executor/expr_eval.py,sha256=hhOhl8CI9iGyrDbgpg1dZ4-KIHvR3soWa3JGtcPEF20,4705
|
|
110
|
+
namel3ss/runtime/executor/records_ops.py,sha256=W-FpC4dIaVKGqmBMMuxSkemE9ng8Z6v7RpDRhSg7dT8,2096
|
|
111
|
+
namel3ss/runtime/executor/result.py,sha256=sySbs4lP7GK2psCYU13BX9KwUDTFX8xrtHLlnmGs6ak,275
|
|
112
|
+
namel3ss/runtime/executor/signals.py,sha256=iGuJDYLjf7jCkQ2_BCTJSldbKu6r7M3V3QZ2lUWhUUE,186
|
|
113
|
+
namel3ss/runtime/executor/statements.py,sha256=c3x1fUh0dhJVPqbTpWnQEURfRVPHL_o7apH1X2iOJE4,4068
|
|
114
|
+
namel3ss/runtime/memory/manager.py,sha256=lwtWH1iUu2y0nOet4zvKBKaafzT8P_SjsyTrYZF9r_w,1926
|
|
115
|
+
namel3ss/runtime/memory/profile.py,sha256=oWzNqDbh6PWm8Ogy5ohNw52FHFvL9UPfjZiHg4z9NNU,536
|
|
116
|
+
namel3ss/runtime/memory/semantic.py,sha256=7czQbZAlBtO-2Ao0PJWX0j_Yiabj8Ll3rZPLCkFwmvE,698
|
|
117
|
+
namel3ss/runtime/memory/short_term.py,sha256=nTUdjUHZRiqcPk_sg1Ig8mJyB7-VjsDN7w7rFZDgoXc,517
|
|
118
|
+
namel3ss/runtime/records/service.py,sha256=4Am-jCQWyqVR-so2wesWgzg_ZTbRDL1D7p1yYBP0Kso,3553
|
|
119
|
+
namel3ss/runtime/store/__init__.py,sha256=R6LrY5IpSIdRvNCFO4Xd1zyiQNxtJaj07Re3J0sehiI,38
|
|
120
|
+
namel3ss/runtime/store/memory_store.py,sha256=9btyuVqYXcPNljXaI1DNB5XxisZjZDPG5xTcb0iWctw,2322
|
|
121
|
+
namel3ss/runtime/tools/registry.py,sha256=hoEiGKm1tNP67JTFYj3iAEMeHpEsvLXYUFsMetQf2fg,393
|
|
122
|
+
namel3ss/runtime/ui/__init__.py,sha256=AVw1mBBkQyz1UHnFErw4_XSueZKTV9bO25eFNCub0yQ,29
|
|
123
|
+
namel3ss/runtime/ui/actions.py,sha256=jpfASVhzUTJAW1ZvgbYDj4WHUptW1KXDZAnJD2AnS3w,4057
|
|
124
|
+
namel3ss/runtime/validators/__init__.py,sha256=5Bhe53S1lqFaXF1xFTKcDSMLAIXwxxPZoIwKWlz3U6Q,38
|
|
125
|
+
namel3ss/runtime/validators/constraints.py,sha256=zVyqi3PwuBYhSA8COKwD5ILsgwPIlJMw_e1EjrKbnOA,4827
|
|
126
|
+
namel3ss/schema/__init__.py,sha256=hz6bWwdvIEd2UXs6zXTxfBm-2vU6ooDeD70YsrbBJ2U,48
|
|
127
|
+
namel3ss/schema/records.py,sha256=sdK4BTDa10JSRxpPfVWffqYOKBFFd6tDRI_szABKeuA,1899
|
|
128
|
+
namel3ss/studio/__init__.py,sha256=jogufPm4Ml1ow5Kh6UBRFTAhBRwFNgnEjaemwKp5OZM,267
|
|
129
|
+
namel3ss/studio/api.py,sha256=Cab6Lb-BLKZcHgVGJX8vv4Idw09isV_BMcLfm2xDaNY,4095
|
|
130
|
+
namel3ss/studio/server.py,sha256=2WUvWU8BTrWseNUt6FGcqdSYr_SleoybeqSs7mXa34I,7082
|
|
131
|
+
namel3ss/studio/session.py,sha256=9cfB_-oZRhGC7s1t0f2CVuelJCfYXE0-jrMFGzPLR7Y,277
|
|
132
|
+
namel3ss/studio/edit/__init__.py,sha256=pIMvXkqkuwGT8iJZXmk91CbN-zZQgJJydgZiCUE9sSU,94
|
|
133
|
+
namel3ss/studio/edit/ops.py,sha256=oXE-tJj-rami7oQ5Njm0oiOtOz3d3Iug1B884MhIkp4,3010
|
|
134
|
+
namel3ss/studio/edit/selectors.py,sha256=egWRWB_-bI2X0QwmKMFQQxXjk1L9xdUDcCuMX1FR4GU,2541
|
|
135
|
+
namel3ss/studio/edit/transform.py,sha256=Xb-HR1hA0an7W1kHVZv5xfqX0XbJ3K_ak4viwgFeZxU,1263
|
|
136
|
+
namel3ss/studio/web/app.js,sha256=5jxSarZDJNTHW0WOX44eqVv1BF6yjVmCWQFe-qiBp_c,7700
|
|
137
|
+
namel3ss/studio/web/index.html,sha256=jlIH3oU3_5HQA3KNI4DqDrKSsZaYvt78BonLs3sY-q8,965
|
|
138
|
+
namel3ss/studio/web/styles.css,sha256=qXZBdmVMY4Yu8iY-mcpXfHtXFfQhzbY7JgscbyTa9p4,555
|
|
139
|
+
namel3ss/templates/__init__.py,sha256=h_CzeuQnN4wCyfaZGVoiCTEj31hnK99zJxiSNo1lSJg,52
|
|
140
|
+
namel3ss/templates/__pycache__/__init__.cpython-312.pyc,sha256=FWLMb-SyqHaT00ae0MM6OlpckABriaJd9QEvZo_amHQ,195
|
|
141
|
+
namel3ss/templates/ai_assistant/.gitignore,sha256=aapzz1vDN3p9l_Lo0rt3MZWBXv4iWvfxvm9bkwa74U8,5
|
|
142
|
+
namel3ss/templates/ai_assistant/README.md,sha256=j9nlocZgLxQg9hO9qTEurRNmJyK5o2H5iWNC_l4rWB8,288
|
|
143
|
+
namel3ss/templates/ai_assistant/app.ai,sha256=jCVCd1C7pGy6D_thQTtfTixTFByilF4Tta4zsBeUylA,685
|
|
144
|
+
namel3ss/templates/crud/.gitignore,sha256=aapzz1vDN3p9l_Lo0rt3MZWBXv4iWvfxvm9bkwa74U8,5
|
|
145
|
+
namel3ss/templates/crud/README.md,sha256=v5wojeirosputgg2Rc0Qg8fLs4ZLnUZDw5yHuZ4aucA,247
|
|
146
|
+
namel3ss/templates/crud/app.ai,sha256=QB-U3dqi_3doaT9ETXqunMO9HWcQU10_OK77qaS1H1E,688
|
|
147
|
+
namel3ss/templates/multi_agent/.gitignore,sha256=aapzz1vDN3p9l_Lo0rt3MZWBXv4iWvfxvm9bkwa74U8,5
|
|
148
|
+
namel3ss/templates/multi_agent/README.md,sha256=71vr2ayp89mJa4FdwOu9OCXpVPkDn4oU14hm3OwJgtU,268
|
|
149
|
+
namel3ss/templates/multi_agent/app.ai,sha256=vBFoY6s5lEwOzpzRWbGfy-A6qxDzuzK3kyoDLyuYDoo,1067
|
|
150
|
+
namel3ss/ui/__init__.py,sha256=JERYoO9HOk06fAKiapxFmr532UumnDYYftVAba2t2H8,34
|
|
151
|
+
namel3ss/ui/manifest.py,sha256=fbWFrbt_0OPnL9RF5B4ewQ2eqhdpV1xLBioU05j0NvI,7430
|
|
152
|
+
namel3ss/utils/__init__.py,sha256=dzf-guxQaeOENGb5HaqnU9XqrqF9f6rDPmicYyaNrkA,38
|
|
153
|
+
namel3ss-0.1.0a0.dist-info/METADATA,sha256=MZAMjJEZWawnaKSoQDwpdUi183hGEtq7UDqNn0ixvgU,5055
|
|
154
|
+
namel3ss-0.1.0a0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
155
|
+
namel3ss-0.1.0a0.dist-info/entry_points.txt,sha256=vSc9Uw5SZ2h7aNB7F3G_TpUAsKzyBwwgAShkrgxO3iQ,46
|
|
156
|
+
namel3ss-0.1.0a0.dist-info/top_level.txt,sha256=Y5iP_vDEi6vy3f2ynprROdBZeIwYUmBDfDjLpT_ik0M,9
|
|
157
|
+
namel3ss-0.1.0a0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
namel3ss
|