You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/dashboard.md
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -30,6 +30,7 @@ The main view discovers all agents in the workspace directory and shows their st
30
30
| Daemon processes | Agents run as background daemons via `forge serve` — they survive UI shutdown |
31
31
| Live status | Real-time state updates (stopped, starting, running, errored) |
32
32
| Passphrase unlock | Prompts for `FORGE_PASSPHRASE` when agents have encrypted secrets |
33
+
| Startup error display | Shows actual error messages (e.g., missing env vars) in the agent card when startup fails, extracted from `.forge/serve.log`|
33
34
| Auto-rescan | Detects new agents after creation |
34
35
| Unified management | All agents (UI-started or CLI-started) get identical Start/Stop controls |
35
36
@@ -39,6 +40,7 @@ The UI manages agents as daemon processes using `forge serve start` / `forge ser
39
40
40
41
-**Agents survive UI shutdown** — closing the dashboard does not kill running agents.
41
42
-**Restart detection** — restarting the UI auto-discovers running agents via `.forge/serve.json` and TCP probing.
43
+
-**PID liveness verification** — after `forge serve start` returns, the UI verifies the child process is still alive via PID probing and TCP port check. If the child crashed (e.g., missing env vars), the error is extracted from `.forge/serve.log` and displayed in the agent card.
42
44
-**Unified view** — agents started from the CLI (`forge serve start`) and agents started from the UI appear identically. There is no distinction between "UI-managed" and "CLI-managed" agents.
43
45
44
46
## Interactive Chat
@@ -102,7 +104,7 @@ An AI-powered conversational tool for creating custom skills. Access it via the
102
104
103
105
### How It Works
104
106
105
-
The Skill Builder uses the agent's own LLM provider to power a chat conversation that generates valid SKILL.md files and optional helper scripts. It automatically selects a stronger code-generation model when available (e.g. `gpt-4.1` for OpenAI, `claude-opus-4-6` for Anthropic).
107
+
The Skill Builder uses the agent's own LLM provider to power a chat conversation that generates valid SKILL.md files and optional helper scripts. It automatically selects a stronger code-generation model when available (e.g. `gpt-4.1` for OpenAI, `claude-opus-4-6` for Anthropic). API key detection loads the agent's `.env` file and encrypted secrets (if unlocked) in addition to system environment variables.
The loop terminates when `FinishReason == "stop"` or `len(ToolCalls) == 0`.
23
23
24
+
### Q&A Nudge Suppression
25
+
26
+
When the agent finishes with `stop` and no workflow phases are configured, the loop checks whether edit or git tools were used. If only explore-phase tools were invoked (e.g., `web_search`, `file_read`), the conversation is classified as informational/Q&A — the agent's text response is the final answer and no continuation nudge ("You stopped…") is sent. This prevents the agent from re-summarizing answers to simple questions.
27
+
24
28
## LLM Providers
25
29
26
30
Forge supports multiple LLM providers with automatic fallback:
@@ -222,7 +226,7 @@ The runner registers five hook groups: logging, audit, progress, global guardrai
222
226
223
227
## Streaming
224
228
225
-
The current implementation (v1) runs the full tool-calling loop non-streaming. `ExecuteStream` calls `Execute`internally and emits the final response as a single message on a channel. True word-by-word streaming during tool loops is planned for v2.
229
+
The LLM tool-calling loop runs non-streaming internally. `ExecuteStream` calls `Execute` and emits the final response on a channel. However, the **UI chat proxy** (`forge-ui/chat.go`) streams A2A SSE events to the browser in real-time — `status` events carry incremental text, `progress` events carry tool execution updates, and `result` events carry the final response. The frontend renders text and tool progress as each event arrives.
226
230
227
231
---
228
232
← [Tools](tools.md) | [Back to README](../README.md) | [Memory](memory.md) →
Copy file name to clipboardExpand all lines: docs/security/guardrails.md
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -108,7 +108,8 @@ Some tools legitimately return PII as part of their function (e.g., `github_get_
108
108
"file_create",
109
109
"code_agent_write",
110
110
"code_agent_edit",
111
-
"cli_execute"
111
+
"cli_execute",
112
+
"web_search"
112
113
]
113
114
}
114
115
}
@@ -122,6 +123,7 @@ Some tools legitimately return PII as part of their function (e.g., `github_get_
122
123
|----------|--------|
123
124
| Per-guardrail scope |`allow_tools` on `no_pii` does **not** bypass `no_secrets` — each guardrail has its own allowlist |
124
125
| Write tools included |`file_create`, `code_agent_write`, `code_agent_edit`, and `cli_execute` are included because they echo back content the LLM already has or return operational output that may contain incidental PII (e.g., git log author emails) |
126
+
| Web search included |`web_search` is included because search results routinely contain names, emails, and other PII that is public web content — blocking these results would make Q&A conversations unusable |
125
127
| Default config | The default policy scaffold pre-configures `allow_tools` for GitHub profile tools and write tools |
126
128
| Custom overrides | Override via `policy-scaffold.json` to add or remove tools from the allowlist |
| 9 |**Working directory**|`cmd.Dir` set to `workDir` for relative path resolution |
146
-
| 10 |**Environment isolation**| Only `PATH`, `HOME`, `LANG`, explicit passthrough vars, proxy vars, and `GH_CONFIG_DIR` (auto-set **only for `gh` binary** when HOME is overridden) |
146
+
| 10 |**Environment isolation**| Only `PATH`, `HOME`, `LANG`, explicit passthrough vars, proxy vars, `GH_CONFIG_DIR` (auto-set **only for `gh`**), and `KUBECONFIG`/`NO_PROXY` (**only for `kubectl`/`helm`** — restores kubeconfig access and bypasses egress proxy for the K8s API server when HOME is overridden) |
147
147
| 11 |**Output limits**| Configurable max output size (default: 1MB) to prevent memory exhaustion |
148
148
| 12 |**Skill guardrails**| Skill-declared `deny_commands` and `deny_output` patterns via hooks |
149
149
| 13 |**Custom tool entrypoint validation**| Custom tool entrypoints are validated against path traversal, symlink escape, absolute paths, and non-regular files |
| 9 | **Working directory** | `cmd.Dir` set to `workDir` so relative paths resolve within the agent directory |
120
-
| 10 | **Environment isolation** | Only `PATH`, `HOME`, `LANG`, explicit passthrough vars, proxy vars, `OPENAI_ORG_ID` (when set), and `GH_CONFIG_DIR` (auto-set to real `~/.config/gh` **only for the `gh` binary** when HOME is overridden). `HOME` is overridden to `workDir` to prevent `~` expansion from reaching the real home directory |
120
+
| 10 | **Environment isolation** | Only `PATH`, `HOME`, `LANG`, explicit passthrough vars, proxy vars, `OPENAI_ORG_ID` (when set), `GH_CONFIG_DIR` (auto-set to real `~/.config/gh` **only for `gh`**), and `KUBECONFIG`/`NO_PROXY` (**only for `kubectl`/`helm`** — see below). `HOME` is overridden to `workDir` to prevent `~` expansion from reaching the real home directory |
121
121
| 11 | **Output limits** | Configurable max output size (default: 1MB) to prevent memory exhaustion |
122
122
| 12 | **Skill guardrails** | Skill-declared `deny_commands` and `deny_output` patterns block/redact command inputs and outputs (see [Skill Guardrails](security/guardrails.md#skill-guardrails)) |
123
123
| 13 | **Custom tool entrypoint validation** | Custom tool entrypoints are validated: rejects empty, absolute, or `..`-containing paths; resolves symlinks and verifies the target stays within the project directory and is a regular file |
124
124
125
+
### KUBECONFIG and NO_PROXY Scoping
126
+
127
+
When `HOME` is overridden to `workDir`, `kubectl` and `helm` lose access to `~/.kube/config`. For these two binaries only, `cli_execute` auto-sets:
128
+
129
+
| Env Var | Value | Purpose |
130
+
|---------|-------|---------|
131
+
| `KUBECONFIG` | `<real-home>/.kube/config` | Restores access to the real kubeconfig |
132
+
| `NO_PROXY` | K8s API server hostname(s) | Bypasses the egress proxy for cluster connections |
133
+
134
+
`NO_PROXY`is extracted from the kubeconfig's `clusters[].cluster.server` field. Other binaries do not receive these variables.
135
+
125
136
## File Create
126
137
127
138
The `file_create` tool generates downloadable files that are both written to disk and uploaded to the user's channel (Slack/Telegram).
0 commit comments