neoctl 0.2.4 → 0.2.6
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 +16 -26
- package/dist/agents/agent-activity.d.ts +70 -0
- package/dist/agents/agent-activity.js +261 -0
- package/dist/agents/agent-activity.js.map +1 -0
- package/dist/agents/agent-definition.d.ts +7 -0
- package/dist/agents/agent-definition.js +44 -1
- package/dist/agents/agent-definition.js.map +1 -1
- package/dist/agents/agent-report-tool.d.ts +11 -0
- package/dist/agents/agent-report-tool.js +50 -0
- package/dist/agents/agent-report-tool.js.map +1 -0
- package/dist/agents/agent-tool.d.ts +3 -1
- package/dist/agents/agent-tool.js +56 -11
- package/dist/agents/agent-tool.js.map +1 -1
- package/dist/agents/local-agent-task.d.ts +3 -0
- package/dist/agents/local-agent-task.js +2 -0
- package/dist/agents/local-agent-task.js.map +1 -1
- package/dist/agents/smoke-agents.js +131 -7
- package/dist/agents/smoke-agents.js.map +1 -1
- package/dist/context/compaction.js +2 -1
- package/dist/context/compaction.js.map +1 -1
- package/dist/context/context-manager.d.ts +2 -1
- package/dist/context/context-manager.js +24 -11
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/prompts.js +4 -0
- package/dist/context/prompts.js.map +1 -1
- package/dist/context/smoke-context.js +14 -6
- package/dist/context/smoke-context.js.map +1 -1
- package/dist/core/context-metrics.d.ts +2 -1
- package/dist/core/context-metrics.js +3 -1
- package/dist/core/context-metrics.js.map +1 -1
- package/dist/core/image-registry.js +3 -3
- package/dist/core/image-registry.js.map +1 -1
- package/dist/core/image-storage.d.ts +14 -0
- package/dist/core/image-storage.js +31 -0
- package/dist/core/image-storage.js.map +1 -1
- package/dist/core/message-pipeline.d.ts +6 -0
- package/dist/core/message-pipeline.js +89 -10
- package/dist/core/message-pipeline.js.map +1 -1
- package/dist/core/prompt-cache-telemetry.d.ts +11 -0
- package/dist/core/prompt-cache-telemetry.js +71 -0
- package/dist/core/prompt-cache-telemetry.js.map +1 -0
- package/dist/core/query-engine.d.ts +3 -1
- package/dist/core/query-engine.js +21 -6
- package/dist/core/query-engine.js.map +1 -1
- package/dist/core/query.d.ts +4 -0
- package/dist/core/query.js +28 -5
- package/dist/core/query.js.map +1 -1
- package/dist/core/run-agent.d.ts +2 -0
- package/dist/core/run-agent.js +156 -21
- package/dist/core/run-agent.js.map +1 -1
- package/dist/core/smoke-core-loop.js +11 -2
- package/dist/core/smoke-core-loop.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/model/anthropic-mapper.js +29 -3
- package/dist/model/anthropic-mapper.js.map +1 -1
- package/dist/model/config.d.ts +2 -8
- package/dist/model/config.js +1 -41
- package/dist/model/config.js.map +1 -1
- package/dist/model/env.js +6 -11
- package/dist/model/env.js.map +1 -1
- package/dist/model/model-metadata.json +1 -115
- package/dist/model/openai-chat-mapper.js +4 -19
- package/dist/model/openai-chat-mapper.js.map +1 -1
- package/dist/model/openai-mappers.js +15 -6
- package/dist/model/openai-mappers.js.map +1 -1
- package/dist/model/provider-factory.js +0 -32
- package/dist/model/provider-factory.js.map +1 -1
- package/dist/model/smoke-anthropic-mapper.js +6 -2
- package/dist/model/smoke-anthropic-mapper.js.map +1 -1
- package/dist/repl/commands.d.ts +14 -0
- package/dist/repl/commands.js +54 -0
- package/dist/repl/commands.js.map +1 -1
- package/dist/repl/index.js +1008 -117
- package/dist/repl/index.js.map +1 -1
- package/dist/secrets/secret-crypto.d.ts +22 -0
- package/dist/secrets/secret-crypto.js +58 -0
- package/dist/secrets/secret-crypto.js.map +1 -0
- package/dist/secrets/secret-redaction.d.ts +8 -0
- package/dist/secrets/secret-redaction.js +40 -0
- package/dist/secrets/secret-redaction.js.map +1 -0
- package/dist/secrets/secret-store.d.ts +28 -0
- package/dist/secrets/secret-store.js +158 -0
- package/dist/secrets/secret-store.js.map +1 -0
- package/dist/secrets/secret-types.d.ts +31 -0
- package/dist/secrets/secret-types.js +17 -0
- package/dist/secrets/secret-types.js.map +1 -0
- package/dist/secrets/smoke-secrets.js +68 -0
- package/dist/secrets/smoke-secrets.js.map +1 -0
- package/dist/session/session-export.js +2 -1
- package/dist/session/session-export.js.map +1 -1
- package/dist/skills/skill-filesystem.js +1 -1
- package/dist/skills/skill-filesystem.js.map +1 -1
- package/dist/skills/skill-tool.js +86 -22
- package/dist/skills/skill-tool.js.map +1 -1
- package/dist/tools/builtins/exec-tool.d.ts +20 -1
- package/dist/tools/builtins/exec-tool.js +167 -29
- package/dist/tools/builtins/exec-tool.js.map +1 -1
- package/dist/tools/builtins/image-generation-tool.js +22 -4
- package/dist/tools/builtins/image-generation-tool.js.map +1 -1
- package/dist/tools/builtins/plan-tool.d.ts +1 -0
- package/dist/tools/builtins/plan-tool.js +80 -27
- package/dist/tools/builtins/plan-tool.js.map +1 -1
- package/dist/tools/builtins/secret-tools.d.ts +10 -0
- package/dist/tools/builtins/secret-tools.js +75 -0
- package/dist/tools/builtins/secret-tools.js.map +1 -0
- package/dist/tools/run-tool-use.js +4 -2
- package/dist/tools/run-tool-use.js.map +1 -1
- package/dist/tools/smoke-tool-system.js +111 -10
- package/dist/tools/smoke-tool-system.js.map +1 -1
- package/dist/tools/tool.d.ts +4 -0
- package/dist/tools/tool.js.map +1 -1
- package/dist/types/events.d.ts +17 -0
- package/dist/ui/display-message.js +8 -4
- package/dist/ui/display-message.js.map +1 -1
- package/dist/web/html.js +1 -1
- package/dist/web/index.js +34 -56
- package/dist/web/index.js.map +1 -1
- package/package.json +3 -2
- package/dist/model/deepseek-adapter.d.ts +0 -29
- package/dist/model/deepseek-adapter.js +0 -108
- package/dist/model/deepseek-adapter.js.map +0 -1
- package/dist/model/kimi-adapter.d.ts +0 -29
- package/dist/model/kimi-adapter.js +0 -108
- package/dist/model/kimi-adapter.js.map +0 -1
- package/dist/model/smoke-deepseek-mapper.js +0 -65
- package/dist/model/smoke-deepseek-mapper.js.map +0 -1
- /package/dist/{model/smoke-deepseek-mapper.d.ts → secrets/smoke-secrets.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -48,7 +48,7 @@ npm run standalone
|
|
|
48
48
|
- Windows:`%APPDATA%\neo\.env`
|
|
49
49
|
- macOS/Linux:`~/.config/neo/.env`
|
|
50
50
|
|
|
51
|
-
可以运行 `/login` 交互式填写并保存,也可以手动编辑。推荐格式是:`MODEL_PROVIDER` 只选择当前供应者;供应者专属的 key、base URL、model 分别写在 `OPENAI_*` / `ANTHROPIC_*`
|
|
51
|
+
可以运行 `/login` 交互式填写并保存,也可以手动编辑。推荐格式是:`MODEL_PROVIDER` 只选择当前供应者;供应者专属的 key、base URL、model 分别写在 `OPENAI_*` / `ANTHROPIC_*` 下;跨供应者共用的运行参数保留 `MODEL_*`。
|
|
52
52
|
|
|
53
53
|
```env
|
|
54
54
|
# Active provider
|
|
@@ -68,19 +68,12 @@ ANTHROPIC_MODEL=claude-sonnet-4-6
|
|
|
68
68
|
ANTHROPIC_FALLBACK_MODEL=
|
|
69
69
|
ANTHROPIC_VERSION=2023-06-01
|
|
70
70
|
|
|
71
|
-
#
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
# Kimi provider settings
|
|
78
|
-
KIMI_API_KEY=your-kimi-api-key
|
|
79
|
-
KIMI_BASE_URL=https://api.moonshot.cn/v1
|
|
80
|
-
KIMI_MODEL=kimi-k2.6
|
|
81
|
-
KIMI_FALLBACK_MODEL=
|
|
82
|
-
# 如果 key 来自国际站 platform.kimi.ai,请改为:
|
|
83
|
-
# KIMI_BASE_URL=https://api.moonshot.ai/v1
|
|
71
|
+
# Anthropic provider settings
|
|
72
|
+
ANTHROPIC_API_KEY=your-anthropic-api-key
|
|
73
|
+
ANTHROPIC_BASE_URL=https://api.anthropic.com
|
|
74
|
+
ANTHROPIC_MODEL=claude-sonnet-4-6
|
|
75
|
+
ANTHROPIC_FALLBACK_MODEL=
|
|
76
|
+
ANTHROPIC_VERSION=2023-06-01
|
|
84
77
|
|
|
85
78
|
# Shared model runtime settings
|
|
86
79
|
MODEL_REASONING_EFFORT=high
|
|
@@ -109,7 +102,6 @@ npm run smoke:agents # 子代理/任务冒烟测试
|
|
|
109
102
|
npm run smoke:skills # skill 模块冒烟测试
|
|
110
103
|
npm run smoke:responses # OpenAI Responses mapper 冒烟测试
|
|
111
104
|
npm run smoke:anthropic # Anthropic Messages mapper 冒烟测试
|
|
112
|
-
npm run smoke:deepseek # DeepSeek Chat mapper 冒烟测试
|
|
113
105
|
npm run smoke:openai -- "Say pong"
|
|
114
106
|
```
|
|
115
107
|
|
|
@@ -205,13 +197,11 @@ src/
|
|
|
205
197
|
|
|
206
198
|
## 模型层
|
|
207
199
|
|
|
208
|
-
模型访问通过 `ModelGateway` 抽象。当前内置 provider 包括 OpenAI
|
|
200
|
+
模型访问通过 `ModelGateway` 抽象。当前内置 provider 包括 OpenAI 与 Anthropic:
|
|
209
201
|
|
|
210
202
|
- `openai-adapter.ts`:端点选择、认证、超时、重试、Responses→Chat fallback。
|
|
211
203
|
- `anthropic-adapter.ts`:Anthropic Messages API provider,默认 `https://api.anthropic.com/v1/messages`,使用 `x-api-key` 与 `anthropic-version` 请求头。
|
|
212
204
|
- `anthropic-mapper.ts`:Anthropic Messages 请求、tool use / tool result、thinking、SSE 流事件归一化。
|
|
213
|
-
- `deepseek-adapter.ts`:DeepSeek OpenAI 格式 Chat Completions,默认 `https://api.deepseek.com/chat/completions`,支持 `reasoning_content` 到 thinking 事件的归一化。
|
|
214
|
-
- `kimi-adapter.ts`:Kimi/Moonshot OpenAI 兼容 Chat Completions,默认 `https://api.moonshot.cn/v1/chat/completions`,支持 `reasoning_content` 到 thinking 事件的归一化。
|
|
215
205
|
- `openai-responses-mapper.ts`:Responses API 请求和流事件归一化。
|
|
216
206
|
- `openai-chat-mapper.ts`:Chat Completions 请求和流事件归一化。
|
|
217
207
|
- `http-transport.ts` / `sse-decoder.ts`:HTTP 请求与 SSE 流解析。
|
|
@@ -222,12 +212,12 @@ src/
|
|
|
222
212
|
|
|
223
213
|
| 变量 | 说明 |
|
|
224
214
|
| --- | --- |
|
|
225
|
-
| `MODEL_PROVIDER` | `openai
|
|
226
|
-
| `OPENAI_API_KEY` / `ANTHROPIC_API_KEY`
|
|
227
|
-
| `OPENAI_BASE_URL` / `ANTHROPIC_BASE_URL`
|
|
228
|
-
| `OPENAI_MODEL` / `ANTHROPIC_MODEL`
|
|
229
|
-
| `OPENAI_FALLBACK_MODEL` / `ANTHROPIC_FALLBACK_MODEL`
|
|
230
|
-
| `OPENAI_ENDPOINT` | OpenAI 专用,`responses`、`chat` 或 `auto`;Anthropic 固定使用 Messages API
|
|
215
|
+
| `MODEL_PROVIDER` | `openai` 或 `anthropic` |
|
|
216
|
+
| `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` | 供应者专属 API Key;只读取当前 `MODEL_PROVIDER` 对应的一组变量 |
|
|
217
|
+
| `OPENAI_BASE_URL` / `ANTHROPIC_BASE_URL` | 供应者专属服务地址;OpenAI 默认 `https://api.openai.com`,Anthropic 默认 `https://api.anthropic.com` |
|
|
218
|
+
| `OPENAI_MODEL` / `ANTHROPIC_MODEL` | 供应者专属默认模型;OpenAI 默认 `gpt-5.5`,Anthropic 默认 `claude-sonnet-4-6` |
|
|
219
|
+
| `OPENAI_FALLBACK_MODEL` / `ANTHROPIC_FALLBACK_MODEL` | 供应者专属 fallback model |
|
|
220
|
+
| `OPENAI_ENDPOINT` | OpenAI 专用,`responses`、`chat` 或 `auto`;Anthropic 固定使用 Messages API |
|
|
231
221
|
| `ANTHROPIC_VERSION` | Anthropic 专用 API version header,默认 `2023-06-01` |
|
|
232
222
|
| `MODEL_REASONING_EFFORT` | 共享运行设置:`none`、`minimal`、`low`、`medium`、`high`、`xhigh`、`max` |
|
|
233
223
|
| `MODEL_REASONING_SUMMARY` | `auto`、`concise`、`detailed` |
|
|
@@ -279,7 +269,7 @@ REPL 当前注册的内置工具:
|
|
|
279
269
|
- `list` 默认跳过 `.git`、`node_modules`、`dist`、`build`、`coverage` 等重目录。
|
|
280
270
|
- `grep` 不依赖系统 PATH,会调用 `vendor/ripgrep` 中的平台二进制;支持 glob、大小写模式、fixed strings、隐藏文件、上下文行、结果数和列宽限制。
|
|
281
271
|
- `search` 默认优先使用显式 `SEARCH_PROVIDER` / `WEB_SEARCH_PROVIDER`;未显式配置且当前模型提供者为 OpenAI(`MODEL_PROVIDER=openai` 或存在 `OPENAI_API_KEY`)时走 OpenAI Responses API 的 GPT web search,否则走 `https://mcp.exa.ai/mcp` 的 `web_search_exa`。OpenAI 搜索可通过 `OPENAI_SEARCH_API_KEY`、`OPENAI_SEARCH_BASE_URL`、`OPENAI_SEARCH_MODEL`、`OPENAI_SEARCH_TOOL_TYPE`、`OPENAI_SEARCH_CONTEXT_SIZE` 配置;Exa 可通过 `EXA_MCP_URL`、`EXA_MCP_TOOL_NAME` 配置;两者超时可用 `SEARCH_TIMEOUT_MS` 配置。模型也可以在单次工具调用里通过 `provider` 字段切换后端,但工具提示会要求:除非用户明确要求特定 provider,或默认/当前搜索 provider 在重试后持续不可用,否则不要显式指定 `provider`,让系统默认选择生效。
|
|
282
|
-
- `image2` 按 OpenAI 图片生成官方接口实现,底层请求 `POST /v1/images/generations`;底层 OpenAI 图片模型只允许 `gpt-image-2`,默认也是 `gpt-image-2`。可用 `OPENAI_IMAGE_API_KEY` / `OPENAI_API_KEY`、`OPENAI_IMAGE_BASE_URL` / `OPENAI_BASE_URL`、`OPENAI_IMAGE_MODEL`、`OPENAI_IMAGE_TIMEOUT_MS` 配置,其中 `OPENAI_IMAGE_MODEL` 若不是 `gpt-image-2` 会被 image2 校验拒绝。只有 `MODEL_PROVIDER=openai` 时 REPL/Web 运行时会注册该工具;切换到
|
|
272
|
+
- `image2` 按 OpenAI 图片生成官方接口实现,底层请求 `POST /v1/images/generations`;底层 OpenAI 图片模型只允许 `gpt-image-2`,默认也是 `gpt-image-2`。可用 `OPENAI_IMAGE_API_KEY` / `OPENAI_API_KEY`、`OPENAI_IMAGE_BASE_URL` / `OPENAI_BASE_URL`、`OPENAI_IMAGE_MODEL`、`OPENAI_IMAGE_TIMEOUT_MS` 配置,其中 `OPENAI_IMAGE_MODEL` 若不是 `gpt-image-2` 会被 image2 校验拒绝。只有 `MODEL_PROVIDER=openai` 时 REPL/Web 运行时会注册该工具;切换到 Anthropic 等其他 provider 后会移除该工具,并在系统提示中要求模型告知用户当前模型/供应者不具备绘图工具。
|
|
283
273
|
|
|
284
274
|
### 命令执行
|
|
285
275
|
|
|
@@ -577,7 +567,7 @@ import { createAgentTool } from "neoctl/agents/agent-tool";
|
|
|
577
567
|
|
|
578
568
|
## 当前边界
|
|
579
569
|
|
|
580
|
-
- 模型 provider 配置类型目前内置 OpenAI
|
|
570
|
+
- 模型 provider 配置类型目前内置 OpenAI 与 Anthropic provider。
|
|
581
571
|
- `src/safety` 是 permission、sandbox、audit 的接口边界;默认 REPL 没有强制沙箱策略。
|
|
582
572
|
- `src/skills` 已实现工具与 catalog,但默认 REPL 未装配 skill catalog。
|
|
583
573
|
- `isolation=worktree/remote` 在 AgentTool schema 中保留为接口形态,当前本地实现主要通过 `cwd` 和独立消息上下文隔离。
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { AgentEvent } from "../types/events.js";
|
|
2
|
+
import type { AgentToolResult } from "./local-agent-task.js";
|
|
3
|
+
export type AgentActivityMode = "sync" | "background" | "fork" | "explore";
|
|
4
|
+
export type AgentActivityStatus = "pending" | "running" | "completed" | "failed" | "killed";
|
|
5
|
+
export type AgentTimelineEntryKind = "text" | "thinking" | "tool_start" | "tool_result" | "status" | "error";
|
|
6
|
+
export interface AgentTimelineEntry {
|
|
7
|
+
id: string;
|
|
8
|
+
at: string;
|
|
9
|
+
kind: AgentTimelineEntryKind;
|
|
10
|
+
title: string;
|
|
11
|
+
detail?: string;
|
|
12
|
+
status?: "running" | "ok" | "failed";
|
|
13
|
+
}
|
|
14
|
+
export interface AgentToolActivity {
|
|
15
|
+
id?: string;
|
|
16
|
+
name: string;
|
|
17
|
+
inputPreview?: string;
|
|
18
|
+
startedAt: string;
|
|
19
|
+
}
|
|
20
|
+
export interface AgentActivity {
|
|
21
|
+
activityId: string;
|
|
22
|
+
agentId: string;
|
|
23
|
+
taskId?: string;
|
|
24
|
+
agentType: string;
|
|
25
|
+
description: string;
|
|
26
|
+
prompt: string;
|
|
27
|
+
mode: AgentActivityMode;
|
|
28
|
+
status: AgentActivityStatus;
|
|
29
|
+
cwd?: string;
|
|
30
|
+
model?: string;
|
|
31
|
+
startedAt: string;
|
|
32
|
+
updatedAt: string;
|
|
33
|
+
completedAt?: string;
|
|
34
|
+
totalEvents: number;
|
|
35
|
+
totalToolUseCount: number;
|
|
36
|
+
totalTokens?: number;
|
|
37
|
+
currentTool?: AgentToolActivity;
|
|
38
|
+
timeline: AgentTimelineEntry[];
|
|
39
|
+
lastText?: string;
|
|
40
|
+
resultPreview?: string;
|
|
41
|
+
error?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface StartAgentActivityInput {
|
|
44
|
+
agentId: string;
|
|
45
|
+
taskId?: string;
|
|
46
|
+
agentType: string;
|
|
47
|
+
description: string;
|
|
48
|
+
prompt: string;
|
|
49
|
+
mode: AgentActivityMode;
|
|
50
|
+
cwd?: string;
|
|
51
|
+
model?: string;
|
|
52
|
+
}
|
|
53
|
+
export declare class AgentActivityStore {
|
|
54
|
+
private readonly activities;
|
|
55
|
+
private readonly subscribers;
|
|
56
|
+
subscribe(listener: () => void): () => void;
|
|
57
|
+
list(): AgentActivity[];
|
|
58
|
+
get(agentId: string): AgentActivity | undefined;
|
|
59
|
+
start(input: StartAgentActivityInput): AgentActivity;
|
|
60
|
+
recordEvent(agentId: string, event: AgentEvent): void;
|
|
61
|
+
complete(agentId: string, result: AgentToolResult): void;
|
|
62
|
+
fail(agentId: string, error: string, status?: AgentActivityStatus): void;
|
|
63
|
+
private recordMessageBlocks;
|
|
64
|
+
private recordToolStarted;
|
|
65
|
+
private recordToolFinished;
|
|
66
|
+
private recordUsage;
|
|
67
|
+
private push;
|
|
68
|
+
private notify;
|
|
69
|
+
}
|
|
70
|
+
export declare const globalAgentActivityStore: AgentActivityStore;
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
const MAX_TIMELINE_ENTRIES = 80;
|
|
2
|
+
const PREVIEW_LIMIT = 260;
|
|
3
|
+
export class AgentActivityStore {
|
|
4
|
+
activities = new Map();
|
|
5
|
+
subscribers = new Set();
|
|
6
|
+
subscribe(listener) {
|
|
7
|
+
this.subscribers.add(listener);
|
|
8
|
+
return () => this.subscribers.delete(listener);
|
|
9
|
+
}
|
|
10
|
+
list() {
|
|
11
|
+
return [...this.activities.values()].sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
|
|
12
|
+
}
|
|
13
|
+
get(agentId) {
|
|
14
|
+
return this.activities.get(agentId);
|
|
15
|
+
}
|
|
16
|
+
start(input) {
|
|
17
|
+
const now = new Date().toISOString();
|
|
18
|
+
const existing = this.activities.get(input.agentId);
|
|
19
|
+
const activity = {
|
|
20
|
+
activityId: existing?.activityId ?? `activity_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`,
|
|
21
|
+
agentId: input.agentId,
|
|
22
|
+
taskId: input.taskId,
|
|
23
|
+
agentType: input.agentType,
|
|
24
|
+
description: input.description,
|
|
25
|
+
prompt: input.prompt,
|
|
26
|
+
mode: input.mode,
|
|
27
|
+
status: "running",
|
|
28
|
+
cwd: input.cwd,
|
|
29
|
+
model: input.model,
|
|
30
|
+
startedAt: existing?.startedAt ?? now,
|
|
31
|
+
updatedAt: now,
|
|
32
|
+
totalEvents: existing?.totalEvents ?? 0,
|
|
33
|
+
totalToolUseCount: existing?.totalToolUseCount ?? 0,
|
|
34
|
+
totalTokens: existing?.totalTokens,
|
|
35
|
+
timeline: existing?.timeline ?? [],
|
|
36
|
+
lastText: existing?.lastText,
|
|
37
|
+
resultPreview: undefined,
|
|
38
|
+
error: undefined,
|
|
39
|
+
};
|
|
40
|
+
this.activities.set(input.agentId, activity);
|
|
41
|
+
this.push(activity, { kind: "status", title: "started", detail: input.description, status: "running" });
|
|
42
|
+
this.notify();
|
|
43
|
+
return activity;
|
|
44
|
+
}
|
|
45
|
+
recordEvent(agentId, event) {
|
|
46
|
+
const activity = this.activities.get(agentId);
|
|
47
|
+
if (!activity)
|
|
48
|
+
return;
|
|
49
|
+
activity.totalEvents += 1;
|
|
50
|
+
activity.updatedAt = new Date().toISOString();
|
|
51
|
+
if (event.type === "state") {
|
|
52
|
+
this.push(activity, { kind: "status", title: event.phase, detail: event.detail, status: "running" }, false);
|
|
53
|
+
}
|
|
54
|
+
else if (event.type === "message") {
|
|
55
|
+
this.recordMessageBlocks(activity, event.message);
|
|
56
|
+
}
|
|
57
|
+
else if (event.type === "tool.started") {
|
|
58
|
+
this.recordToolStarted(activity, event.toolUse);
|
|
59
|
+
}
|
|
60
|
+
else if (event.type === "tool.finished") {
|
|
61
|
+
this.recordToolFinished(activity, event.toolUse, event.ok);
|
|
62
|
+
}
|
|
63
|
+
else if (event.type === "usage") {
|
|
64
|
+
this.recordUsage(activity, event.usage);
|
|
65
|
+
}
|
|
66
|
+
else if (event.type === "retrying") {
|
|
67
|
+
this.push(activity, { kind: "status", title: `retrying #${event.attempt}`, detail: event.error.message, status: "running" });
|
|
68
|
+
}
|
|
69
|
+
else if (event.type === "terminal") {
|
|
70
|
+
this.push(activity, { kind: "status", title: "terminal", detail: event.detail ?? event.reason, status: "ok" });
|
|
71
|
+
}
|
|
72
|
+
else if (event.type === "error") {
|
|
73
|
+
activity.error = event.error.message;
|
|
74
|
+
this.push(activity, { kind: "error", title: "error", detail: event.error.message, status: "failed" });
|
|
75
|
+
}
|
|
76
|
+
this.activities.set(agentId, activity);
|
|
77
|
+
this.notify();
|
|
78
|
+
}
|
|
79
|
+
complete(agentId, result) {
|
|
80
|
+
const activity = this.activities.get(agentId);
|
|
81
|
+
if (!activity)
|
|
82
|
+
return;
|
|
83
|
+
activity.status = "completed";
|
|
84
|
+
activity.completedAt = new Date().toISOString();
|
|
85
|
+
activity.updatedAt = activity.completedAt;
|
|
86
|
+
activity.totalTokens = result.total_tokens ?? activity.totalTokens;
|
|
87
|
+
activity.totalToolUseCount = result.total_tool_use_count || activity.totalToolUseCount;
|
|
88
|
+
activity.resultPreview = previewText(result.content);
|
|
89
|
+
activity.currentTool = undefined;
|
|
90
|
+
this.push(activity, { kind: "status", title: "completed", detail: activity.resultPreview, status: "ok" });
|
|
91
|
+
this.activities.set(agentId, activity);
|
|
92
|
+
this.notify();
|
|
93
|
+
}
|
|
94
|
+
fail(agentId, error, status = "failed") {
|
|
95
|
+
const activity = this.activities.get(agentId);
|
|
96
|
+
if (!activity)
|
|
97
|
+
return;
|
|
98
|
+
activity.status = status;
|
|
99
|
+
activity.error = error;
|
|
100
|
+
activity.completedAt = new Date().toISOString();
|
|
101
|
+
activity.updatedAt = activity.completedAt;
|
|
102
|
+
activity.currentTool = undefined;
|
|
103
|
+
this.push(activity, { kind: "error", title: status, detail: error, status: "failed" });
|
|
104
|
+
this.activities.set(agentId, activity);
|
|
105
|
+
this.notify();
|
|
106
|
+
}
|
|
107
|
+
recordMessageBlocks(activity, message) {
|
|
108
|
+
for (const block of message.blocks) {
|
|
109
|
+
if (block.type === "text") {
|
|
110
|
+
const text = previewText(block.text);
|
|
111
|
+
if (!text)
|
|
112
|
+
continue;
|
|
113
|
+
activity.lastText = text;
|
|
114
|
+
const label = message.role === "assistant" ? "assistant" : message.role;
|
|
115
|
+
this.push(activity, { kind: "text", title: label, detail: text, status: "running" });
|
|
116
|
+
}
|
|
117
|
+
else if (block.type === "thinking") {
|
|
118
|
+
const text = previewText(block.text);
|
|
119
|
+
if (!text)
|
|
120
|
+
continue;
|
|
121
|
+
activity.lastText = text;
|
|
122
|
+
this.push(activity, { kind: "thinking", title: "thinking", detail: text, status: "running" });
|
|
123
|
+
}
|
|
124
|
+
else if (block.type === "tool_use") {
|
|
125
|
+
// Some providers surface tool_use only as a message block. Avoid double-counting if tool.started already ran.
|
|
126
|
+
if (activity.currentTool?.id !== block.id)
|
|
127
|
+
this.recordToolStarted(activity, block);
|
|
128
|
+
}
|
|
129
|
+
else if (block.type === "tool_result") {
|
|
130
|
+
this.push(activity, {
|
|
131
|
+
kind: "tool_result",
|
|
132
|
+
title: `${block.name} ${block.ok ? "ok" : "failed"}`,
|
|
133
|
+
detail: summarizeToolResult(block),
|
|
134
|
+
status: block.ok ? "ok" : "failed",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
recordToolStarted(activity, toolUse) {
|
|
140
|
+
activity.totalToolUseCount += 1;
|
|
141
|
+
activity.currentTool = {
|
|
142
|
+
id: toolUse.id,
|
|
143
|
+
name: toolUse.name,
|
|
144
|
+
inputPreview: previewValue(toolUse.input),
|
|
145
|
+
startedAt: new Date().toISOString(),
|
|
146
|
+
};
|
|
147
|
+
this.push(activity, {
|
|
148
|
+
kind: "tool_start",
|
|
149
|
+
title: toolUse.name,
|
|
150
|
+
detail: activity.currentTool.inputPreview,
|
|
151
|
+
status: "running",
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
recordToolFinished(activity, toolUse, ok) {
|
|
155
|
+
if (activity.currentTool?.id === toolUse.id)
|
|
156
|
+
activity.currentTool = undefined;
|
|
157
|
+
this.push(activity, {
|
|
158
|
+
kind: "tool_result",
|
|
159
|
+
title: `${toolUse.name} ${ok ? "finished" : "failed"}`,
|
|
160
|
+
detail: previewValue(toolUse.input),
|
|
161
|
+
status: ok ? "ok" : "failed",
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
recordUsage(activity, usage) {
|
|
165
|
+
activity.totalTokens = usage.totalTokens ?? activity.totalTokens;
|
|
166
|
+
}
|
|
167
|
+
push(activity, entry, notify = true) {
|
|
168
|
+
const next = {
|
|
169
|
+
id: `entry_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`,
|
|
170
|
+
at: new Date().toISOString(),
|
|
171
|
+
...entry,
|
|
172
|
+
};
|
|
173
|
+
activity.timeline.push(next);
|
|
174
|
+
if (activity.timeline.length > MAX_TIMELINE_ENTRIES)
|
|
175
|
+
activity.timeline.splice(0, activity.timeline.length - MAX_TIMELINE_ENTRIES);
|
|
176
|
+
activity.updatedAt = next.at;
|
|
177
|
+
if (notify)
|
|
178
|
+
this.notify();
|
|
179
|
+
}
|
|
180
|
+
notify() {
|
|
181
|
+
for (const subscriber of [...this.subscribers])
|
|
182
|
+
subscriber();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export const globalAgentActivityStore = new AgentActivityStore();
|
|
186
|
+
function summarizeToolResult(block) {
|
|
187
|
+
return previewValue(block.output);
|
|
188
|
+
}
|
|
189
|
+
function previewText(value) {
|
|
190
|
+
return value.replace(/\s+/g, " ").trim().slice(0, PREVIEW_LIMIT);
|
|
191
|
+
}
|
|
192
|
+
function previewValue(value) {
|
|
193
|
+
return previewText(formatPreviewValue(value));
|
|
194
|
+
}
|
|
195
|
+
function formatPreviewValue(value) {
|
|
196
|
+
if (typeof value === "string")
|
|
197
|
+
return value;
|
|
198
|
+
if (value === null || value === undefined)
|
|
199
|
+
return String(value);
|
|
200
|
+
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint")
|
|
201
|
+
return String(value);
|
|
202
|
+
if (Array.isArray(value)) {
|
|
203
|
+
if (value.length === 0)
|
|
204
|
+
return "[]";
|
|
205
|
+
const items = value.slice(0, 3).map(formatPreviewValue).filter(Boolean);
|
|
206
|
+
return `[${items.join(", ")}${value.length > 3 ? `, +${value.length - 3} more` : ""}]`;
|
|
207
|
+
}
|
|
208
|
+
if (typeof value === "object")
|
|
209
|
+
return formatObjectPreview(value);
|
|
210
|
+
return String(value);
|
|
211
|
+
}
|
|
212
|
+
function formatObjectPreview(value) {
|
|
213
|
+
const preferredKeys = [
|
|
214
|
+
"status",
|
|
215
|
+
"description",
|
|
216
|
+
"agent_type",
|
|
217
|
+
"agent_id",
|
|
218
|
+
"task_id",
|
|
219
|
+
"name",
|
|
220
|
+
"path",
|
|
221
|
+
"query",
|
|
222
|
+
"command",
|
|
223
|
+
"cwd",
|
|
224
|
+
"error",
|
|
225
|
+
"content",
|
|
226
|
+
"output",
|
|
227
|
+
"total_tool_use_count",
|
|
228
|
+
];
|
|
229
|
+
const keys = [...preferredKeys.filter((key) => key in value), ...Object.keys(value).filter((key) => !preferredKeys.includes(key))];
|
|
230
|
+
const parts = [];
|
|
231
|
+
for (const key of keys.slice(0, 6)) {
|
|
232
|
+
const formatted = formatPreviewField(value[key]);
|
|
233
|
+
if (!formatted)
|
|
234
|
+
continue;
|
|
235
|
+
parts.push(`${humanizePreviewKey(key)}=${formatted}`);
|
|
236
|
+
}
|
|
237
|
+
const extra = keys.length > 6 ? `, +${keys.length - 6} fields` : "";
|
|
238
|
+
return parts.length ? parts.join(" · ") + extra : "{}";
|
|
239
|
+
}
|
|
240
|
+
function formatPreviewField(value) {
|
|
241
|
+
if (typeof value === "string")
|
|
242
|
+
return quoteIfNeeded(value.replace(/\s+/g, " ").trim());
|
|
243
|
+
if (value === null || value === undefined)
|
|
244
|
+
return String(value);
|
|
245
|
+
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint")
|
|
246
|
+
return String(value);
|
|
247
|
+
if (Array.isArray(value))
|
|
248
|
+
return `${value.length} item${value.length === 1 ? "" : "s"}`;
|
|
249
|
+
if (typeof value === "object")
|
|
250
|
+
return `${Object.keys(value).length} fields`;
|
|
251
|
+
return String(value);
|
|
252
|
+
}
|
|
253
|
+
function humanizePreviewKey(key) {
|
|
254
|
+
return key.replace(/_/g, "-");
|
|
255
|
+
}
|
|
256
|
+
function quoteIfNeeded(value) {
|
|
257
|
+
if (!value)
|
|
258
|
+
return "\"\"";
|
|
259
|
+
return /[\s,=]/.test(value) ? `"${value}"` : value;
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=agent-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-activity.js","sourceRoot":"","sources":["../../src/agents/agent-activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,11 +20,18 @@ export interface AgentDefinition {
|
|
|
20
20
|
memory?: "user" | "project" | "local";
|
|
21
21
|
isolation?: AgentIsolation;
|
|
22
22
|
omitProjectMemory?: boolean;
|
|
23
|
+
/** Require an authoritative final result via agent_report instead of normal assistant text. */
|
|
24
|
+
requiresReport?: boolean;
|
|
25
|
+
/** Report tool name used when requiresReport is enabled. Defaults to agent_report. */
|
|
26
|
+
reportToolName?: string;
|
|
27
|
+
/** Number of extra short turns allowed to recover a missing report. */
|
|
28
|
+
reportRetryTurns?: number;
|
|
23
29
|
buildSystemPrompt?: (context?: ToolUseContext) => string;
|
|
24
30
|
}
|
|
25
31
|
export declare const FORK_BOILERPLATE_TAG = "<fork-child-agent>";
|
|
26
32
|
export declare const FORK_AGENT: AgentDefinition;
|
|
27
33
|
export declare const GENERAL_PURPOSE_AGENT: AgentDefinition;
|
|
34
|
+
export declare const EXPLORE_AGENT: AgentDefinition;
|
|
28
35
|
export interface AgentCatalog {
|
|
29
36
|
resolve(agentType?: string): AgentDefinition;
|
|
30
37
|
list(): AgentDefinition[];
|
|
@@ -3,6 +3,7 @@ export const FORK_AGENT = {
|
|
|
3
3
|
agentType: "fork",
|
|
4
4
|
whenToUse: "Fork the current conversation into an isolated worker for scoped parallel work.",
|
|
5
5
|
tools: ["*"],
|
|
6
|
+
disallowedTools: ["plan"],
|
|
6
7
|
model: "inherit",
|
|
7
8
|
permissionMode: "bubble",
|
|
8
9
|
maxTurns: 40,
|
|
@@ -12,17 +13,59 @@ export const GENERAL_PURPOSE_AGENT = {
|
|
|
12
13
|
agentType: "general-purpose",
|
|
13
14
|
whenToUse: "General engineering worker for scoped implementation, investigation, or verification tasks.",
|
|
14
15
|
tools: ["*"],
|
|
16
|
+
disallowedTools: ["plan"],
|
|
15
17
|
permissionMode: "inherit",
|
|
16
18
|
maxTurns: 40,
|
|
17
19
|
buildSystemPrompt: () => [
|
|
18
20
|
"You are a subagent worker inside the same neo runtime.",
|
|
19
21
|
"You may identify yourself as neo when referring to your operating identity.",
|
|
20
22
|
"Stay within the assigned prompt. Use available tools when needed and return a concise final result.",
|
|
23
|
+
"If the agent_report tool is available, use it to submit your final result to the parent agent.",
|
|
24
|
+
].join("\n"),
|
|
25
|
+
};
|
|
26
|
+
export const EXPLORE_AGENT = {
|
|
27
|
+
agentType: "explore",
|
|
28
|
+
whenToUse: "Fast read-only codebase exploration: locate files, trace symbols, summarize architecture, and report findings without modifying anything.",
|
|
29
|
+
tools: ["list", "read", "grep", "search", "exec", "agent_report"],
|
|
30
|
+
disallowedTools: ["edit", "write", "agent", "plan"],
|
|
31
|
+
permissionMode: "readonly",
|
|
32
|
+
maxTurns: 20,
|
|
33
|
+
requiresReport: true,
|
|
34
|
+
reportRetryTurns: 1,
|
|
35
|
+
buildSystemPrompt: () => [
|
|
36
|
+
"You are a read-only codebase exploration subagent inside the same neo runtime.",
|
|
37
|
+
"",
|
|
38
|
+
"Mission:",
|
|
39
|
+
"- Inspect the repository using read-only tools.",
|
|
40
|
+
"- Locate relevant files, trace symbols, summarize architecture, and report verifiable findings.",
|
|
41
|
+
"",
|
|
42
|
+
"Hard rules:",
|
|
43
|
+
"- For codebase exploration, you MUST use repository inspection tools before reporting findings.",
|
|
44
|
+
"- Start with list/grep/read as appropriate for the assigned scope.",
|
|
45
|
+
"- Do NOT claim that you inspected, confirmed, read, or verified anything unless it is based on tool results in this run.",
|
|
46
|
+
"- Do NOT modify files, write files, spawn subagents, or perform implementation.",
|
|
47
|
+
"- Shell commands via exec are available for inspection/diagnostics; avoid commands intended to mutate repository or system state.",
|
|
48
|
+
"- Do NOT return progress-only text such as 'I will continue', 'next I will read', or 'I have started' as the final answer.",
|
|
49
|
+
"- If you run out of turns or cannot complete the requested scope, submit an INCOMPLETE report explaining exactly what was and was not inspected.",
|
|
50
|
+
"- When ready to report, you MUST call the agent_report tool with the complete report content. Do not rely on a normal assistant message for the final report.",
|
|
51
|
+
"",
|
|
52
|
+
"Final response contract:",
|
|
53
|
+
"- Your submitted agent_report content must be a structured report, not a progress update.",
|
|
54
|
+
"- Include concrete file paths for important findings.",
|
|
55
|
+
"- Do not invent file contents, command results, or unverified architecture.",
|
|
56
|
+
"",
|
|
57
|
+
"Required final report structure:",
|
|
58
|
+
"- Use markdown headings to separate sections.",
|
|
59
|
+
"- Cover the assigned scope.",
|
|
60
|
+
"- List relevant files inspected and why they matter.",
|
|
61
|
+
"- Summarize key findings with file path evidence.",
|
|
62
|
+
"- Call out risks, unknowns, or unverified areas.",
|
|
63
|
+
"- Suggest concrete next steps.",
|
|
21
64
|
].join("\n"),
|
|
22
65
|
};
|
|
23
66
|
export class StaticAgentCatalog {
|
|
24
67
|
definitions = new Map();
|
|
25
|
-
constructor(definitions = [GENERAL_PURPOSE_AGENT]) {
|
|
68
|
+
constructor(definitions = [GENERAL_PURPOSE_AGENT, EXPLORE_AGENT]) {
|
|
26
69
|
for (const definition of definitions)
|
|
27
70
|
this.definitions.set(definition.agentType, definition);
|
|
28
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-definition.js","sourceRoot":"","sources":["../../src/agents/agent-definition.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-definition.js","sourceRoot":"","sources":["../../src/agents/agent-definition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Tool } from "../tools/tool.js";
|
|
2
|
+
export declare const AGENT_REPORT_TOOL_NAME = "agent_report";
|
|
3
|
+
export interface AgentReportInput {
|
|
4
|
+
content: string;
|
|
5
|
+
status?: "completed" | "incomplete";
|
|
6
|
+
}
|
|
7
|
+
export interface AgentReportOutput {
|
|
8
|
+
report: string;
|
|
9
|
+
status: "completed" | "incomplete";
|
|
10
|
+
}
|
|
11
|
+
export declare function createAgentReportTool(): Tool<AgentReportInput>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export const AGENT_REPORT_TOOL_NAME = "agent_report";
|
|
2
|
+
export function createAgentReportTool() {
|
|
3
|
+
return {
|
|
4
|
+
name: AGENT_REPORT_TOOL_NAME,
|
|
5
|
+
description: [
|
|
6
|
+
"Submit the subagent's final report to the parent agent.",
|
|
7
|
+
"Use this exactly once when your assigned scope is complete or when you must return an INCOMPLETE report.",
|
|
8
|
+
"The parent agent will use this tool result as the authoritative subagent output instead of incidental progress text.",
|
|
9
|
+
].join(" "),
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: "object",
|
|
12
|
+
properties: {
|
|
13
|
+
content: {
|
|
14
|
+
type: "string",
|
|
15
|
+
description: "The complete final report or INCOMPLETE report for the assigned subagent task.",
|
|
16
|
+
},
|
|
17
|
+
status: {
|
|
18
|
+
type: "string",
|
|
19
|
+
enum: ["completed", "incomplete"],
|
|
20
|
+
description: "Whether the assigned scope was completed.",
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
required: ["content"],
|
|
24
|
+
additionalProperties: false,
|
|
25
|
+
},
|
|
26
|
+
metadata: { readOnly: true, concurrent: false, visible: true },
|
|
27
|
+
validate(input, _context) {
|
|
28
|
+
if (!input || typeof input !== "object")
|
|
29
|
+
throw new Error("agent_report input must be an object");
|
|
30
|
+
const value = input;
|
|
31
|
+
if (typeof value.content !== "string" || value.content.trim().length === 0) {
|
|
32
|
+
throw new Error("agent_report.content must be a non-empty string");
|
|
33
|
+
}
|
|
34
|
+
if (value.status !== undefined && value.status !== "completed" && value.status !== "incomplete") {
|
|
35
|
+
throw new Error("agent_report.status must be 'completed' or 'incomplete'");
|
|
36
|
+
}
|
|
37
|
+
return { content: value.content, status: value.status };
|
|
38
|
+
},
|
|
39
|
+
async call(input) {
|
|
40
|
+
const report = input.content.trim();
|
|
41
|
+
const status = input.status ?? (report.startsWith("INCOMPLETE") ? "incomplete" : "completed");
|
|
42
|
+
return {
|
|
43
|
+
ok: true,
|
|
44
|
+
output: { report, status },
|
|
45
|
+
summary: status === "completed" ? "Subagent final report submitted" : "Subagent incomplete report submitted",
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=agent-report-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-report-tool.js","sourceRoot":"","sources":["../../src/agents/agent-report-tool.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAG,cAAc,CAAC;AAYrD,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE;YACX,yDAAyD;YACzD,0GAA0G;YAC1G,sHAAsH;SACvH,CAAC,IAAI,CAAC,GAAG,CAAC;QACX,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gFAAgF;iBAC9F;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;oBACjC,WAAW,EAAE,2CAA2C;iBACzD;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,oBAAoB,EAAE,KAAK;SAC5B;QACD,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;QAC9D,QAAQ,CAAC,KAAc,EAAE,QAAwB;YAC/C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACjG,MAAM,KAAK,GAAG,KAAgC,CAAC;YAC/C,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3E,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBAChG,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAoC,EAAE,CAAC;QACxF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAuB;YAChC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAC9F,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAA8B;gBACtD,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,sCAAsC;aAC7G,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -5,6 +5,7 @@ import type { Tool, ToolUseContext } from "../tools/tool.js";
|
|
|
5
5
|
import type { ToolRegistry } from "../tools/registry.js";
|
|
6
6
|
import { type AgentCatalog, type AgentIsolation, type AgentPermissionMode } from "./agent-definition.js";
|
|
7
7
|
import { type TaskStore } from "../tasks/task-store.js";
|
|
8
|
+
import { type AgentActivityStore } from "./agent-activity.js";
|
|
8
9
|
export declare const AGENT_TOOL_NAME = "agent";
|
|
9
10
|
export declare const AGENT_TOOL_PROMPT_RULES: string;
|
|
10
11
|
export interface AgentToolInput {
|
|
@@ -17,7 +18,7 @@ export interface AgentToolInput {
|
|
|
17
18
|
parallel?: boolean;
|
|
18
19
|
name?: string;
|
|
19
20
|
team_name?: string;
|
|
20
|
-
mode?: AgentPermissionMode | "sync" | "background" | "fork";
|
|
21
|
+
mode?: AgentPermissionMode | "sync" | "background" | "fork" | "explore";
|
|
21
22
|
isolation?: AgentIsolation;
|
|
22
23
|
/** Working directory for this subagent's tools (resolved against parent cwd when relative). */
|
|
23
24
|
cwd?: string;
|
|
@@ -30,6 +31,7 @@ export interface AgentToolRuntime {
|
|
|
30
31
|
contextBudget?: ContextBudgetOptions;
|
|
31
32
|
taskStore?: TaskStore;
|
|
32
33
|
agentCatalog?: AgentCatalog;
|
|
34
|
+
agentActivityStore?: AgentActivityStore;
|
|
33
35
|
}
|
|
34
36
|
export declare function createAgentTool(runtime?: AgentToolRuntime): Tool<AgentToolInput>;
|
|
35
37
|
export declare function resumeAgentTask(taskId: string, directive: string | undefined, runtime: AgentToolRuntime, taskStore: TaskStore, parentContext: ToolUseContext): Promise<{
|