mirror of
https://github.com/tinyhumansai/openhuman.git
synced 2026-07-28 13:32:23 +00:00
* Enhance autocomplete functionality and logging. Increased debounce time for autocomplete suggestions and added minimum context character requirement. Improved inline suggestion handling with new cleanup logic for tab acceptance. Introduced a new logging option for autocomplete-only logs in CLI. Updated various components to support these changes, including sanitization and error handling in the autocomplete engine. * Add autocomplete CLI adapter for improved argument handling This commit introduces a new module, , which encapsulates the argument parsing and logging logic specific to the autocomplete namespace in the CLI. Key features include extraction of leading verbose flags, handling of the flag, and improved help message printing. The existing CLI command handling has been refactored to utilize this new adapter, enhancing code organization and maintainability. * Refactor inline completion sanitization and enhance context handling
122 lines
6.4 KiB
Bash
122 lines
6.4 KiB
Bash
#!/usr/bin/env bash
|
|
# End-to-end subconscious loop test with real local AI (Ollama).
|
|
# Ingests data, runs ticks, verifies decisions.
|
|
set -euo pipefail
|
|
|
|
CORE_BIN="./app/src-tauri/binaries/openhuman-core-x86_64-pc-windows-msvc.exe"
|
|
RPC_PORT=7810
|
|
RPC_URL="http://127.0.0.1:${RPC_PORT}/rpc"
|
|
FIXTURES="./tests/fixtures/subconscious"
|
|
|
|
if [ ! -f "$CORE_BIN" ]; then echo "ERROR: Core binary not found"; exit 1; fi
|
|
|
|
# Check Ollama
|
|
if ! curl -s --max-time 3 http://localhost:11434/ >/dev/null 2>&1; then
|
|
echo "ERROR: Ollama not running. Start with: ollama serve"
|
|
exit 1
|
|
fi
|
|
|
|
echo "=== Subconscious Loop E2E Test ==="
|
|
echo ""
|
|
|
|
# Start core server
|
|
echo "[setup] Starting core on port $RPC_PORT..."
|
|
OPENHUMAN_CORE_PORT="$RPC_PORT" "$CORE_BIN" serve > /tmp/subconscious-test.log 2>&1 &
|
|
SERVER_PID=$!
|
|
cleanup() { kill "$SERVER_PID" 2>/dev/null || true; wait "$SERVER_PID" 2>/dev/null || true; }
|
|
trap cleanup EXIT
|
|
|
|
for i in $(seq 1 15); do
|
|
if curl -s "$RPC_URL" -H "Content-Type: application/json" \
|
|
-d '{"jsonrpc":"2.0","id":0,"method":"openhuman.health_snapshot","params":{}}' 2>/dev/null | grep -q "result"; then
|
|
echo "[setup] Server ready."
|
|
break
|
|
fi
|
|
[ "$i" -eq 15 ] && { echo "ERROR: Server timeout"; exit 1; }
|
|
sleep 1
|
|
done
|
|
|
|
rpc() {
|
|
curl -s --max-time 120 "$RPC_URL" -H "Content-Type: application/json" -d "$1" 2>&1
|
|
}
|
|
|
|
# Write HEARTBEAT.md to the workspace
|
|
echo "[setup] Writing HEARTBEAT.md to workspace..."
|
|
WORKSPACE="$HOME/.openhuman/workspace"
|
|
mkdir -p "$WORKSPACE"
|
|
cp "$FIXTURES/heartbeat.md" "$WORKSPACE/HEARTBEAT.md"
|
|
echo "[setup] HEARTBEAT.md written: $(cat "$WORKSPACE/HEARTBEAT.md" | grep "^- " | wc -l) tasks"
|
|
|
|
echo ""
|
|
echo "========================================="
|
|
echo " PHASE 1: Ingest tick 1 data"
|
|
echo "========================================="
|
|
|
|
# Ingest tick1 gmail
|
|
GMAIL1=$(cat "$FIXTURES/tick1_gmail.txt")
|
|
GMAIL1_ESC=$(echo "$GMAIL1" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")
|
|
RESULT=$(rpc "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"openhuman.memory_doc_ingest\",\"params\":{\"namespace\":\"skill-gmail\",\"key\":\"tick1-gmail\",\"title\":\"Deadline reminder and meeting invite\",\"content\":$GMAIL1_ESC,\"source_type\":\"gmail\",\"priority\":\"high\",\"category\":\"core\"}}")
|
|
echo "Gmail tick1 ingested: $(echo "$RESULT" | python3 -c "import sys,json;d=json.load(sys.stdin);r=d.get('result',{});print(f\"{r.get('entityCount',0)} entities, {r.get('relationCount',0)} relations\")" 2>/dev/null || echo "$RESULT" | head -c 200)"
|
|
|
|
# Ingest tick1 notion
|
|
NOTION1=$(cat "$FIXTURES/tick1_notion.txt")
|
|
NOTION1_ESC=$(echo "$NOTION1" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")
|
|
RESULT=$(rpc "{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"openhuman.memory_doc_ingest\",\"params\":{\"namespace\":\"skill-notion\",\"key\":\"tick1-notion\",\"title\":\"Q1 Delivery Tracker\",\"content\":$NOTION1_ESC,\"source_type\":\"notion\",\"priority\":\"high\",\"category\":\"core\"}}")
|
|
echo "Notion tick1 ingested: $(echo "$RESULT" | python3 -c "import sys,json;d=json.load(sys.stdin);r=d.get('result',{});print(f\"{r.get('entityCount',0)} entities, {r.get('relationCount',0)} relations\")" 2>/dev/null || echo "$RESULT" | head -c 200)"
|
|
|
|
# Check what's in memory
|
|
echo ""
|
|
echo "Namespaces after tick1 ingest:"
|
|
rpc '{"jsonrpc":"2.0","id":3,"method":"openhuman.memory_list_namespaces","params":{}}' | python3 -c "import sys,json;d=json.load(sys.stdin);print(d.get('result',{}).get('data',{}).get('namespaces',[]))" 2>/dev/null
|
|
|
|
echo ""
|
|
echo "========================================="
|
|
echo " PHASE 2: Subconscious Tick 1"
|
|
echo "========================================="
|
|
echo "(Calling local AI via Ollama — may take 30-60s)"
|
|
|
|
TICK1=$(rpc '{"jsonrpc":"2.0","id":10,"method":"openhuman.subconscious_trigger","params":{}}')
|
|
echo "Tick 1 result:"
|
|
echo "$TICK1" | python3 -c "import sys,json; print(json.dumps(json.load(sys.stdin), indent=2))" 2>/dev/null || echo "$TICK1" | head -c 500
|
|
|
|
echo ""
|
|
echo "========================================="
|
|
echo " PHASE 3: Ingest tick 2 data (state change)"
|
|
echo "========================================="
|
|
|
|
# Ingest tick2 gmail (deadline moved)
|
|
GMAIL2=$(cat "$FIXTURES/tick2_gmail.txt")
|
|
GMAIL2_ESC=$(echo "$GMAIL2" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")
|
|
RESULT=$(rpc "{\"jsonrpc\":\"2.0\",\"id\":4,\"method\":\"openhuman.memory_doc_ingest\",\"params\":{\"namespace\":\"skill-gmail\",\"key\":\"tick2-gmail\",\"title\":\"URGENT deadline moved to tomorrow\",\"content\":$GMAIL2_ESC,\"source_type\":\"gmail\",\"priority\":\"high\",\"category\":\"core\"}}")
|
|
echo "Gmail tick2 ingested: $(echo "$RESULT" | python3 -c "import sys,json;d=json.load(sys.stdin);r=d.get('result',{});print(f\"{r.get('entityCount',0)} entities, {r.get('relationCount',0)} relations\")" 2>/dev/null || echo "$RESULT" | head -c 200)"
|
|
|
|
# Ingest tick2 notion (tracker updated)
|
|
NOTION2=$(cat "$FIXTURES/tick2_notion.txt")
|
|
NOTION2_ESC=$(echo "$NOTION2" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")
|
|
RESULT=$(rpc "{\"jsonrpc\":\"2.0\",\"id\":5,\"method\":\"openhuman.memory_doc_ingest\",\"params\":{\"namespace\":\"skill-notion\",\"key\":\"tick2-notion\",\"title\":\"Q1 Tracker updated - unblocked\",\"content\":$NOTION2_ESC,\"source_type\":\"notion\",\"priority\":\"high\",\"category\":\"core\"}}")
|
|
echo "Notion tick2 ingested: $(echo "$RESULT" | python3 -c "import sys,json;d=json.load(sys.stdin);r=d.get('result',{});print(f\"{r.get('entityCount',0)} entities, {r.get('relationCount',0)} relations\")" 2>/dev/null || echo "$RESULT" | head -c 200)"
|
|
|
|
echo ""
|
|
echo "========================================="
|
|
echo " PHASE 4: Subconscious Tick 2"
|
|
echo "========================================="
|
|
echo "(Calling local AI via Ollama — may take 30-60s)"
|
|
|
|
TICK2=$(rpc '{"jsonrpc":"2.0","id":11,"method":"openhuman.subconscious_trigger","params":{}}')
|
|
echo "Tick 2 result:"
|
|
echo "$TICK2" | python3 -c "import sys,json; print(json.dumps(json.load(sys.stdin), indent=2))" 2>/dev/null || echo "$TICK2" | head -c 500
|
|
|
|
echo ""
|
|
echo "========================================="
|
|
echo " PHASE 5: Status check"
|
|
echo "========================================="
|
|
|
|
STATUS=$(rpc '{"jsonrpc":"2.0","id":12,"method":"openhuman.subconscious_status","params":{}}')
|
|
echo "Subconscious status:"
|
|
echo "$STATUS" | python3 -c "import sys,json; print(json.dumps(json.load(sys.stdin), indent=2))" 2>/dev/null || echo "$STATUS" | head -c 500
|
|
|
|
echo ""
|
|
echo "========================================="
|
|
echo " DONE"
|
|
echo "========================================="
|