@whispering233/ai-editor-agent 0.0.30 → 0.0.33

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.
Files changed (68) hide show
  1. package/dist/index.d.ts +2 -5
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +5 -9
  4. package/dist/index.js.map +1 -1
  5. package/dist/runtime/events.d.ts +21 -0
  6. package/dist/runtime/events.d.ts.map +1 -0
  7. package/dist/runtime/events.js +235 -0
  8. package/dist/runtime/events.js.map +1 -0
  9. package/dist/runtime/index.d.ts +11 -0
  10. package/dist/runtime/index.d.ts.map +1 -0
  11. package/dist/runtime/index.js +12 -0
  12. package/dist/runtime/index.js.map +1 -0
  13. package/dist/runtime/message-projection.d.ts +57 -0
  14. package/dist/runtime/message-projection.d.ts.map +1 -0
  15. package/dist/runtime/message-projection.js +94 -0
  16. package/dist/runtime/message-projection.js.map +1 -0
  17. package/dist/runtime/paths.d.ts +11 -0
  18. package/dist/runtime/paths.d.ts.map +1 -0
  19. package/dist/runtime/paths.js +23 -0
  20. package/dist/runtime/paths.js.map +1 -0
  21. package/dist/runtime/project-runtime.d.ts +57 -0
  22. package/dist/runtime/project-runtime.d.ts.map +1 -0
  23. package/dist/runtime/project-runtime.js +78 -0
  24. package/dist/runtime/project-runtime.js.map +1 -0
  25. package/dist/runtime/proposals.d.ts +85 -0
  26. package/dist/runtime/proposals.d.ts.map +1 -0
  27. package/dist/runtime/proposals.js +173 -0
  28. package/dist/runtime/proposals.js.map +1 -0
  29. package/dist/runtime/resources.d.ts +14 -0
  30. package/dist/runtime/resources.d.ts.map +1 -0
  31. package/dist/runtime/resources.js +39 -0
  32. package/dist/runtime/resources.js.map +1 -0
  33. package/dist/runtime/sessions.d.ts +35 -0
  34. package/dist/runtime/sessions.d.ts.map +1 -0
  35. package/dist/runtime/sessions.js +89 -0
  36. package/dist/runtime/sessions.js.map +1 -0
  37. package/dist/{prompts.d.ts → runtime/system-prompt.d.ts} +4 -12
  38. package/dist/runtime/system-prompt.d.ts.map +1 -0
  39. package/dist/runtime/system-prompt.js +22 -0
  40. package/dist/runtime/system-prompt.js.map +1 -0
  41. package/dist/runtime/tool-result.d.ts +12 -0
  42. package/dist/runtime/tool-result.d.ts.map +1 -0
  43. package/dist/runtime/tool-result.js +53 -0
  44. package/dist/runtime/tool-result.js.map +1 -0
  45. package/dist/runtime/tools.d.ts +28 -0
  46. package/dist/runtime/tools.d.ts.map +1 -0
  47. package/dist/runtime/tools.js +54 -0
  48. package/dist/runtime/tools.js.map +1 -0
  49. package/package.json +5 -4
  50. package/dist/context.d.ts +0 -96
  51. package/dist/context.d.ts.map +0 -1
  52. package/dist/context.js +0 -149
  53. package/dist/context.js.map +0 -1
  54. package/dist/executor.d.ts +0 -86
  55. package/dist/executor.d.ts.map +0 -1
  56. package/dist/executor.js +0 -259
  57. package/dist/executor.js.map +0 -1
  58. package/dist/prompts.d.ts.map +0 -1
  59. package/dist/prompts.js +0 -29
  60. package/dist/prompts.js.map +0 -1
  61. package/dist/run.d.ts +0 -182
  62. package/dist/run.d.ts.map +0 -1
  63. package/dist/run.js +0 -430
  64. package/dist/run.js.map +0 -1
  65. package/dist/session.d.ts +0 -60
  66. package/dist/session.d.ts.map +0 -1
  67. package/dist/session.js +0 -204
  68. package/dist/session.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,9 +1,6 @@
1
1
  export declare const AGENT_PKG_NAME = "@whispering233/ai-editor-agent";
2
2
  export declare const AGENT_PKG_VERSION = "0.1.0";
3
3
  export declare const TOOLS_DEP = "@whispering233/ai-editor-tools";
4
- export * from "./session.js";
5
- export * from "./prompts.js";
6
- export * from "./context.js";
7
- export * from "./run.js";
8
- export * from "./executor.js";
4
+ export { AGENTS_FILE_NAME, createCustomTools, createPingFrame, createProposalSink, createProposalStore, createProjectRuntime, createSessionFrame, defaultProposalStore, buildResourceLoaderOptions, estimateTokens, extractText, FOCUS_TITLE, findProjectSession, getThinkingPreview, KERNEL_PROMPT, lastVisibleSessionText, listProjectSessions, NoModelConfiguredError, openProjectSessionManager, projectAgentsFilePath, projectMessageForWire, projectSessionMessages, projectSessionsDir, PROPOSAL_BUILDERS, PROPOSAL_MAX_COUNT, PROPOSAL_TTL_MS, readProjectAgentsFile, readProjectSession, readSessionThinking, resolveAgentDir, resolveDefaultModel, SESSIONS_DIR_NAME, stringifyToolResult, THINKING_PREVIEW_MAX_CHARS, toProposalPayload, toSseFrame, TOOL_RESULT_MAX_TOKENS, truncateToolResultText, } from "./runtime/index.js";
5
+ export type { CreateCustomToolsOptions, CreateProposalSinkOptions, ProjectRuntime, ProjectRuntimeInput, Proposal, ProposalStore, ProposalStoreOptions, ProposalPayload, ProposalSink, ProposalSinkInput, ResourceLoaderOptions, SessionEntry, SessionInfo, SseFrame, SseProjectionOptions, ThinkingLevel, ThinkingPreviewProjection, WireMessage, WireSessionMessage, WireToolCall, } from "./runtime/index.js";
9
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,cAAc,mCAAmC,CAAC;AAC/D,eAAO,MAAM,iBAAiB,UAAU,CAAC;AACzC,eAAO,MAAM,SAAS,mCAAiB,CAAC;AAExC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,cAAc,mCAAmC,CAAC;AAC/D,eAAO,MAAM,iBAAiB,UAAU,CAAC;AACzC,eAAO,MAAM,SAAS,mCAAiB,CAAC;AAExC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACd,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,iBAAiB,EACjB,UAAU,EACV,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,wBAAwB,EACxB,yBAAyB,EACzB,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,aAAa,EACb,yBAAyB,EACzB,WAAW,EACX,kBAAkB,EAClB,YAAY,GACb,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,15 +1,11 @@
1
1
  // @whispering233/ai-editor-agent 入口
2
- // S7.1 会话管理(session.ts):历史重建 / 成对裁剪 / 喂回格式 / 末条约束——纯内存、无 I/O
3
- // S7.2 上下文组装(context.ts + prompts.ts):三层提示词注入 / 聚焦注入 / 工具清单 / 分层 token 预算
4
- // S7.3 主循环(run.ts):runAgent 三重保险 / 工具调度接口 ToolDispatcher / AgentEvent 事件流
5
- // S7.4 工具调度(executor.ts):ToolDispatcher 真实现 / 提案内存仓(TTL + 上限 + 项目绑定)
2
+ //
3
+ // 本包 = pi 运行时装配层:模型/凭据/会话/循环都由 pi 承担(见 docs/design/architecture.md「AI 运行时」),
4
+ // 本包只负责装配(ModelRuntime + SessionManager + AgentSession)、内核提示词、领域工具适配、
5
+ // 事件投影(→ SSE 帧)与提案仓。
6
6
  import { TOOLS_PKG_NAME } from "@whispering233/ai-editor-tools";
7
7
  export const AGENT_PKG_NAME = "@whispering233/ai-editor-agent";
8
8
  export const AGENT_PKG_VERSION = "0.1.0";
9
9
  export const TOOLS_DEP = TOOLS_PKG_NAME;
10
- export * from "./session.js";
11
- export * from "./prompts.js";
12
- export * from "./context.js";
13
- export * from "./run.js";
14
- export * from "./executor.js";
10
+ export { AGENTS_FILE_NAME, createCustomTools, createPingFrame, createProposalSink, createProposalStore, createProjectRuntime, createSessionFrame, defaultProposalStore, buildResourceLoaderOptions, estimateTokens, extractText, FOCUS_TITLE, findProjectSession, getThinkingPreview, KERNEL_PROMPT, lastVisibleSessionText, listProjectSessions, NoModelConfiguredError, openProjectSessionManager, projectAgentsFilePath, projectMessageForWire, projectSessionMessages, projectSessionsDir, PROPOSAL_BUILDERS, PROPOSAL_MAX_COUNT, PROPOSAL_TTL_MS, readProjectAgentsFile, readProjectSession, readSessionThinking, resolveAgentDir, resolveDefaultModel, SESSIONS_DIR_NAME, stringifyToolResult, THINKING_PREVIEW_MAX_CHARS, toProposalPayload, toSseFrame, TOOL_RESULT_MAX_TOKENS, truncateToolResultText, } from "./runtime/index.js";
15
11
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,6DAA6D;AAC7D,0EAA0E;AAC1E,0EAA0E;AAC1E,qEAAqE;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,MAAM,CAAC,MAAM,cAAc,GAAG,gCAAgC,CAAC;AAC/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG,cAAc,CAAC;AAExC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,EAAE;AACF,6EAA6E;AAC7E,sEAAsE;AACtE,qBAAqB;AAErB,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,MAAM,CAAC,MAAM,cAAc,GAAG,gCAAgC,CAAC;AAC/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG,cAAc,CAAC;AAExC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACd,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,iBAAiB,EACjB,UAAU,EACV,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { AgentSessionEvent, ContextUsage } from "@earendil-works/pi-coding-agent";
2
+ /** 一帧 SSE(`event: <event>` + `data: <json>`) */
3
+ export interface SseFrame {
4
+ event: string;
5
+ data: Record<string, unknown>;
6
+ }
7
+ /** 投影选项(每轮取值都是「当前时刻」的函数,不做快照缓存) */
8
+ export interface SseProjectionOptions {
9
+ /** 占用条口径:由 `AgentSession.getContextUsage()` 提供(turn_end / agent_end 帧附带) */
10
+ getContextUsage?: () => ContextUsage | undefined;
11
+ }
12
+ /** 服务端合成的会话帧(流的首帧:客户端据此持久化「当前会话」) */
13
+ export declare function createSessionFrame(sessionId: string): SseFrame;
14
+ /** 心跳帧(探活 + 断开检测;载荷恒为空) */
15
+ export declare function createPingFrame(): SseFrame;
16
+ /**
17
+ * 单个 pi 会话事件 → SSE 帧;不投影的事件返回 null(调用方跳过)。
18
+ * 纯函数:同样的输入 + 同样的 options 取值 ⇒ 同样的帧(便于单测逐事件断言)。
19
+ */
20
+ export declare function toSseFrame(event: AgentSessionEvent, options?: SseProjectionOptions): SseFrame | null;
21
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/runtime/events.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAIvF,gDAAgD;AAChD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,mCAAmC;AACnC,MAAM,WAAW,oBAAoB;IACnC,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;CAClD;AAqBD,qCAAqC;AACrC,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAE9D;AAED,2BAA2B;AAC3B,wBAAgB,eAAe,IAAI,QAAQ,CAE1C;AAsED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,GAAE,oBAAyB,GAAG,QAAQ,GAAG,IAAI,CAmIxG"}
@@ -0,0 +1,235 @@
1
+ // pi 运行时:会话事件 → SSE 帧投影
2
+ //
3
+ // 契约 = docs/api/80-api-chat.md「SSE 事件集 + 过滤约定」:本模块是该契约的**唯一实现点**。
4
+ // 三件必须做的事(每件都有「不做就会出事」的理由):
5
+ // 1. **剥离 `partial`/完整消息大对象**:pi 的增量事件都挂一份完整消息快照,原样转发单帧可达数百 KB。
6
+ // 2. **thinking 降预览**:全文走按需端点,帧里只给预览 + 定位参数(流式期间已由 thinking_delta 下发增量)。
7
+ // 3. **AUTO 工具的 `details` 不下发**:与 `content` 重复且可能极大;只有 PROPOSAL 工具的
8
+ // details(提案载荷)是 UI 的真实消费面。
9
+ //
10
+ // 丢弃 pi 的内部状态事件(entry_appended / queue_update / session_info_changed /
11
+ // thinking_level_changed / agent_settled / summarization_retry_* / bash_execution_update):
12
+ // 事件表没有登记 = UI 没有消费方,转发只会变成无人接的噪声。
13
+ import { PROPOSAL_TOOLS } from "@whispering233/ai-editor-shared";
14
+ import { getThinkingPreview, projectMessageForWire } from "./message-projection.js";
15
+ /** 提案工具名集合(details 门控依据;shared 常量是工具名的唯一事实来源) */
16
+ const PROPOSAL_TOOL_NAME_SET = new Set(PROPOSAL_TOOLS);
17
+ /** 丢弃的事件类型(未登记进事件表的内部状态) */
18
+ const DROPPED_EVENT_TYPES = new Set([
19
+ "entry_appended",
20
+ "queue_update",
21
+ "session_info_changed",
22
+ "thinking_level_changed",
23
+ "agent_settled",
24
+ "summarization_retry_scheduled",
25
+ "summarization_retry_attempt_start",
26
+ "summarization_retry_finished",
27
+ "bash_execution_update",
28
+ ]);
29
+ /** 服务端合成的会话帧(流的首帧:客户端据此持久化「当前会话」) */
30
+ export function createSessionFrame(sessionId) {
31
+ return { event: "session", data: { session_id: sessionId } };
32
+ }
33
+ /** 心跳帧(探活 + 断开检测;载荷恒为空) */
34
+ export function createPingFrame() {
35
+ return { event: "ping", data: {} };
36
+ }
37
+ /** 占用条字段(无 getContextUsage 或返回 undefined 时不带该键) */
38
+ function contextUsageField(options) {
39
+ const usage = options.getContextUsage?.();
40
+ if (usage === undefined)
41
+ return {};
42
+ return {
43
+ contextUsage: { percent: usage.percent, tokens: usage.tokens, contextWindow: usage.contextWindow },
44
+ };
45
+ }
46
+ /** 从 partial 快照里取工具调用的 id/name(toolcall_start/delta 事件不带这两个字段) */
47
+ function toolCallMetadata(event) {
48
+ const assistantEvent = event.assistantMessageEvent;
49
+ if (assistantEvent.type !== "toolcall_start" && assistantEvent.type !== "toolcall_delta")
50
+ return null;
51
+ const content = assistantEvent.partial?.content;
52
+ const contentIndex = assistantEvent.contentIndex;
53
+ if (!Array.isArray(content) || typeof contentIndex !== "number")
54
+ return null;
55
+ const block = content[contentIndex];
56
+ if (block === undefined || block.type !== "toolCall")
57
+ return null;
58
+ const id = typeof block.id === "string" ? block.id : null;
59
+ const toolName = typeof block.name === "string" ? block.name : null;
60
+ return id !== null && toolName !== null ? { id, toolName } : null;
61
+ }
62
+ /**
63
+ * assistant 增量事件投影:剥离 `partial`(完整消息快照)。
64
+ * `done` / `error` 两种收尾事件还挂着完整消息(`message` / `error`),同样只留 `reason`——
65
+ * 消息终态由随后的 `message_end` 帧负责。
66
+ */
67
+ function projectAssistantMessageEvent(event) {
68
+ if (event.type === "done")
69
+ return { type: "done", reason: event.reason };
70
+ if (event.type === "error")
71
+ return { type: "error", reason: event.reason };
72
+ const { partial: _partial, ...rest } = event;
73
+ void _partial;
74
+ // thinking_end 的 content 是整段思维链(可达数十 KB):客户端已通过 thinking_delta 拿到增量、
75
+ // 终态由 message_end 的预览负责(全文走按需端点)——这里降为预览,避免单帧数百 KB。
76
+ if (event.type === "thinking_end" && typeof rest.content === "string") {
77
+ return { ...rest, content: getThinkingPreview(rest.content), contentLength: rest.content.length };
78
+ }
79
+ const metadata = toolCallMetadata({ assistantMessageEvent: event });
80
+ return metadata === null ? rest : { ...rest, ...metadata };
81
+ }
82
+ /** 末条 assistant 消息的失败信息(agent_end 帧用:错误/中止时带 stopReason) */
83
+ function lastAssistantFailure(messages) {
84
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
85
+ const message = messages[index];
86
+ if (message === undefined || message.role !== "assistant")
87
+ continue;
88
+ const stopReason = typeof message.stopReason === "string" ? message.stopReason : undefined;
89
+ if (stopReason !== "error" && stopReason !== "aborted")
90
+ return {};
91
+ return {
92
+ stopReason,
93
+ ...(typeof message.errorMessage === "string" ? { errorMessage: message.errorMessage } : {}),
94
+ };
95
+ }
96
+ return {};
97
+ }
98
+ /** 消息帧的 `{ message }` 载荷(未知角色 → null,调用方丢弃该帧) */
99
+ function messageField(message) {
100
+ const projected = projectMessageForWire(message);
101
+ return projected === null ? null : { message: projected };
102
+ }
103
+ /**
104
+ * 单个 pi 会话事件 → SSE 帧;不投影的事件返回 null(调用方跳过)。
105
+ * 纯函数:同样的输入 + 同样的 options 取值 ⇒ 同样的帧(便于单测逐事件断言)。
106
+ */
107
+ export function toSseFrame(event, options = {}) {
108
+ const type = event.type;
109
+ if (DROPPED_EVENT_TYPES.has(type))
110
+ return null;
111
+ switch (type) {
112
+ case "agent_start":
113
+ case "turn_start":
114
+ return { event: type, data: {} };
115
+ case "message_start":
116
+ case "message_end": {
117
+ const data = messageField(event.message);
118
+ return data === null ? null : { event: type, data };
119
+ }
120
+ case "message_update": {
121
+ const update = event;
122
+ // 只投影 assistant 的增量:pi 的 message_update 仅对 assistant 消息触发(文档事件表同款),
123
+ // 其他角色出现即视为未知事件,丢弃而不是转发一个前端无法归属的 delta。
124
+ const role = update.message?.role;
125
+ if (role !== "assistant")
126
+ return null;
127
+ // **不带 `message`**:pi 的增量事件里挂着完整消息快照,一旦转发就等于把「partial 剥离」
128
+ // 白做(正文会随每个 chunk 重复下发);消息终态由 message_end 帧负责。
129
+ return {
130
+ event: "message_update",
131
+ data: { assistantMessageEvent: projectAssistantMessageEvent(update.assistantMessageEvent) },
132
+ };
133
+ }
134
+ case "tool_execution_start":
135
+ case "tool_execution_update": {
136
+ const execution = event;
137
+ return {
138
+ event: type,
139
+ data: {
140
+ toolCallId: execution.toolCallId,
141
+ toolName: execution.toolName,
142
+ ...(type === "tool_execution_start"
143
+ ? { args: execution.args }
144
+ : { partialResult: execution.partialResult }),
145
+ },
146
+ };
147
+ }
148
+ case "tool_execution_end": {
149
+ const execution = event;
150
+ return {
151
+ event: "tool_execution_end",
152
+ data: {
153
+ toolCallId: execution.toolCallId,
154
+ toolName: execution.toolName,
155
+ result: projectToolResult(execution.toolName, execution.result),
156
+ isError: execution.isError,
157
+ },
158
+ };
159
+ }
160
+ case "turn_end": {
161
+ const turn = event;
162
+ return {
163
+ event: "turn_end",
164
+ data: {
165
+ toolResults: turn.toolResults
166
+ .map((result) => projectMessageForWire(result))
167
+ .filter((result) => result !== null),
168
+ ...contextUsageField(options),
169
+ },
170
+ };
171
+ }
172
+ case "compaction_start": {
173
+ const compaction = event;
174
+ return { event: "compaction_start", data: { reason: compaction.reason } };
175
+ }
176
+ case "compaction_end": {
177
+ const compaction = event;
178
+ return {
179
+ event: "compaction_end",
180
+ data: {
181
+ reason: compaction.reason,
182
+ ...(compaction.result === undefined ? {} : { result: compaction.result }),
183
+ aborted: compaction.aborted,
184
+ willRetry: compaction.willRetry,
185
+ ...(compaction.errorMessage === undefined ? {} : { errorMessage: compaction.errorMessage }),
186
+ },
187
+ };
188
+ }
189
+ case "auto_retry_start": {
190
+ const retry = event;
191
+ return {
192
+ event: "auto_retry_start",
193
+ data: {
194
+ attempt: retry.attempt,
195
+ maxAttempts: retry.maxAttempts,
196
+ delayMs: retry.delayMs,
197
+ errorMessage: retry.errorMessage,
198
+ },
199
+ };
200
+ }
201
+ case "auto_retry_end": {
202
+ const retry = event;
203
+ return {
204
+ event: "auto_retry_end",
205
+ data: {
206
+ success: retry.success,
207
+ attempt: retry.attempt,
208
+ ...(retry.finalError === undefined ? {} : { finalError: retry.finalError }),
209
+ },
210
+ };
211
+ }
212
+ case "agent_end": {
213
+ const end = event;
214
+ return {
215
+ event: "agent_end",
216
+ data: { ...lastAssistantFailure(end.messages), ...contextUsageField(options) },
217
+ };
218
+ }
219
+ default:
220
+ return null;
221
+ }
222
+ }
223
+ /**
224
+ * 工具结果 projection:
225
+ * - AUTO 工具:只给 `content`(details 与 content 重复,且可能是整棵大纲/全图)
226
+ * - PROPOSAL 工具:附带 `details`(提案载荷 `{ proposal_id, type, preview }`,前端提案卡的唯一数据面)
227
+ */
228
+ function projectToolResult(toolName, result) {
229
+ const record = (typeof result === "object" && result !== null ? result : {});
230
+ const content = record.content ?? [];
231
+ if (!PROPOSAL_TOOL_NAME_SET.has(toolName))
232
+ return { content };
233
+ return record.details === undefined ? { content } : { content, details: record.details };
234
+ }
235
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/runtime/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export * from "./paths.js";
2
+ export * from "./resources.js";
3
+ export * from "./sessions.js";
4
+ export * from "./system-prompt.js";
5
+ export * from "./tool-result.js";
6
+ export * from "./tools.js";
7
+ export * from "./message-projection.js";
8
+ export * from "./events.js";
9
+ export * from "./proposals.js";
10
+ export * from "./project-runtime.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAEA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,12 @@
1
+ // pi 运行时入口:装配 + 资源收窄 + 工具适配 + 事件投影 + 提案仓
2
+ export * from "./paths.js";
3
+ export * from "./resources.js";
4
+ export * from "./sessions.js";
5
+ export * from "./system-prompt.js";
6
+ export * from "./tool-result.js";
7
+ export * from "./tools.js";
8
+ export * from "./message-projection.js";
9
+ export * from "./events.js";
10
+ export * from "./proposals.js";
11
+ export * from "./project-runtime.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAEzC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,57 @@
1
+ import type { AssistantMessage, TextContent, ThinkingContent, ToolResultMessage, UserMessage } from "@earendil-works/pi-ai";
2
+ /** 思维链预览长度(与 pi-web 同口径:240 字符) */
3
+ export declare const THINKING_PREVIEW_MAX_CHARS = 240;
4
+ /** 思维链投影(列表/帧里只给预览;`deferred: true` 表示全文需按需拉取) */
5
+ export interface ThinkingPreviewProjection {
6
+ /** 前 240 字符预览(首行截取后 trimEnd) */
7
+ preview: string;
8
+ deferred: true;
9
+ /** 原消息 content 数组中的块下标(取全文时的定位参数) */
10
+ blockIndex: number;
11
+ /** 原文字符数(前端展示「已折叠 N 字」) */
12
+ length: number;
13
+ }
14
+ /** 工具调用投影(assistant 消息内) */
15
+ export interface WireToolCall {
16
+ id: string;
17
+ name: string;
18
+ arguments: unknown;
19
+ }
20
+ /** 线协议消息投影(SSE 帧与历史接口共用;`id` 由历史层按 entry 补,不在此层) */
21
+ export interface WireMessage {
22
+ role: "user" | "assistant" | "tool";
23
+ /** 可见文本(assistant = text 块拼接;thinking 不在此字段) */
24
+ content: string;
25
+ /** assistant 消息的思维链投影(仅非空块) */
26
+ thinking?: ThinkingPreviewProjection[];
27
+ /** assistant 消息的工具调用 */
28
+ toolCalls?: WireToolCall[];
29
+ /** tool 消息关联的调用 id */
30
+ toolCallId?: string;
31
+ /** tool 消息是否失败 */
32
+ isError?: boolean;
33
+ /** ISO 8601(pi 消息的毫秒时间戳) */
34
+ createdAt: string;
35
+ }
36
+ /** 思维链预览:截首行 + 截断到 240 字符(同行首 240 字符,超长行同样截断) */
37
+ export declare function getThinkingPreview(thinking: string): string;
38
+ /** 单块 thinking → 预览投影 */
39
+ export declare function projectThinkingBlock(block: ThinkingContent, blockIndex: number): ThinkingPreviewProjection;
40
+ /** 文本提取:string 原样;块数组只取 text 块(图片等非文本内容不进 content) */
41
+ export declare function extractText(content: string | readonly (TextContent | {
42
+ type: string;
43
+ text?: string;
44
+ })[]): string;
45
+ /** user 消息投影 */
46
+ export declare function projectUserMessage(message: UserMessage): WireMessage;
47
+ /** assistant 消息投影(thinking 降预览、toolCall 拆到 toolCalls) */
48
+ export declare function projectAssistantMessage(message: AssistantMessage): WireMessage;
49
+ /** tool 消息投影 */
50
+ export declare function projectToolResultMessage(message: ToolResultMessage): WireMessage;
51
+ /**
52
+ * 任意 pi 消息 → 线协议投影;未知角色返回 null(调用方据此丢弃该帧)。
53
+ * 判定按 role 分支(不用 instanceof——消息可能来自反序列化的会话文件,原型链不可靠)。
54
+ */
55
+ export declare function projectMessageForWire(message: unknown): WireMessage | null;
56
+ /** tool 块的类型引用(toolCalls 投影用;导出供调用方类型标注) */
57
+ //# sourceMappingURL=message-projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-projection.d.ts","sourceRoot":"","sources":["../../src/runtime/message-projection.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAE/B,mCAAmC;AACnC,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,kDAAkD;AAClD,MAAM,WAAW,yBAAyB;IACxC,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,IAAI,CAAC;IACf,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,4BAA4B;AAC5B,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,oDAAoD;AACpD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACpC,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACvC,wBAAwB;IACxB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,yBAAyB;AACzB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,yBAAyB,CAO1G;AAED,sDAAsD;AACtD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,GAAG,MAAM,CAMhH;AAOD,gBAAgB;AAChB,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAEpE;AAED,yDAAyD;AACzD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,WAAW,CAqB9E;AAED,gBAAgB;AAChB,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,iBAAiB,GAAG,WAAW,CAQhF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAO1E;AAED,4CAA4C"}
@@ -0,0 +1,94 @@
1
+ // pi 运行时:消息 → 线协议投影(SSE 帧与历史回看共用同一份投影)
2
+ //
3
+ // 为什么单独一层:
4
+ // 1. thinking 全文可能极长,而流式期间已由 `thinking_delta` 下发过——帧/历史里只给
5
+ // 「预览 + 可拉取标记」,全文走按需端点(契约见 docs/api/80-api-chat.md)。
6
+ // 2. 抹平 pi 的原始消息形态(content blocks / toolResult / usage / api 元数据),
7
+ // 让 client 只面对文档登记过的字段(role/content/thinking/toolCalls/toolCallId/isError/createdAt)。
8
+ //
9
+ // 未知角色(pi 的 custom / bashExecution / branchSummary / compactionSummary 等)返回 null:
10
+ // 文档的事件表只登记 user / assistant / tool 三类,多出来的角色没有消费方。
11
+ /** 思维链预览长度(与 pi-web 同口径:240 字符) */
12
+ export const THINKING_PREVIEW_MAX_CHARS = 240;
13
+ /** 思维链预览:截首行 + 截断到 240 字符(同行首 240 字符,超长行同样截断) */
14
+ export function getThinkingPreview(thinking) {
15
+ return thinking.trimStart().match(/^[^\r\n]{0,240}/u)?.[0].trimEnd() ?? "";
16
+ }
17
+ /** 单块 thinking → 预览投影 */
18
+ export function projectThinkingBlock(block, blockIndex) {
19
+ return {
20
+ preview: getThinkingPreview(block.thinking),
21
+ deferred: true,
22
+ blockIndex,
23
+ length: block.thinking.length,
24
+ };
25
+ }
26
+ /** 文本提取:string 原样;块数组只取 text 块(图片等非文本内容不进 content) */
27
+ export function extractText(content) {
28
+ if (typeof content === "string")
29
+ return content;
30
+ return content
31
+ .filter((block) => block.type === "text" && typeof block.text === "string")
32
+ .map((block) => block.text)
33
+ .join("");
34
+ }
35
+ /** 毫秒时间戳 → ISO 8601(缺省防御:无 timestamp 用当前时刻) */
36
+ function toIso(timestamp) {
37
+ return new Date(typeof timestamp === "number" ? timestamp : Date.now()).toISOString();
38
+ }
39
+ /** user 消息投影 */
40
+ export function projectUserMessage(message) {
41
+ return { role: "user", content: extractText(message.content), createdAt: toIso(message.timestamp) };
42
+ }
43
+ /** assistant 消息投影(thinking 降预览、toolCall 拆到 toolCalls) */
44
+ export function projectAssistantMessage(message) {
45
+ const thinking = [];
46
+ const toolCalls = [];
47
+ message.content.forEach((block, index) => {
48
+ if (block.type === "thinking") {
49
+ // 空思维链(含被安全过滤的 redacted 块)不投影:预览为空串没有信息量,且 length 会误导
50
+ if (block.thinking.trim() === "")
51
+ return;
52
+ thinking.push(projectThinkingBlock(block, index));
53
+ return;
54
+ }
55
+ if (block.type === "toolCall") {
56
+ toolCalls.push({ id: block.id, name: block.name, arguments: block.arguments });
57
+ }
58
+ });
59
+ return {
60
+ role: "assistant",
61
+ content: extractText(message.content),
62
+ ...(thinking.length === 0 ? {} : { thinking }),
63
+ ...(toolCalls.length === 0 ? {} : { toolCalls }),
64
+ createdAt: toIso(message.timestamp),
65
+ };
66
+ }
67
+ /** tool 消息投影 */
68
+ export function projectToolResultMessage(message) {
69
+ return {
70
+ role: "tool",
71
+ content: extractText(message.content),
72
+ toolCallId: message.toolCallId,
73
+ isError: message.isError,
74
+ createdAt: toIso(message.timestamp),
75
+ };
76
+ }
77
+ /**
78
+ * 任意 pi 消息 → 线协议投影;未知角色返回 null(调用方据此丢弃该帧)。
79
+ * 判定按 role 分支(不用 instanceof——消息可能来自反序列化的会话文件,原型链不可靠)。
80
+ */
81
+ export function projectMessageForWire(message) {
82
+ if (typeof message !== "object" || message === null)
83
+ return null;
84
+ const role = message.role;
85
+ if (role === "user")
86
+ return projectUserMessage(message);
87
+ if (role === "assistant")
88
+ return projectAssistantMessage(message);
89
+ if (role === "toolResult")
90
+ return projectToolResultMessage(message);
91
+ return null;
92
+ }
93
+ /** tool 块的类型引用(toolCalls 投影用;导出供调用方类型标注) */
94
+ //# sourceMappingURL=message-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-projection.js","sourceRoot":"","sources":["../../src/runtime/message-projection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** 项目内会话目录名(与备份管道登记的随包目录同名) */
2
+ export declare const SESSIONS_DIR_NAME = "sessions";
3
+ /** 项目规则文件名(唯一持久化上下文通道;读取只认项目根这一个文件) */
4
+ export declare const AGENTS_FILE_NAME = "AGENTS.md";
5
+ /** pi agent dir(`~/.pi/agent`;调用方可覆盖——测试隔离依赖) */
6
+ export declare function resolveAgentDir(override?: string): string;
7
+ /** 项目内会话目录绝对路径(`<项目根>/sessions`) */
8
+ export declare function projectSessionsDir(projectRoot: string): string;
9
+ /** 项目根 AGENTS.md 绝对路径 */
10
+ export declare function projectAgentsFilePath(projectRoot: string): string;
11
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/runtime/paths.ts"],"names":[],"mappings":"AAQA,+BAA+B;AAC/B,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAE5C,uCAAuC;AACvC,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAE5C,iDAAiD;AACjD,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,oCAAoC;AACpC,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,yBAAyB;AACzB,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEjE"}
@@ -0,0 +1,23 @@
1
+ // pi 运行时:路径解析(项目目录 vs pi agent dir)
2
+ //
3
+ // 会话文件落**项目目录**(随书移动/备份天然携带),模型/凭据/参数落 pi agent dir。
4
+ // 两个位置都由本模块给出,避免调用方自行拼接路径(路径只出一处)。
5
+ import { join, resolve } from "node:path";
6
+ import { getAgentDir } from "@earendil-works/pi-coding-agent";
7
+ /** 项目内会话目录名(与备份管道登记的随包目录同名) */
8
+ export const SESSIONS_DIR_NAME = "sessions";
9
+ /** 项目规则文件名(唯一持久化上下文通道;读取只认项目根这一个文件) */
10
+ export const AGENTS_FILE_NAME = "AGENTS.md";
11
+ /** pi agent dir(`~/.pi/agent`;调用方可覆盖——测试隔离依赖) */
12
+ export function resolveAgentDir(override) {
13
+ return override === undefined ? getAgentDir() : resolve(override);
14
+ }
15
+ /** 项目内会话目录绝对路径(`<项目根>/sessions`) */
16
+ export function projectSessionsDir(projectRoot) {
17
+ return join(resolve(projectRoot), SESSIONS_DIR_NAME);
18
+ }
19
+ /** 项目根 AGENTS.md 绝对路径 */
20
+ export function projectAgentsFilePath(projectRoot) {
21
+ return join(resolve(projectRoot), AGENTS_FILE_NAME);
22
+ }
23
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/runtime/paths.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,EAAE;AACF,qDAAqD;AACrD,mCAAmC;AAEnC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,+BAA+B;AAC/B,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAE5C,uCAAuC;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAE5C,iDAAiD;AACjD,MAAM,UAAU,eAAe,CAAC,QAAiB;IAC/C,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC,CAAC;AACvD,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,57 @@
1
+ import type { Api, Model } from "@earendil-works/pi-ai";
2
+ import { AgentSession, ModelRuntime, SessionManager, SettingsManager, type AgentSessionServices } from "@earendil-works/pi-coding-agent";
3
+ import type { ToolContext } from "@whispering233/ai-editor-tools";
4
+ import { type ProposalStore } from "./proposals.js";
5
+ import { type ProposalSink } from "./tools.js";
6
+ /** 思考强度(取自 AgentSession 的公开签名,避免直接依赖 pi-agent-core 类型) */
7
+ export type ThinkingLevel = Parameters<AgentSession["setThinkingLevel"]>[0];
8
+ /** 未配置任何可用模型/凭据(装配期失败;调用方决定如何呈现) */
9
+ export declare class NoModelConfiguredError extends Error {
10
+ constructor(message: string);
11
+ }
12
+ export interface ProjectRuntimeInput {
13
+ /** 项目根目录(AGENTS.md 与 sessions/ 都在这里) */
14
+ projectRoot: string;
15
+ /** 工具执行上下文(db / outlineDir / projectId) */
16
+ toolContext: ToolContext;
17
+ /** pi agent dir 覆盖(缺省 `~/.pi/agent`;测试隔离用) */
18
+ agentDir?: string;
19
+ /** 注入既有 ModelRuntime(测试/复用);缺省由 SDK 按 agentDir 自建 */
20
+ modelRuntime?: ModelRuntime;
21
+ /** 注入既有 SettingsManager;缺省按「项目配置不参与」自建 */
22
+ settingsManager?: SettingsManager;
23
+ /** 注入既有 SessionManager;缺省按项目 sessions/ 目录自建 */
24
+ sessionManager?: SessionManager;
25
+ /** 显式激活模型;缺省按 pi settings 的 defaultModel / 首个可用模型解析 */
26
+ model?: Model<Api>;
27
+ /** 初始思考强度;缺省按 pi settings 与模型能力解析 */
28
+ thinkingLevel?: ThinkingLevel;
29
+ /** 提案仓(缺省 defaultProposalStore 单例——与 confirm/reject 路由同仓消费) */
30
+ proposalStore?: ProposalStore;
31
+ /** 覆写提案登记回调(缺省 = createProposalSink(proposalStore);测试/特殊装配用) */
32
+ proposalSink?: ProposalSink;
33
+ }
34
+ /** 一个项目的 pi 运行时(会话 + 支撑服务) */
35
+ export interface ProjectRuntime {
36
+ /** 会话(prompt/abort/subscribe/dispose 见 pi AgentSession) */
37
+ session: AgentSession;
38
+ /** cwd 绑定的支撑服务(模型运行时 / 设置 / 资源加载器) */
39
+ services: AgentSessionServices;
40
+ sessionManager: SessionManager;
41
+ settingsManager: SettingsManager;
42
+ modelRuntime: ModelRuntime;
43
+ /** 释放会话订阅(项目关闭/切换时调用) */
44
+ dispose(): void;
45
+ }
46
+ /**
47
+ * 缺省模型解析:pi settings 的 defaultProvider+defaultModel → 首个可用模型(已配凭据者)→ 抛错。
48
+ * 不在本函数兜底到任何硬编码模型——「用哪个模型」归用户配置。
49
+ * 导出供 K5(settings 端点)复用与单测注入(stub runtime)。
50
+ */
51
+ export declare function resolveDefaultModel(runtime: ModelRuntime, settings: SettingsManager): Promise<Model<Api>>;
52
+ /**
53
+ * 装配一个项目的运行时。
54
+ * 会话文件落 `<项目根>/sessions`(不是 pi 默认的 agent dir 布局)。
55
+ */
56
+ export declare function createProjectRuntime(input: ProjectRuntimeInput): Promise<ProjectRuntime>;
57
+ //# sourceMappingURL=project-runtime.d.ts.map