DeepSeek Harness Remote
DeepSeek Harness Remote 可将手机或另一台电脑与你运行 DeepSeek Harness 的电脑安全连接,随时随地继续你的工作,方便随时查看进度并继续工作。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Central enterprise AI agent optimized for data-driven engineering, CRO, and automated codebase optimization across CuePointe projects.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Strategic intelligence & execution agent
THE SIGNATURE — the brand mark · THE G — the agent's face, in-app only
Think like a strategist. Validate like a data scientist. Build like a software engineer. Communicate like a storyteller. Operate like an owner.
A product of SpeakPower
Three marks, three jobs, shown once each above. Nothing here is interchangeable.
| Mark | Role | Where it is used |
|---|---|---|
| SpeakPower | The parent brand | Opens and closes this README; the attribution in the app sidebar and page metadata. Never replaced by a GRIOT mark |
| The GRIOT Signature | GRIOT's brand mark | Browser tab, app icons, app sidebar, social card, decks. Identifies the product; does not stand in for SpeakPower |
| The G | The agent's face | Inside the app only, as the avatar beside GRIOT's replies. Not a logo, and on no branding surface |
At tab sizes the Signature is cropped past its decorative band so the face survives the downscale, with the gold rim keeping its circular silhouette — the same mark, drawn for the size it is used at. The G blinks on its own and blinks faster with its smile moving while the agent is working; it sits on a navy disc so the white spectacle frames read against a light reply bubble.
Generic assistants answer questions. They do not hold portfolio context, they do not separate evidence from assumption, and they forget every decision the moment the tab closes.
GRIOT fixes all three, and now does it for more than one organisation at a time.
Never confuse activity with progress.
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#283142','primaryTextColor':'#ffffff','primaryBorderColor':'#E0BE55','lineColor':'#E0BE55','secondaryColor':'#36415a','tertiaryColor':'#f4f4f5','fontFamily':'ui-sans-serif, system-ui, sans-serif'}}}%%
flowchart TB
subgraph client["🖥️ Callers"]
UI["Browser UI<br/><code>app/static/</code>"]
W["Studio Worker<br/><i>server-to-server</i>"]
end
subgraph api["⚙️ GRIOT OS — FastAPI"]
direction TB
A["Auth + tenant<br/><code>security.py</code>"]
R["Router<br/><code>llm.route()</code>"]
P["Prompt builder<br/><code>build_system_prompt()</code>"]
M["Model adapter<br/><code>llm.analyse()</code>"]
A --> R --> P --> M
end
store[("Postgres / SQLite<br/><i>every row tenant-scoped</i>")]
LLM["🧠 Claude API<br/>claude-opus-5"]
UI -->|"POST /chat"| A
W -->|"X-API-Key + X-Tenant-Id"| A
P <-->|"memory, history, documents"| store
M -->|"decisions, messages"| store
M <-->|"messages.create"| LLM
M -->|"answer + agents[]"| UI
style client fill:#f4f4f5,stroke:#283142,stroke-width:2px
style api fill:#283142,stroke:#E0BE55,stroke-width:3px,color:#fff
style LLM fill:#E0BE55,stroke:#283142,stroke-width:2px,color:#283142
Storage is chosen at runtime: DATABASE_URL present → Postgres, otherwise SQLite.
Every query is scoped to a tenant, so one client's work can never surface in another's.
Requests are reasoned through nine stages rather than answered directly:
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#283142','primaryTextColor':'#ffffff','primaryBorderColor':'#E0BE55','lineColor':'#E0BE55','fontFamily':'ui-sans-serif, system-ui, sans-serif'}}}%%
flowchart LR
U(["UNDERSTAND"]) --> C(["CONTEXT"]) --> E(["EVIDENCE"]) --> D(["DIAGNOSE"])
D --> O(["OPTIONS"]) --> R(["RECOMMEND"]) --> X(["EXECUTE"])
X --> M(["MEASURE"]) --> L(["LEARN"])
L -.->|"writes memory"| E
style U fill:#283142,color:#fff,stroke:#E0BE55
style C fill:#283142,color:#fff,stroke:#E0BE55
style E fill:#283142,color:#fff,stroke:#E0BE55
style D fill:#283142,color:#fff,stroke:#E0BE55
style O fill:#283142,color:#fff,stroke:#E0BE55
style R fill:#E0BE55,color:#283142,stroke:#283142,stroke-width:3px
style X fill:#283142,color:#fff,stroke:#E0BE55
style M fill:#283142,color:#fff,stroke:#E0BE55
style L fill:#E0BE55,color:#283142,stroke:#283142,stroke-width:3px
Claims are tagged by epistemic status so assumptions never masquerade as evidence:
| Tag | Meaning |
|---|---|
FACT | Verifiable, sourced |
INFERENCE | Derived from facts, logically supported |
HYPOTHESIS | Plausible, untested |
RECOMMENDATION | A judgment call, owned as such |
UNKNOWN | Explicitly not known — stated, not skipped |
Answer modes change the shape of the reply when you need something specific:
| Mode | What it does |
|---|---|
challenge | Pressure-tests the idea instead of supporting it |
diagnose | Finds the root cause before suggesting any fix |
plan | Turns the goal into an executable plan |
A record of the work, newest first.
/favicon.ico route added; shared links now present
as a product rather than a bare URL.X-Tenant-Id alongside the API key. The key authenticates the caller (a server-side
Studio Worker), and the tenant names whose data this is. A malformed id is rejected rather
than normalised — silently coercing it could collapse two clients onto one./health reports tenancy so a seat-selling front end can refuse to start without it.vercel.json had no rewrites so every path 404'd;
api/index.py raised ImportError; app/__init__.py did not exist. A stale static
public/ copy that shadowed the app was removed.LEARN step finally persists.| Capability | Status | Notes |
|---|---|---|
| FastAPI service, health, OpenAPI | ✅ | |
| Claude reasoning | ✅ | claude-opus-5, adaptive thinking |
| Conversation threads | ✅ | Prior turns replayed per request |
| Automatic memory writes | ✅ | Distilled by a cheap worker model |
| Multi-tenant isolation | ✅ | Every row scoped; X-Tenant-Id |
| Answer modes | ✅ | challenge, diagnose, plan |
| Client documents with citations | ✅ | Passed per request, cited by source |
| API-key authentication | ✅ | Constant-time compare |
| Serverless startup guards | ✅ | Refuses to boot misconfigured |
| Smoke tests | ✅ | 68 passing |
| Streaming responses | ❌ | A long answer still arrives all at once |
Approval gate (/approval) | ❌ | Endpoint exists; no producer writes actions |
| Tool use / web research | ❌ | No tool layer yet |
| Rate limiting / usage metering | ❌ | No spend ceiling per caller |
git clone https://github.com/SpeakPower-commits/claude-central-agent.git
cd claude-central-agent/griot-os
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # set ANTHROPIC_API_KEY, and GRIOT_API_KEY to enable auth
python3 -m uvicorn app.main:app --reload
| Surface | URL |
|---|---|
| Web interface | http://127.0.0.1:8000 |
| OpenAPI docs | http://127.0.0.1:8000/docs |
| Health probe | http://127.0.0.1:8000/health |
Without
ANTHROPIC_API_KEYthe service still boots and exercises routing, memory and persistence in orchestration-only mode — useful for testing the pipeline without spending tokens.
Every route except /health and the UI shell requires X-API-Key.
Add X-Tenant-Id to scope a request to a client; omit it and the internal tenant is used.
| Method | Path | Purpose |
|---|---|---|
GET | /health | Liveness, storage, model and tenancy posture |
GET | /projects · /agents · /protocol | What this instance works across |
GET | /memories?project= | Stored memory |
POST | /memory | Persist a memory with a confidence tag |
DELETE | /memories/{id} | Remove a memory |
GET | /threads · /threads/{id} | List threads, replay one |
GET | /decisions | The decision log |
POST | /chat | Full decision-protocol pass |
POST | /approval | Resolve a pending action (see status) |
curl -s -X POST localhost:8000/chat \
-H 'Content-Type: application/json' \
-H "X-API-Key: $GRIOT_API_KEY" \
-d '{"message":"Registrations rise, orders flat. Diagnose the bottleneck.",
"project":"tonninyira","answer_mode":"diagnose"}' | jq
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#283142','primaryTextColor':'#ffffff','primaryBorderColor':'#E0BE55','lineColor':'#E0BE55','fontFamily':'ui-sans-serif, system-ui, sans-serif'}}}%%
flowchart LR
GH["GitHub<br/><i>source of truth</i>"] -->|"push → build"| V["Vercel<br/><i>Python runtime</i>"]
CF["Cloudflare<br/><i>DNS</i>"] -.->|"CNAME"| V
V --> NEON[("Neon Postgres<br/><i>pooled</i>")]
V --> CLAUDE["Claude API"]
style GH fill:#283142,color:#fff,stroke:#E0BE55,stroke-width:2px
style V fill:#E0BE55,color:#283142,stroke:#283142,stroke-width:3px
style CF fill:#f4f4f5,color:#283142,stroke:#283142
style NEON fill:#283142,color:#fff,stroke:#E0BE55,stroke-width:2px
style CLAUDE fill:#283142,color:#fff,stroke:#E0BE55,stroke-width:2px
Postgres is mandatory in production — serverless filesystems are read-only, so the SQLite fallback cannot persist. Use Neon's pooled connection string.
Full checklist: griot-os/docs/GRIOT_OS_DEPLOYMENT.md
GRIOT_API_KEY guards every route that reads or spends, and
the app refuses to start serverless without it..gitignore covers .env and *.db.Agent-facing engineering rules: AGENTS.md · Persona and tone: CLAUDE.md
| Next | Why it matters |
|---|---|
| Streaming responses | A long answer currently arrives all at once after a silent wait |
| Rate limiting + usage metering | No spend ceiling per caller, and no way to price an engagement |
| The approval loop | /approval exists but nothing writes a pending action |
| Tool use | ResearchAgent cannot yet research |
Built by SpeakPower
GRIOT OS is a product of SpeakPower · Thomas Otieno Articulate is key.