neoctl 0.1.13 → 0.1.14

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 CHANGED
@@ -252,6 +252,7 @@ REPL 当前注册的内置工具:
252
252
  | `edit` / `replace` | 基于唯一字符串替换修改文件,容忍 LF/CRLF 和直/弯引号差异 |
253
253
  | `exec` / `shell` / `bash` / `powershell` | 执行命令,支持 cwd、超时、输出截断和后台模式 |
254
254
  | `search` | 通过可插拔 provider 搜索 Web;OpenAI 模型提供者默认走 GPT web search,否则默认 Exa MCP;可显式切换 provider |
255
+ | `image2` / `draw_image` / `generate_image` | 仅在 `MODEL_PROVIDER=openai` 时注册;通过 OpenAI Images API 生成图片并返回可展示的 data URL;非 OpenAI provider 不暴露绘图工具,系统提示会要求模型说明当前不具备绘图能力 |
255
256
  | `plan` | 输出和更新当前任务计划 |
256
257
  | `agent` | 启动同步/后台/fork 子代理 |
257
258
  | `TaskOutput` | 读取后台任务输出,可阻塞等待完成 |
@@ -267,6 +268,7 @@ REPL 当前注册的内置工具:
267
268
  - `list` 默认跳过 `.git`、`node_modules`、`dist`、`build`、`coverage` 等重目录。
268
269
  - `grep` 不依赖系统 PATH,会调用 `vendor/ripgrep` 中的平台二进制;支持 glob、大小写模式、fixed strings、隐藏文件、上下文行、结果数和列宽限制。
269
270
  - `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`,让系统默认选择生效。
271
+ - `image2` 按 OpenAI 图片生成官方接口实现,底层请求 `POST /v1/images/generations`(可理解为项目里的 image2 绘图接口),默认模型 `gpt-image-1`,可用 `OPENAI_IMAGE_API_KEY` / `OPENAI_API_KEY`、`OPENAI_IMAGE_BASE_URL` / `OPENAI_BASE_URL`、`OPENAI_IMAGE_MODEL`、`OPENAI_IMAGE_TIMEOUT_MS` 配置。只有 `MODEL_PROVIDER=openai` 时 REPL/Web 运行时会注册该工具;切换到 DeepSeek/Kimi 等其他 provider 后会移除该工具,并在系统提示中要求模型告知用户当前模型/供应者不具备绘图工具。
270
272
 
271
273
  ### 命令执行
272
274
 
@@ -443,6 +445,107 @@ for await (const event of engine.sendUserText("Summarize this repository")) {
443
445
  }
444
446
  ```
445
447
 
448
+ Vue 等前端项目如果通过 API 消费消息,可使用展示层投影工具把内部 `Message` 转为可直接渲染的 DTO。`image2` 生成结果会被写入 `image` block;`imageMode: "data-url"` 时图片块会提供可直接赋给 `<img :src>` 的 `thumbnail.src` / `original.src`:
449
+
450
+ ```ts
451
+ import { extractDisplayImages, toDisplayAgentEvent, toDisplayMessages } from "neoctl";
452
+
453
+ const displayMessages = toDisplayMessages(engine.getHistoryMessages(), {
454
+ imageMode: "data-url",
455
+ includeThinking: false,
456
+ includeToolUse: false,
457
+ });
458
+
459
+ // 如果只想拿图片列表:
460
+ const images = extractDisplayImages(displayMessages);
461
+ // images[0]?.src 可直接返回给 Vue 的 <img :src>
462
+ ```
463
+
464
+ ```vue
465
+ <template v-for="message in displayMessages" :key="message.id">
466
+ <template v-for="(block, index) in message.blocks" :key="index">
467
+ <img
468
+ v-if="block.type === 'image' && block.thumbnail"
469
+ :src="block.thumbnail.src"
470
+ :alt="block.label || 'generated image'"
471
+ class="message-image-thumb"
472
+ />
473
+ </template>
474
+ </template>
475
+ ```
476
+
477
+ SSE/WebSocket 流式推送事件时,可以在后端把单个 `AgentEvent` 投影为 `DisplayAgentEvent`,这样 Vue 收到 `event.type === "message"` 时同样能直接渲染图片:
478
+
479
+ ```ts
480
+ for await (const event of engine.sendUserText("画一张小猫")) {
481
+ sendSse(toDisplayAgentEvent(event, { imageMode: "data-url" }));
482
+ }
483
+ ```
484
+
485
+ 也可以用 `imageMode: "metadata-only"` 只返回图片标签、MIME 与大小信息,避免在列表接口中内联 base64。
486
+
487
+ ### 简单多会话 / Vue 后端集成
488
+
489
+ 如果 Vue 侧只需要“每个用户使用自己的会话”或“一个用户操作,其他用户旁观”,可以使用轻量的 `SimpleSessionRuntime`。它不会改变底层 `QueryEngine` / `SessionStore` 行为,只是在库侧封装:
490
+
491
+ - 每个 `sessionId` 一个活动 `QueryEngine`。
492
+ - 同一 session 默认只允许一个发送任务运行,避免并发写历史。
493
+ - 支持读取 Vue 展示 DTO。
494
+ - 支持 `abort()` 中断当前 session。
495
+ - 支持 `onEvent()` 监听事件,便于服务端广播给 SSE/WebSocket 客户端。
496
+ - 可通过 `sessionRootDir` 做简单用户隔离。
497
+
498
+ ```ts
499
+ import { SimpleSessionRuntime, createModelGatewayFromEnv, ToolRegistry } from "neoctl";
500
+
501
+ const tools = new ToolRegistry();
502
+
503
+ const runtime = new SimpleSessionRuntime({
504
+ agentId: "main",
505
+ modelGateway: createModelGatewayFromEnv(),
506
+ tools,
507
+ // 简单多用户推荐:后端根据登录态为每个用户分配独立 session 目录。
508
+ sessionRootDir: `.agent/users/${userId}/sessions`,
509
+ });
510
+
511
+ runtime.onDisplayEvent((event, { sessionId }) => {
512
+ // 可在这里把已投影的 DisplayAgentEvent 广播给正在观看该 session 的 SSE/WebSocket 客户端。
513
+ // image2 图片会以 message.blocks[].type === "image" 且 block.thumbnail.src 可直接渲染的形式出现。
514
+ broadcast(sessionId, event);
515
+ }, { imageMode: "data-url", includeThinking: false, includeToolUse: false });
516
+
517
+ for await (const event of runtime.sendUserText(sessionId, "Summarize this repository")) {
518
+ console.log(event);
519
+ }
520
+
521
+ const displayMessages = await runtime.getDisplayMessages(sessionId, {
522
+ imageMode: "data-url", // Vue <img :src> 用这个;列表页可改为 metadata-only
523
+ includeThinking: false,
524
+ includeToolUse: false,
525
+ });
526
+ const images = await runtime.getDisplayImages(sessionId, { imageMode: "data-url" });
527
+ ```
528
+
529
+ 常用方法:
530
+
531
+ ```ts
532
+ await runtime.newSession();
533
+ await runtime.resumeSession(sessionId);
534
+ await runtime.listSessions(20);
535
+ await runtime.getMessages(sessionId);
536
+ await runtime.getDisplayMessages(sessionId, { imageMode: "metadata-only" });
537
+ await runtime.getDisplayImages(sessionId, { imageMode: "data-url" });
538
+ runtime.isBusy(sessionId);
539
+ runtime.abort(sessionId);
540
+ runtime.release(sessionId);
541
+ ```
542
+
543
+ 如果同一 session 正在运行,再次发送默认会抛出 `session is busy`。需要新请求打断旧请求时,可以使用:
544
+
545
+ ```ts
546
+ runtime.sendUserText(sessionId, text, { busyBehavior: "interrupt" });
547
+ ```
548
+
446
549
  除根入口外,发布包还通过 package `exports` 暴露 `dist` 下的编译后子路径,便于依赖方按需导入较底层模块:
447
550
 
448
551
  ```ts
@@ -1,5 +1,6 @@
1
1
  export const SYSTEM_PROMPT_DYNAMIC_BOUNDARY = "__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__";
2
2
  export function buildDefaultSystemPromptSections(enabledTools = []) {
3
+ const hasImageGenerationTool = enabledTools.includes("image2") || enabledTools.includes("draw_image") || enabledTools.includes("generate_image");
3
4
  return [
4
5
  {
5
6
  name: "Agent Scaffold",
@@ -28,6 +29,9 @@ export function buildDefaultSystemPromptSections(enabledTools = []) {
28
29
  ? `Available tools are provided separately. Stable tool prefix: ${enabledTools.join(", ")}.`
29
30
  : "Available tools are provided separately by the runtime.",
30
31
  "When using tools, you may briefly state the intent of the tool call; if a tool result contains valuable information, you may briefly report it.",
32
+ hasImageGenerationTool
33
+ ? "When the user asks for drawing/image generation, use the image2 tool. It is backed by OpenAI's Images API."
34
+ : "This runtime has no drawing/image generation tool. If the user asks you to draw, create, render, or generate an image, say that the current model/provider does not have drawing capability instead of pretending to generate one.",
31
35
  ].join("\n"),
32
36
  },
33
37
  {
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/context/prompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/context/prompts.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -40,6 +40,7 @@ export * from "./tools/tool.js";
40
40
  export * from "./session/session-store.js";
41
41
  export * from "./session/session-export.js";
42
42
  export * from "./session/tool-result-memory.js";
43
+ export * from "./session/simple-session-runtime.js";
43
44
  export * from "./tools/registry.js";
44
45
  export * from "./tools/run-tool-use.js";
45
46
  export * from "./tools/tool-orchestration.js";
@@ -52,9 +53,11 @@ export * from "./tools/builtins/grep-tool.js";
52
53
  export * from "./tools/builtins/search-tool.js";
53
54
  export * from "./tools/builtins/search-providers.js";
54
55
  export * from "./tools/builtins/plan-tool.js";
56
+ export * from "./tools/builtins/image-generation-tool.js";
55
57
  export * from "./tools/builtins/ripgrep-binary.js";
56
58
  export * from "./types/messages.js";
57
59
  export * from "./types/events.js";
60
+ export * from "./ui/display-message.js";
58
61
  export * from "./app/app-state.js";
59
62
  export * from "./safety/audit.js";
60
63
  export * from "./safety/permissions.js";
package/dist/index.js CHANGED
@@ -40,6 +40,7 @@ export * from "./tools/tool.js";
40
40
  export * from "./session/session-store.js";
41
41
  export * from "./session/session-export.js";
42
42
  export * from "./session/tool-result-memory.js";
43
+ export * from "./session/simple-session-runtime.js";
43
44
  export * from "./tools/registry.js";
44
45
  export * from "./tools/run-tool-use.js";
45
46
  export * from "./tools/tool-orchestration.js";
@@ -52,9 +53,11 @@ export * from "./tools/builtins/grep-tool.js";
52
53
  export * from "./tools/builtins/search-tool.js";
53
54
  export * from "./tools/builtins/search-providers.js";
54
55
  export * from "./tools/builtins/plan-tool.js";
56
+ export * from "./tools/builtins/image-generation-tool.js";
55
57
  export * from "./tools/builtins/ripgrep-binary.js";
56
58
  export * from "./types/messages.js";
57
59
  export * from "./types/events.js";
60
+ export * from "./ui/display-message.js";
58
61
  export * from "./app/app-state.js";
59
62
  export * from "./safety/audit.js";
60
63
  export * from "./safety/permissions.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mCAAmC,CAAC;AAClD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mCAAmC,CAAC;AAClD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oCAAoC,CAAC;AACnD,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC"}
@@ -20,6 +20,7 @@ import { listDirectoryTool, readFileTool } from "../tools/builtins/filesystem-to
20
20
  import { grepTool } from "../tools/builtins/grep-tool.js";
21
21
  import { searchTool } from "../tools/builtins/search-tool.js";
22
22
  import { planTool } from "../tools/builtins/plan-tool.js";
23
+ import { createOpenAIImageGenerationTool } from "../tools/builtins/image-generation-tool.js";
23
24
  import { createAgentTool, resumeAgentTask } from "../agents/agent-tool.js";
24
25
  import { createTaskTools } from "../tasks/task-tools.js";
25
26
  import { TaskStore } from "../tasks/task-store.js";
@@ -156,6 +157,8 @@ async function createRuntime() {
156
157
  tools.register(readFileTool);
157
158
  tools.register(grepTool);
158
159
  tools.register(searchTool);
160
+ if (modelConfig?.provider === "openai")
161
+ tools.register(createOpenAIImageGenerationTool());
159
162
  tools.register(planTool);
160
163
  const agentRuntime = { modelGateway, tools, taskStore };
161
164
  tools.register(createAgentTool(agentRuntime));
@@ -199,12 +202,18 @@ async function createRuntime() {
199
202
  agentRuntime,
200
203
  usage: new SessionUsageTracker(),
201
204
  taskStore,
205
+ tools,
202
206
  initialMetrics,
203
207
  defaultReasoning: modelConfig?.defaultReasoning,
204
208
  envPath: process.env.NEO_ENV_FILE?.trim() ? path.resolve(process.env.NEO_ENV_FILE.trim()) : envLoad.userDotEnvPath,
205
209
  envNotice: envLoad.createdUserDotEnv ? formatCreatedEnvNotice(envLoad.userDotEnvPath) : undefined,
206
210
  };
207
211
  }
212
+ function syncImageGenerationTool(runtime, provider) {
213
+ runtime.tools.unregister("image2");
214
+ if (provider === "openai")
215
+ runtime.tools.register(createOpenAIImageGenerationTool());
216
+ }
208
217
  function formatCreatedEnvNotice(path) {
209
218
  return `Created default config file: ${path}\nSet MODEL_PROVIDER and the matching provider section (for example OPENAI_API_KEY or KIMI_API_KEY), then restart neo.`;
210
219
  }
@@ -1979,6 +1988,7 @@ async function handleModelCommand(command, runtime) {
1979
1988
  fallbackModel: config.fallbackModel,
1980
1989
  reasoning: config.defaultReasoning,
1981
1990
  });
1991
+ syncImageGenerationTool(runtime, config.provider);
1982
1992
  runtime.defaultReasoning = config.defaultReasoning;
1983
1993
  }
1984
1994
  }
@@ -2605,6 +2615,7 @@ async function submitLoginForm(state, runtime, append, setLoginFormState, setSta
2605
2615
  fallbackModel: config.fallbackModel,
2606
2616
  reasoning: config.defaultReasoning,
2607
2617
  });
2618
+ syncImageGenerationTool(runtime, config.provider);
2608
2619
  runtime.defaultReasoning = config.defaultReasoning;
2609
2620
  const metrics = await runtime.engine.contextMetrics();
2610
2621
  setStatus((current) => ({