@pickle-pee/runtime 0.0.0
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 +99 -0
- package/dist/adapters/index.d.ts +3 -0
- package/dist/adapters/index.js +10 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/kernel-session-adapter.d.ts +73 -0
- package/dist/adapters/kernel-session-adapter.js +10 -0
- package/dist/adapters/kernel-session-adapter.js.map +1 -0
- package/dist/adapters/pi-mono-event-bridge.d.ts +54 -0
- package/dist/adapters/pi-mono-event-bridge.js +159 -0
- package/dist/adapters/pi-mono-event-bridge.js.map +1 -0
- package/dist/adapters/pi-mono-session-adapter.d.ts +75 -0
- package/dist/adapters/pi-mono-session-adapter.js +490 -0
- package/dist/adapters/pi-mono-session-adapter.js.map +1 -0
- package/dist/create-app-runtime.d.ts +52 -0
- package/dist/create-app-runtime.js +163 -0
- package/dist/create-app-runtime.js.map +1 -0
- package/dist/domain/index.d.ts +1 -0
- package/dist/domain/index.js +5 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/events/event-bus.d.ts +23 -0
- package/dist/events/event-bus.js +85 -0
- package/dist/events/event-bus.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.js +6 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/runtime-event.d.ts +158 -0
- package/dist/events/runtime-event.js +13 -0
- package/dist/events/runtime-event.js.map +1 -0
- package/dist/governance/tool-governor.d.ts +63 -0
- package/dist/governance/tool-governor.js +639 -0
- package/dist/governance/tool-governor.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/planning/index.d.ts +6 -0
- package/dist/planning/index.js +16 -0
- package/dist/planning/index.js.map +1 -0
- package/dist/planning/plan-engine.d.ts +49 -0
- package/dist/planning/plan-engine.js +174 -0
- package/dist/planning/plan-engine.js.map +1 -0
- package/dist/planning/plan-events.d.ts +14 -0
- package/dist/planning/plan-events.js +94 -0
- package/dist/planning/plan-events.js.map +1 -0
- package/dist/planning/plan-orchestrator.d.ts +56 -0
- package/dist/planning/plan-orchestrator.js +167 -0
- package/dist/planning/plan-orchestrator.js.map +1 -0
- package/dist/planning/plan-types.d.ts +36 -0
- package/dist/planning/plan-types.js +9 -0
- package/dist/planning/plan-types.js.map +1 -0
- package/dist/runtime-context.d.ts +21 -0
- package/dist/runtime-context.js +37 -0
- package/dist/runtime-context.js.map +1 -0
- package/dist/services/event-normalizer.d.ts +22 -0
- package/dist/services/event-normalizer.js +162 -0
- package/dist/services/event-normalizer.js.map +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.js +7 -0
- package/dist/services/index.js.map +1 -0
- package/dist/session/session-events.d.ts +11 -0
- package/dist/session/session-events.js +52 -0
- package/dist/session/session-events.js.map +1 -0
- package/dist/session/session-facade.d.ts +88 -0
- package/dist/session/session-facade.js +439 -0
- package/dist/session/session-facade.js.map +1 -0
- package/dist/session/session-state.d.ts +14 -0
- package/dist/session/session-state.js +75 -0
- package/dist/session/session-state.js.map +1 -0
- package/dist/subagent/aggregation.d.ts +25 -0
- package/dist/subagent/aggregation.js +124 -0
- package/dist/subagent/aggregation.js.map +1 -0
- package/dist/subagent/index.d.ts +10 -0
- package/dist/subagent/index.js +29 -0
- package/dist/subagent/index.js.map +1 -0
- package/dist/subagent/path-scope.d.ts +24 -0
- package/dist/subagent/path-scope.js +86 -0
- package/dist/subagent/path-scope.js.map +1 -0
- package/dist/subagent/result-types.d.ts +61 -0
- package/dist/subagent/result-types.js +9 -0
- package/dist/subagent/result-types.js.map +1 -0
- package/dist/subagent/stop-condition.d.ts +34 -0
- package/dist/subagent/stop-condition.js +76 -0
- package/dist/subagent/stop-condition.js.map +1 -0
- package/dist/subagent/task-types.d.ts +48 -0
- package/dist/subagent/task-types.js +10 -0
- package/dist/subagent/task-types.js.map +1 -0
- package/dist/subagent/task-validator.d.ts +22 -0
- package/dist/subagent/task-validator.js +79 -0
- package/dist/subagent/task-validator.js.map +1 -0
- package/dist/subagent/verification.d.ts +22 -0
- package/dist/subagent/verification.js +55 -0
- package/dist/subagent/verification.js.map +1 -0
- package/dist/test/aggregation.test.d.ts +1 -0
- package/dist/test/aggregation.test.js +201 -0
- package/dist/test/aggregation.test.js.map +1 -0
- package/dist/test/create-app-runtime.test.d.ts +1 -0
- package/dist/test/create-app-runtime.test.js +286 -0
- package/dist/test/create-app-runtime.test.js.map +1 -0
- package/dist/test/event-bus.test.d.ts +1 -0
- package/dist/test/event-bus.test.js +81 -0
- package/dist/test/event-bus.test.js.map +1 -0
- package/dist/test/event-normalizer.test.d.ts +1 -0
- package/dist/test/event-normalizer.test.js +143 -0
- package/dist/test/event-normalizer.test.js.map +1 -0
- package/dist/test/path-scope.test.d.ts +1 -0
- package/dist/test/path-scope.test.js +71 -0
- package/dist/test/path-scope.test.js.map +1 -0
- package/dist/test/pi-mono-event-bridge.test.d.ts +1 -0
- package/dist/test/pi-mono-event-bridge.test.js +125 -0
- package/dist/test/pi-mono-event-bridge.test.js.map +1 -0
- package/dist/test/pi-mono-live.test.d.ts +1 -0
- package/dist/test/pi-mono-live.test.js +289 -0
- package/dist/test/pi-mono-live.test.js.map +1 -0
- package/dist/test/pi-mono-session-adapter.test.d.ts +1 -0
- package/dist/test/pi-mono-session-adapter.test.js +260 -0
- package/dist/test/pi-mono-session-adapter.test.js.map +1 -0
- package/dist/test/plan-engine.test.d.ts +1 -0
- package/dist/test/plan-engine.test.js +235 -0
- package/dist/test/plan-engine.test.js.map +1 -0
- package/dist/test/plan-events.test.d.ts +1 -0
- package/dist/test/plan-events.test.js +81 -0
- package/dist/test/plan-events.test.js.map +1 -0
- package/dist/test/plan-orchestrator.test.d.ts +1 -0
- package/dist/test/plan-orchestrator.test.js +324 -0
- package/dist/test/plan-orchestrator.test.js.map +1 -0
- package/dist/test/runtime-context.test.d.ts +1 -0
- package/dist/test/runtime-context.test.js +70 -0
- package/dist/test/runtime-context.test.js.map +1 -0
- package/dist/test/session-facade.test.d.ts +1 -0
- package/dist/test/session-facade.test.js +1011 -0
- package/dist/test/session-facade.test.js.map +1 -0
- package/dist/test/session-state.test.d.ts +1 -0
- package/dist/test/session-state.test.js +118 -0
- package/dist/test/session-state.test.js.map +1 -0
- package/dist/test/stop-condition.test.d.ts +1 -0
- package/dist/test/stop-condition.test.js +105 -0
- package/dist/test/stop-condition.test.js.map +1 -0
- package/dist/test/stubs/stub-kernel-session-adapter.d.ts +45 -0
- package/dist/test/stubs/stub-kernel-session-adapter.js +186 -0
- package/dist/test/stubs/stub-kernel-session-adapter.js.map +1 -0
- package/dist/test/task-validator.test.d.ts +1 -0
- package/dist/test/task-validator.test.js +97 -0
- package/dist/test/task-validator.test.js.map +1 -0
- package/dist/test/tool-governor.test.d.ts +1 -0
- package/dist/test/tool-governor.test.js +379 -0
- package/dist/test/tool-governor.test.js.map +1 -0
- package/dist/types/index.d.ts +77 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +28 -0
package/README.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# @pickle-pee/runtime
|
|
2
|
+
|
|
3
|
+
## 职责
|
|
4
|
+
|
|
5
|
+
产品层运行时。围绕 `pi-coding-agent` 构建 facade,管理会话(SessionFacade)、运行时上下文(RuntimeContext)、计划执行协议和事件标准化。所有 CLI 模式共享此 runtime。
|
|
6
|
+
|
|
7
|
+
## 导出
|
|
8
|
+
|
|
9
|
+
### 入口
|
|
10
|
+
|
|
11
|
+
- `createAppRuntime(config)` — 运行时工厂入口,返回 `AppRuntime`
|
|
12
|
+
- `AppRuntime` — 提供 `createSession()`、`recoverSession()`、`shutdown()` 和全局事件总线
|
|
13
|
+
|
|
14
|
+
### 会话管理
|
|
15
|
+
|
|
16
|
+
- `SessionFacade` — 会话外观接口,封装 prompt/continue/abort/close 生命周期
|
|
17
|
+
- `SessionFacadeImpl` — SessionFacade 的实现类
|
|
18
|
+
- `createInitialSessionState()` — 创建初始会话状态
|
|
19
|
+
- `recoverSessionState()` / `serializeForRecovery()` — 会话恢复与序列化
|
|
20
|
+
|
|
21
|
+
### 上下文
|
|
22
|
+
|
|
23
|
+
- `RuntimeContext` — 不可变执行上下文(sessionId, cwd, mode, model, toolSet, taskState)
|
|
24
|
+
- `createRuntimeContext()` — 上下文工厂
|
|
25
|
+
|
|
26
|
+
### 事件体系
|
|
27
|
+
|
|
28
|
+
- `EventBus` — 类型化事件总线(`on`/`onCategory`/`emit`/`off`/`removeAllListeners`)
|
|
29
|
+
- `RuntimeEvent` — 18 种标准化产品层事件的联合类型,6 个分类:
|
|
30
|
+
- `session` — 会话生命周期(created/resumed/suspended/closing/closed)
|
|
31
|
+
- `tool` — 工具执行(started/update/completed/denied)
|
|
32
|
+
- `plan` — 计划进度(created/step_started/step_completed/completed)
|
|
33
|
+
- `compaction` — 上下文压缩(started/completed)
|
|
34
|
+
- `permission` — 权限判定(requested/resolved)
|
|
35
|
+
- `text` — 文本流(text_delta/thinking_delta)
|
|
36
|
+
|
|
37
|
+
### 适配层
|
|
38
|
+
|
|
39
|
+
- `KernelSessionAdapter` — 上游 pi-mono 会话桥接接口
|
|
40
|
+
- `RawUpstreamEvent` — 上游原始事件信封
|
|
41
|
+
- `EventNormalizer` — raw event → RuntimeEvent 标准化翻译器
|
|
42
|
+
|
|
43
|
+
### 计划类型(P2 仅类型,引擎在 P4)
|
|
44
|
+
|
|
45
|
+
- `PlanSummary`、`PlanStep`、`PlanStatus`
|
|
46
|
+
|
|
47
|
+
## 依赖方向
|
|
48
|
+
|
|
49
|
+
- 依赖: 无(本项目叶子节点)
|
|
50
|
+
- 被依赖: `app-tools`, `app-ui`, `app-extensions`, `app-evaluation`, `app-cli`
|
|
51
|
+
|
|
52
|
+
## 禁止事项
|
|
53
|
+
|
|
54
|
+
- 不渲染 UI
|
|
55
|
+
- 不实现具体工具逻辑
|
|
56
|
+
- 不直接暴露上游零散事件,统一标准化后导出
|
|
57
|
+
|
|
58
|
+
## 内部结构
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
src/
|
|
62
|
+
├── index.ts # 主 barrel 导出
|
|
63
|
+
├── create-app-runtime.ts # 工厂入口
|
|
64
|
+
├── runtime-context.ts # RuntimeContext 工厂
|
|
65
|
+
├── types/index.ts # 所有公共类型定义
|
|
66
|
+
├── domain/index.ts # 领域类型重导出
|
|
67
|
+
├── events/
|
|
68
|
+
│ ├── index.ts # 事件 barrel
|
|
69
|
+
│ ├── runtime-event.ts # 18 种标准化事件定义
|
|
70
|
+
│ └── event-bus.ts # 类型化事件总线
|
|
71
|
+
├── session/
|
|
72
|
+
│ ├── session-facade.ts # SessionFacade 实现
|
|
73
|
+
│ ├── session-state.ts # 状态管理纯函数
|
|
74
|
+
│ └── session-events.ts # 会话事件工厂
|
|
75
|
+
├── planning/
|
|
76
|
+
│ ├── index.ts # barrel
|
|
77
|
+
│ └── plan-types.ts # 计划类型
|
|
78
|
+
├── adapters/
|
|
79
|
+
│ ├── index.ts # barrel
|
|
80
|
+
│ └── kernel-session-adapter.ts # 上游适配器接口
|
|
81
|
+
├── services/
|
|
82
|
+
│ ├── index.ts # barrel
|
|
83
|
+
│ └── event-normalizer.ts # 事件标准化翻译器
|
|
84
|
+
└── test/ # 测试
|
|
85
|
+
├── create-app-runtime.test.ts
|
|
86
|
+
├── session-facade.test.ts
|
|
87
|
+
├── session-state.test.ts
|
|
88
|
+
├── runtime-context.test.ts
|
|
89
|
+
├── event-bus.test.ts
|
|
90
|
+
├── event-normalizer.test.ts
|
|
91
|
+
└── stubs/
|
|
92
|
+
└── stub-kernel-session-adapter.ts
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## 验证
|
|
96
|
+
|
|
97
|
+
- `npx tsc --noEmit` 类型检查通过
|
|
98
|
+
- `vitest run` 全部测试通过(51 tests, 6 files)
|
|
99
|
+
- `npm run check` lint + format + types 全部通过
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { KernelSessionAdapter, RawUpstreamEvent } from "./kernel-session-adapter.js";
|
|
2
|
+
export { bridgePiMonoEvent, createInitialBridgeState, type PiMonoBridgeResult, type PiMonoBridgeState, } from "./pi-mono-event-bridge.js";
|
|
3
|
+
export { PiMonoSessionAdapter, type PiMonoSessionAdapterOptions } from "./pi-mono-session-adapter.js";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// adapters/ — Bridges to the upstream kernel session implementation.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PiMonoSessionAdapter = exports.createInitialBridgeState = exports.bridgePiMonoEvent = void 0;
|
|
5
|
+
var pi_mono_event_bridge_js_1 = require("./pi-mono-event-bridge.js");
|
|
6
|
+
Object.defineProperty(exports, "bridgePiMonoEvent", { enumerable: true, get: function () { return pi_mono_event_bridge_js_1.bridgePiMonoEvent; } });
|
|
7
|
+
Object.defineProperty(exports, "createInitialBridgeState", { enumerable: true, get: function () { return pi_mono_event_bridge_js_1.createInitialBridgeState; } });
|
|
8
|
+
var pi_mono_session_adapter_js_1 = require("./pi-mono-session-adapter.js");
|
|
9
|
+
Object.defineProperty(exports, "PiMonoSessionAdapter", { enumerable: true, get: function () { return pi_mono_session_adapter_js_1.PiMonoSessionAdapter; } });
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";AAAA,qEAAqE;;;AAGrE,qEAKmC;AAJlC,4HAAA,iBAAiB,OAAA;AACjB,mIAAA,wBAAwB,OAAA;AAIzB,2EAAsG;AAA7F,kIAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter interface for bridging to pi-mono's AgentSession.
|
|
3
|
+
*
|
|
4
|
+
* Since pi-mono is not installed as a dependency yet, this file defines the
|
|
5
|
+
* contract that the real adapter will implement when integration begins.
|
|
6
|
+
* For P2, StubKernelSessionAdapter (in test/) provides a test double.
|
|
7
|
+
*/
|
|
8
|
+
import type { SessionRecoveryData } from "../types/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Minimal representation of an event emitted by the upstream kernel.
|
|
11
|
+
*
|
|
12
|
+
* The EventNormalizer interprets these and maps them to product-layer
|
|
13
|
+
* RuntimeEvent instances. Unrecognized events are silently dropped.
|
|
14
|
+
*/
|
|
15
|
+
export interface RawUpstreamEvent {
|
|
16
|
+
readonly type: string;
|
|
17
|
+
readonly timestamp: number;
|
|
18
|
+
readonly payload?: Readonly<Record<string, unknown>>;
|
|
19
|
+
}
|
|
20
|
+
export interface ToolExecutionGateContext {
|
|
21
|
+
readonly toolName: string;
|
|
22
|
+
readonly toolCallId: string;
|
|
23
|
+
readonly parameters: Readonly<Record<string, unknown>>;
|
|
24
|
+
}
|
|
25
|
+
export type ToolExecutionGateDecision = {
|
|
26
|
+
readonly type: "allow";
|
|
27
|
+
} | {
|
|
28
|
+
readonly type: "deny";
|
|
29
|
+
readonly reason: string;
|
|
30
|
+
readonly riskLevel: string;
|
|
31
|
+
} | {
|
|
32
|
+
readonly type: "ask_user";
|
|
33
|
+
readonly reason: string;
|
|
34
|
+
readonly riskLevel: string;
|
|
35
|
+
};
|
|
36
|
+
export interface ToolExecutionGate {
|
|
37
|
+
beforeToolExecution(context: ToolExecutionGateContext): ToolExecutionGateDecision;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Bridge between the product layer and the upstream pi-coding-agent session.
|
|
41
|
+
*
|
|
42
|
+
* When pi-mono is integrated, a PiMonoSessionAdapter class will implement
|
|
43
|
+
* this interface by wrapping AgentSession. Only the adapter and normalizer
|
|
44
|
+
* need updating — nothing else in app-runtime changes.
|
|
45
|
+
*/
|
|
46
|
+
export interface KernelSessionAdapter {
|
|
47
|
+
/**
|
|
48
|
+
* Optional pre-execution governance hook.
|
|
49
|
+
*
|
|
50
|
+
* Adapters that support real tool interception should call this before
|
|
51
|
+
* dispatching a tool to the upstream executor.
|
|
52
|
+
*/
|
|
53
|
+
setToolExecutionGate?(gate: ToolExecutionGate): void;
|
|
54
|
+
/** Send a user prompt and receive raw upstream events as a stream. */
|
|
55
|
+
sendPrompt(input: string): AsyncIterable<RawUpstreamEvent>;
|
|
56
|
+
/** Continue an existing conversation turn. */
|
|
57
|
+
sendContinue(input: string): AsyncIterable<RawUpstreamEvent>;
|
|
58
|
+
/** Optional manual compaction hook. */
|
|
59
|
+
sendCompact?(customInstructions?: string): AsyncIterable<RawUpstreamEvent>;
|
|
60
|
+
/**
|
|
61
|
+
* Optional permission-resolution callback for adapters that can suspend a
|
|
62
|
+
* tool until the product layer collects a user decision.
|
|
63
|
+
*/
|
|
64
|
+
resolveToolPermission?(callId: string, decision: "allow" | "allow_for_session" | "allow_once" | "deny"): void | Promise<void>;
|
|
65
|
+
/** Abort the current streaming response. */
|
|
66
|
+
abort(): void;
|
|
67
|
+
/** Close the underlying session and release resources. */
|
|
68
|
+
close(): Promise<void>;
|
|
69
|
+
/** Extract serializable recovery data from the current session state. */
|
|
70
|
+
getRecoveryData(): SessionRecoveryData;
|
|
71
|
+
/** Resume a previously serialized session. Called before any prompt/continue. */
|
|
72
|
+
resume(data: SessionRecoveryData): void;
|
|
73
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Adapter interface for bridging to pi-mono's AgentSession.
|
|
4
|
+
*
|
|
5
|
+
* Since pi-mono is not installed as a dependency yet, this file defines the
|
|
6
|
+
* contract that the real adapter will implement when integration begins.
|
|
7
|
+
* For P2, StubKernelSessionAdapter (in test/) provides a test double.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
//# sourceMappingURL=kernel-session-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel-session-adapter.js","sourceRoot":"","sources":["../../src/adapters/kernel-session-adapter.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { RawUpstreamEvent } from "./kernel-session-adapter.js";
|
|
2
|
+
type PiMonoBridgeEvent = {
|
|
3
|
+
type: "agent_start";
|
|
4
|
+
} | {
|
|
5
|
+
type: "agent_end";
|
|
6
|
+
} | {
|
|
7
|
+
type: "message_update";
|
|
8
|
+
assistantMessageEvent: {
|
|
9
|
+
type: "text_delta" | "thinking_delta";
|
|
10
|
+
delta: string;
|
|
11
|
+
};
|
|
12
|
+
} | {
|
|
13
|
+
type: "tool_execution_start";
|
|
14
|
+
toolName: string;
|
|
15
|
+
toolCallId: string;
|
|
16
|
+
args?: unknown;
|
|
17
|
+
} | {
|
|
18
|
+
type: "tool_execution_update";
|
|
19
|
+
toolName: string;
|
|
20
|
+
toolCallId: string;
|
|
21
|
+
partialResult?: unknown;
|
|
22
|
+
} | {
|
|
23
|
+
type: "tool_execution_end";
|
|
24
|
+
toolName: string;
|
|
25
|
+
toolCallId: string;
|
|
26
|
+
isError: boolean;
|
|
27
|
+
result?: unknown;
|
|
28
|
+
} | {
|
|
29
|
+
type: "compaction_start";
|
|
30
|
+
} | {
|
|
31
|
+
type: "compaction_end";
|
|
32
|
+
result?: {
|
|
33
|
+
tokensBefore?: number;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export interface PiMonoBridgeState {
|
|
37
|
+
readonly model: {
|
|
38
|
+
readonly id: string;
|
|
39
|
+
readonly provider: string;
|
|
40
|
+
readonly displayName?: string;
|
|
41
|
+
} | null;
|
|
42
|
+
readonly toolSet: readonly string[];
|
|
43
|
+
readonly toolStartedAtById: ReadonlyMap<string, number>;
|
|
44
|
+
}
|
|
45
|
+
export interface PiMonoBridgeResult {
|
|
46
|
+
readonly rawEvents: readonly RawUpstreamEvent[];
|
|
47
|
+
readonly nextState: PiMonoBridgeState;
|
|
48
|
+
}
|
|
49
|
+
export declare function createInitialBridgeState(params: {
|
|
50
|
+
model: PiMonoBridgeState["model"];
|
|
51
|
+
toolSet: readonly string[];
|
|
52
|
+
}): PiMonoBridgeState;
|
|
53
|
+
export declare function bridgePiMonoEvent(event: PiMonoBridgeEvent, state: PiMonoBridgeState): PiMonoBridgeResult;
|
|
54
|
+
export {};
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createInitialBridgeState = createInitialBridgeState;
|
|
4
|
+
exports.bridgePiMonoEvent = bridgePiMonoEvent;
|
|
5
|
+
function createInitialBridgeState(params) {
|
|
6
|
+
return {
|
|
7
|
+
model: params.model,
|
|
8
|
+
toolSet: [...params.toolSet],
|
|
9
|
+
toolStartedAtById: new Map(),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function bridgePiMonoEvent(event, state) {
|
|
13
|
+
const timestamp = Date.now();
|
|
14
|
+
const rawEvents = [];
|
|
15
|
+
const toolStartedAtById = new Map(state.toolStartedAtById);
|
|
16
|
+
switch (event.type) {
|
|
17
|
+
case "agent_start":
|
|
18
|
+
rawEvents.push({
|
|
19
|
+
type: "agent_start",
|
|
20
|
+
timestamp,
|
|
21
|
+
payload: {
|
|
22
|
+
model: state.model ?? { id: "unknown", provider: "unknown" },
|
|
23
|
+
toolSet: state.toolSet,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
break;
|
|
27
|
+
case "agent_end":
|
|
28
|
+
rawEvents.push({
|
|
29
|
+
type: "agent_end",
|
|
30
|
+
timestamp,
|
|
31
|
+
});
|
|
32
|
+
break;
|
|
33
|
+
case "message_update": {
|
|
34
|
+
const delta = extractMessageDelta(event);
|
|
35
|
+
if (delta !== null) {
|
|
36
|
+
rawEvents.push({
|
|
37
|
+
type: "message_update",
|
|
38
|
+
timestamp,
|
|
39
|
+
payload: {
|
|
40
|
+
kind: delta.kind,
|
|
41
|
+
content: delta.content,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case "tool_execution_start":
|
|
48
|
+
toolStartedAtById.set(event.toolCallId, timestamp);
|
|
49
|
+
rawEvents.push({
|
|
50
|
+
type: "tool_execution_start",
|
|
51
|
+
timestamp,
|
|
52
|
+
payload: {
|
|
53
|
+
toolName: event.toolName,
|
|
54
|
+
toolCallId: event.toolCallId,
|
|
55
|
+
parameters: asRecord(event.args),
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
break;
|
|
59
|
+
case "tool_execution_update":
|
|
60
|
+
rawEvents.push({
|
|
61
|
+
type: "tool_execution_update",
|
|
62
|
+
timestamp,
|
|
63
|
+
payload: {
|
|
64
|
+
toolName: event.toolName,
|
|
65
|
+
toolCallId: event.toolCallId,
|
|
66
|
+
update: extractToolText(event.partialResult),
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
break;
|
|
70
|
+
case "tool_execution_end": {
|
|
71
|
+
const startedAt = toolStartedAtById.get(event.toolCallId) ?? timestamp;
|
|
72
|
+
toolStartedAtById.delete(event.toolCallId);
|
|
73
|
+
rawEvents.push({
|
|
74
|
+
type: "tool_execution_end",
|
|
75
|
+
timestamp,
|
|
76
|
+
payload: {
|
|
77
|
+
toolName: event.toolName,
|
|
78
|
+
toolCallId: event.toolCallId,
|
|
79
|
+
status: event.isError ? "failure" : "success",
|
|
80
|
+
result: extractToolText(event.result),
|
|
81
|
+
durationMs: Math.max(0, timestamp - startedAt),
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case "compaction_start":
|
|
87
|
+
rawEvents.push({
|
|
88
|
+
type: "compaction_start",
|
|
89
|
+
timestamp,
|
|
90
|
+
});
|
|
91
|
+
break;
|
|
92
|
+
case "compaction_end":
|
|
93
|
+
rawEvents.push({
|
|
94
|
+
type: "compaction_end",
|
|
95
|
+
timestamp,
|
|
96
|
+
payload: {
|
|
97
|
+
originalMessageCount: 0,
|
|
98
|
+
retainedMessageCount: 0,
|
|
99
|
+
estimatedTokensSaved: event.result?.tokensBefore ?? 0,
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
break;
|
|
103
|
+
default:
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
rawEvents,
|
|
108
|
+
nextState: {
|
|
109
|
+
model: state.model,
|
|
110
|
+
toolSet: state.toolSet,
|
|
111
|
+
toolStartedAtById,
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function extractMessageDelta(event) {
|
|
116
|
+
if (event.assistantMessageEvent.type === "text_delta") {
|
|
117
|
+
return {
|
|
118
|
+
kind: "text",
|
|
119
|
+
content: event.assistantMessageEvent.delta,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (event.assistantMessageEvent.type === "thinking_delta") {
|
|
123
|
+
return {
|
|
124
|
+
kind: "thinking",
|
|
125
|
+
content: event.assistantMessageEvent.delta,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
function extractToolText(value) {
|
|
131
|
+
if (!value || typeof value !== "object") {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
const content = value.content;
|
|
135
|
+
if (Array.isArray(content)) {
|
|
136
|
+
const text = content
|
|
137
|
+
.filter((entry) => typeof entry === "object" && entry !== null)
|
|
138
|
+
.filter((entry) => entry.type === "text" && typeof entry.text === "string")
|
|
139
|
+
.map((entry) => entry.text.trim())
|
|
140
|
+
.filter((entry) => entry.length > 0)
|
|
141
|
+
.join("\n");
|
|
142
|
+
if (text.length > 0) {
|
|
143
|
+
return text;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
return JSON.stringify(value);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return String(value);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function asRecord(value) {
|
|
154
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
155
|
+
return {};
|
|
156
|
+
}
|
|
157
|
+
return { ...value };
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=pi-mono-event-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-mono-event-bridge.js","sourceRoot":"","sources":["../../src/adapters/pi-mono-event-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { ModelDescriptor, SessionRecoveryData } from "../types/index.js";
|
|
2
|
+
import type { KernelSessionAdapter, RawUpstreamEvent, ToolExecutionGate } from "./kernel-session-adapter.js";
|
|
3
|
+
type PermissionDecision = "allow" | "allow_for_session" | "allow_once" | "deny";
|
|
4
|
+
type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
5
|
+
type PiMonoModel = Record<string, unknown>;
|
|
6
|
+
interface AgentSession {
|
|
7
|
+
readonly sessionId: string;
|
|
8
|
+
readonly sessionFile?: string;
|
|
9
|
+
readonly isStreaming: boolean;
|
|
10
|
+
subscribe(listener: (event: unknown) => void): () => void;
|
|
11
|
+
prompt(input: string): Promise<void>;
|
|
12
|
+
followUp(input: string): Promise<void>;
|
|
13
|
+
abort(): Promise<void>;
|
|
14
|
+
compact(customInstructions?: string): Promise<void>;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
}
|
|
17
|
+
interface PiMonoTool {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
execute(toolCallId: string, params: unknown, signal?: AbortSignal, onUpdate?: ((partialResult: unknown) => void) | undefined): Promise<unknown>;
|
|
20
|
+
}
|
|
21
|
+
interface CreateAgentSessionOptions {
|
|
22
|
+
readonly cwd: string;
|
|
23
|
+
readonly agentDir?: string;
|
|
24
|
+
readonly model?: PiMonoModel;
|
|
25
|
+
readonly thinkingLevel?: ThinkingLevel;
|
|
26
|
+
readonly tools?: readonly PiMonoTool[];
|
|
27
|
+
readonly authStorage?: unknown;
|
|
28
|
+
readonly modelRegistry?: unknown;
|
|
29
|
+
readonly sessionManager?: unknown;
|
|
30
|
+
}
|
|
31
|
+
export interface PiMonoSessionAdapterOptions {
|
|
32
|
+
readonly workingDirectory: string;
|
|
33
|
+
readonly agentDir?: string;
|
|
34
|
+
readonly model: ModelDescriptor;
|
|
35
|
+
readonly toolSet?: readonly string[];
|
|
36
|
+
readonly thinkingLevel?: ThinkingLevel;
|
|
37
|
+
readonly createTools?: (cwd: string, toolSet: readonly string[]) => PiMonoTool[];
|
|
38
|
+
readonly createSession?: (options: CreateAgentSessionOptions) => Promise<AgentSession>;
|
|
39
|
+
}
|
|
40
|
+
export declare class PiMonoSessionAdapter implements KernelSessionAdapter {
|
|
41
|
+
private readonly options;
|
|
42
|
+
private session;
|
|
43
|
+
private toolExecutionGate;
|
|
44
|
+
private activeQueue;
|
|
45
|
+
private readonly pendingToolStartEvents;
|
|
46
|
+
private readonly approvedToolCalls;
|
|
47
|
+
private readonly deniedToolCalls;
|
|
48
|
+
private readonly pendingPermissionResolvers;
|
|
49
|
+
private pendingRecoveryData;
|
|
50
|
+
private closed;
|
|
51
|
+
private bridgeState;
|
|
52
|
+
constructor(options: PiMonoSessionAdapterOptions);
|
|
53
|
+
setToolExecutionGate(gate: ToolExecutionGate): void;
|
|
54
|
+
sendPrompt(input: string): AsyncIterable<RawUpstreamEvent>;
|
|
55
|
+
sendContinue(input: string): AsyncIterable<RawUpstreamEvent>;
|
|
56
|
+
sendCompact(customInstructions?: string): AsyncIterable<RawUpstreamEvent>;
|
|
57
|
+
resolveToolPermission(callId: string, decision: PermissionDecision): Promise<void>;
|
|
58
|
+
abort(): void;
|
|
59
|
+
close(): Promise<void>;
|
|
60
|
+
getRecoveryData(): SessionRecoveryData;
|
|
61
|
+
resume(data: SessionRecoveryData): void;
|
|
62
|
+
private runPromptLikeOperation;
|
|
63
|
+
private runCompactOperation;
|
|
64
|
+
private handleRawEvent;
|
|
65
|
+
private emitRawEvent;
|
|
66
|
+
private cleanupToolCall;
|
|
67
|
+
private approveToolCall;
|
|
68
|
+
private denyToolCall;
|
|
69
|
+
private initialize;
|
|
70
|
+
private createUnderlyingSession;
|
|
71
|
+
private wrapTools;
|
|
72
|
+
private executeGuardedTool;
|
|
73
|
+
private waitForPermissionResolution;
|
|
74
|
+
}
|
|
75
|
+
export {};
|