Compare commits
1 Commits
7ebdc9c722
..
v1.0.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
25aa208d04
|
@@ -16,6 +16,19 @@ for 1.0.0 have something to be assembled from.
|
|||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
## 1.0.2
|
||||||
|
|
||||||
|
- **The documentation moved to the [wiki](https://git.houmeres.sk/Houmeres/LLeMbas/wiki).**
|
||||||
|
`CLAUDE.md`, `PLAN.md` and `docs/` are gone from the repository: they are
|
||||||
|
documentation *about* this project rather than part of it, and a clone should
|
||||||
|
carry software. Nothing was lost — the working notes, the roadmap and the eight
|
||||||
|
topic notes are all there, with every internal link rewritten, and the README
|
||||||
|
now opens onto them. Where a source comment said "see `CLAUDE.md`" it now says
|
||||||
|
"see the working notes".
|
||||||
|
- Entries below this one still name `PLAN.md` and `docs/notes/…`, and are left as
|
||||||
|
they were written. A changelog records what happened at the time; rewriting old
|
||||||
|
entries to match a later decision makes it a worse record, not a better one.
|
||||||
|
|
||||||
## 1.0.1
|
## 1.0.1
|
||||||
|
|
||||||
- Fixed: the Updates page showed **"v1.0.0 (reports 1.0.0)"** — two spellings of
|
- Fixed: the Updates page showed **"v1.0.0 (reports 1.0.0)"** — two spellings of
|
||||||
|
|||||||
@@ -144,7 +144,24 @@ runtime. Clone it, `pip install -e .`, run it.
|
|||||||
|
|
||||||
OCR for scanned PDFs · conversation branching · chat export · archived chats.
|
OCR for scanned PDFs · conversation branching · chat export · archived chats.
|
||||||
|
|
||||||
See [PLAN.md](PLAN.md) for what is built, what is not, and why.
|
See the [Roadmap](https://git.houmeres.sk/Houmeres/LLeMbas/wiki/Roadmap) for what
|
||||||
|
is built, what is not, and why.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
The **[wiki](https://git.houmeres.sk/Houmeres/LLeMbas/wiki)** carries everything
|
||||||
|
about how this works and why — it is documentation *about* the project rather
|
||||||
|
than part of it, so a clone stays software.
|
||||||
|
|
||||||
|
- **[Working notes](https://git.houmeres.sk/Houmeres/LLeMbas/wiki/Working-notes)**
|
||||||
|
— read this before changing anything. The hard rules the project is built
|
||||||
|
around, the layout, and a long catalogue of *things that will bite you*: bugs
|
||||||
|
that shipped looking correct, why each happened, and what stops it recurring.
|
||||||
|
- **[Roadmap](https://git.houmeres.sk/Houmeres/LLeMbas/wiki/Roadmap)** — what is
|
||||||
|
built, what is deliberately not, and the reasoning behind each.
|
||||||
|
- A page each for agent chats, schedules and reports, permissions and sharing,
|
||||||
|
search and extraction, image generation, subagents, branding, and the manual
|
||||||
|
release checklist.
|
||||||
|
|
||||||
## Quick start
|
## Quick start
|
||||||
|
|
||||||
@@ -479,7 +496,7 @@ python scripts/fetch_vendor.py # verify vendored JS against the lockfile
|
|||||||
There is no Alembic. The schema is SQLite-only and synchronised at startup:
|
There is no Alembic. The schema is SQLite-only and synchronised at startup:
|
||||||
missing tables and missing columns are added automatically, so adding a field to
|
missing tables and missing columns are added automatically, so adding a field to
|
||||||
a model needs nothing but a restart. Renames, drops and retypes are still manual
|
a model needs nothing but a restart. Renames, drops and retypes are still manual
|
||||||
— see `CLAUDE.md`.
|
— see the [working notes](https://git.houmeres.sk/Houmeres/LLeMbas/wiki/Working-notes).
|
||||||
|
|
||||||
## Artwork
|
## Artwork
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
"""LLeMbas - a Middle-earth themed web UI for OpenAI-compatible LLM endpoints."""
|
"""LLeMbas - a Middle-earth themed web UI for OpenAI-compatible LLM endpoints."""
|
||||||
|
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.0.2"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
Two shapes on one nav entry, because they are two different kinds of thing. The
|
Two shapes on one nav entry, because they are two different kinds of thing. The
|
||||||
connection, the checkpoints and the switches are instance settings and get a
|
connection, the checkpoints and the switches are instance settings and get a
|
||||||
settings page. A workflow is an authored document with a name, a description and
|
settings page. A workflow is an authored document with a name, a description and
|
||||||
a body, so the workflows are list-plus-detail -- the shape `CLAUDE.md` requires
|
a body, so the workflows are list-plus-detail -- the shape the working notes require
|
||||||
of any admin list, and for the reason it gives: a page that renders a ten-line
|
of any admin list, and for the reason it gives: a page that renders a ten-line
|
||||||
JSON textarea per row is unusable at three rows.
|
JSON textarea per row is unusable at three rows.
|
||||||
|
|
||||||
|
|||||||
@@ -238,7 +238,7 @@ async def browse_profile(
|
|||||||
it holds for the same reason -- somebody who owns the credential could list
|
it holds for the same reason -- somebody who owns the credential could list
|
||||||
the directory with an ssh client -- but it does mean Manual mode's promise
|
the directory with an ssh client -- but it does mean Manual mode's promise
|
||||||
that everything is shown to you first now has a second exception. Both are
|
that everything is shown to you first now has a second exception. Both are
|
||||||
written down in CLAUDE.md.
|
written down in the working notes.
|
||||||
"""
|
"""
|
||||||
profile = _profile(db, user, profile_id)
|
profile = _profile(db, user, profile_id)
|
||||||
entries: list = []
|
entries: list = []
|
||||||
|
|||||||
@@ -985,7 +985,7 @@ def _too_many_replies(db: DBSession, chat: Chat, user: User) -> str:
|
|||||||
"""Why this account may not start another reply right now, or "".
|
"""Why this account may not start another reply right now, or "".
|
||||||
|
|
||||||
In-process, and that is exact rather than approximate only because this
|
In-process, and that is exact rather than approximate only because this
|
||||||
application runs one worker -- see the first known limit in PLAN.md. With
|
application runs one worker -- see the first known limit in the roadmap. With
|
||||||
several, this becomes a guess, and a quota that is a guess should be a
|
several, this becomes a guess, and a quota that is a guess should be a
|
||||||
number in the database instead. Stated here rather than discovered.
|
number in the database instead. Stated here rather than discovered.
|
||||||
"""
|
"""
|
||||||
|
|||||||
+1
-1
@@ -263,7 +263,7 @@ def register_error_handlers(app: FastAPI) -> None:
|
|||||||
|
|
||||||
|
|
||||||
# Flavour lives in error pages, empty states and theme names -- never in the
|
# Flavour lives in error pages, empty states and theme names -- never in the
|
||||||
# functional UI. See CLAUDE.md.
|
# functional UI. See the working notes.
|
||||||
#
|
#
|
||||||
# The three lines themselves moved into `services/branding.py` with the rest of
|
# The three lines themselves moved into `services/branding.py` with the rest of
|
||||||
# what an administrator can replace. What is left here is the mapping from a
|
# what an administrator can replace. What is left here is the mapping from a
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ a model choosing to run something. Both are read-only, both are built here
|
|||||||
rather than assembled from anything a model said, and the project directory is
|
rather than assembled from anything a model said, and the project directory is
|
||||||
configuration rather than input. It is still an exception to Manual mode's
|
configuration rather than input. It is still an exception to Manual mode's
|
||||||
"everything is shown to you before it happens", and it is written down in
|
"everything is shown to you before it happens", and it is written down in
|
||||||
CLAUDE.md next to the others.
|
the working notes, next to the others.
|
||||||
|
|
||||||
**Nothing here is trusted.** Filenames come off somebody else's machine and end
|
**Nothing here is trusted.** Filenames come off somebody else's machine and end
|
||||||
up inside a system prompt, so they are stripped of control characters, capped
|
up inside a system prompt, so they are stripped of control characters, capped
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ def launch_and_wait_command(chat_id: str, job_id: str, command: str, max_bytes:
|
|||||||
# operand and formats to "<Logger … (WARNING)>", whose angle brackets and
|
# operand and formats to "<Logger … (WARNING)>", whose angle brackets and
|
||||||
# parentheses are shell syntax -- so this line died with a syntax error,
|
# parentheses are shell syntax -- so this line died with a syntax error,
|
||||||
# after the sentinel where nothing reads it, and every job's four files
|
# after the sentinel where nothing reads it, and every job's four files
|
||||||
# were left on the far side forever. See the note in CLAUDE.md.
|
# were left on the far side forever. See the note in the working notes.
|
||||||
f"rm -f {_file(chat_id, job_id, 'sh')} {pid} {logf} {exit_}\n"
|
f"rm -f {_file(chat_id, job_id, 'sh')} {pid} {logf} {exit_}\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ are separate because they fail differently:
|
|||||||
shows;
|
shows;
|
||||||
- **flavour text** — the Middle-earth lines, which live in the artwork, the
|
- **flavour text** — the Middle-earth lines, which live in the artwork, the
|
||||||
empty states, the loading lines and the error pages and nowhere else (see the
|
empty states, the loading lines and the error pages and nowhere else (see the
|
||||||
flavour rule in CLAUDE.md), and which somebody rebranding needs to be able to
|
flavour rule in the working notes), and which somebody rebranding needs to be able to
|
||||||
replace without editing templates;
|
replace without editing templates;
|
||||||
- **themes**, which are token sets rather than stylesheets, because the
|
- **themes**, which are token sets rather than stylesheets, because the
|
||||||
invariant that no component hard-codes a colour is what makes a third one
|
invariant that no component hard-codes a colour is what makes a third one
|
||||||
@@ -36,7 +36,7 @@ page and by nothing else.
|
|||||||
The cost of being a cache is stated rather than discovered: with several
|
The cost of being a cache is stated rather than discovered: with several
|
||||||
workers, a save in one is not seen by the others until each next reads. That is
|
workers, a save in one is not seen by the others until each next reads. That is
|
||||||
already true of this application for other reasons -- see the "one worker" note
|
already true of this application for other reasons -- see the "one worker" note
|
||||||
in PLAN.md -- and this does not make it worse.
|
in the roadmap -- and this does not make it worse.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|||||||
@@ -383,7 +383,7 @@ async def _run_fetch(context: ToolContext, args: dict[str, Any]) -> ToolOutcome:
|
|||||||
|
|
||||||
Straight through `services/fetch.py`, which owns the SSRF guard, the
|
Straight through `services/fetch.py`, which owns the SSRF guard, the
|
||||||
hand-rolled redirect loop that re-checks every hop, and the content-type
|
hand-rolled redirect loop that re-checks every hop, and the content-type
|
||||||
sniff. Deliberately not a second HTTP client: CLAUDE.md already names three
|
sniff. Deliberately not a second HTTP client: the working notes already name three
|
||||||
places that follow redirects by hand as the ceiling, and a fourth is how one
|
places that follow redirects by hand as the ceiling, and a fourth is how one
|
||||||
of them loses its check.
|
of them loses its check.
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -118,7 +118,7 @@
|
|||||||
toggling their panel twice, which is to say doing nothing at all.
|
toggling their panel twice, which is to say doing nothing at all.
|
||||||
|
|
||||||
None of it looks like a script loaded twice. Found by driving the file under a
|
None of it looks like a script loaded twice. Found by driving the file under a
|
||||||
DOM stub, which is the rule `CLAUDE.md` sets out and the reason it does.
|
DOM stub, which is the rule the working notes set out and the reason it does.
|
||||||
#}
|
#}
|
||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
<script src="{{ url_for('static', path='js/steps.js') }}" defer></script>
|
<script src="{{ url_for('static', path='js/steps.js') }}" defer></script>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
Cached at install time, so it has to stand entirely on its own: no user, no
|
Cached at install time, so it has to stand entirely on its own: no user, no
|
||||||
chats, nothing that was rendered from the database. One of the few places
|
chats, nothing that was rendered from the database. One of the few places
|
||||||
flavour belongs -- see the flavour rule in CLAUDE.md.
|
flavour belongs -- see the flavour rule in the working notes.
|
||||||
#}
|
#}
|
||||||
|
|
||||||
{% block title %}Offline - {{ brand.name }}{% endblock %}
|
{% block title %}Offline - {{ brand.name }}{% endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user