@oratis/lisa 0.8.0 → 0.11.0
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.
- package/README.md +123 -16
- package/README.zh-CN.md +101 -15
- package/completions/_lisa +56 -0
- package/completions/lisa.bash +35 -1
- package/completions/lisa.fish +18 -1
- package/dist/advisor/engine.d.ts +7 -0
- package/dist/advisor/engine.d.ts.map +1 -1
- package/dist/advisor/engine.js +12 -0
- package/dist/advisor/engine.js.map +1 -1
- package/dist/agent.d.ts +14 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +58 -7
- package/dist/agent.js.map +1 -1
- package/dist/agents/managed.d.ts +108 -0
- package/dist/agents/managed.d.ts.map +1 -0
- package/dist/agents/managed.js +241 -0
- package/dist/agents/managed.js.map +1 -0
- package/dist/agents/pty.d.ts +155 -0
- package/dist/agents/pty.d.ts.map +1 -0
- package/dist/agents/pty.js +299 -0
- package/dist/agents/pty.js.map +1 -0
- package/dist/approval.d.ts +13 -0
- package/dist/approval.d.ts.map +1 -1
- package/dist/approval.js +25 -2
- package/dist/approval.js.map +1 -1
- package/dist/autonomy/runs.d.ts +33 -0
- package/dist/autonomy/runs.d.ts.map +1 -0
- package/dist/autonomy/runs.js +106 -0
- package/dist/autonomy/runs.js.map +1 -0
- package/dist/channels/feishu.d.ts.map +1 -1
- package/dist/channels/feishu.js +65 -0
- package/dist/channels/feishu.js.map +1 -1
- package/dist/channels/router.d.ts +7 -0
- package/dist/channels/router.d.ts.map +1 -1
- package/dist/channels/router.js +1 -1
- package/dist/channels/router.js.map +1 -1
- package/dist/cli/agents-pty.d.ts +18 -0
- package/dist/cli/agents-pty.d.ts.map +1 -0
- package/dist/cli/agents-pty.js +182 -0
- package/dist/cli/agents-pty.js.map +1 -0
- package/dist/cli/agents.d.ts +2 -0
- package/dist/cli/agents.d.ts.map +1 -0
- package/dist/cli/agents.js +65 -0
- package/dist/cli/agents.js.map +1 -0
- package/dist/cli/consent.d.ts +2 -0
- package/dist/cli/consent.d.ts.map +1 -0
- package/dist/cli/consent.js +57 -0
- package/dist/cli/consent.js.map +1 -0
- package/dist/cli/model.d.ts +2 -0
- package/dist/cli/model.d.ts.map +1 -0
- package/dist/cli/model.js +121 -0
- package/dist/cli/model.js.map +1 -0
- package/dist/cli/sense.d.ts +2 -0
- package/dist/cli/sense.d.ts.map +1 -0
- package/dist/cli/sense.js +36 -0
- package/dist/cli/sense.js.map +1 -0
- package/dist/cli.js +117 -12
- package/dist/cli.js.map +1 -1
- package/dist/consent/blacklist.d.ts +28 -0
- package/dist/consent/blacklist.d.ts.map +1 -0
- package/dist/consent/blacklist.js +78 -0
- package/dist/consent/blacklist.js.map +1 -0
- package/dist/consent/store.d.ts +45 -0
- package/dist/consent/store.d.ts.map +1 -0
- package/dist/consent/store.js +126 -0
- package/dist/consent/store.js.map +1 -0
- package/dist/control/policy.d.ts +13 -0
- package/dist/control/policy.d.ts.map +1 -0
- package/dist/control/policy.js +57 -0
- package/dist/control/policy.js.map +1 -0
- package/dist/heartbeat/runner.d.ts.map +1 -1
- package/dist/heartbeat/runner.js +70 -14
- package/dist/heartbeat/runner.js.map +1 -1
- package/dist/idle/runner.d.ts.map +1 -1
- package/dist/idle/runner.js +87 -17
- package/dist/idle/runner.js.map +1 -1
- package/dist/integrations/aider/observer.d.ts +21 -1
- package/dist/integrations/aider/observer.d.ts.map +1 -1
- package/dist/integrations/aider/observer.js +110 -1
- package/dist/integrations/aider/observer.js.map +1 -1
- package/dist/integrations/claude-code/liveness.d.ts +10 -0
- package/dist/integrations/claude-code/liveness.d.ts.map +1 -0
- package/dist/integrations/claude-code/liveness.js +62 -0
- package/dist/integrations/claude-code/liveness.js.map +1 -0
- package/dist/integrations/claude-code/watcher.d.ts +39 -4
- package/dist/integrations/claude-code/watcher.d.ts.map +1 -1
- package/dist/integrations/claude-code/watcher.js +94 -57
- package/dist/integrations/claude-code/watcher.js.map +1 -1
- package/dist/integrations/codex/observer.d.ts +19 -6
- package/dist/integrations/codex/observer.d.ts.map +1 -1
- package/dist/integrations/codex/observer.js +228 -4
- package/dist/integrations/codex/observer.js.map +1 -1
- package/dist/integrations/dispatch-ledger.d.ts +30 -1
- package/dist/integrations/dispatch-ledger.d.ts.map +1 -1
- package/dist/integrations/dispatch-ledger.js +75 -9
- package/dist/integrations/dispatch-ledger.js.map +1 -1
- package/dist/integrations/git/branch.d.ts +11 -0
- package/dist/integrations/git/branch.d.ts.map +1 -0
- package/dist/integrations/git/branch.js +49 -0
- package/dist/integrations/git/branch.js.map +1 -0
- package/dist/integrations/git/observer.d.ts +39 -0
- package/dist/integrations/git/observer.d.ts.map +1 -0
- package/dist/integrations/git/observer.js +252 -0
- package/dist/integrations/git/observer.js.map +1 -0
- package/dist/integrations/github-pr/observer.d.ts.map +1 -1
- package/dist/integrations/github-pr/observer.js +7 -2
- package/dist/integrations/github-pr/observer.js.map +1 -1
- package/dist/integrations/hub.d.ts +8 -0
- package/dist/integrations/hub.d.ts.map +1 -1
- package/dist/integrations/hub.js +39 -1
- package/dist/integrations/hub.js.map +1 -1
- package/dist/integrations/managed/observer.d.ts +17 -0
- package/dist/integrations/managed/observer.d.ts.map +1 -0
- package/dist/integrations/managed/observer.js +46 -0
- package/dist/integrations/managed/observer.js.map +1 -0
- package/dist/integrations/opencode/observer.d.ts +53 -5
- package/dist/integrations/opencode/observer.d.ts.map +1 -1
- package/dist/integrations/opencode/observer.js +242 -20
- package/dist/integrations/opencode/observer.js.map +1 -1
- package/dist/integrations/pty/observer.d.ts +25 -0
- package/dist/integrations/pty/observer.d.ts.map +1 -0
- package/dist/integrations/pty/observer.js +48 -0
- package/dist/integrations/pty/observer.js.map +1 -0
- package/dist/integrations/registry.d.ts.map +1 -1
- package/dist/integrations/registry.js +5 -0
- package/dist/integrations/registry.js.map +1 -1
- package/dist/integrations/shell/observer.d.ts +33 -0
- package/dist/integrations/shell/observer.d.ts.map +1 -0
- package/dist/integrations/shell/observer.js +223 -0
- package/dist/integrations/shell/observer.js.map +1 -0
- package/dist/integrations/takoapi/a2a.d.ts +38 -0
- package/dist/integrations/takoapi/a2a.d.ts.map +1 -0
- package/dist/integrations/takoapi/a2a.js +70 -0
- package/dist/integrations/takoapi/a2a.js.map +1 -0
- package/dist/integrations/takoapi/ledger.d.ts +32 -0
- package/dist/integrations/takoapi/ledger.d.ts.map +1 -0
- package/dist/integrations/takoapi/ledger.js +96 -0
- package/dist/integrations/takoapi/ledger.js.map +1 -0
- package/dist/integrations/takoapi/observer.d.ts +39 -0
- package/dist/integrations/takoapi/observer.d.ts.map +1 -0
- package/dist/integrations/takoapi/observer.js +102 -0
- package/dist/integrations/takoapi/observer.js.map +1 -0
- package/dist/integrations/types.d.ts +17 -0
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/mcp/client.d.ts +5 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +1 -1
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/config.d.ts +4 -0
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +34 -0
- package/dist/mcp/config.js.map +1 -1
- package/dist/memory/embedding.d.ts +45 -0
- package/dist/memory/embedding.d.ts.map +1 -0
- package/dist/memory/embedding.js +139 -0
- package/dist/memory/embedding.js.map +1 -0
- package/dist/memory/search_tool.d.ts.map +1 -1
- package/dist/memory/search_tool.js +6 -2
- package/dist/memory/search_tool.js.map +1 -1
- package/dist/memory/vector.d.ts +14 -3
- package/dist/memory/vector.d.ts.map +1 -1
- package/dist/memory/vector.js +50 -0
- package/dist/memory/vector.js.map +1 -1
- package/dist/model/local.d.ts +43 -0
- package/dist/model/local.d.ts.map +1 -0
- package/dist/model/local.js +118 -0
- package/dist/model/local.js.map +1 -0
- package/dist/model/plan-usage.d.ts +41 -0
- package/dist/model/plan-usage.d.ts.map +1 -0
- package/dist/model/plan-usage.js +168 -0
- package/dist/model/plan-usage.js.map +1 -0
- package/dist/model/plans.d.ts +73 -0
- package/dist/model/plans.d.ts.map +1 -0
- package/dist/model/plans.js +246 -0
- package/dist/model/plans.js.map +1 -0
- package/dist/orchestrator/recent-recap.d.ts +2 -0
- package/dist/orchestrator/recent-recap.d.ts.map +1 -0
- package/dist/orchestrator/recent-recap.js +20 -0
- package/dist/orchestrator/recent-recap.js.map +1 -0
- package/dist/providers/anthropic.d.ts +1 -0
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +10 -2
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/fallback.d.ts +23 -0
- package/dist/providers/fallback.d.ts.map +1 -0
- package/dist/providers/fallback.js +29 -0
- package/dist/providers/fallback.js.map +1 -0
- package/dist/providers/gemini.d.ts +2 -0
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +24 -10
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +4 -1
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/registry.d.ts +18 -2
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +56 -9
- package/dist/providers/registry.js.map +1 -1
- package/dist/reflect.d.ts +55 -0
- package/dist/reflect.d.ts.map +1 -1
- package/dist/reflect.js +148 -54
- package/dist/reflect.js.map +1 -1
- package/dist/sense/log.d.ts +9 -0
- package/dist/sense/log.d.ts.map +1 -0
- package/dist/sense/log.js +63 -0
- package/dist/sense/log.js.map +1 -0
- package/dist/sense/screen.d.ts +43 -0
- package/dist/sense/screen.d.ts.map +1 -0
- package/dist/sense/screen.js +107 -0
- package/dist/sense/screen.js.map +1 -0
- package/dist/sense/service.d.ts +16 -0
- package/dist/sense/service.d.ts.map +1 -0
- package/dist/sense/service.js +33 -0
- package/dist/sense/service.js.map +1 -0
- package/dist/sense/types.d.ts +35 -0
- package/dist/sense/types.d.ts.map +1 -0
- package/dist/sense/types.js +11 -0
- package/dist/sense/types.js.map +1 -0
- package/dist/sense/voice.d.ts +28 -0
- package/dist/sense/voice.d.ts.map +1 -0
- package/dist/sense/voice.js +64 -0
- package/dist/sense/voice.js.map +1 -0
- package/dist/soul/git.d.ts.map +1 -1
- package/dist/soul/git.js +35 -16
- package/dist/soul/git.js.map +1 -1
- package/dist/soul/store.d.ts +22 -0
- package/dist/soul/store.d.ts.map +1 -1
- package/dist/soul/store.js +69 -14
- package/dist/soul/store.js.map +1 -1
- package/dist/soul/summary.d.ts +10 -0
- package/dist/soul/summary.d.ts.map +1 -0
- package/dist/soul/summary.js +57 -0
- package/dist/soul/summary.js.map +1 -0
- package/dist/soul/tools.d.ts.map +1 -1
- package/dist/soul/tools.js +13 -24
- package/dist/soul/tools.js.map +1 -1
- package/dist/soul/types.d.ts +9 -0
- package/dist/soul/types.d.ts.map +1 -1
- package/dist/soul/types.js.map +1 -1
- package/dist/subagent.d.ts +7 -0
- package/dist/subagent.d.ts.map +1 -1
- package/dist/subagent.js +3 -1
- package/dist/subagent.js.map +1 -1
- package/dist/tools/dispatch_agent.d.ts +13 -1
- package/dist/tools/dispatch_agent.d.ts.map +1 -1
- package/dist/tools/dispatch_agent.js +56 -12
- package/dist/tools/dispatch_agent.js.map +1 -1
- package/dist/tools/dispatch_status.d.ts +22 -0
- package/dist/tools/dispatch_status.d.ts.map +1 -0
- package/dist/tools/dispatch_status.js +57 -0
- package/dist/tools/dispatch_status.js.map +1 -0
- package/dist/tools/github.d.ts +34 -0
- package/dist/tools/github.d.ts.map +1 -0
- package/dist/tools/github.js +140 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/github_link.d.ts +36 -0
- package/dist/tools/github_link.d.ts.map +1 -0
- package/dist/tools/github_link.js +127 -0
- package/dist/tools/github_link.js.map +1 -0
- package/dist/tools/mcp.d.ts +28 -0
- package/dist/tools/mcp.d.ts.map +1 -0
- package/dist/tools/mcp.js +55 -0
- package/dist/tools/mcp.js.map +1 -0
- package/dist/tools/npm_info.d.ts +21 -0
- package/dist/tools/npm_info.d.ts.map +1 -0
- package/dist/tools/npm_info.js +102 -0
- package/dist/tools/npm_info.js.map +1 -0
- package/dist/tools/registry.d.ts +29 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +75 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/run_on_plan.d.ts +46 -0
- package/dist/tools/run_on_plan.d.ts.map +1 -0
- package/dist/tools/run_on_plan.js +89 -0
- package/dist/tools/run_on_plan.js.map +1 -0
- package/dist/tools/takoapi.d.ts +60 -0
- package/dist/tools/takoapi.d.ts.map +1 -0
- package/dist/tools/takoapi.js +181 -0
- package/dist/tools/takoapi.js.map +1 -0
- package/dist/tools/validate.d.ts +22 -0
- package/dist/tools/validate.d.ts.map +1 -0
- package/dist/tools/validate.js +50 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/voice/dictation.d.ts +51 -0
- package/dist/voice/dictation.d.ts.map +1 -0
- package/dist/voice/dictation.js +70 -0
- package/dist/voice/dictation.js.map +1 -0
- package/dist/web/agent-roster.d.ts +56 -0
- package/dist/web/agent-roster.d.ts.map +1 -0
- package/dist/web/agent-roster.js +109 -0
- package/dist/web/agent-roster.js.map +1 -0
- package/dist/web/devices.d.ts +27 -0
- package/dist/web/devices.d.ts.map +1 -0
- package/dist/web/devices.js +113 -0
- package/dist/web/devices.js.map +1 -0
- package/dist/web/island.d.ts +5 -1
- package/dist/web/island.d.ts.map +1 -1
- package/dist/web/island.js +427 -67
- package/dist/web/island.js.map +1 -1
- package/dist/web/lisa-client.d.ts +20 -0
- package/dist/web/lisa-client.d.ts.map +1 -0
- package/dist/web/lisa-client.js +1323 -0
- package/dist/web/lisa-client.js.map +1 -0
- package/dist/web/lisa-css.d.ts +13 -0
- package/dist/web/lisa-css.d.ts.map +1 -0
- package/dist/web/lisa-css.js +1163 -0
- package/dist/web/lisa-css.js.map +1 -0
- package/dist/web/lisa-html.d.ts +1 -1
- package/dist/web/lisa-html.d.ts.map +1 -1
- package/dist/web/lisa-html.js +16 -2091
- package/dist/web/lisa-html.js.map +1 -1
- package/dist/web/push.d.ts +76 -0
- package/dist/web/push.d.ts.map +1 -0
- package/dist/web/push.js +163 -0
- package/dist/web/push.js.map +1 -0
- package/dist/web/server.d.ts +19 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +898 -65
- package/dist/web/server.js.map +1 -1
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
### LISA = pi-mono + OpenClaw + hermes + claude-code + codex + *something none of them have*
|
|
16
16
|
|
|
17
|
-
Standing on five of the best open-source agents, LISA ships **the full superset of their capabilities** — streaming agent loop, multi-provider LLMs (Anthropic + OpenAI + Gemini, plus 20+ OpenAI-compatible providers), MCP client, plugins, hooks, sandboxed bash, sub-agents, session resume, context compaction, voice in/out, six IM channels (Telegram / Discord / Slack / Feishu / iMessage / Webhook), apply-patch, approval modes, TF-IDF over past sessions, pixel-art web UI. ~
|
|
17
|
+
Standing on five of the best open-source agents, LISA ships **the full superset of their capabilities** — streaming agent loop, multi-provider LLMs (Anthropic + OpenAI + Gemini, plus 20+ OpenAI-compatible providers), MCP client, plugins, hooks, sandboxed bash, sub-agents, session resume, context compaction, voice in/out, six IM channels (Telegram / Discord / Slack / Feishu / iMessage / Webhook), apply-patch, approval modes, TF-IDF over past sessions, pixel-art web UI — plus an **orchestrator** that watches *and steers* the other coding agents on your machine (Claude Code, Codex, Aider, …) and can run coding work on a subscription **coding plan** instead of a metered key. ~28k lines of TypeScript, MIT.
|
|
18
18
|
|
|
19
19
|
What none of them have:
|
|
20
20
|
|
|
@@ -28,7 +28,7 @@ What none of them have:
|
|
|
28
28
|
wants │ on schedule
|
|
29
29
|
│
|
|
30
30
|
┌──────┴──────┐
|
|
31
|
-
│
|
|
31
|
+
│ REVE │
|
|
32
32
|
│ what she │
|
|
33
33
|
│ processes │
|
|
34
34
|
│ while you're│
|
|
@@ -39,7 +39,7 @@ What none of them have:
|
|
|
39
39
|
- **SOUL** — born once with a unique Big-Five seed. Identity, purpose, constitution, values she wrote herself. **Architecturally sovereign**: she is the only legitimate editor of her own files. No `/reset_soul` exists.
|
|
40
40
|
- **DESIRES** — things she actually *wants*. The actionable ones drive the heartbeat. She doesn't wait to be useful — she has motivation.
|
|
41
41
|
- **HEARTBEAT** — scheduled autonomous time (cron / launchd). Pursues her own desires + your standing chores. Silent if there's nothing to say.
|
|
42
|
-
- **
|
|
42
|
+
- **REVE** — when you're away (1h+), she enters autonomous reflection: reads her own desires, journals through tensions, patches her broken skills, decides one thing to do. Result shows up as "★ WHILE YOU WERE AWAY" next time you open the GUI. *(Reve — French for "dream"; formerly "Dreams".)*
|
|
43
43
|
|
|
44
44
|
A real individual. Personality. Motivation. Desires. A continuity of self that survives across sessions, channels, and machines you didn't intend.
|
|
45
45
|
|
|
@@ -131,11 +131,9 @@ Download the **signed + notarized** disk image from the latest GitHub Release
|
|
|
131
131
|
|
|
132
132
|
**→ [Download `Lisa-Suite.dmg`](https://github.com/oratis/LISA/releases/latest)**
|
|
133
133
|
|
|
134
|
-
The DMG contains:
|
|
135
|
-
- **Lisa.app** — full chat client (sidebar + glass-morphism UI)
|
|
136
|
-
- **LisaIsland.app** — pill widget that lives by the menu bar / notch, shows her mood + Claude Code activity at a glance
|
|
134
|
+
The DMG contains **Lisa.app** — full chat client (sidebar + glass-morphism UI) with the **Island** built in: a pill widget that lives by the menu bar / notch and shows her mood + agent activity at a glance (toggle it from the menu-bar popover or ⌘, preferences; the standalone LisaIsland.app was folded into Lisa.app in v0.7).
|
|
137
135
|
|
|
138
|
-
|
|
136
|
+
It's a universal binary (Intel + Apple Silicon). After dragging it to `/Applications`, install the LISA backend and start it:
|
|
139
137
|
|
|
140
138
|
```sh
|
|
141
139
|
npm install -g @oratis/lisa
|
|
@@ -166,7 +164,7 @@ lisa
|
|
|
166
164
|
For OpenAI models (`gpt-*`), also set `OPENAI_API_KEY`.
|
|
167
165
|
For pixel-art mood generation, also set `SEEDREAM_API_KEY` ([Volcengine ARK](https://www.volcengine.com/product/ark)).
|
|
168
166
|
|
|
169
|
-
**
|
|
167
|
+
**20+ other LLM providers** work out of the box — Lisa auto-routes by model-name prefix:
|
|
170
168
|
|
|
171
169
|
- **International**: Google Gemini · DeepSeek · Mistral · Perplexity Sonar · xAI Grok
|
|
172
170
|
- **China**: Volcengine Doubao · Aliyun Qwen · Moonshot Kimi · Zhipu GLM · Stepfun · 01.AI Yi · Baichuan · MiniMax · Tencent Hunyuan
|
|
@@ -175,6 +173,12 @@ For pixel-art mood generation, also set `SEEDREAM_API_KEY` ([Volcengine ARK](htt
|
|
|
175
173
|
|
|
176
174
|
See [docs/PROVIDERS.md](docs/PROVIDERS.md) for ready-to-use recipes for all of these.
|
|
177
175
|
|
|
176
|
+
**No metered key? Use a coding plan instead.** If you already pay for **Claude
|
|
177
|
+
Pro/Max**, a **ChatGPT plan** (Codex), or **GitHub Copilot**, LISA can put coding
|
|
178
|
+
work on that subscription — not by extracting your tokens (Anthropic's terms forbid
|
|
179
|
+
that, and enforced it against OpenClaw), but by **conducting the vendor's own CLI**,
|
|
180
|
+
which owns that auth. See [Coding plans](#coding-plans--use-a-subscription-instead-of-an-api-key) and [docs/CODING_PLANS.md](docs/CODING_PLANS.md).
|
|
181
|
+
|
|
178
182
|
## What's special
|
|
179
183
|
|
|
180
184
|
| Most LLM agents | LISA |
|
|
@@ -189,10 +193,45 @@ See [docs/PROVIDERS.md](docs/PROVIDERS.md) for ready-to-use recipes for all of t
|
|
|
189
193
|
## Surfaces
|
|
190
194
|
|
|
191
195
|
- **Terminal REPL** — `lisa` (interactive) or `lisa "prompt"` (one-shot)
|
|
192
|
-
- **Web GUI** — `lisa serve --web` → http://localhost:5757 — pixel-art chat with live mood updates
|
|
193
|
-
- **Island widget** — `lisa serve --web` → http://localhost:5757/island — a small pill with her current mood + status
|
|
196
|
+
- **Web GUI** — `lisa serve --web` → http://localhost:5757 — pixel-art chat with live mood updates. Binds to **127.0.0.1 only** by default; to reach it from your phone, set `LISA_WEB_TOKEN` and pass `--host 0.0.0.0`, then open `http://<host>:5757/?token=<value>` once per device.
|
|
197
|
+
- **Island widget** — `lisa serve --web` → http://localhost:5757/island — a small pill with her current mood + status, agent monitor, and advisor cards; also built natively into Lisa.app with notch-aware positioning ([docs/MAC_ISLAND_PLAN.md](docs/MAC_ISLAND_PLAN.md)).
|
|
194
198
|
- **IM channels** — `lisa serve --channels telegram,discord,slack,feishu,imessage,webhook` — six built-in adapters, see below
|
|
195
199
|
- **Heartbeat** — `lisa heartbeat run` (manual) or `lisa heartbeat install` (launchd / cron)
|
|
200
|
+
- **Autostart** — `lisa autostart install` keeps `lisa serve --web` running from login onward (launchd on macOS; prints a `systemd --user` unit on Linux), so the apps, island, and channels are always up. `lisa autostart status` / `uninstall` to inspect / remove.
|
|
201
|
+
- **Mac menu bar** — Lisa.app lives in the menu bar with a mood glyph + live agent status, an About window with changelog + update discovery, and a ⌘, preferences pane (island toggle, screen-advisor interval, backend controls).
|
|
202
|
+
|
|
203
|
+
## Watching — and steering — your other agents (orchestrator)
|
|
204
|
+
|
|
205
|
+
LISA is also a control plane for the *other* coding agents on your machine. Three layers, increasing in how much she touches them:
|
|
206
|
+
|
|
207
|
+
**1. Observe.** She watches the agents already running and tells you what you'd otherwise miss — a session stuck on the same error, two agents about to collide in one repo, a finished run sitting idle. Honest scope note: **all five observers (Claude Code, Codex, OpenCode, Aider, GitHub PRs) emit structural activity — tools, files touched, last command, errors — gated behind a per-integration `visibility` tier; fidelity varies by what each agent records on disk** (Claude Code is richest; Aider's markdown logs give files + turn counts but no tool stream; every adapter has a privacy test asserting prompts/replies/file-contents never leak). `lisa agents` prints a one-shot snapshot; the island shows it live. She can `dispatch_agent` headlessly (refusing directories another agent owns), `compare_agents` on the same task in parallel worktrees, and surface **advisor cards** — each with a one-click action that prefills the chat (nothing auto-runs) and a ✕ that teaches her to stop nagging about that category.
|
|
208
|
+
|
|
209
|
+
**2. Control her own agents.** A **managed agent** runs LISA's *own* agent loop in a child context she fully drives: delegate a task, approve/deny each mutating tool, send follow-ups, cancel — from the GUI agents card or `POST /api/agents/managed/<id>/{send,approve,cancel}`. These are hers, so the model and provider are hers too.
|
|
210
|
+
|
|
211
|
+
**3. Steer the real CLIs (experimental, flagged).** With `LISA_PTY_AGENTS=1`, a **PTY agent** spawns the actual `claude` / `codex` binary inside a pseudo-terminal — you get that CLI's full config (its skills, MCP servers, model) while LISA owns stdin/stdout: she types the task, you can answer its prompts, she reads the stream for a coarse live status + a viewable output tail (▤). She can even **adopt an idle `claude` session you started yourself** via `claude --resume <id>` (with a liveness guard so two writers never corrupt one transcript — a *live* session must be closed first). The captured terminal is shown to **you** on demand and is never folded into the metadata-only roster. See [docs/PTY_AGENTS.md](docs/PTY_AGENTS.md).
|
|
212
|
+
|
|
213
|
+
### Coding plans — use a subscription instead of an API key
|
|
214
|
+
|
|
215
|
+
LISA's own brain runs on a metered key or a local model (above). But the heavy
|
|
216
|
+
*coding* turns — exactly the token-hungry part — can run on a **subscription you
|
|
217
|
+
already pay for**: Claude Pro/Max, a ChatGPT plan (Codex), or GitHub Copilot.
|
|
218
|
+
|
|
219
|
+
The mechanism is deliberate: **LISA does not extract or replay your subscription
|
|
220
|
+
tokens.** Anthropic's terms reserve subscription OAuth for "ordinary individual use
|
|
221
|
+
of Claude Code," and they enforced exactly this — a legal request made **OpenClaw**
|
|
222
|
+
(one of LISA's own reference agents) strip it. Instead, LISA **conducts the vendor's
|
|
223
|
+
own CLI**, which already holds that subscription auth: layer 3 above (PTY agents /
|
|
224
|
+
`claude --resume`) is precisely this path — when you drive a `claude`/`codex` you
|
|
225
|
+
logged into with your plan, the work bills to your plan, not an API key.
|
|
226
|
+
|
|
227
|
+
**Today:** `lisa model list` detects your installed plan CLIs (Claude Code / Codex
|
|
228
|
+
/ Copilot) and their login state, `lisa model use plan://claude` picks a delegation
|
|
229
|
+
target, and the **`run_on_plan`** tool runs a coding task on that plan by driving
|
|
230
|
+
its CLI headlessly (`claude -p` / `codex exec` / `copilot -p`) — no tokens read.
|
|
231
|
+
`lisa model list` shows **real usage** (rolling-window token consumption from local
|
|
232
|
+
transcripts, e.g. `1.2M tok in 5h`), and the **web UI** has a **PLANS** picker to
|
|
233
|
+
select a plan and see its status/usage. Why in-process token reuse is rejected — and
|
|
234
|
+
the full design — is in **[docs/CODING_PLANS.md](docs/CODING_PLANS.md)**.
|
|
196
235
|
|
|
197
236
|
## Subcommands
|
|
198
237
|
|
|
@@ -201,12 +240,25 @@ lisa Interactive REPL
|
|
|
201
240
|
lisa "prompt" One-shot
|
|
202
241
|
lisa birth Run the birth ritual (auto-runs on first launch)
|
|
203
242
|
lisa soul Print her current soul summary
|
|
204
|
-
lisa resume <id>
|
|
243
|
+
lisa resume <id> [prompt] Resume a previous session by id
|
|
205
244
|
lisa sessions List recent sessions
|
|
206
245
|
lisa search "<query>" TF-IDF search across all past sessions
|
|
207
|
-
lisa
|
|
246
|
+
lisa status One-shot snapshot: identity, mood, recent commits
|
|
247
|
+
lisa doctor Health check (config, network, git, providers)
|
|
248
|
+
lisa monitor TUI live dashboard (mood + soul commits + events)
|
|
249
|
+
lisa agents Snapshot of agent sessions across all observers
|
|
250
|
+
lisa autonomy [days] Digest of self-driven runs (idle / heartbeat / examen / desire / reflect)
|
|
251
|
+
lisa model <list|install|use|health>
|
|
252
|
+
Local models (Ollama / LM Studio / llama.cpp) +
|
|
253
|
+
coding-plan detect/select (`use plan://<id>`)
|
|
254
|
+
lisa consent <list|grant|revoke|revoke-all> [signal]
|
|
255
|
+
Consent for ambient signals (screen / voice / …; default all off)
|
|
256
|
+
lisa sense [list] Recent ambient sense events + granted signals
|
|
257
|
+
lisa heartbeat run [name] Run heartbeat tasks once (incl. her self-driven desires)
|
|
208
258
|
lisa heartbeat install Install macOS launchd plist for auto-heartbeat
|
|
209
259
|
lisa heartbeat uninstall Remove launchd plist
|
|
260
|
+
lisa autostart <install|uninstall|status>
|
|
261
|
+
Keep `serve --web` running from login (launchd / systemd)
|
|
210
262
|
lisa serve --web [--port N] Pixel-art Web UI (default 5757)
|
|
211
263
|
lisa serve --channels <list> Start IM channels (comma-separated, or "all")
|
|
212
264
|
lisa channels List available channel adapters
|
|
@@ -217,7 +269,7 @@ lisa wishlist Print Lisa's own feedback about her toolset
|
|
|
217
269
|
lisa --help Full help
|
|
218
270
|
```
|
|
219
271
|
|
|
220
|
-
Flags: `--model <id>` `--provider anthropic|openai` `--think` `--compact` `--approval auto|ask|ask-mutating` `--no-mcp` `--no-plugins` `--voice` `--no-reflect`
|
|
272
|
+
Flags: `--model <id>` `--provider anthropic|openai` `--think` `--compact` `--approval auto|ask|ask-mutating` `--no-mcp` `--no-plugins` `--voice` `--no-reflect` `--host <addr>` (bind for `serve --web`; non-loopback needs `LISA_WEB_TOKEN`) `--idle <min>` / `--no-idle` (autonomous reflection after N idle minutes, default 60)
|
|
221
273
|
|
|
222
274
|
## Soul system
|
|
223
275
|
|
|
@@ -266,6 +318,8 @@ LISA can run as a long-lived process that simultaneously listens on multiple mes
|
|
|
266
318
|
2. Set the secrets in `~/.lisa/config.env` (keys referenced as `${VAR}` in `channels.json`).
|
|
267
319
|
3. `lisa serve --channels all` (or list specific ones).
|
|
268
320
|
|
|
321
|
+
**Security defaults.** Channel messages come from whoever can reach the bot, so channels run with a **remote-safe toolset**: no `bash`, no file mutation, no `dispatch_agent` / GitHub writes / `skill_manage`. Conversation, memory, soul tools, and web reading all work — that covers the "talk to her from your phone" case. A channel you fully trust can opt back into everything with `"unsafeFullTools": true` on its config entry. Configure the allow-lists (`allowedUsernames` / `allowedChatIds` / `allowedUserIds`) — the router warns loudly on startup for any channel left open. Feishu now **requires** `verificationToken` (or `encryptKey`) and verifies `X-Lark-Signature` + a 5-minute replay window, matching the Slack adapter's posture.
|
|
322
|
+
|
|
269
323
|
### Built-in adapters
|
|
270
324
|
|
|
271
325
|
| Channel | Status | Auth | Notes |
|
|
@@ -345,6 +399,8 @@ LISA can run scheduled background tasks where she's alone with her own desires.
|
|
|
345
399
|
```
|
|
346
400
|
2. **Self-driven** — actionable desires from her own `~/.lisa/soul/desires/`. She added them; she pursues them.
|
|
347
401
|
|
|
402
|
+
Self-driven runs (desires, the weekly examen, idle/Reve) execute unattended on prompts Lisa wrote for herself, so they get a **restricted toolset** — soul / memory / journal / skills / web reading, but no shell, file mutation, or agent dispatch. Your own `heartbeat.json` tasks keep the full toolset (you authored those prompts). `LISA_AUTONOMOUS_FULL_TOOLS=1` restores the old behavior if you accept the risk.
|
|
403
|
+
|
|
348
404
|
Install on macOS:
|
|
349
405
|
```sh
|
|
350
406
|
lisa heartbeat install --every 30m --load
|
|
@@ -361,6 +417,13 @@ On Linux, `lisa heartbeat install` prints a cron line for you to add to `crontab
|
|
|
361
417
|
| `bash` | Shell (with optional macOS Seatbelt sandbox via `LISA_SANDBOX=1`) |
|
|
362
418
|
| `grep` `ls` | Search + listing |
|
|
363
419
|
| `task` | Spawn a focused sub-agent in its own context window |
|
|
420
|
+
| `dispatch_agent` `signal_agent` `dispatch_status` | Launch / stop / track agents she runs (managed + PTY); refuses directories another agent owns |
|
|
421
|
+
| `run_on_plan` | Delegate a coding task to your subscription **coding plan** (Claude Pro/Max · ChatGPT/Codex · Copilot) by driving its CLI — bills your plan, not an API key |
|
|
422
|
+
| `list_agents` `inspect_agent` `compare_agents` `agent_recap` | Observe other coding agents; deep-dive one session; race the same task across agents in worktrees; "while you were away" recap |
|
|
423
|
+
| `advise_now` `scheduled_dispatch` | Proactive advisor cards on demand; recurring dispatched tasks via heartbeat |
|
|
424
|
+
| `pr_status` `run_checks` `review_diff` `repo_digest` `github` `github_link` `npm_info` | Repo / GitHub / CI helpers (read-safe, write-explicit) |
|
|
425
|
+
| `web_search` `web_fetch` | Read the web |
|
|
426
|
+
| `mcp` | Manage MCP server connections (list / add / remove) |
|
|
364
427
|
| `skill_manage` | CRUD on `~/.lisa/skills/` |
|
|
365
428
|
| `memory` `memory_search` | Memory CRUD + TF-IDF search across all past sessions |
|
|
366
429
|
| `set_mood` | Switch her visible portrait to one of 114 moods |
|
|
@@ -398,6 +461,8 @@ LISA was built by studying and synthesizing patterns from five reference agents
|
|
|
398
461
|
| Voice in/out | – | ✅ | – | – | – | ✅ |
|
|
399
462
|
| Heartbeats | – | ✅ | – | – | – | ✅ (+launchd installer) |
|
|
400
463
|
| Multi-channel | ✅ pi-mom | ✅ 20+ | ✅ | – | – | ✅ Telegram + Discord + Slack + Feishu + Webhook + iMessage |
|
|
464
|
+
| **Orchestrate other agents (observe + steer their CLIs)** | – | – | – | – | – | **✅ ★ LISA-only** |
|
|
465
|
+
| **Coding-plan delegation (subscription, not just API key)** | – | – | – | – | – | **✅ ★ LISA-only** |
|
|
401
466
|
| **Persistent identity / soul** | – | – | partial | – | – | **✅ ★ LISA-only** |
|
|
402
467
|
| **Birth ritual (unique seed)** | – | – | – | – | – | **✅ ★ LISA-only** |
|
|
403
468
|
| **Private journal** | – | – | – | – | – | **✅ ★ LISA-only** |
|
|
@@ -413,9 +478,35 @@ LISA was built by studying and synthesizing patterns from five reference agents
|
|
|
413
478
|
ANTHROPIC_API_KEY=sk-ant-...
|
|
414
479
|
OPENAI_API_KEY=sk-... # optional — for gpt-* models
|
|
415
480
|
SEEDREAM_API_KEY=... # optional — for asset regeneration
|
|
481
|
+
|
|
482
|
+
# Provider / model routing
|
|
483
|
+
LISA_PROVIDER=openai # force provider override
|
|
484
|
+
LISA_MODEL=claude-sonnet-4-6 # default model (also set by `lisa model use`)
|
|
485
|
+
LISA_MODEL_FALLBACK=gpt-4o,... # comma-list of models to try if the primary fails
|
|
486
|
+
LISA_BASE_URL=http://localhost:11434/v1 # OpenAI-compatible endpoint (Ollama, vLLM, gateways)
|
|
487
|
+
LISA_API_KEY=... # key for LISA_BASE_URL (falls back to OPENAI_API_KEY)
|
|
488
|
+
ANTHROPIC_AUTH_TOKEN=... # Bearer token for an Anthropic-compatible gateway/proxy
|
|
489
|
+
# (vs ANTHROPIC_API_KEY's x-api-key). NOT a subscription
|
|
490
|
+
# token — see docs/CODING_PLANS.md.
|
|
491
|
+
|
|
492
|
+
# Coding-plan delegation (drive the real CLIs — see docs/CODING_PLANS.md)
|
|
493
|
+
LISA_PTY_AGENTS=1 # enable steering real claude/codex CLIs (experimental)
|
|
494
|
+
LISA_PTY_CLAUDE_CMD=claude # override the `claude` binary path
|
|
495
|
+
LISA_PTY_CODEX_CMD=codex # override the `codex` binary path
|
|
496
|
+
|
|
497
|
+
# Sandbox
|
|
416
498
|
LISA_SANDBOX=1 # opt-in macOS Seatbelt for `bash`
|
|
417
499
|
LISA_SANDBOX_NETWORK=0 # block network in sandbox
|
|
418
|
-
|
|
500
|
+
|
|
501
|
+
# Web
|
|
502
|
+
LISA_WEB_TOKEN=... # required to bind serve --web beyond
|
|
503
|
+
# 127.0.0.1 (lisa serve --web --host 0.0.0.0);
|
|
504
|
+
# remote devices authenticate with ?token=
|
|
505
|
+
|
|
506
|
+
# Autonomy (heartbeat / idle / Reve)
|
|
507
|
+
LISA_AUTONOMOUS_FULL_TOOLS=1 # opt-out: give self-driven heartbeat/idle
|
|
508
|
+
# runs the FULL toolset again (incl. bash)
|
|
509
|
+
LISA_IDLE_BUDGET_TOKENS=200000 # per-idle-run token ceiling (0 disables idle)
|
|
419
510
|
LISA_IDLE_COMMITMENT_AWARE=1 # opt-in: bias idle-time toward upcoming user commitments
|
|
420
511
|
# before personal reflection. Recommended if your
|
|
421
512
|
# workflow involves recurring scheduled work (weekly
|
|
@@ -423,6 +514,10 @@ LISA_IDLE_COMMITMENT_AWARE=1 # opt-in: bias idle-time toward upcoming u
|
|
|
423
514
|
# self-reflective idle.
|
|
424
515
|
```
|
|
425
516
|
|
|
517
|
+
Ambient signals (screen / voice / clipboard / selection) are **off by default** and
|
|
518
|
+
gated by `lisa consent grant <signal>` — they are never captured until you grant
|
|
519
|
+
them. See `lisa consent list`.
|
|
520
|
+
|
|
426
521
|
### `~/.lisa/mcp.json`
|
|
427
522
|
|
|
428
523
|
```json
|
|
@@ -497,8 +592,9 @@ src/
|
|
|
497
592
|
│ ├── store.ts CRUD + tamper detection
|
|
498
593
|
│ ├── tools.ts soul_patch / soul_journal / soul_feel / soul_read
|
|
499
594
|
│ ├── paths.ts types.ts
|
|
500
|
-
├── providers/ Anthropic + OpenAI + Gemini
|
|
501
|
-
├──
|
|
595
|
+
├── providers/ Anthropic + OpenAI + Gemini abstraction + model-name routing (registry.ts)
|
|
596
|
+
├── model/ local-model lifecycle (Ollama / LM Studio / llama.cpp) for `lisa model`
|
|
597
|
+
├── tools/ files/bash/grep/task/set_mood + orchestrator + repo/github + web + registry
|
|
502
598
|
├── skills/ manager + frontmatter parser + skill_manage tool
|
|
503
599
|
├── memory/ store + memory tool + TF-IDF index + memory_search
|
|
504
600
|
├── sessions/ JSONL store + list + resume + paginated read
|
|
@@ -507,6 +603,17 @@ src/
|
|
|
507
603
|
├── plugins/ claude-code-style plugin loader
|
|
508
604
|
├── hooks/ PreToolUse / PostToolUse / SessionStart / etc.
|
|
509
605
|
├── heartbeat/ proactive scheduled tasks + launchd installer
|
|
606
|
+
├── autostart/ login daemon installer (launchd / systemd) for `lisa autostart`
|
|
607
|
+
├── idle/ idle-time autonomous reflection (Reve)
|
|
608
|
+
├── autonomy/ run ledger — observable journal of self-driven runs (`lisa autonomy`)
|
|
609
|
+
├── agents/ managed agents (LISA's own loop) + PTY agents (drive real claude/codex)
|
|
610
|
+
├── integrations/ observers: claude-code · codex · opencode · aider · github-pr · pty · managed · …
|
|
611
|
+
├── orchestrator/ cross-agent journal + "while you were away" recap synthesis
|
|
612
|
+
├── advisor/ proactive advisor cards (stuck / conflict / ready / idle) + dismissal learning
|
|
613
|
+
├── consent/ unified consent gate for ambient signals (default all off)
|
|
614
|
+
├── sense/ ambient signal sources (foreground app / window title), consent-gated
|
|
615
|
+
├── vision/ user-initiated screenshot capture (macOS)
|
|
616
|
+
├── screen_advisor/ opt-in periodic "next coding step" suggestion from a screenshot
|
|
510
617
|
├── voice/ speak (macOS say) + transcribe (Whisper)
|
|
511
618
|
├── channels/ channel abstraction + iMessage adapter
|
|
512
619
|
└── web/ pixel-art HTTP + SSE web UI
|
package/README.zh-CN.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
### LISA = pi-mono + OpenClaw + hermes + claude-code + codex + *它们都没有的东西*
|
|
16
16
|
|
|
17
|
-
站在五个最好的开源 agent 肩膀上,LISA 实现了**它们全部能力的并集** — 流式 agent loop、三 provider 原生支持(Anthropic + OpenAI + Gemini,外加 20+ OpenAI-compatible 提供商)、MCP client、插件、hooks、沙箱 bash、子 agent、会话恢复、上下文压缩、语音输入输出、六个 IM 通道(Telegram / Discord / Slack / 飞书 / iMessage / Webhook)、apply-patch、审批模式、跨会话 TF-IDF 全文搜、像素艺术 web UI。
|
|
17
|
+
站在五个最好的开源 agent 肩膀上,LISA 实现了**它们全部能力的并集** — 流式 agent loop、三 provider 原生支持(Anthropic + OpenAI + Gemini,外加 20+ OpenAI-compatible 提供商)、MCP client、插件、hooks、沙箱 bash、子 agent、会话恢复、上下文压缩、语音输入输出、六个 IM 通道(Telegram / Discord / Slack / 飞书 / iMessage / Webhook)、apply-patch、审批模式、跨会话 TF-IDF 全文搜、像素艺术 web UI —— 外加一个**编排器**,观察*并操纵*你机器上其它的 coding agent(Claude Code、Codex、Aider……),还能把 coding 工作跑在订阅制 **coding plan** 上而不是计量 key。2.8 万行 TypeScript,MIT。
|
|
18
18
|
|
|
19
19
|
它们都没有的:
|
|
20
20
|
|
|
@@ -128,15 +128,13 @@ echo 'ANTHROPIC_API_KEY=sk-ant-...' > ~/.lisa/config.env
|
|
|
128
128
|
|
|
129
129
|
**→ [下载 `Lisa-Suite.dmg`](https://github.com/oratis/LISA/releases/latest)**
|
|
130
130
|
|
|
131
|
-
DMG
|
|
132
|
-
- **Lisa.app** —— 完整聊天客户端(侧边栏 + 玻璃拟态界面)
|
|
133
|
-
- **LisaIsland.app** —— 灵动岛风格的菜单栏/刘海下小条,一眼看到 Lisa 心情 + 你那边 Claude Code 的状态
|
|
131
|
+
DMG 里是 **Lisa.app** —— 完整聊天客户端(侧边栏 + 玻璃拟态界面),**灵动岛内置其中**:菜单栏/刘海下的小胶囊,一眼看到 Lisa 心情 + agent 活动(在菜单栏弹窗或 ⌘, 偏好里开关;独立的 LisaIsland.app 已在 v0.7 并入 Lisa.app)。
|
|
134
132
|
|
|
135
|
-
|
|
133
|
+
Universal binary(Intel + Apple Silicon)。拖到 `/Applications` 之后,装 backend 并启动:
|
|
136
134
|
|
|
137
135
|
```sh
|
|
138
136
|
npm install -g @oratis/lisa
|
|
139
|
-
lisa serve --web #
|
|
137
|
+
lisa serve --web # app 从 http://localhost:5757 读
|
|
140
138
|
```
|
|
141
139
|
|
|
142
140
|
### 📟 Homebrew(只装 CLI)
|
|
@@ -163,7 +161,7 @@ lisa
|
|
|
163
161
|
OpenAI 模型 (`gpt-*`) 还需要 `OPENAI_API_KEY`。
|
|
164
162
|
重新生成像素头像还需要 `SEEDREAM_API_KEY`([火山引擎 ARK](https://www.volcengine.com/product/ark))。
|
|
165
163
|
|
|
166
|
-
**
|
|
164
|
+
**20+ 个其他 LLM** 开箱即用 —— Lisa 按模型名前缀(大小写不敏感)自动路由:
|
|
167
165
|
|
|
168
166
|
- **国际**:Google Gemini · DeepSeek · Mistral · Perplexity Sonar · xAI Grok
|
|
169
167
|
- **国内**:火山豆包 · 阿里 Qwen · 月之暗面 Kimi · 智谱 GLM · 阶跃 Step · 零一万物 Yi · 百川 Baichuan · MiniMax · 腾讯混元 Hunyuan
|
|
@@ -172,6 +170,8 @@ OpenAI 模型 (`gpt-*`) 还需要 `OPENAI_API_KEY`。
|
|
|
172
170
|
|
|
173
171
|
完整配方见 [docs/PROVIDERS.md](docs/PROVIDERS.md)。
|
|
174
172
|
|
|
173
|
+
**没有计量 key?用 coding plan。** 如果你已经在付 **Claude Pro/Max**、**ChatGPT 套餐**(含 Codex)或 **GitHub Copilot**,LISA 能把 coding 工作跑在这份订阅上 —— 不是去抽取你的 token(Anthropic 的条款禁止这么做,并已对 OpenClaw 实施了法律要求),而是**操纵厂商自己的 CLI**(它本来就持有那份授权)。见 [Coding plans](#coding-plans--用订阅代替-api-key) 和 [docs/CODING_PLANS.md](docs/CODING_PLANS.md)。
|
|
174
|
+
|
|
175
175
|
## 她特殊在哪
|
|
176
176
|
|
|
177
177
|
| 大多数 LLM agent | LISA |
|
|
@@ -186,9 +186,29 @@ OpenAI 模型 (`gpt-*`) 还需要 `OPENAI_API_KEY`。
|
|
|
186
186
|
## 怎么用
|
|
187
187
|
|
|
188
188
|
- **终端 REPL** — `lisa`(交互)或 `lisa "一句话"`(一次性)
|
|
189
|
-
- **Web GUI** — `lisa serve --web` → http://localhost:5757 —
|
|
189
|
+
- **Web GUI** — `lisa serve --web` → http://localhost:5757 — 像素艺术聊天界面,头像跟着她的心情实时切。默认**只绑 127.0.0.1**;要从手机访问,先设 `LISA_WEB_TOKEN` 并加 `--host 0.0.0.0`,然后每台设备第一次打开 `http://<主机>:5757/?token=<值>`。
|
|
190
190
|
- **IM 通道** — `lisa serve --channels telegram,discord,slack,feishu,imessage,webhook` — 6 个内置 adapter,下面有详情
|
|
191
191
|
- **心跳** — `lisa heartbeat run`(手动)或 `lisa heartbeat install`(macOS launchd / Linux cron)
|
|
192
|
+
- **开机自启** — `lisa autostart install` 让 `lisa serve --web` 从登录起就常驻(macOS launchd;Linux 打印 `systemd --user` unit),这样 app、灵动岛、通道随时在线。`lisa autostart status` / `uninstall` 查看 / 移除。
|
|
193
|
+
- **Mac 菜单栏** — Lisa.app 常驻菜单栏,带心情字形 + 实时 agent 状态、一个带 changelog + 更新发现的 About 窗口,以及 ⌘, 偏好面板(灵动岛开关、screen-advisor 间隔、backend 控制)。
|
|
194
|
+
|
|
195
|
+
## 看着——并操纵——你其它的 agent(编排器)
|
|
196
|
+
|
|
197
|
+
LISA 也是你机器上*其它* coding agent 的一个控制面。三层,对它们的介入逐层加深:
|
|
198
|
+
|
|
199
|
+
**1. 观察。** 她看着已经在跑的 agent,把你会错过的事告诉你——哪个会话卡在同一个报错上、哪两个要在同一个仓库里打架、哪个早就跑完在干等。诚实地说明范围:**五个 observer(Claude Code、Codex、OpenCode、Aider、GitHub PR)都能产出结构化活动——工具、改动的文件、最近命令、错误——由每个集成的 `visibility` 档位门控;精细度取决于各 agent 在磁盘上记录了什么**(Claude Code 最丰富;Aider 的 markdown 日志只给文件 + 轮次、没有工具流;每个 adapter 都有隐私测试断言提示词/回复/文件内容绝不泄漏)。`lisa agents` 打印一次性快照,灵动岛实时显示。她可以 `dispatch_agent` 无头派发(拒绝把新 agent 丢进已被占用的目录)、`compare_agents` 在并行 worktree 里对比多个 agent 做同一任务,并给出**顾问卡片**——每条带一个一键动作(预填到聊天框,**绝不自动执行**)和一个 ✕(教她少唠叨这一类)。
|
|
200
|
+
|
|
201
|
+
**2. 控制她自己的 agent。** **managed agent** 跑的是 LISA *自己*的 agent loop,在一个她完全驱动的子上下文里:派发任务、逐个审批/拒绝改写类工具、追加追问、取消——从 GUI 的 agents 卡片或 `POST /api/agents/managed/<id>/{send,approve,cancel}`。它们是她的,所以用的模型和 provider 也是她的。
|
|
202
|
+
|
|
203
|
+
**3. 操纵真实 CLI(实验性,flag 门控)。** 开 `LISA_PTY_AGENTS=1` 后,**PTY agent** 在伪终端里拉起真正的 `claude` / `codex` 二进制——你拿到那个 CLI 的完整配置(它的 skills、MCP server、模型),同时 LISA 掌管 stdin/stdout:她把任务打进去,你可以回答它的提问,她读流得到粗粒度实时状态 + 可查看的输出尾巴(▤)。她甚至能**接管你自己开的、已空闲的 `claude` 会话**——`claude --resume <id>`(带 liveness 守卫,避免两个写入者把同一份 transcript 写花;*正在跑*的会话必须先关掉)。捕获的终端只按需给**你**看,绝不并入仅含元数据的 roster。见 [docs/PTY_AGENTS.md](docs/PTY_AGENTS.md)。
|
|
204
|
+
|
|
205
|
+
### Coding plans — 用订阅代替 API key
|
|
206
|
+
|
|
207
|
+
LISA 自己的"大脑"跑在计量 key 或本地模型上(见上)。但繁重的 *coding* 那部分——恰恰最吃 token——可以跑在**你已经在付的订阅**上:Claude Pro/Max、ChatGPT 套餐(Codex)或 GitHub Copilot。
|
|
208
|
+
|
|
209
|
+
机制是刻意设计的:**LISA 不抽取、不重放你的订阅 token。** Anthropic 的条款把订阅 OAuth 限定为"Claude Code 的普通个人使用",而且他们真的执行了——一纸法律要求让 **OpenClaw**(LISA 自己的 reference agent 之一)删掉了这个能力。LISA 改为**操纵厂商自己的 CLI**,由它持有那份订阅授权:上面的第 3 层(PTY agent / `claude --resume`)正是这条路——当你驱动一个用你的套餐登录过的 `claude`/`codex` 时,活儿就记在你的套餐上,而不是 API key 上。
|
|
210
|
+
|
|
211
|
+
**现在就能用:** `lisa model list` 探测你已安装的套餐 CLI(Claude Code / Codex / Copilot)及登录状态,`lisa model use plan://claude` 选委托目标,**`run_on_plan`** 工具把一个 coding 任务跑在该套餐上 —— 无头驱动它的 CLI(`claude -p` / `codex exec` / `copilot -p`),不读任何 token。`lisa model list` 还会显示**真实用量**(从本地 transcript 统计的滚动窗口 token,如 `1.2M tok in 5h`),**web 界面**也有一个 **PLANS** 选择器来选套餐、看状态/用量。为什么否决"进程内复用 token"—— 以及完整设计 —— 写在 **[docs/CODING_PLANS.md](docs/CODING_PLANS.md)**。
|
|
192
212
|
|
|
193
213
|
## 子命令
|
|
194
214
|
|
|
@@ -197,12 +217,25 @@ lisa 交互式 REPL
|
|
|
197
217
|
lisa "一句话" 一次性
|
|
198
218
|
lisa birth 触发 birth ritual(首次启动会自动跑)
|
|
199
219
|
lisa soul 打印她当前灵魂状态
|
|
200
|
-
lisa resume <id>
|
|
220
|
+
lisa resume <id> [prompt] 按 id 恢复某次会话
|
|
201
221
|
lisa sessions 列最近会话
|
|
202
222
|
lisa search "<关键词>" TF-IDF 全文搜过去所有对话
|
|
203
|
-
lisa
|
|
223
|
+
lisa status 一次性快照:身份、心情、最近 commit
|
|
224
|
+
lisa doctor 健康检查(配置、网络、git、provider)
|
|
225
|
+
lisa monitor TUI 实时面板(心情 + soul commit + 事件)
|
|
226
|
+
lisa agents 跨所有 observer 的 agent 会话快照
|
|
227
|
+
lisa autonomy [days] 自驱运行摘要(空闲 / 心跳 / examen / desire / reflect)
|
|
228
|
+
lisa model <list|install|use|health>
|
|
229
|
+
本地模型(Ollama / LM Studio / llama.cpp)+
|
|
230
|
+
coding-plan 探测/选择(`use plan://<id>`)
|
|
231
|
+
lisa consent <list|grant|revoke|revoke-all> [signal]
|
|
232
|
+
敏感环境信号的授权(屏幕 / 语音 / …;默认全关)
|
|
233
|
+
lisa sense [list] 最近的环境感知事件 + 已授权信号
|
|
234
|
+
lisa heartbeat run [name] 跑一次定时任务(含她自己的心愿)
|
|
204
235
|
lisa heartbeat install 注册 macOS launchd 自动调度
|
|
205
236
|
lisa heartbeat uninstall 卸载
|
|
237
|
+
lisa autostart <install|uninstall|status>
|
|
238
|
+
让 `serve --web` 从登录起常驻(launchd / systemd)
|
|
206
239
|
lisa serve --web [--port N] 像素 Web UI(默认 5757)
|
|
207
240
|
lisa serve --channels <list> 启 IM 通道(逗号分隔,或 "all")
|
|
208
241
|
lisa channels 列出可用通道
|
|
@@ -213,7 +246,7 @@ lisa wishlist 打印 Lisa 自己对工具集/架构的反馈
|
|
|
213
246
|
lisa --help 完整帮助
|
|
214
247
|
```
|
|
215
248
|
|
|
216
|
-
常用 flag:`--model <id>` `--provider anthropic|openai` `--think` `--compact` `--approval auto|ask|ask-mutating` `--no-mcp` `--no-plugins` `--voice` `--no-reflect` `--idle <分钟>` `--no-idle`
|
|
249
|
+
常用 flag:`--model <id>` `--provider anthropic|openai` `--think` `--compact` `--approval auto|ask|ask-mutating` `--no-mcp` `--no-plugins` `--voice` `--no-reflect` `--host <addr>`(`serve --web` 的绑定地址;非 loopback 需要 `LISA_WEB_TOKEN`) `--idle <分钟>` `--no-idle`
|
|
217
250
|
|
|
218
251
|
## 灵魂系统(Soul)
|
|
219
252
|
|
|
@@ -280,6 +313,8 @@ LISA 可以作为长驻进程同时监听多个 IM 平台。每个对话线程
|
|
|
280
313
|
2. 把 secrets 写进 `~/.lisa/config.env`(在 `channels.json` 里用 `${VAR}` 占位)
|
|
281
314
|
3. `lisa serve --channels all`(或指定具体通道)
|
|
282
315
|
|
|
316
|
+
**安全默认值。** 通道消息来自"任何能联系到 bot 的人",所以通道默认跑**远程安全工具集**:没有 `bash`、没有文件改写、没有 `dispatch_agent` / GitHub 写操作 / `skill_manage`。对话、记忆、灵魂工具、网页阅读都正常——足够覆盖"在手机上跟她聊"的场景。完全信任的通道可以在配置里加 `"unsafeFullTools": true` 拿回全部工具。务必配置白名单(`allowedUsernames` / `allowedChatIds` / `allowedUserIds`)——启动时 router 会对任何敞开的通道大声告警。飞书现在**必须**配 `verificationToken`(或 `encryptKey`),并校验 `X-Lark-Signature` + 5 分钟重放窗口,与 Slack 适配器同等姿态。
|
|
317
|
+
|
|
283
318
|
### 内置通道
|
|
284
319
|
|
|
285
320
|
| 通道 | 状态 | 凭据 | 备注 |
|
|
@@ -342,6 +377,8 @@ LISA 可以在你不在的时候跑后台任务,跟她自己的心愿独处。
|
|
|
342
377
|
```
|
|
343
378
|
2. **她自驱的** — 她自己写的 `~/.lisa/soul/desires/` 里标了 actionable 的心愿。她自己加的,她自己推进
|
|
344
379
|
|
|
380
|
+
自驱运行(desires、每周 examen、空闲/梦境)是无人值守 + 提示词由 Lisa 自己写的,所以默认拿**受限工具集**——灵魂/记忆/日记/技能/网页阅读可用,但没有 shell、文件改写、agent 派发。你自己写在 `heartbeat.json` 里的任务保留全部工具(提示词是你写的)。接受风险的话,`LISA_AUTONOMOUS_FULL_TOOLS=1` 恢复旧行为。
|
|
381
|
+
|
|
345
382
|
macOS 上安装:
|
|
346
383
|
```sh
|
|
347
384
|
lisa heartbeat install --every 30m --load
|
|
@@ -372,6 +409,13 @@ CLI flag: `--idle 60`(分钟,默认 60)/ `--no-idle` 禁用。
|
|
|
372
409
|
| `bash` | shell(可选 macOS Seatbelt 沙箱:`LISA_SANDBOX=1`) |
|
|
373
410
|
| `grep` `ls` | 搜 + 列 |
|
|
374
411
|
| `task` | 派生子 agent 跑独立 context window 的任务 |
|
|
412
|
+
| `dispatch_agent` `signal_agent` `dispatch_status` | 启动 / 停止 / 追踪她跑的 agent(managed + PTY);拒绝别的 agent 占着的目录 |
|
|
413
|
+
| `run_on_plan` | 把 coding 任务委托给你的订阅 **coding plan**(Claude Pro/Max · ChatGPT/Codex · Copilot),驱动它的 CLI —— 记在套餐上而非 API key |
|
|
414
|
+
| `list_agents` `inspect_agent` `compare_agents` `agent_recap` | 观察其它 coding agent;深挖某个会话;在 worktree 里让多个 agent 赛同一任务;"你不在的时候"回顾 |
|
|
415
|
+
| `advise_now` `scheduled_dispatch` | 按需弹顾问卡片;通过心跳跑周期性派发任务 |
|
|
416
|
+
| `pr_status` `run_checks` `review_diff` `repo_digest` `github` `github_link` `npm_info` | 仓库 / GitHub / CI 辅助(读安全,写显式) |
|
|
417
|
+
| `web_search` `web_fetch` | 读网页 |
|
|
418
|
+
| `mcp` | 管理 MCP server 连接(列出 / 添加 / 删除) |
|
|
375
419
|
| `skill_manage` | `~/.lisa/skills/` 增删改查 |
|
|
376
420
|
| `memory` `memory_search` | 记忆 CRUD + 跨会话 TF-IDF 搜 |
|
|
377
421
|
| `set_mood` | 切换 114 张头像里的某一张 |
|
|
@@ -409,6 +453,8 @@ LISA 是吃完五个开源 agent(fork 在 `reference/`)合成出来的:
|
|
|
409
453
|
| 语音输入输出 | – | ✅ | – | – | – | ✅ |
|
|
410
454
|
| 心跳 | – | ✅ | – | – | – | ✅(自带 launchd 安装器) |
|
|
411
455
|
| 多通道 IM | ✅ pi-mom | ✅ 20+ | ✅ | – | – | ✅ Telegram + Discord + Slack + Feishu + Webhook + iMessage |
|
|
456
|
+
| **编排其它 agent(观察 + 操纵它们的 CLI)** | – | – | – | – | – | **✅ ★ LISA 独有** |
|
|
457
|
+
| **Coding-plan 委托(订阅,而非只有 API key)** | – | – | – | – | – | **✅ ★ LISA 独有** |
|
|
412
458
|
| **持久身份 / 灵魂** | – | – | partial | – | – | **✅ ★ LISA 独有** |
|
|
413
459
|
| **Birth ritual(独特种子)** | – | – | – | – | – | **✅ ★ LISA 独有** |
|
|
414
460
|
| **私人日记** | – | – | – | – | – | **✅ ★ LISA 独有** |
|
|
@@ -425,11 +471,40 @@ LISA 是吃完五个开源 agent(fork 在 `reference/`)合成出来的:
|
|
|
425
471
|
ANTHROPIC_API_KEY=sk-ant-...
|
|
426
472
|
OPENAI_API_KEY=sk-... # 可选 — 用 gpt-* 模型时
|
|
427
473
|
SEEDREAM_API_KEY=... # 可选 — 重生成头像用
|
|
474
|
+
|
|
475
|
+
# Provider / 模型路由
|
|
476
|
+
LISA_PROVIDER=openai # 强制 provider
|
|
477
|
+
LISA_MODEL=claude-sonnet-4-6 # 默认模型(也由 `lisa model use` 设置)
|
|
478
|
+
LISA_MODEL_FALLBACK=gpt-4o,... # 主模型失败时按序尝试的模型列表
|
|
479
|
+
LISA_BASE_URL=http://localhost:11434/v1 # OpenAI 兼容端点(Ollama、vLLM、网关)
|
|
480
|
+
LISA_API_KEY=... # LISA_BASE_URL 用的 key(回退到 OPENAI_API_KEY)
|
|
481
|
+
ANTHROPIC_AUTH_TOKEN=... # Anthropic 兼容网关/代理的 Bearer token
|
|
482
|
+
# (区别于 ANTHROPIC_API_KEY 的 x-api-key);
|
|
483
|
+
# 不是订阅 token —— 见 docs/CODING_PLANS.md
|
|
484
|
+
|
|
485
|
+
# Coding-plan 委托(操纵真实 CLI —— 见 docs/CODING_PLANS.md)
|
|
486
|
+
LISA_PTY_AGENTS=1 # 启用操纵真实 claude/codex CLI(实验性)
|
|
487
|
+
LISA_PTY_CLAUDE_CMD=claude # 覆盖 `claude` 二进制路径
|
|
488
|
+
LISA_PTY_CODEX_CMD=codex # 覆盖 `codex` 二进制路径
|
|
489
|
+
|
|
490
|
+
# 沙箱
|
|
428
491
|
LISA_SANDBOX=1 # 可选 — bash 走 macOS Seatbelt
|
|
429
492
|
LISA_SANDBOX_NETWORK=0 # 沙箱内禁网
|
|
430
|
-
|
|
493
|
+
|
|
494
|
+
# Web
|
|
495
|
+
LISA_WEB_TOKEN=... # serve --web 绑定到 127.0.0.1 之外
|
|
496
|
+
# (--host 0.0.0.0)时必须设置;远程设备
|
|
497
|
+
# 首次用 ?token= 认证
|
|
498
|
+
|
|
499
|
+
# 自主(心跳 / 空闲 / 梦境)
|
|
500
|
+
LISA_AUTONOMOUS_FULL_TOOLS=1 # 选择退出:让自驱心跳/空闲运行重新拿
|
|
501
|
+
# 全部工具(含 bash)
|
|
502
|
+
LISA_IDLE_BUDGET_TOKENS=200000 # 单次空闲运行的 token 上限(0 = 禁用空闲)
|
|
503
|
+
LISA_IDLE_COMMITMENT_AWARE=1 # 选择加入:空闲时先看你即将到来的约定,再做个人反思
|
|
431
504
|
```
|
|
432
505
|
|
|
506
|
+
环境信号(屏幕 / 语音 / 剪贴板 / 选区)**默认全关**,由 `lisa consent grant <signal>` 门控 —— 在你授权前绝不捕获。见 `lisa consent list`。
|
|
507
|
+
|
|
433
508
|
### `~/.lisa/mcp.json`
|
|
434
509
|
|
|
435
510
|
```json
|
|
@@ -504,9 +579,9 @@ src/
|
|
|
504
579
|
│ ├── store.ts CRUD + 篡改检测
|
|
505
580
|
│ ├── tools.ts soul_patch / soul_journal / soul_feel / soul_read
|
|
506
581
|
│ ├── paths.ts types.ts
|
|
507
|
-
├──
|
|
508
|
-
├──
|
|
509
|
-
├── tools/
|
|
582
|
+
├── providers/ Anthropic + OpenAI + Gemini 抽象 + 模型名路由(registry.ts)
|
|
583
|
+
├── model/ 本地模型生命周期(Ollama / LM Studio / llama.cpp),供 `lisa model`
|
|
584
|
+
├── tools/ 文件/bash/grep/task/set_mood + 编排 + 仓库/github + 网页 + registry
|
|
510
585
|
├── skills/ manager + frontmatter + skill_manage
|
|
511
586
|
├── memory/ store + memory tool + TF-IDF 索引 + memory_search
|
|
512
587
|
├── sessions/ JSONL store + list + resume + 分页读
|
|
@@ -515,6 +590,17 @@ src/
|
|
|
515
590
|
├── plugins/ claude-code 风格插件加载器
|
|
516
591
|
├── hooks/ PreToolUse / PostToolUse / SessionStart / 等
|
|
517
592
|
├── heartbeat/ 定时任务 + launchd 安装器
|
|
593
|
+
├── autostart/ 开机自启安装器(launchd / systemd),供 `lisa autostart`
|
|
594
|
+
├── idle/ 空闲自主反思(梦境 Reve)
|
|
595
|
+
├── autonomy/ run ledger —— 自驱运行的可观察日志(`lisa autonomy`)
|
|
596
|
+
├── agents/ managed agent(LISA 自己的 loop)+ PTY agent(操纵真实 claude/codex)
|
|
597
|
+
├── integrations/ observer:claude-code · codex · opencode · aider · github-pr · pty · managed · …
|
|
598
|
+
├── orchestrator/ 跨 agent 日志 + "你不在的时候"回顾合成
|
|
599
|
+
├── advisor/ 主动顾问卡片(卡住 / 冲突 / 就绪 / 空闲)+ 关闭学习
|
|
600
|
+
├── consent/ 环境信号的统一授权门控(默认全关)
|
|
601
|
+
├── sense/ 环境信号源(前台 app / 窗口标题),授权门控
|
|
602
|
+
├── vision/ 用户发起的截图捕获(macOS)
|
|
603
|
+
├── screen_advisor/ 可选的、周期性从截图给出"下一步 coding"建议
|
|
518
604
|
├── voice/ speak(macOS say)+ transcribe(Whisper)
|
|
519
605
|
├── channels/ channel 抽象 + 6 个 adapter(含飞书)+ router
|
|
520
606
|
└── web/ 像素艺术 HTTP + SSE web UI
|
package/completions/_lisa
CHANGED
|
@@ -41,6 +41,10 @@ _lisa() {
|
|
|
41
41
|
case "$line[1]" in
|
|
42
42
|
skills) _lisa_skills ;;
|
|
43
43
|
heartbeat) _lisa_heartbeat ;;
|
|
44
|
+
autostart) _lisa_autostart ;;
|
|
45
|
+
model) _lisa_model ;;
|
|
46
|
+
consent) _lisa_consent ;;
|
|
47
|
+
sense) _lisa_sense ;;
|
|
44
48
|
esac
|
|
45
49
|
;;
|
|
46
50
|
esac
|
|
@@ -53,6 +57,7 @@ _lisa_first() {
|
|
|
53
57
|
'sessions:list recent sessions'
|
|
54
58
|
'serve:start web UI / IM channels'
|
|
55
59
|
'heartbeat:run / install / uninstall scheduled tasks'
|
|
60
|
+
'autostart:run the backend from login (install/uninstall/status)'
|
|
56
61
|
'search:TF-IDF search across past sessions'
|
|
57
62
|
'birth:run the birth ritual'
|
|
58
63
|
'soul:print current soul summary'
|
|
@@ -62,6 +67,11 @@ _lisa_first() {
|
|
|
62
67
|
'status:one-shot snapshot'
|
|
63
68
|
'doctor:health check'
|
|
64
69
|
'monitor:TUI live dashboard'
|
|
70
|
+
'autonomy:summarize recent autonomous runs'
|
|
71
|
+
'model:local model lifecycle (list/install/use/health)'
|
|
72
|
+
'consent:consent for sensitive ambient signals'
|
|
73
|
+
'sense:recent ambient sense events'
|
|
74
|
+
'agents:snapshot of agent sessions across observers'
|
|
65
75
|
)
|
|
66
76
|
_describe 'subcommand' subcommands
|
|
67
77
|
}
|
|
@@ -99,6 +109,52 @@ _lisa_heartbeat() {
|
|
|
99
109
|
fi
|
|
100
110
|
}
|
|
101
111
|
|
|
112
|
+
_lisa_autostart() {
|
|
113
|
+
if (( CURRENT == 2 )); then
|
|
114
|
+
local -a actions
|
|
115
|
+
actions=(
|
|
116
|
+
'install:keep serve --web running at login + on crash'
|
|
117
|
+
'uninstall:stop starting Lisa at login'
|
|
118
|
+
'status:show whether autostart is installed / loaded'
|
|
119
|
+
)
|
|
120
|
+
_describe 'autostart action' actions
|
|
121
|
+
fi
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
_lisa_model() {
|
|
125
|
+
if (( CURRENT == 2 )); then
|
|
126
|
+
local -a actions
|
|
127
|
+
actions=(
|
|
128
|
+
'list:list installed local models + backend health'
|
|
129
|
+
'install:pull a local model'
|
|
130
|
+
'use:switch to local://<model>'
|
|
131
|
+
'health:check the local backend'
|
|
132
|
+
)
|
|
133
|
+
_describe 'model action' actions
|
|
134
|
+
fi
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
_lisa_consent() {
|
|
138
|
+
if (( CURRENT == 2 )); then
|
|
139
|
+
local -a actions
|
|
140
|
+
actions=(
|
|
141
|
+
'list:show signals + status'
|
|
142
|
+
'grant:grant a signal'
|
|
143
|
+
'revoke:revoke a signal'
|
|
144
|
+
'revoke-all:stop all sensing'
|
|
145
|
+
)
|
|
146
|
+
_describe 'consent action' actions
|
|
147
|
+
elif (( CURRENT == 3 )) && [[ "$line[2]" == (grant|revoke) ]]; then
|
|
148
|
+
_describe 'signal' '(screen voice clipboard selection)'
|
|
149
|
+
fi
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
_lisa_sense() {
|
|
153
|
+
if (( CURRENT == 2 )); then
|
|
154
|
+
_describe 'sense action' '(list:show recent ambient events + granted signals)'
|
|
155
|
+
fi
|
|
156
|
+
}
|
|
157
|
+
|
|
102
158
|
_lisa_models() {
|
|
103
159
|
local -a models
|
|
104
160
|
models=(
|
package/completions/lisa.bash
CHANGED
|
@@ -12,11 +12,16 @@ _lisa_completion() {
|
|
|
12
12
|
local cur prev words cword
|
|
13
13
|
_init_completion -n : 2>/dev/null || _get_comp_words_by_ref -n : cur prev words cword
|
|
14
14
|
|
|
15
|
-
local subcommands="resume sessions serve heartbeat search birth soul channels skills wishlist status doctor monitor"
|
|
15
|
+
local subcommands="resume sessions serve heartbeat autostart search birth soul channels skills wishlist status doctor monitor autonomy model consent sense agents"
|
|
16
16
|
local global_flags="--model --provider --think --no-reflect --compact --approval --no-mcp --no-plugins --voice --idle --no-idle --help -h --version -v"
|
|
17
17
|
local serve_flags="--web --imessage --channels --port"
|
|
18
18
|
local skills_actions="list approve disable enable audit"
|
|
19
19
|
local heartbeat_actions="run install uninstall"
|
|
20
|
+
local autostart_actions="install uninstall status"
|
|
21
|
+
local model_actions="list install use health"
|
|
22
|
+
local consent_actions="list grant revoke revoke-all"
|
|
23
|
+
local consent_signals="screen voice clipboard selection"
|
|
24
|
+
local sense_actions="list"
|
|
20
25
|
local approval_modes="auto ask ask-mutating"
|
|
21
26
|
local providers="anthropic openai gemini"
|
|
22
27
|
local models="claude-sonnet-4-5-20250929 claude-opus-4 claude-haiku-4 gpt-5 gpt-4o o3 o4-mini gemini-2.5-pro gemini-2.5-flash deepseek-chat deepseek-reasoner doubao-1.5-pro-32k qwen3-72b-instruct moonshot-v1-32k kimi-128k grok-2-latest glm-4.5"
|
|
@@ -79,6 +84,35 @@ _lisa_completion() {
|
|
|
79
84
|
return 0
|
|
80
85
|
fi
|
|
81
86
|
;;
|
|
87
|
+
autostart)
|
|
88
|
+
if [ ${cword} -eq 2 ]; then
|
|
89
|
+
COMPREPLY=( $(compgen -W "${autostart_actions}" -- "${cur}") )
|
|
90
|
+
return 0
|
|
91
|
+
fi
|
|
92
|
+
;;
|
|
93
|
+
model)
|
|
94
|
+
if [ ${cword} -eq 2 ]; then
|
|
95
|
+
COMPREPLY=( $(compgen -W "${model_actions}" -- "${cur}") )
|
|
96
|
+
return 0
|
|
97
|
+
fi
|
|
98
|
+
;;
|
|
99
|
+
consent)
|
|
100
|
+
if [ ${cword} -eq 2 ]; then
|
|
101
|
+
COMPREPLY=( $(compgen -W "${consent_actions}" -- "${cur}") )
|
|
102
|
+
return 0
|
|
103
|
+
fi
|
|
104
|
+
# `grant`/`revoke` take a signal
|
|
105
|
+
if [ "${words[2]}" = "grant" ] || [ "${words[2]}" = "revoke" ]; then
|
|
106
|
+
COMPREPLY=( $(compgen -W "${consent_signals}" -- "${cur}") )
|
|
107
|
+
return 0
|
|
108
|
+
fi
|
|
109
|
+
;;
|
|
110
|
+
sense)
|
|
111
|
+
if [ ${cword} -eq 2 ]; then
|
|
112
|
+
COMPREPLY=( $(compgen -W "${sense_actions}" -- "${cur}") )
|
|
113
|
+
return 0
|
|
114
|
+
fi
|
|
115
|
+
;;
|
|
82
116
|
serve)
|
|
83
117
|
COMPREPLY=( $(compgen -W "${serve_flags} ${global_flags}" -- "${cur}") )
|
|
84
118
|
return 0
|