@trim21/personal-pi-extensions 0.0.301 → 0.0.303
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/package.json +1 -1
- package/src/aft/bridge.ts +12 -1
- package/src/aft/tools.ts +17 -14
package/package.json
CHANGED
package/src/aft/bridge.ts
CHANGED
|
@@ -50,6 +50,9 @@ export interface AftPool {
|
|
|
50
50
|
projectRoot: string;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
/** semantic_search 等待索引构建完成的上限(与 Rust 侧 AFT_WAIT_FOR_SEMANTIC_READY_MS 一致)。 */
|
|
54
|
+
export const SEMANTIC_INDEX_WAIT_TIMEOUT_MS = 600_000;
|
|
55
|
+
|
|
53
56
|
/** 创建 transport pool。每个项目根一个常驻 aft 进程,跨 session 共享。 */
|
|
54
57
|
export async function createAftPool(cwd: string): Promise<AftPool> {
|
|
55
58
|
const binaryPath = await resolveAftBinary();
|
|
@@ -57,7 +60,15 @@ export async function createAftPool(cwd: string): Promise<AftPool> {
|
|
|
57
60
|
const pool = await createAftTransportPool({
|
|
58
61
|
harness: "pi",
|
|
59
62
|
binaryPath,
|
|
60
|
-
poolOptions: {
|
|
63
|
+
poolOptions: {
|
|
64
|
+
childEnv: {
|
|
65
|
+
// Rust 侧 semantic_search 在索引 Building 时阻塞等待构建完成
|
|
66
|
+
// (main.rs wait_for_semantic_index_before_search),避免首次搜索拿到
|
|
67
|
+
// 词法 fallback 的部分结果。语义搜索未启用时该逻辑直接跳过。
|
|
68
|
+
AFT_WAIT_FOR_SEMANTIC_READY: "1",
|
|
69
|
+
AFT_WAIT_FOR_SEMANTIC_READY_MS: String(SEMANTIC_INDEX_WAIT_TIMEOUT_MS),
|
|
70
|
+
},
|
|
71
|
+
},
|
|
61
72
|
configOverrides: {
|
|
62
73
|
storage_dir: resolveCortexKitStorageRoot(),
|
|
63
74
|
cortexkit_user_config_path: paths.userConfigPath,
|
package/src/aft/tools.ts
CHANGED
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
21
21
|
import { Type } from "typebox";
|
|
22
22
|
|
|
23
|
-
import { callAftTool } from "./bridge.js";
|
|
23
|
+
import { callAftTool, SEMANTIC_INDEX_WAIT_TIMEOUT_MS } from "./bridge.js";
|
|
24
24
|
|
|
25
25
|
/** 解析 `~` 前缀与相对路径(相对 session cwd)。URL 与绝对路径原样返回。 */
|
|
26
26
|
export function resolvePathArg(cwd: string, input: string): string {
|
|
@@ -42,14 +42,14 @@ export function bridgeFor(ctx: AftToolContext): AftProjectTransport {
|
|
|
42
42
|
|
|
43
43
|
const OutlineParams = Type.Object(
|
|
44
44
|
{
|
|
45
|
-
target: Type.
|
|
45
|
+
target: Type.String({
|
|
46
46
|
description:
|
|
47
|
-
"要 outline
|
|
47
|
+
"要 outline 的对象:文件路径、目录路径或 URL(http:// 或 https://)。只接受单个 target;目录递归上限 200 个文件。",
|
|
48
48
|
}),
|
|
49
49
|
files: Type.Optional(
|
|
50
50
|
Type.Boolean({
|
|
51
51
|
description:
|
|
52
|
-
"目录模式:为 true 时 target
|
|
52
|
+
"目录模式:为 true 时 target 必须是目录,返回带语言/符号数/字节大小的扁平文件树,而非符号大纲。",
|
|
53
53
|
}),
|
|
54
54
|
),
|
|
55
55
|
includeTests: Type.Optional(
|
|
@@ -67,24 +67,20 @@ export function registerOutlineTool(pi: ExtensionAPI, ctx: AftToolContext): void
|
|
|
67
67
|
"输出代码文件、目录、URL 的结构化大纲:函数/类/类型等符号及其行号范围;Markdown/HTML 返回标题层级。",
|
|
68
68
|
"用它在读取具体内容之前先了解文件结构(比整文件 read 省 token)。",
|
|
69
69
|
"深入了解某个符号用 aft_zoom;看跨文件调用关系用 aft_callgraph。",
|
|
70
|
-
"target 支持:文件路径(带签名的符号大纲)、目录路径(递归最多 200 文件)、URL
|
|
70
|
+
"target 支持:文件路径(带签名的符号大纲)、目录路径(递归最多 200 文件)、URL。只接受单个 target。",
|
|
71
71
|
"files: true 且 target 为目录时返回扁平文件树(语言、顶层符号数、字节大小)。",
|
|
72
72
|
].join("\n"),
|
|
73
73
|
promptSnippet: "Output structural outline of a file/directory/URL",
|
|
74
74
|
parameters: OutlineParams,
|
|
75
75
|
async execute(_id, params, _signal, _onUpdate, extCtx) {
|
|
76
76
|
const target = coerceTargetParam(params.target);
|
|
77
|
-
if (
|
|
78
|
-
(
|
|
79
|
-
(!Array.isArray(target) || target.length === 0)
|
|
80
|
-
) {
|
|
81
|
-
throw new Error("'target' must be a non-empty string or array of strings");
|
|
77
|
+
if (typeof target !== "string" || target.length === 0) {
|
|
78
|
+
throw new Error("'target' must be a single path or URL (array targets are not supported)");
|
|
82
79
|
}
|
|
83
80
|
const filesMode = coerceBoolean(params.files);
|
|
84
81
|
const rawArgs: Record<string, unknown> = {
|
|
85
|
-
target:
|
|
86
|
-
|
|
87
|
-
: filesMode || target.startsWith("http://") || target.startsWith("https://")
|
|
82
|
+
target:
|
|
83
|
+
filesMode || target.startsWith("http://") || target.startsWith("https://")
|
|
88
84
|
? target
|
|
89
85
|
: resolvePathArg(extCtx.cwd, target),
|
|
90
86
|
};
|
|
@@ -336,6 +332,7 @@ export function registerSearchTool(pi: ExtensionAPI, ctx: AftToolContext): void
|
|
|
336
332
|
"精确名字、字符串、正则保持简短('^export'、'Cargo.lock')。",
|
|
337
333
|
"需要语义索引可用(aft.jsonc 中 semantic_search: true 且 embedding 后端就绪);",
|
|
338
334
|
"否则退化为词法/正则匹配通道。",
|
|
335
|
+
"启用语义索引时,首次调用会阻塞到索引构建完成,避免返回部分结果。",
|
|
339
336
|
].join("\n"),
|
|
340
337
|
promptSnippet: "Search code by meaning or exact text",
|
|
341
338
|
parameters: SearchParams,
|
|
@@ -350,7 +347,13 @@ export function registerSearchTool(pi: ExtensionAPI, ctx: AftToolContext): void
|
|
|
350
347
|
rawArgs.path = resolvePathArg(extCtx.cwd, params.path);
|
|
351
348
|
}
|
|
352
349
|
|
|
353
|
-
const { text, response } = await callAftTool(bridgeFor(ctx), "search", rawArgs, extCtx
|
|
350
|
+
const { text, response } = await callAftTool(bridgeFor(ctx), "search", rawArgs, extCtx, {
|
|
351
|
+
// 默认 search 传输超时仅 60s,会早于索引等待(600s)触发;覆盖为等待
|
|
352
|
+
// 上限 + 常规执行预算。超时只说明响应被挤掉而非 bridge 挂死,保留
|
|
353
|
+
// 常驻的语义索引/LSP 状态。
|
|
354
|
+
transportTimeoutMs: SEMANTIC_INDEX_WAIT_TIMEOUT_MS + 60_000,
|
|
355
|
+
keepBridgeOnTimeout: true,
|
|
356
|
+
});
|
|
354
357
|
return {
|
|
355
358
|
content: [{ type: "text", text }],
|
|
356
359
|
details: { input: params, truncated: response.truncated === true },
|