ommlds 0.0.0.dev466__py3-none-any.whl → 0.0.0.dev512__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.
- ommlds/.omlish-manifests.json +404 -31
- ommlds/README.md +11 -0
- ommlds/__about__.py +21 -12
- ommlds/_hacks/__init__.py +4 -0
- ommlds/_hacks/funcs.py +110 -0
- ommlds/_hacks/names.py +158 -0
- ommlds/_hacks/params.py +73 -0
- ommlds/_hacks/patches.py +0 -3
- ommlds/backends/anthropic/protocol/__init__.py +13 -1
- ommlds/backends/anthropic/protocol/_dataclasses.py +1625 -0
- ommlds/backends/anthropic/protocol/sse/events.py +2 -0
- ommlds/backends/anthropic/protocol/types.py +5 -7
- ommlds/backends/cerebras/__init__.py +7 -0
- ommlds/backends/cerebras/_dataclasses.py +4254 -0
- ommlds/backends/cerebras/_marshal.py +24 -0
- ommlds/backends/cerebras/clients.py +9 -0
- ommlds/backends/cerebras/protocol.py +310 -0
- ommlds/backends/google/protocol/__init__.py +13 -0
- ommlds/backends/google/protocol/_dataclasses.py +5997 -0
- ommlds/backends/google/protocol/types.py +6 -8
- ommlds/backends/groq/__init__.py +7 -0
- ommlds/backends/groq/_dataclasses.py +3901 -0
- ommlds/backends/groq/_marshal.py +23 -0
- ommlds/backends/groq/clients.py +9 -0
- ommlds/backends/groq/protocol.py +247 -0
- ommlds/{huggingface.py → backends/huggingface/cache.py} +1 -6
- ommlds/backends/huggingface/cli.py +208 -0
- ommlds/backends/llamacpp/logging.py +4 -1
- ommlds/backends/mlx/caching.py +7 -3
- ommlds/backends/mlx/cli.py +10 -7
- ommlds/backends/mlx/generation.py +18 -16
- ommlds/backends/mlx/limits.py +10 -6
- ommlds/backends/mlx/loading.py +7 -4
- ommlds/backends/ollama/__init__.py +7 -0
- ommlds/backends/ollama/_dataclasses.py +3940 -0
- ommlds/backends/ollama/cli.py +36 -0
- ommlds/backends/ollama/protocol.py +201 -0
- ommlds/backends/openai/protocol/__init__.py +15 -1
- ommlds/backends/openai/protocol/_common.py +3 -5
- ommlds/backends/openai/protocol/_dataclasses.py +7708 -0
- ommlds/backends/tavily/__init__.py +7 -0
- ommlds/backends/tavily/_dataclasses.py +1734 -0
- ommlds/backends/tavily/protocol.py +299 -0
- ommlds/backends/tinygrad/models/llama3/__init__.py +22 -14
- ommlds/backends/torch/backends.py +1 -1
- ommlds/backends/transformers/__init__.py +14 -0
- ommlds/backends/transformers/filecache.py +109 -0
- ommlds/backends/transformers/streamers.py +73 -0
- ommlds/cli/__init__.py +7 -0
- ommlds/cli/_dataclasses.py +3835 -0
- ommlds/cli/asyncs.py +30 -0
- ommlds/cli/backends/catalog.py +88 -0
- ommlds/cli/backends/configs.py +9 -0
- ommlds/cli/backends/inject.py +100 -42
- ommlds/cli/{sessions/chat/backends → backends}/injection.py +1 -1
- ommlds/cli/backends/meta.py +82 -0
- ommlds/cli/{sessions/chat/backends → backends}/types.py +11 -1
- ommlds/cli/{sessions/chat/content → content}/messages.py +2 -2
- ommlds/cli/{sessions/chat/content → content}/strings.py +1 -1
- ommlds/cli/inject.py +17 -8
- ommlds/cli/inputs/asyncs.py +32 -0
- ommlds/cli/inputs/sync.py +75 -0
- ommlds/cli/main.py +346 -114
- ommlds/cli/rendering/configs.py +9 -0
- ommlds/cli/{sessions/chat/rendering → rendering}/inject.py +4 -5
- ommlds/cli/{sessions/chat/rendering → rendering}/markdown.py +1 -1
- ommlds/cli/{sessions/chat/rendering → rendering}/raw.py +1 -1
- ommlds/cli/{sessions/chat/rendering → rendering}/types.py +7 -1
- ommlds/cli/secrets.py +22 -0
- ommlds/cli/sessions/base.py +1 -10
- ommlds/cli/sessions/chat/configs.py +13 -30
- ommlds/cli/sessions/chat/drivers/ai/configs.py +13 -0
- ommlds/cli/sessions/chat/drivers/ai/events.py +57 -0
- ommlds/cli/sessions/chat/{chat → drivers}/ai/inject.py +15 -12
- ommlds/cli/sessions/chat/{chat → drivers}/ai/rendering.py +8 -8
- ommlds/cli/sessions/chat/{chat → drivers}/ai/services.py +5 -5
- ommlds/cli/sessions/chat/{chat → drivers}/ai/tools.py +4 -8
- ommlds/cli/sessions/chat/{chat → drivers}/ai/types.py +10 -1
- ommlds/cli/sessions/chat/drivers/configs.py +25 -0
- ommlds/cli/sessions/chat/drivers/events/inject.py +27 -0
- ommlds/cli/sessions/chat/drivers/events/injection.py +14 -0
- ommlds/cli/sessions/chat/drivers/events/manager.py +16 -0
- ommlds/cli/sessions/chat/drivers/events/types.py +44 -0
- ommlds/cli/sessions/chat/drivers/impl.py +50 -0
- ommlds/cli/sessions/chat/drivers/inject.py +70 -0
- ommlds/cli/sessions/chat/drivers/state/configs.py +13 -0
- ommlds/cli/sessions/chat/drivers/state/ids.py +25 -0
- ommlds/cli/sessions/chat/drivers/state/inject.py +83 -0
- ommlds/cli/sessions/chat/{chat → drivers}/state/inmemory.py +1 -6
- ommlds/cli/sessions/chat/{chat → drivers}/state/storage.py +18 -12
- ommlds/cli/sessions/chat/{chat → drivers}/state/types.py +11 -6
- ommlds/cli/sessions/chat/drivers/tools/configs.py +22 -0
- ommlds/cli/sessions/chat/drivers/tools/confirmation.py +44 -0
- ommlds/cli/sessions/chat/drivers/tools/errorhandling.py +39 -0
- ommlds/cli/sessions/chat/{tools → drivers/tools}/execution.py +3 -4
- ommlds/cli/sessions/chat/drivers/tools/fs/__init__.py +0 -0
- ommlds/cli/sessions/chat/drivers/tools/fs/configs.py +12 -0
- ommlds/cli/sessions/chat/drivers/tools/fs/inject.py +35 -0
- ommlds/cli/sessions/chat/drivers/tools/inject.py +83 -0
- ommlds/cli/sessions/chat/{tools → drivers/tools}/injection.py +20 -5
- ommlds/cli/sessions/chat/{tools → drivers/tools}/rendering.py +3 -3
- ommlds/cli/sessions/chat/drivers/tools/todo/__init__.py +0 -0
- ommlds/cli/sessions/chat/drivers/tools/todo/configs.py +12 -0
- ommlds/cli/sessions/chat/drivers/tools/todo/inject.py +31 -0
- ommlds/cli/sessions/chat/drivers/tools/weather/__init__.py +0 -0
- ommlds/cli/sessions/chat/drivers/tools/weather/configs.py +12 -0
- ommlds/cli/sessions/chat/drivers/tools/weather/inject.py +22 -0
- ommlds/cli/sessions/chat/{tools/weather.py → drivers/tools/weather/tools.py} +1 -1
- ommlds/cli/sessions/chat/drivers/types.py +31 -0
- ommlds/cli/sessions/chat/drivers/user/__init__.py +0 -0
- ommlds/cli/sessions/chat/drivers/user/configs.py +14 -0
- ommlds/cli/sessions/chat/drivers/user/inject.py +41 -0
- ommlds/cli/sessions/chat/facades/__init__.py +0 -0
- ommlds/cli/sessions/chat/facades/commands/__init__.py +0 -0
- ommlds/cli/sessions/chat/facades/commands/base.py +83 -0
- ommlds/cli/sessions/chat/facades/commands/configs.py +9 -0
- ommlds/cli/sessions/chat/facades/commands/inject.py +41 -0
- ommlds/cli/sessions/chat/facades/commands/injection.py +15 -0
- ommlds/cli/sessions/chat/facades/commands/manager.py +59 -0
- ommlds/cli/sessions/chat/facades/commands/simple.py +34 -0
- ommlds/cli/sessions/chat/facades/commands/types.py +13 -0
- ommlds/cli/sessions/chat/facades/configs.py +11 -0
- ommlds/cli/sessions/chat/facades/facade.py +26 -0
- ommlds/cli/sessions/chat/facades/inject.py +35 -0
- ommlds/cli/sessions/chat/facades/ui.py +34 -0
- ommlds/cli/sessions/chat/inject.py +10 -49
- ommlds/cli/sessions/chat/interfaces/__init__.py +0 -0
- ommlds/cli/sessions/chat/interfaces/bare/__init__.py +0 -0
- ommlds/cli/sessions/chat/interfaces/bare/configs.py +15 -0
- ommlds/cli/sessions/chat/interfaces/bare/inject.py +69 -0
- ommlds/cli/sessions/chat/interfaces/bare/interactive.py +49 -0
- ommlds/cli/sessions/chat/interfaces/bare/oneshot.py +21 -0
- ommlds/cli/sessions/chat/{tools/confirmation.py → interfaces/bare/tools.py} +3 -22
- ommlds/cli/sessions/chat/interfaces/base.py +13 -0
- ommlds/cli/sessions/chat/interfaces/configs.py +11 -0
- ommlds/cli/sessions/chat/interfaces/inject.py +29 -0
- ommlds/cli/sessions/chat/interfaces/textual/__init__.py +0 -0
- ommlds/cli/sessions/chat/interfaces/textual/app.py +429 -0
- ommlds/cli/sessions/chat/interfaces/textual/configs.py +11 -0
- ommlds/cli/sessions/chat/interfaces/textual/facades.py +19 -0
- ommlds/cli/sessions/chat/interfaces/textual/inject.py +111 -0
- ommlds/cli/sessions/chat/interfaces/textual/inputhistory.py +174 -0
- ommlds/cli/sessions/chat/interfaces/textual/interface.py +24 -0
- ommlds/cli/sessions/chat/interfaces/textual/styles/__init__.py +29 -0
- ommlds/cli/sessions/chat/interfaces/textual/styles/input.tcss +53 -0
- ommlds/cli/sessions/chat/interfaces/textual/styles/markdown.tcss +7 -0
- ommlds/cli/sessions/chat/interfaces/textual/styles/messages.tcss +167 -0
- ommlds/cli/sessions/chat/interfaces/textual/tools.py +38 -0
- ommlds/cli/sessions/chat/interfaces/textual/widgets/__init__.py +0 -0
- ommlds/cli/sessions/chat/interfaces/textual/widgets/input.py +70 -0
- ommlds/cli/sessions/chat/interfaces/textual/widgets/messages.py +207 -0
- ommlds/cli/sessions/chat/session.py +8 -13
- ommlds/cli/sessions/completion/configs.py +5 -6
- ommlds/cli/sessions/completion/inject.py +15 -2
- ommlds/cli/sessions/completion/session.py +10 -18
- ommlds/cli/sessions/configs.py +10 -0
- ommlds/cli/sessions/embedding/configs.py +5 -6
- ommlds/cli/sessions/embedding/inject.py +15 -2
- ommlds/cli/sessions/embedding/session.py +10 -18
- ommlds/cli/sessions/inject.py +15 -15
- ommlds/cli/state/storage.py +8 -2
- ommlds/minichain/__init__.py +217 -60
- ommlds/minichain/_dataclasses.py +20640 -0
- ommlds/minichain/_typedvalues.py +15 -8
- ommlds/minichain/backends/catalogs/base.py +20 -1
- ommlds/minichain/backends/catalogs/simple.py +2 -2
- ommlds/minichain/backends/catalogs/strings.py +13 -10
- ommlds/minichain/backends/impls/anthropic/chat.py +28 -5
- ommlds/minichain/backends/impls/anthropic/names.py +3 -3
- ommlds/minichain/backends/impls/anthropic/protocol.py +2 -2
- ommlds/minichain/backends/impls/anthropic/stream.py +23 -18
- ommlds/minichain/backends/impls/cerebras/__init__.py +0 -0
- ommlds/minichain/backends/impls/cerebras/chat.py +82 -0
- ommlds/minichain/backends/impls/cerebras/names.py +45 -0
- ommlds/minichain/backends/impls/cerebras/protocol.py +143 -0
- ommlds/minichain/backends/impls/cerebras/stream.py +114 -0
- ommlds/minichain/backends/impls/duckduckgo/search.py +5 -1
- ommlds/minichain/backends/impls/dummy/__init__.py +0 -0
- ommlds/minichain/backends/impls/dummy/chat.py +69 -0
- ommlds/minichain/backends/impls/google/chat.py +20 -84
- ommlds/minichain/backends/impls/google/names.py +6 -0
- ommlds/minichain/backends/impls/google/protocol.py +105 -0
- ommlds/minichain/backends/impls/google/search.py +10 -5
- ommlds/minichain/backends/impls/google/stream.py +64 -142
- ommlds/minichain/backends/impls/google/tools.py +2 -2
- ommlds/minichain/backends/impls/groq/__init__.py +0 -0
- ommlds/minichain/backends/impls/groq/chat.py +77 -0
- ommlds/minichain/backends/impls/groq/names.py +48 -0
- ommlds/minichain/backends/impls/groq/protocol.py +143 -0
- ommlds/minichain/backends/impls/groq/stream.py +114 -0
- ommlds/minichain/backends/impls/huggingface/repos.py +1 -5
- ommlds/minichain/backends/impls/llamacpp/chat.py +15 -3
- ommlds/minichain/backends/impls/llamacpp/completion.py +7 -3
- ommlds/minichain/backends/impls/llamacpp/stream.py +38 -19
- ommlds/minichain/backends/impls/mistral.py +9 -2
- ommlds/minichain/backends/impls/mlx/chat.py +100 -23
- ommlds/minichain/backends/impls/ollama/__init__.py +0 -0
- ommlds/minichain/backends/impls/ollama/chat.py +193 -0
- ommlds/minichain/backends/impls/ollama/protocol.py +144 -0
- ommlds/minichain/backends/impls/openai/chat.py +14 -7
- ommlds/minichain/backends/impls/openai/completion.py +9 -2
- ommlds/minichain/backends/impls/openai/embedding.py +9 -2
- ommlds/minichain/backends/impls/openai/format.py +117 -115
- ommlds/minichain/backends/impls/openai/names.py +33 -5
- ommlds/minichain/backends/impls/openai/stream.py +61 -70
- ommlds/minichain/backends/impls/sentencepiece/tokens.py +9 -6
- ommlds/minichain/backends/impls/tavily.py +66 -0
- ommlds/minichain/backends/impls/tinygrad/chat.py +17 -14
- ommlds/minichain/backends/impls/tokenizers/tokens.py +9 -6
- ommlds/minichain/backends/impls/transformers/sentence.py +5 -2
- ommlds/minichain/backends/impls/transformers/tokens.py +9 -6
- ommlds/minichain/backends/impls/transformers/transformers.py +139 -20
- ommlds/minichain/backends/strings/parsing.py +2 -2
- ommlds/minichain/backends/strings/resolving.py +7 -2
- ommlds/minichain/chat/choices/stream/__init__.py +0 -0
- ommlds/minichain/chat/{stream → choices/stream}/adapters.py +7 -7
- ommlds/minichain/chat/choices/stream/joining.py +31 -0
- ommlds/minichain/chat/choices/stream/services.py +45 -0
- ommlds/minichain/chat/choices/stream/types.py +43 -0
- ommlds/minichain/chat/content.py +42 -0
- ommlds/minichain/chat/messages.py +46 -42
- ommlds/minichain/chat/stream/_marshal.py +4 -4
- ommlds/minichain/chat/stream/joining.py +56 -43
- ommlds/minichain/chat/stream/services.py +15 -15
- ommlds/minichain/chat/stream/types.py +17 -24
- ommlds/minichain/chat/templating.py +3 -3
- ommlds/minichain/content/__init__.py +20 -3
- ommlds/minichain/content/_marshal.py +181 -55
- ommlds/minichain/content/code.py +26 -0
- ommlds/minichain/content/composite.py +28 -0
- ommlds/minichain/content/content.py +27 -0
- ommlds/minichain/content/dynamic.py +12 -0
- ommlds/minichain/content/emphasis.py +27 -0
- ommlds/minichain/content/images.py +2 -2
- ommlds/minichain/content/json.py +2 -2
- ommlds/minichain/content/link.py +13 -0
- ommlds/minichain/content/markdown.py +12 -0
- ommlds/minichain/content/metadata.py +10 -0
- ommlds/minichain/content/namespaces.py +8 -0
- ommlds/minichain/content/placeholders.py +10 -9
- ommlds/minichain/content/quote.py +26 -0
- ommlds/minichain/content/raw.py +49 -0
- ommlds/minichain/content/recursive.py +12 -0
- ommlds/minichain/content/resources.py +22 -0
- ommlds/minichain/content/section.py +26 -0
- ommlds/minichain/content/sequence.py +17 -3
- ommlds/minichain/content/standard.py +32 -0
- ommlds/minichain/content/tag.py +28 -0
- ommlds/minichain/content/templates.py +13 -0
- ommlds/minichain/content/text.py +2 -2
- ommlds/minichain/content/transform/__init__.py +0 -0
- ommlds/minichain/content/transform/json.py +55 -0
- ommlds/minichain/content/transform/markdown.py +8 -0
- ommlds/minichain/content/transform/materialize.py +59 -0
- ommlds/minichain/content/transform/metadata.py +16 -0
- ommlds/minichain/content/transform/namespaces.py +20 -0
- ommlds/minichain/content/transform/placeholders.py +60 -0
- ommlds/minichain/content/{prepare.py → transform/prepare.py} +10 -15
- ommlds/minichain/content/transform/recursive.py +54 -0
- ommlds/minichain/content/transform/resources.py +58 -0
- ommlds/minichain/content/transform/standard.py +43 -0
- ommlds/minichain/content/{transforms → transform}/stringify.py +1 -7
- ommlds/minichain/content/transform/strings.py +33 -0
- ommlds/minichain/content/transform/templates.py +25 -0
- ommlds/minichain/content/transform/types.py +18 -0
- ommlds/minichain/content/transform/visitors.py +38 -0
- ommlds/minichain/content/visitors.py +218 -0
- ommlds/minichain/http/__init__.py +0 -0
- ommlds/minichain/http/stream.py +195 -0
- ommlds/minichain/lib/fs/tools/read.py +1 -1
- ommlds/minichain/lib/fs/tools/recursivels/rendering.py +1 -1
- ommlds/minichain/lib/fs/tools/recursivels/running.py +1 -1
- ommlds/minichain/lib/todo/tools/write.py +2 -1
- ommlds/minichain/lib/todo/types.py +1 -1
- ommlds/minichain/llms/types.py +4 -0
- ommlds/minichain/metadata.py +56 -2
- ommlds/minichain/models/configs.py +2 -2
- ommlds/minichain/models/names.py +2 -0
- ommlds/minichain/registries/globals.py +18 -4
- ommlds/minichain/resources.py +49 -3
- ommlds/minichain/search.py +1 -1
- ommlds/minichain/services/README.md +154 -0
- ommlds/minichain/services/__init__.py +6 -2
- ommlds/minichain/services/_marshal.py +46 -10
- ommlds/minichain/services/_origclasses.py +11 -0
- ommlds/minichain/services/_typedvalues.py +8 -3
- ommlds/minichain/services/requests.py +73 -3
- ommlds/minichain/services/responses.py +73 -3
- ommlds/minichain/services/services.py +9 -0
- ommlds/minichain/standard.py +8 -0
- ommlds/minichain/stream/services.py +43 -17
- ommlds/minichain/text/applypatch.py +2 -1
- ommlds/minichain/text/toolparsing/llamacpp/types.py +1 -1
- ommlds/minichain/tokens/specials.py +1 -1
- ommlds/minichain/tools/execution/catalog.py +2 -2
- ommlds/minichain/tools/execution/errorhandling.py +36 -0
- ommlds/minichain/tools/execution/errors.py +2 -2
- ommlds/minichain/tools/execution/executors.py +1 -1
- ommlds/minichain/tools/fns.py +1 -1
- ommlds/minichain/tools/jsonschema.py +2 -2
- ommlds/minichain/tools/reflect.py +11 -7
- ommlds/minichain/tools/types.py +16 -19
- ommlds/minichain/vectors/_marshal.py +1 -1
- ommlds/minichain/vectors/embeddings.py +1 -1
- ommlds/minichain/wrappers/__init__.py +7 -0
- ommlds/minichain/wrappers/firstinwins.py +144 -0
- ommlds/minichain/wrappers/instrument.py +146 -0
- ommlds/minichain/wrappers/retry.py +168 -0
- ommlds/minichain/wrappers/services.py +98 -0
- ommlds/minichain/wrappers/stream.py +57 -0
- ommlds/nanochat/LICENSE +21 -0
- ommlds/nanochat/__init__.py +0 -0
- ommlds/nanochat/rustbpe/LICENSE +21 -0
- ommlds/nanochat/rustbpe/README.md +10 -0
- ommlds/nanochat/tokenizers.py +440 -0
- ommlds/specs/__init__.py +0 -0
- ommlds/specs/mcp/__init__.py +0 -0
- ommlds/specs/mcp/_marshal.py +23 -0
- ommlds/specs/mcp/clients.py +146 -0
- ommlds/specs/mcp/protocol.py +369 -0
- ommlds/tools/git.py +84 -64
- ommlds/tools/ocr.py +1 -1
- ommlds/wiki/analyze.py +2 -2
- ommlds/wiki/models.py +4 -4
- ommlds/wiki/text/mfh.py +9 -9
- ommlds/wiki/utils/xml.py +5 -5
- {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/METADATA +28 -21
- ommlds-0.0.0.dev512.dist-info/RECORD +534 -0
- {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/WHEEL +1 -1
- ommlds/cli/backends/standard.py +0 -20
- ommlds/cli/sessions/chat/backends/catalog.py +0 -56
- ommlds/cli/sessions/chat/backends/inject.py +0 -37
- ommlds/cli/sessions/chat/chat/state/inject.py +0 -40
- ommlds/cli/sessions/chat/chat/user/inject.py +0 -61
- ommlds/cli/sessions/chat/chat/user/interactive.py +0 -29
- ommlds/cli/sessions/chat/chat/user/oneshot.py +0 -25
- ommlds/cli/sessions/chat/chat/user/types.py +0 -15
- ommlds/cli/sessions/chat/driver.py +0 -43
- ommlds/cli/sessions/chat/tools/inject.py +0 -145
- ommlds/minichain/backends/impls/openai/format2.py +0 -210
- ommlds/minichain/content/materialize.py +0 -196
- ommlds/minichain/content/simple.py +0 -47
- ommlds/minichain/content/transforms/base.py +0 -46
- ommlds/minichain/content/transforms/interleave.py +0 -70
- ommlds/minichain/content/transforms/squeeze.py +0 -72
- ommlds/minichain/content/transforms/strings.py +0 -24
- ommlds/minichain/content/types.py +0 -43
- ommlds/minichain/stream/wrap.py +0 -62
- ommlds-0.0.0.dev466.dist-info/RECORD +0 -376
- /ommlds/{cli/sessions/chat/backends → backends/huggingface}/__init__.py +0 -0
- /ommlds/cli/{sessions/chat/chat → content}/__init__.py +0 -0
- /ommlds/cli/{sessions/chat/chat/ai → inputs}/__init__.py +0 -0
- /ommlds/cli/{sessions/chat/chat/state → rendering}/__init__.py +0 -0
- /ommlds/cli/sessions/chat/{chat/user → drivers}/__init__.py +0 -0
- /ommlds/cli/sessions/chat/{content → drivers/ai}/__init__.py +0 -0
- /ommlds/cli/sessions/chat/{chat → drivers}/ai/injection.py +0 -0
- /ommlds/cli/sessions/chat/{phases → drivers/events}/__init__.py +0 -0
- /ommlds/cli/sessions/chat/{rendering → drivers/phases}/__init__.py +0 -0
- /ommlds/cli/sessions/chat/{phases → drivers/phases}/inject.py +0 -0
- /ommlds/cli/sessions/chat/{phases → drivers/phases}/injection.py +0 -0
- /ommlds/cli/sessions/chat/{phases → drivers/phases}/manager.py +0 -0
- /ommlds/cli/sessions/chat/{phases → drivers/phases}/types.py +0 -0
- /ommlds/cli/sessions/chat/{tools → drivers/state}/__init__.py +0 -0
- /ommlds/{minichain/content/transforms → cli/sessions/chat/drivers/tools}/__init__.py +0 -0
- {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/entry_points.txt +0 -0
- {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/licenses/LICENSE +0 -0
- {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
import asyncio
|
|
3
|
+
import typing as ta
|
|
4
|
+
|
|
5
|
+
from omdev.tui import textual as tx
|
|
6
|
+
from omlish import lang
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class MessagesContainer(tx.VerticalScroll):
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
##
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class MessageDivider(tx.Static):
|
|
20
|
+
def __init__(self) -> None:
|
|
21
|
+
super().__init__()
|
|
22
|
+
|
|
23
|
+
self.add_class('message-divider')
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class Message(tx.Static, lang.Abstract):
|
|
30
|
+
def __init__(self, *args: ta.Any, **kwargs: ta.Any) -> None:
|
|
31
|
+
super().__init__(*args, **kwargs)
|
|
32
|
+
|
|
33
|
+
self.add_class('message')
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class WelcomeMessage(Message):
|
|
40
|
+
def __init__(self, content: str) -> None:
|
|
41
|
+
super().__init__()
|
|
42
|
+
|
|
43
|
+
self.add_class('welcome-message')
|
|
44
|
+
|
|
45
|
+
self._content = content
|
|
46
|
+
|
|
47
|
+
def compose(self) -> tx.ComposeResult:
|
|
48
|
+
with tx.Vertical(classes='welcome-message-outer message-outer'):
|
|
49
|
+
yield tx.Static(self._content, classes='welcome-message-content')
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
#
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class UserMessage(Message):
|
|
56
|
+
def __init__(self, content: str) -> None:
|
|
57
|
+
super().__init__()
|
|
58
|
+
|
|
59
|
+
self.add_class('user-message')
|
|
60
|
+
|
|
61
|
+
self._content = content
|
|
62
|
+
|
|
63
|
+
def compose(self) -> tx.ComposeResult:
|
|
64
|
+
with tx.Horizontal(classes='user-message-outer message-outer'):
|
|
65
|
+
yield tx.Static('> ', classes='user-message-glyph message-glyph')
|
|
66
|
+
with tx.Vertical(classes='user-message-inner message-inner'):
|
|
67
|
+
yield tx.Static(self._content)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class AiMessage(Message, lang.Abstract):
|
|
74
|
+
def __init__(self) -> None:
|
|
75
|
+
super().__init__()
|
|
76
|
+
|
|
77
|
+
self.add_class('ai-message')
|
|
78
|
+
|
|
79
|
+
def compose(self) -> tx.ComposeResult:
|
|
80
|
+
with tx.Horizontal(classes='ai-message-outer message-outer'):
|
|
81
|
+
yield tx.Static('< ', classes='ai-message-glyph message-glyph')
|
|
82
|
+
with tx.Vertical(classes='ai-message-inner message-inner'):
|
|
83
|
+
yield from self._compose_content()
|
|
84
|
+
|
|
85
|
+
@abc.abstractmethod
|
|
86
|
+
def _compose_content(self) -> ta.Generator:
|
|
87
|
+
raise NotImplementedError
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class StaticAiMessage(AiMessage):
|
|
91
|
+
def __init__(
|
|
92
|
+
self,
|
|
93
|
+
content: str,
|
|
94
|
+
*,
|
|
95
|
+
markdown: bool = False,
|
|
96
|
+
) -> None:
|
|
97
|
+
super().__init__()
|
|
98
|
+
|
|
99
|
+
self._content = content
|
|
100
|
+
self._markdown = markdown
|
|
101
|
+
|
|
102
|
+
def _compose_content(self) -> ta.Generator:
|
|
103
|
+
if self._markdown:
|
|
104
|
+
yield tx.Markdown(self._content)
|
|
105
|
+
else:
|
|
106
|
+
yield tx.Static(self._content)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class StreamAiMessage(AiMessage):
|
|
110
|
+
def __init__(self, content: str) -> None:
|
|
111
|
+
super().__init__()
|
|
112
|
+
|
|
113
|
+
self._content = content
|
|
114
|
+
|
|
115
|
+
def _compose_content(self) -> ta.Generator:
|
|
116
|
+
yield tx.Markdown('')
|
|
117
|
+
|
|
118
|
+
_stream_: tx.MarkdownStream | None = None
|
|
119
|
+
|
|
120
|
+
def _stream(self) -> tx.MarkdownStream:
|
|
121
|
+
if self._stream_ is None:
|
|
122
|
+
self._stream_ = tx.Markdown.get_stream(self.query_one(tx.Markdown))
|
|
123
|
+
return self._stream_
|
|
124
|
+
|
|
125
|
+
async def write_initial_content(self) -> None:
|
|
126
|
+
if self._content:
|
|
127
|
+
await self._stream().write(self._content)
|
|
128
|
+
|
|
129
|
+
async def append_content(self, content: str) -> None:
|
|
130
|
+
if not content:
|
|
131
|
+
return
|
|
132
|
+
|
|
133
|
+
self._content += content
|
|
134
|
+
await self._stream().write(content)
|
|
135
|
+
|
|
136
|
+
async def stop_stream(self) -> None:
|
|
137
|
+
if (stream := self._stream_) is None:
|
|
138
|
+
return
|
|
139
|
+
|
|
140
|
+
await stream.stop()
|
|
141
|
+
self._stream_ = None
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
#
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class ToolConfirmationControls(tx.Static):
|
|
148
|
+
class Allowed(tx.Message):
|
|
149
|
+
pass
|
|
150
|
+
|
|
151
|
+
def compose(self) -> tx.ComposeResult:
|
|
152
|
+
yield tx.Button('Allow', action='allow')
|
|
153
|
+
|
|
154
|
+
def action_allow(self) -> None:
|
|
155
|
+
self.post_message(self.Allowed())
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class ToolConfirmationMessage(Message):
|
|
159
|
+
def __init__(
|
|
160
|
+
self,
|
|
161
|
+
outer_content: str,
|
|
162
|
+
inner_content: str,
|
|
163
|
+
fut: asyncio.Future[bool],
|
|
164
|
+
) -> None:
|
|
165
|
+
super().__init__()
|
|
166
|
+
|
|
167
|
+
self.add_class('tool-confirmation-message')
|
|
168
|
+
|
|
169
|
+
self._outer_content = outer_content
|
|
170
|
+
self._inner_content = inner_content
|
|
171
|
+
self._fut = fut
|
|
172
|
+
|
|
173
|
+
def compose(self) -> tx.ComposeResult:
|
|
174
|
+
with tx.Horizontal(classes='tool-confirmation-message-outer message-outer'):
|
|
175
|
+
yield tx.Static('? ', classes='tool-confirmation-message-glyph message-glyph')
|
|
176
|
+
with tx.Vertical(classes='tool-confirmation-message-inner tool-confirmation-message-inner-open message-inner'): # noqa
|
|
177
|
+
yield tx.Static(self._outer_content, classes='tool-confirmation-message-outer-content')
|
|
178
|
+
yield tx.Static(self._inner_content, classes='tool-confirmation-message-inner-content')
|
|
179
|
+
yield ToolConfirmationControls(classes='tool-confirmation-message-controls')
|
|
180
|
+
|
|
181
|
+
@tx.on(ToolConfirmationControls.Allowed)
|
|
182
|
+
async def on_allowed(self, event: ToolConfirmationControls.Allowed) -> None:
|
|
183
|
+
inner = self.query_one(tx.Vertical)
|
|
184
|
+
await inner.query_one(ToolConfirmationControls).remove()
|
|
185
|
+
inner.remove_class('tool-confirmation-message-inner-open')
|
|
186
|
+
inner.add_class('tool-confirmation-message-inner-closed')
|
|
187
|
+
inner.query_one('.tool-confirmation-message-outer-content', tx.Static).update('Tool use confirmed.')
|
|
188
|
+
|
|
189
|
+
self._fut.set_result(True)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
#
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class UiMessage(Message):
|
|
196
|
+
def __init__(self, content: str) -> None:
|
|
197
|
+
super().__init__()
|
|
198
|
+
|
|
199
|
+
self.add_class('ui-message')
|
|
200
|
+
|
|
201
|
+
self._content = content
|
|
202
|
+
|
|
203
|
+
def compose(self) -> tx.ComposeResult:
|
|
204
|
+
with tx.Horizontal(classes='ui-message-outer message-outer'):
|
|
205
|
+
yield tx.Static('~ ', classes='ui-message-glyph message-glyph')
|
|
206
|
+
with tx.Vertical(classes='ui-message-inner message-inner'):
|
|
207
|
+
yield tx.Static(self._content)
|
|
@@ -1,27 +1,22 @@
|
|
|
1
|
-
import
|
|
1
|
+
import typing as ta
|
|
2
2
|
|
|
3
3
|
from ..base import Session
|
|
4
|
-
from .
|
|
5
|
-
from .driver import ChatDriver
|
|
4
|
+
from .interfaces.base import ChatInterface
|
|
6
5
|
|
|
7
6
|
|
|
8
7
|
##
|
|
9
8
|
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class Config(Session.Config, ChatConfig):
|
|
14
|
-
pass
|
|
15
|
-
|
|
10
|
+
@ta.final
|
|
11
|
+
class ChatSession(Session):
|
|
16
12
|
def __init__(
|
|
17
13
|
self,
|
|
18
|
-
config: Config,
|
|
19
14
|
*,
|
|
20
|
-
|
|
15
|
+
interface: ChatInterface,
|
|
21
16
|
) -> None:
|
|
22
|
-
super().__init__(
|
|
17
|
+
super().__init__()
|
|
23
18
|
|
|
24
|
-
self.
|
|
19
|
+
self._interface = interface
|
|
25
20
|
|
|
26
21
|
async def run(self) -> None:
|
|
27
|
-
await self.
|
|
22
|
+
await self._interface.run()
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import dataclasses as dc
|
|
1
|
+
from omlish import dataclasses as dc
|
|
2
2
|
|
|
3
3
|
from .... import minichain as mc
|
|
4
|
+
from ..configs import SessionConfig
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
##
|
|
7
8
|
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
DEFAULT_BACKEND = 'openai'
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
##
|
|
13
14
|
|
|
14
15
|
|
|
15
|
-
@dc.dataclass(frozen=True)
|
|
16
|
-
class CompletionConfig:
|
|
16
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
|
17
|
+
class CompletionConfig(SessionConfig):
|
|
17
18
|
content: 'mc.Content'
|
|
18
19
|
|
|
19
|
-
_: dc.KW_ONLY
|
|
20
|
-
|
|
21
20
|
backend: str | None = None
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
from omlish import dataclasses as dc
|
|
2
1
|
from omlish import inject as inj
|
|
3
2
|
from omlish import lang
|
|
4
3
|
|
|
4
|
+
from ...backends.configs import BackendConfig
|
|
5
|
+
from ...backends.types import DefaultBackendName
|
|
5
6
|
from ..base import Session
|
|
7
|
+
from .configs import DEFAULT_BACKEND
|
|
6
8
|
from .configs import CompletionConfig
|
|
7
9
|
|
|
8
10
|
|
|
9
11
|
with lang.auto_proxy_import(globals()):
|
|
12
|
+
from ...backends import inject as _backends
|
|
10
13
|
from . import session as _session
|
|
11
14
|
|
|
12
15
|
|
|
@@ -19,10 +22,20 @@ def bind_completion(cfg: CompletionConfig) -> inj.Elements:
|
|
|
19
22
|
#
|
|
20
23
|
|
|
21
24
|
els.extend([
|
|
22
|
-
inj.bind(
|
|
25
|
+
inj.bind(cfg),
|
|
23
26
|
inj.bind(Session, to_ctor=_session.CompletionSession, singleton=True),
|
|
24
27
|
])
|
|
25
28
|
|
|
26
29
|
#
|
|
27
30
|
|
|
31
|
+
els.extend([
|
|
32
|
+
_backends.bind_backends(BackendConfig(
|
|
33
|
+
backend=cfg.backend,
|
|
34
|
+
)),
|
|
35
|
+
|
|
36
|
+
inj.bind(DefaultBackendName, to_const=DEFAULT_BACKEND),
|
|
37
|
+
])
|
|
38
|
+
|
|
39
|
+
#
|
|
40
|
+
|
|
28
41
|
return inj.as_elements(*els)
|
|
@@ -1,39 +1,31 @@
|
|
|
1
|
-
import dataclasses as dc
|
|
2
|
-
|
|
3
1
|
from omlish import check
|
|
4
|
-
from omlish import lang
|
|
5
2
|
|
|
6
3
|
from .... import minichain as mc
|
|
4
|
+
from ...backends.types import CompletionServiceBackendProvider
|
|
7
5
|
from ..base import Session
|
|
8
|
-
from .configs import DEFAULT_COMPLETION_MODEL_BACKEND
|
|
9
6
|
from .configs import CompletionConfig
|
|
10
7
|
|
|
11
8
|
|
|
12
9
|
##
|
|
13
10
|
|
|
14
11
|
|
|
15
|
-
class CompletionSession(Session
|
|
16
|
-
@dc.dataclass(frozen=True)
|
|
17
|
-
class Config(Session.Config, CompletionConfig):
|
|
18
|
-
pass
|
|
19
|
-
|
|
12
|
+
class CompletionSession(Session):
|
|
20
13
|
def __init__(
|
|
21
14
|
self,
|
|
22
|
-
config:
|
|
15
|
+
config: CompletionConfig,
|
|
23
16
|
*,
|
|
24
|
-
|
|
17
|
+
service_provider: CompletionServiceBackendProvider,
|
|
25
18
|
) -> None:
|
|
26
|
-
super().__init__(
|
|
19
|
+
super().__init__()
|
|
27
20
|
|
|
28
|
-
self.
|
|
21
|
+
self._config = config
|
|
22
|
+
self._service_provider = service_provider
|
|
29
23
|
|
|
30
24
|
async def run(self) -> None:
|
|
31
25
|
prompt = check.isinstance(self._config.content, str)
|
|
32
26
|
|
|
33
27
|
mdl: mc.CompletionService
|
|
34
|
-
async with
|
|
35
|
-
mc.CompletionService,
|
|
36
|
-
self._config.backend or DEFAULT_COMPLETION_MODEL_BACKEND,
|
|
37
|
-
)) as mdl:
|
|
28
|
+
async with self._service_provider.provide_backend() as mdl:
|
|
38
29
|
response = await mdl.invoke(mc.CompletionRequest(prompt))
|
|
39
|
-
|
|
30
|
+
|
|
31
|
+
print(response.v.strip())
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import dataclasses as dc
|
|
1
|
+
from omlish import dataclasses as dc
|
|
2
2
|
|
|
3
3
|
from .... import minichain as mc
|
|
4
|
+
from ..configs import SessionConfig
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
##
|
|
7
8
|
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
DEFAULT_BACKEND = 'openai'
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
##
|
|
13
14
|
|
|
14
15
|
|
|
15
|
-
@dc.dataclass(frozen=True)
|
|
16
|
-
class EmbeddingConfig:
|
|
16
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
|
17
|
+
class EmbeddingConfig(SessionConfig):
|
|
17
18
|
content: 'mc.Content'
|
|
18
19
|
|
|
19
|
-
_: dc.KW_ONLY
|
|
20
|
-
|
|
21
20
|
backend: str | None = None
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
from omlish import dataclasses as dc
|
|
2
1
|
from omlish import inject as inj
|
|
3
2
|
from omlish import lang
|
|
4
3
|
|
|
4
|
+
from ...backends.configs import BackendConfig
|
|
5
|
+
from ...backends.types import DefaultBackendName
|
|
5
6
|
from ..base import Session
|
|
7
|
+
from .configs import DEFAULT_BACKEND
|
|
6
8
|
from .configs import EmbeddingConfig
|
|
7
9
|
|
|
8
10
|
|
|
9
11
|
with lang.auto_proxy_import(globals()):
|
|
12
|
+
from ...backends import inject as _backends
|
|
10
13
|
from . import session as _session
|
|
11
14
|
|
|
12
15
|
|
|
@@ -19,10 +22,20 @@ def bind_embedding(cfg: EmbeddingConfig) -> inj.Elements:
|
|
|
19
22
|
#
|
|
20
23
|
|
|
21
24
|
els.extend([
|
|
22
|
-
inj.bind(
|
|
25
|
+
inj.bind(cfg),
|
|
23
26
|
inj.bind(Session, to_ctor=_session.EmbeddingSession, singleton=True),
|
|
24
27
|
])
|
|
25
28
|
|
|
26
29
|
#
|
|
27
30
|
|
|
31
|
+
els.extend([
|
|
32
|
+
_backends.bind_backends(BackendConfig(
|
|
33
|
+
backend=cfg.backend,
|
|
34
|
+
)),
|
|
35
|
+
|
|
36
|
+
inj.bind(DefaultBackendName, to_const=DEFAULT_BACKEND),
|
|
37
|
+
])
|
|
38
|
+
|
|
39
|
+
#
|
|
40
|
+
|
|
28
41
|
return inj.as_elements(*els)
|
|
@@ -1,37 +1,29 @@
|
|
|
1
|
-
import dataclasses as dc
|
|
2
|
-
|
|
3
|
-
from omlish import lang
|
|
4
1
|
from omlish.formats import json
|
|
5
2
|
|
|
6
3
|
from .... import minichain as mc
|
|
4
|
+
from ...backends.types import EmbeddingServiceBackendProvider
|
|
7
5
|
from ..base import Session
|
|
8
|
-
from .configs import DEFAULT_EMBEDDING_MODEL_BACKEND
|
|
9
6
|
from .configs import EmbeddingConfig
|
|
10
7
|
|
|
11
8
|
|
|
12
9
|
##
|
|
13
10
|
|
|
14
11
|
|
|
15
|
-
class EmbeddingSession(Session
|
|
16
|
-
@dc.dataclass(frozen=True)
|
|
17
|
-
class Config(Session.Config, EmbeddingConfig):
|
|
18
|
-
pass
|
|
19
|
-
|
|
12
|
+
class EmbeddingSession(Session):
|
|
20
13
|
def __init__(
|
|
21
14
|
self,
|
|
22
|
-
config:
|
|
15
|
+
config: EmbeddingConfig,
|
|
23
16
|
*,
|
|
24
|
-
|
|
17
|
+
service_provider: EmbeddingServiceBackendProvider,
|
|
25
18
|
) -> None:
|
|
26
|
-
super().__init__(
|
|
19
|
+
super().__init__()
|
|
27
20
|
|
|
28
|
-
self.
|
|
21
|
+
self._config = config
|
|
22
|
+
self._service_provider = service_provider
|
|
29
23
|
|
|
30
24
|
async def run(self) -> None:
|
|
31
25
|
mdl: mc.EmbeddingService
|
|
32
|
-
async with
|
|
33
|
-
mc.EmbeddingService,
|
|
34
|
-
self._config.backend or DEFAULT_EMBEDDING_MODEL_BACKEND,
|
|
35
|
-
)) as mdl:
|
|
26
|
+
async with self._service_provider.provide_backend() as mdl:
|
|
36
27
|
response = await mdl.invoke(mc.EmbeddingRequest(self._config.content))
|
|
37
|
-
|
|
28
|
+
|
|
29
|
+
print(json.dumps_compact(list(map(float, response.v))))
|
ommlds/cli/sessions/inject.py
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import typing as ta
|
|
2
|
-
|
|
3
1
|
from omlish import inject as inj
|
|
4
2
|
from omlish import lang
|
|
5
3
|
|
|
4
|
+
from .chat.configs import ChatConfig
|
|
5
|
+
from .completion.configs import CompletionConfig
|
|
6
|
+
from .configs import SessionConfig
|
|
7
|
+
from .embedding.configs import EmbeddingConfig
|
|
8
|
+
|
|
6
9
|
|
|
7
10
|
with lang.auto_proxy_import(globals()):
|
|
8
|
-
from .chat import
|
|
9
|
-
from .
|
|
10
|
-
from .
|
|
11
|
-
from .completion import inject as _completion_inj
|
|
12
|
-
from .embedding import configs as _embedding_cfgs
|
|
13
|
-
from .embedding import inject as _embedding_inj
|
|
11
|
+
from .chat import inject as _chat
|
|
12
|
+
from .completion import inject as _completion
|
|
13
|
+
from .embedding import inject as _embedding
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
##
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
def bind_sessions(cfg:
|
|
19
|
+
def bind_sessions(cfg: SessionConfig) -> inj.Elements:
|
|
20
20
|
els: list[inj.Elemental] = []
|
|
21
21
|
|
|
22
22
|
#
|
|
23
23
|
|
|
24
|
-
if isinstance(cfg,
|
|
25
|
-
els.append(
|
|
24
|
+
if isinstance(cfg, ChatConfig):
|
|
25
|
+
els.append(_chat.bind_chat(cfg))
|
|
26
26
|
|
|
27
|
-
elif isinstance(cfg,
|
|
28
|
-
els.append(
|
|
27
|
+
elif isinstance(cfg, CompletionConfig):
|
|
28
|
+
els.append(_completion.bind_completion(cfg))
|
|
29
29
|
|
|
30
|
-
elif isinstance(cfg,
|
|
31
|
-
els.append(
|
|
30
|
+
elif isinstance(cfg, EmbeddingConfig):
|
|
31
|
+
els.append(_embedding.bind_embedding(cfg))
|
|
32
32
|
|
|
33
33
|
else:
|
|
34
34
|
raise TypeError(cfg)
|
ommlds/cli/state/storage.py
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import abc
|
|
2
|
-
import
|
|
2
|
+
import datetime
|
|
3
3
|
import os.path
|
|
4
4
|
import typing as ta
|
|
5
5
|
|
|
6
|
+
from omlish import dataclasses as dc
|
|
6
7
|
from omlish import lang
|
|
7
8
|
from omlish import marshal as msh
|
|
8
9
|
from omlish.formats import json
|
|
@@ -52,8 +53,12 @@ STATE_VERSION = 0
|
|
|
52
53
|
@dc.dataclass(frozen=True)
|
|
53
54
|
class MarshaledState:
|
|
54
55
|
version: int
|
|
56
|
+
|
|
55
57
|
payload: ta.Any
|
|
56
58
|
|
|
59
|
+
created_at: datetime.datetime | None = dc.field(default_factory=lang.utcnow)
|
|
60
|
+
updated_at: datetime.datetime | None = dc.field(default_factory=lang.utcnow)
|
|
61
|
+
|
|
57
62
|
|
|
58
63
|
class MarshalStateStorage(StateStorage, lang.Abstract):
|
|
59
64
|
def __init__(
|
|
@@ -75,6 +80,7 @@ class MarshalStateStorage(StateStorage, lang.Abstract):
|
|
|
75
80
|
ms = MarshaledState(
|
|
76
81
|
version=self._version,
|
|
77
82
|
payload=msh.marshal(obj, ty),
|
|
83
|
+
updated_at=lang.utcnow(),
|
|
78
84
|
)
|
|
79
85
|
return msh.marshal(ms)
|
|
80
86
|
|
|
@@ -102,7 +108,7 @@ class JsonFileStateStorage(MarshalStateStorage):
|
|
|
102
108
|
return json.loads(data)
|
|
103
109
|
|
|
104
110
|
def _save_file_data(self, data: ta.Any) -> None:
|
|
105
|
-
data = json.
|
|
111
|
+
data = json.dumps_compact(data)
|
|
106
112
|
with open(self._file, 'w') as f:
|
|
107
113
|
f.write(data)
|
|
108
114
|
|