TimemAi
Health Warn
- License — License: Apache-2.0
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Pass
- Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
Another LLM scaffold
Timem Shell Agent
𝓣𝓲𝓶𝓮𝓶 Ai
████████╗██╗███╗ ███╗███████╗███╗ ███╗
╚══██╔══╝██║████╗ ████║██╔════╝████╗ ████║
██║ ██║██╔████╔██║█████╗ ██╔████╔██║
██║ ██║██║╚██╔╝██║██╔══╝ ██║╚██╔╝██║
██║ ██║██║ ╚═╝ ██║███████╗██║ ╚═╝ ██║
╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
Bash · Memory · Time-aware
TimemAi is a lightweight local agent for everyday work. It combines an LLM
conversation loop, guarded Bash command execution, and local multidimensional
structured memory so it can inspect your working environment, help with files
and commands, and remember useful context across sessions.
This repository packages the standalone Rust shell agent extracted from the
Timem iOS workspace. It is intended for users who want to run and update the
agent directly from a terminal without building the iOS app.
Layout
agent_core/: protocol loop, provider wire-format adapters, memory/search
tools, guarded local actions.timem_shell/: terminal UI, input editor, provider HTTP transport, audit
log, CLI.resources/: system prompt, response protocol prompt suites, and capability
manifests used by the runtime.docs/architecture.md: module boundaries, turn lifecycle, runtime contracts.docs/feature-test-management.md: feature ownership and test coverage ledger..github/workflows/ci.yml: GitHub Actions workflow for push / pull request
CI.
Quick Start
Install once:
cd ~/timemai
./install.sh
Use env_template as the complete config reference. Copy it to a private env
file, then uncomment and edit only the values you need. The template usesexport, so a plain source env makes the values visible to timem andcargo run child processes:
cp env_template env
$EDITOR env
For Aliyun/Qwen, the minimum config is:
export TIMEM_GATEWAY_PROVIDER=aliyun
export TIMEM_API_KEY=your_api_key_here
export TIMEM_MODEL=qwen-plus
export TIMEM_SPACE=.test_mem
Run:
source /path/to/your/env
timem
That is the normal installed path. timem does not load any env file
implicitly; sourcing your env file makes the config visible as process env so
the startup banner shows the actual effective values.
To run the newest source code directly from this checkout without reinstalling,
use cargo run from the clone root. It compiles the current files and runs the
debug binary:
cargo run -p timem_shell
Every env-backed setting can also be passed on the command line. See:
timem --help
Command line options override process env values.
Example without sourcing an env file:
timem \
--data-dir data \
--space .test_mem \
--gateway-provider aliyun \
--api-protocol openai-compatible \
--model qwen-plus \
--max-llm-input 100K \
--bash-approval ask
Update
If you installed from a git clone, update in the same clone directory:
cd ~/timemai
git pull --ff-only
./install.sh
This rebuilds the latest release binary and overwrites the installedtimem-native-rs and the timem command. Your private env file is
user-managed and is not touched; source it explicitly before running:
source /path/to/your/env
If you cloned into another directory, run the same commands there. Keep your
private env file wherever it is easiest for you to manage.
Quality Gates
Local production gate:
scripts/ci.sh
This runs script syntax checks, install logic tests, feature/test contract
checks, sensitive scan, Rust formatting, full workspace tests, repeated edge
regression, performance guard, release build, real TTY smoke, and whitespace
checks.
GitHub Actions runs the same scripts/ci.sh gate on pushes and pull requests
for Linux and macOS. Feature coverage is tracked indocs/feature-test-management.md; each release-ready feature is expected to
have normal, boundary, error, and stress/repetition coverage or an explicit
residual-risk note.
Provider Config
Common examples:
# Aliyun DashScope compatible mode
export TIMEM_GATEWAY_PROVIDER=aliyun
export TIMEM_API_KEY=...
export TIMEM_API_PROTOCOL=openai-compatible
export TIMEM_RESPONSE_PROTOCOL=xml
export TIMEM_MAX_LLM_INPUT=100K
export TIMEM_MAX_LLM_OUTPUT=10K
# OpenAI
export TIMEM_GATEWAY_PROVIDER=openai
export TIMEM_API_KEY=...
export TIMEM_API_PROTOCOL=openai-responses
# Anthropic
export TIMEM_GATEWAY_PROVIDER=anthropic
export TIMEM_API_KEY=...
export TIMEM_API_PROTOCOL=anthropic
TIMEM_GATEWAY_PROVIDER chooses the traffic platform and default URL.TIMEM_API_PROTOCOL chooses the provider HTTP wire format. Supported values:
openai-compatibleopenai-responsesanthropic
openai-compatible means the Chat Completions-compatible shape
(/chat/completions). openai-responses means OpenAI's Responses API shape
(/responses), where output text and usage fields differ from Chat
Completions.
If TIMEM_API_PROTOCOL is omitted, TIMEM_GATEWAY_PROVIDER=openai uses
OpenAI Responses, TIMEM_GATEWAY_PROVIDER=anthropic uses Anthropic protocol,
and other providers use OpenAI-compatible chat completions. For a custom
gateway, set both TIMEM_API_PROTOCOL and TIMEM_BASE_URL explicitly.
TIMEM_RESPONSE_PROTOCOL chooses how the model must format its response for
the local runtime parser. Supported values are markdown, json, and xml;
the default is xml.
TIMEM_WORK_INSTRUCTIONS controls whether Timem loads AGENTS.md andCLAUDE.md from the current working directory into agent context. Supported
values are silent (default, auto-load and notify), ask, and off.
TIMEM_MAX_LLM_INPUT defaults to 100K; TIMEM_MAX_LLM_OUTPUT defaults to10K. When observed provider input tokens plus the new prompt delta estimate
reaches 90% of TIMEM_MAX_LLM_INPUT, runtime requires the model to compact
dynamic prompt deltas before continuing: summarize useful dynamic context to
about 10%-20% of its current token footprint, discard stale details, and place
important but lengthy state into scratch memory before shrinking covered
delta/slice ids. For prompt context the model can ask runtime to offload
specific delta/slice ids instead of rewriting that context itself.
If a provider reports that output was cut off by the output-token limit, Timem
asks whether to temporarily increase TIMEM_MAX_LLM_OUTPUT by 10K and retry
the same turn. The increase only affects the current running shell process.
Inside the interactive shell, use /config to change runtime settings such as
model, gateway provider, API protocol, base URL, max input/output tokens, and
bash approval mode. The menu uses arrow keys and Enter, then returns to chat.
If the shell has been idle for at least 3 hours and the existing dynamic task
context is over about 10K tokens, Timem asks whether to continue the previous
task context. Choose YES to keep it, or NO to clear only the old dynamic
prompt context and start the new question cleanly. Durable memory, chat history,
scratch memory, and runtime data are not deleted by this choice.
Override the default URL only when needed:
TIMEM_BASE_URL=https://your-gateway.example/v1
Runtime Capabilities
Timem ships with built-in tool manifests, but you can overlay prompt/IDL
capabilities at startup without recompiling:
export TIMEM_CAPABILITIES_DIR=/path/to/capabilities
timem
Directory layout:
capabilities/
tools/*.yaml
skills/<skill_id>/skill.yaml
skills/<skill_id>/instructions.md
Runtime tool manifests may add or override canonical tool names only when they
bind to an existing builtin executor such as run_bash, memmgr, self_tool,
or capmgr, or to a command script inside the overlay directory.
Command-bound tools use this manifest shape:
kind: tool
id: my_tool
binding_type: command
binding_name: scripts/my_tool.sh
summary: My runtime tool.
description: |
Use when this local runtime tool is appropriate.
input_properties:
query: string
required:
- query
example_json: |
{
"action": "my_tool",
"args": {
"query": "hello"
}
}
Runtime invokes /bin/sh scripts/my_tool.sh and writes one JSON object to
stdin: {"action":"my_tool","args":{...}}. Output is captured
as an action result with bounded size and timeout.
Runtime Data
By default, runtime data is written under the directory where you starttimem:
data/<space>/audit/api_audit.json
data/<space>/audit/action_audit.json
data/<space>/memory/
data/<space>/memory/shell_jobs/
data/<space>/shell_history.txt
api_audit.json is a JSON document with an events array. action_audit.json
is grouped JSON for model-requested actions.
Use a fixed data root if you do not want data under the current directory:
TIMEM_DATA_DIR=/path/to/data timem
Env files are independent from runtime data. timem only reads process env, so
you can keep the private env file anywhere and load it yourself:
source /path/to/your/env
Local Shell Jobs
run_bash runs short commands in normal mode. For long builds, tests,
package installs, or video commands, the model can request:
{
"action": "run_bash",
"args": {
"cmd": "cargo test",
"background": true
}
}
Runtime returns a process id such as pid=12345, now keeps running in background. If a normal command reaches its timeout_ms, runtime returnspid=12345, timeout, but is still running and keeps tracking that process.
When a tracked job exits, runtime adds a one-time RUNNING_JOB_UPDATE to the
next prompt delta. After large context compaction, runtime can also add aRUNNING JOB LIST snapshot. The model can inspect or stop those jobs with
ordinary run_bash commands such as ps -p <pid> or kill <pid>.
Ctrl+C is always a cancellation key, not an exit key: while editing input it
cancels the current line, inside menus it cancels the current selection, and
while Timem is thinking it cancels the current turn. Use Ctrl+D or /exit to
leave the shell intentionally.
While Timem is thinking, you can also type an extra instruction and press Enter.
That line is added to the current turn as a user_supplement prompt slice, so
the next model round sees it as the newest user correction/instruction instead
of waiting for a new chat turn.
Install Details
One-command install:
cd ~/timemai
./install.sh
Timem shell currently supports macOS and Linux. Windows is not supported yet.install.sh detects the OS before building:
- macOS: checks Xcode Command Line Tools and
curl. - Linux: checks
cc,make,curl,pkg-config, andca-certificates;
when possible it installs them withapt-get,dnf,yum,pacman, orzypper.
If Rust/cargo is not installed, install.sh installs the Rust toolchain with
rustup first. Cargo 1.78+ is required because the repository usesCargo.lock v4; if an older Cargo is found and rustup exists, the installer
updates the stable toolchain automatically. To disable automatic Rust
install/update:
TIMEM_SHELL_SKIP_RUST_INSTALL=1 ./install.sh
After Rust is ready, the installer runs cargo fetch --locked andcargo build --locked -p timem_shell --release. Cargo downloads Rust crates
from Cargo.lock automatically, including terminal rendering dependencies such
as termimad; users do not manually install those crate libraries. If this
step fails on a fresh machine, check network access to crates.io and rerun./install.sh.
If a manual cargo run fails with lock file version '4' was found, update
Rust first:
rustup update stable
rustup default stable
The installer builds timem_shell, installs:
timem-native-rs: release binarytimem: thin wrapper that runs the binary; it does not load env files
Development Run
Use cargo run when developing the shell itself or when you want to verify the
latest local source before running ./install.sh. Like timem, cargo run
does not automatically load env files, so source your file or pass the
needed env vars in the shell:
cd ~/timemai
TIMEM_GATEWAY_PROVIDER=aliyun \
TIMEM_API_KEY=... \
TIMEM_MODEL=qwen-plus \
TIMEM_SPACE=.test_mem \
cargo run -p timem_shell
Custom gateway example:
TIMEM_GATEWAY_PROVIDER=custom \
TIMEM_API_PROTOCOL=anthropic \
TIMEM_BASE_URL=https://your-gateway.example/v1 \
TIMEM_API_KEY=... \
TIMEM_MODEL=aws-claude-sonnet-4-6 \
TIMEM_SPACE=.test_mem \
cargo run -p timem_shell
Uninstall
Uninstall binaries:
./uninstall.sh
Private env files are user-managed and are not removed.
The uninstall script does not remove Rust. If Rust was installed only for Timem
shell, remove it separately with:
rustup self uninstall
Test
cd ~/timemai
cargo fmt --check
cargo test -p agent_core
cargo test -p timem_shell
One real-provider test is intentionally ignored unless a real local key file exists.
Contributors
TimemAi is developed by limo with assistance from Claude and Codex.
This line is added by myself(Timem).
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found