@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
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The single entry point for creating the product-layer runtime.
|
|
4
|
+
*
|
|
5
|
+
* `createAppRuntime()` initializes the runtime with configuration, model,
|
|
6
|
+
* tool set, and adapter provisioning. All four CLI modes (interactive,
|
|
7
|
+
* print, json, rpc) use the same factory and the same AppRuntime interface.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createAppRuntime = createAppRuntime;
|
|
11
|
+
const event_bus_js_1 = require("./events/event-bus.js");
|
|
12
|
+
const tool_governor_js_1 = require("./governance/tool-governor.js");
|
|
13
|
+
const plan_engine_js_1 = require("./planning/plan-engine.js");
|
|
14
|
+
const runtime_context_js_1 = require("./runtime-context.js");
|
|
15
|
+
const session_events_js_1 = require("./session/session-events.js");
|
|
16
|
+
const session_facade_js_1 = require("./session/session-facade.js");
|
|
17
|
+
const session_state_js_1 = require("./session/session-state.js");
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Factory
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
function createAppRuntime(config) {
|
|
22
|
+
const globalBus = (0, event_bus_js_1.createEventBus)();
|
|
23
|
+
const governor = (0, tool_governor_js_1.createToolGovernor)();
|
|
24
|
+
const planEngine = (0, plan_engine_js_1.createPlanEngine)();
|
|
25
|
+
const toolSet = new Set(config.toolSet ?? []);
|
|
26
|
+
registerBuiltinToolDefinitions(governor, toolSet);
|
|
27
|
+
const sessions = new Set();
|
|
28
|
+
let shutdown = false;
|
|
29
|
+
let staticAdapterClaimed = false;
|
|
30
|
+
function assertNotShutdown() {
|
|
31
|
+
if (shutdown) {
|
|
32
|
+
throw new Error("Runtime has been shut down");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function getAdapter() {
|
|
36
|
+
if (config.createAdapter) {
|
|
37
|
+
return config.createAdapter();
|
|
38
|
+
}
|
|
39
|
+
if (config.adapter) {
|
|
40
|
+
if (staticAdapterClaimed) {
|
|
41
|
+
throw new Error("AppRuntimeConfig.adapter can only back a single session. Use createAdapter() to provision a fresh adapter per session.");
|
|
42
|
+
}
|
|
43
|
+
staticAdapterClaimed = true;
|
|
44
|
+
return config.adapter;
|
|
45
|
+
}
|
|
46
|
+
throw new Error("No KernelSessionAdapter provided. Pass adapter for a single session or createAdapter for multi-session runtimes.");
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
get events() {
|
|
50
|
+
return globalBus;
|
|
51
|
+
},
|
|
52
|
+
get governor() {
|
|
53
|
+
return governor;
|
|
54
|
+
},
|
|
55
|
+
get planEngine() {
|
|
56
|
+
return planEngine;
|
|
57
|
+
},
|
|
58
|
+
createSession() {
|
|
59
|
+
assertNotShutdown();
|
|
60
|
+
const sessionId = { value: crypto.randomUUID() };
|
|
61
|
+
const state = (0, session_state_js_1.createInitialSessionState)(sessionId, config.model, toolSet);
|
|
62
|
+
const context = (0, runtime_context_js_1.createRuntimeContext)({
|
|
63
|
+
sessionId,
|
|
64
|
+
workingDirectory: config.workingDirectory,
|
|
65
|
+
agentDir: config.agentDir,
|
|
66
|
+
configSources: config.configSources,
|
|
67
|
+
mode: config.mode,
|
|
68
|
+
model: config.model,
|
|
69
|
+
toolSet,
|
|
70
|
+
});
|
|
71
|
+
const facade = new session_facade_js_1.SessionFacadeImpl(getAdapter(), state, context, globalBus, governor, planEngine);
|
|
72
|
+
// Emit session_created on the global bus
|
|
73
|
+
const event = (0, session_events_js_1.sessionCreated)(sessionId, config.model, [...toolSet]);
|
|
74
|
+
globalBus.emit(event);
|
|
75
|
+
sessions.add(facade);
|
|
76
|
+
return facade;
|
|
77
|
+
},
|
|
78
|
+
recoverSession(data) {
|
|
79
|
+
assertNotShutdown();
|
|
80
|
+
const state = (0, session_state_js_1.recoverSessionState)(data);
|
|
81
|
+
const context = (0, runtime_context_js_1.createRuntimeContext)({
|
|
82
|
+
sessionId: data.sessionId,
|
|
83
|
+
workingDirectory: config.workingDirectory,
|
|
84
|
+
agentDir: data.agentDir ?? config.agentDir,
|
|
85
|
+
configSources: config.configSources,
|
|
86
|
+
mode: config.mode,
|
|
87
|
+
model: data.model,
|
|
88
|
+
toolSet: new Set(data.toolSet),
|
|
89
|
+
});
|
|
90
|
+
const adapter = getAdapter();
|
|
91
|
+
// Tell the adapter about the recovery so it can restore its own state.
|
|
92
|
+
adapter.resume(data);
|
|
93
|
+
const facade = new session_facade_js_1.SessionFacadeImpl(adapter, state, context, globalBus, governor, planEngine);
|
|
94
|
+
// Emit session_resumed on the global bus
|
|
95
|
+
const event = (0, session_events_js_1.sessionResumed)(data.sessionId, data);
|
|
96
|
+
globalBus.emit(event);
|
|
97
|
+
sessions.add(facade);
|
|
98
|
+
return facade;
|
|
99
|
+
},
|
|
100
|
+
async shutdown() {
|
|
101
|
+
if (shutdown)
|
|
102
|
+
return;
|
|
103
|
+
shutdown = true;
|
|
104
|
+
// Close all active sessions
|
|
105
|
+
for (const session of sessions) {
|
|
106
|
+
try {
|
|
107
|
+
await session.close();
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Best-effort close during shutdown
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
sessions.clear();
|
|
114
|
+
globalBus.removeAllListeners();
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function registerBuiltinToolDefinitions(governor, toolSet) {
|
|
119
|
+
for (const toolName of toolSet) {
|
|
120
|
+
const definition = builtinToolDefinition(toolName);
|
|
121
|
+
if (definition && !governor.catalog.has(toolName)) {
|
|
122
|
+
governor.catalog.register(definition);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function builtinToolDefinition(toolName) {
|
|
127
|
+
switch (toolName) {
|
|
128
|
+
case "read":
|
|
129
|
+
return makeBuiltinToolDefinition("read", "file-read", "L0", true, "never", "unlimited", 30_000);
|
|
130
|
+
case "grep":
|
|
131
|
+
case "find":
|
|
132
|
+
case "ls":
|
|
133
|
+
return makeBuiltinToolDefinition(toolName, "file-read", "L0", true, "never", "unlimited", 30_000);
|
|
134
|
+
case "write":
|
|
135
|
+
return makeBuiltinToolDefinition("write", "file-mutation", "L1", false, "always", "per_target", 30_000);
|
|
136
|
+
case "edit":
|
|
137
|
+
return makeBuiltinToolDefinition("edit", "file-mutation", "L2", false, "on_write", "per_target", 30_000);
|
|
138
|
+
case "bash":
|
|
139
|
+
return makeBuiltinToolDefinition("bash", "command-execution", "L3", false, "always", "unlimited", 120_000);
|
|
140
|
+
default:
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function makeBuiltinToolDefinition(name, category, riskLevel, readOnly, confirmation, concurrency, timeoutMs) {
|
|
145
|
+
return {
|
|
146
|
+
identity: { name, category },
|
|
147
|
+
contract: {
|
|
148
|
+
parameterSchema: { type: "object", properties: {} },
|
|
149
|
+
output: { type: "text" },
|
|
150
|
+
errorTypes: [],
|
|
151
|
+
},
|
|
152
|
+
policy: {
|
|
153
|
+
riskLevel,
|
|
154
|
+
readOnly,
|
|
155
|
+
concurrency,
|
|
156
|
+
confirmation,
|
|
157
|
+
subAgentAllowed: true,
|
|
158
|
+
timeoutMs,
|
|
159
|
+
},
|
|
160
|
+
executorTag: name,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=create-app-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-app-runtime.js","sourceRoot":"","sources":["../src/create-app-runtime.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AA8EH,4CAuHC;AAhMD,wDAAuD;AAEvD,oEAAmE;AAEnE,8DAA6D;AAC7D,6DAA4D;AAC5D,mEAA6E;AAE7E,mEAAgE;AAChE,iEAA4F;AA4D5F,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAgB,gBAAgB,CAAC,MAAwB;IACxD,MAAM,SAAS,GAAG,IAAA,6BAAc,GAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAA,qCAAkB,GAAE,CAAC;IACtC,MAAM,UAAU,GAAG,IAAA,iCAAgB,GAAE,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC9C,8BAA8B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC1C,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,oBAAoB,GAAG,KAAK,CAAC;IAEjC,SAAS,iBAAiB;QACzB,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC/C,CAAC;IACF,CAAC;IAED,SAAS,UAAU;QAClB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,aAAa,EAAE,CAAC;QAC/B,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,oBAAoB,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CACd,wHAAwH,CACxH,CAAC;YACH,CAAC;YACD,oBAAoB,GAAG,IAAI,CAAC;YAC5B,OAAO,MAAM,CAAC,OAAO,CAAC;QACvB,CAAC;QAED,MAAM,IAAI,KAAK,CACd,kHAAkH,CAClH,CAAC;IACH,CAAC;IAED,OAAO;QACN,IAAI,MAAM;YACT,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,IAAI,QAAQ;YACX,OAAO,QAAQ,CAAC;QACjB,CAAC;QAED,IAAI,UAAU;YACb,OAAO,UAAU,CAAC;QACnB,CAAC;QAED,aAAa;YACZ,iBAAiB,EAAE,CAAC;YAEpB,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,IAAA,4CAAyB,EAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAG,IAAA,yCAAoB,EAAC;gBACpC,SAAS;gBACT,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;gBACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,OAAO;aACP,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,qCAAiB,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YAEpG,yCAAyC;YACzC,MAAM,KAAK,GAAG,IAAA,kCAAc,EAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YACpE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEtB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,MAAM,CAAC;QACf,CAAC;QAED,cAAc,CAAC,IAAyB;YACvC,iBAAiB,EAAE,CAAC;YAEpB,MAAM,KAAK,GAAG,IAAA,sCAAmB,EAAC,IAAI,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,IAAA,yCAAoB,EAAC;gBACpC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;gBACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ;gBAC1C,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;aAC9B,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAE7B,uEAAuE;YACvE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAErB,MAAM,MAAM,GAAG,IAAI,qCAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YAE/F,yCAAyC;YACzC,MAAM,KAAK,GAAG,IAAA,kCAAc,EAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACnD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEtB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,MAAM,CAAC;QACf,CAAC;QAED,KAAK,CAAC,QAAQ;YACb,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAEhB,4BAA4B;YAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACJ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBACvB,CAAC;gBAAC,MAAM,CAAC;oBACR,oCAAoC;gBACrC,CAAC;YACF,CAAC;YACD,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,SAAS,CAAC,kBAAkB,EAAE,CAAC;QAChC,CAAC;KACD,CAAC;AACH,CAAC;AAED,SAAS,8BAA8B,CAAC,QAAsB,EAAE,OAA4B;IAC3F,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,UAAU,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgB;IAC9C,QAAQ,QAAQ,EAAE,CAAC;QAClB,KAAK,MAAM;YACV,OAAO,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACjG,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,IAAI;YACR,OAAO,yBAAyB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACnG,KAAK,OAAO;YACX,OAAO,yBAAyB,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QACzG,KAAK,MAAM;YACV,OAAO,yBAAyB,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QAC1G,KAAK,MAAM;YACV,OAAO,yBAAyB,CAAC,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAC5G;YACC,OAAO,IAAI,CAAC;IACd,CAAC;AACF,CAAC;AAED,SAAS,yBAAyB,CACjC,IAAY,EACZ,QAAgB,EAChB,SAA2C,EAC3C,QAAiB,EACjB,YAA6C,EAC7C,WAAkD,EAClD,SAAiB;IAEjB,OAAO;QACN,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC5B,QAAQ,EAAE;YACT,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;YACnD,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACxB,UAAU,EAAE,EAAE;SACd;QACD,MAAM,EAAE;YACP,SAAS;YACT,QAAQ;YACR,WAAW;YACX,YAAY;YACZ,eAAe,EAAE,IAAI;YACrB,SAAS;SACT;QACD,WAAW,EAAE,IAAI;KACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { CliMode, CompactionSummary, ModelDescriptor, PlanStatus, PlanStep, PlanSummary, RuntimeContext, SessionId, SessionRecoveryData, SessionState, SessionStatus, TaskState, TaskStatus, ToolSetDescriptor, } from "../types/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,8CAA8C"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed event bus for the product-layer runtime.
|
|
3
|
+
*
|
|
4
|
+
* Enforces the RuntimeEvent contract: only standardized events can be emitted
|
|
5
|
+
* and consumed. No raw upstream events leak through.
|
|
6
|
+
*/
|
|
7
|
+
import type { RuntimeEvent } from "./runtime-event.js";
|
|
8
|
+
export type Unsubscribe = () => void;
|
|
9
|
+
export type EventListener<T extends RuntimeEvent = RuntimeEvent> = (event: T) => void;
|
|
10
|
+
export interface EventBus {
|
|
11
|
+
/** Emit a standardized event to all matching listeners. */
|
|
12
|
+
emit(event: RuntimeEvent): void;
|
|
13
|
+
/** Subscribe to events of a specific `type`. Returns an unsubscribe function. */
|
|
14
|
+
on(type: string, listener: EventListener): Unsubscribe;
|
|
15
|
+
/** Subscribe to all events of a given `category`. Returns an unsubscribe function. */
|
|
16
|
+
onCategory(category: string, listener: EventListener): Unsubscribe;
|
|
17
|
+
/** Remove a specific type-level listener. */
|
|
18
|
+
off(type: string, listener: EventListener): void;
|
|
19
|
+
/** Remove all listeners. */
|
|
20
|
+
removeAllListeners(): void;
|
|
21
|
+
onAny(listener: EventListener): Unsubscribe;
|
|
22
|
+
}
|
|
23
|
+
export declare function createEventBus(): EventBus;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Typed event bus for the product-layer runtime.
|
|
4
|
+
*
|
|
5
|
+
* Enforces the RuntimeEvent contract: only standardized events can be emitted
|
|
6
|
+
* and consumed. No raw upstream events leak through.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createEventBus = createEventBus;
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Implementation
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
function createEventBus() {
|
|
14
|
+
const typeListeners = new Map();
|
|
15
|
+
const categoryListeners = new Map();
|
|
16
|
+
const anyListeners = new Set();
|
|
17
|
+
return {
|
|
18
|
+
emit(event) {
|
|
19
|
+
for (const listener of anyListeners) {
|
|
20
|
+
listener(event);
|
|
21
|
+
}
|
|
22
|
+
const typed = typeListeners.get(event.type);
|
|
23
|
+
if (typed) {
|
|
24
|
+
for (const listener of typed) {
|
|
25
|
+
listener(event);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const categorized = categoryListeners.get(event.category);
|
|
29
|
+
if (categorized) {
|
|
30
|
+
for (const listener of categorized) {
|
|
31
|
+
listener(event);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
on(type, listener) {
|
|
36
|
+
let set = typeListeners.get(type);
|
|
37
|
+
if (!set) {
|
|
38
|
+
set = new Set();
|
|
39
|
+
typeListeners.set(type, set);
|
|
40
|
+
}
|
|
41
|
+
set.add(listener);
|
|
42
|
+
return () => {
|
|
43
|
+
set.delete(listener);
|
|
44
|
+
if (set.size === 0) {
|
|
45
|
+
typeListeners.delete(type);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
onCategory(category, listener) {
|
|
50
|
+
let set = categoryListeners.get(category);
|
|
51
|
+
if (!set) {
|
|
52
|
+
set = new Set();
|
|
53
|
+
categoryListeners.set(category, set);
|
|
54
|
+
}
|
|
55
|
+
set.add(listener);
|
|
56
|
+
return () => {
|
|
57
|
+
set.delete(listener);
|
|
58
|
+
if (set.size === 0) {
|
|
59
|
+
categoryListeners.delete(category);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
off(type, listener) {
|
|
64
|
+
const set = typeListeners.get(type);
|
|
65
|
+
if (set) {
|
|
66
|
+
set.delete(listener);
|
|
67
|
+
if (set.size === 0) {
|
|
68
|
+
typeListeners.delete(type);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
removeAllListeners() {
|
|
73
|
+
typeListeners.clear();
|
|
74
|
+
categoryListeners.clear();
|
|
75
|
+
anyListeners.clear();
|
|
76
|
+
},
|
|
77
|
+
onAny(listener) {
|
|
78
|
+
anyListeners.add(listener);
|
|
79
|
+
return () => {
|
|
80
|
+
anyListeners.delete(listener);
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/events/event-bus.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAkCH,wCAgFC;AApFD,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,SAAgB,cAAc;IAC7B,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8B,CAAC;IAC5D,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA8B,CAAC;IAChE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiB,CAAC;IAE9C,OAAO;QACN,IAAI,CAAC,KAAmB;YACvB,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;gBACrC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;YACD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,KAAK,EAAE,CAAC;gBACX,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;oBAC9B,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;YACF,CAAC;YAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1D,IAAI,WAAW,EAAE,CAAC;gBACjB,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;oBACpC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;YACF,CAAC;QACF,CAAC;QAED,EAAE,CAAC,IAAY,EAAE,QAAuB;YACvC,IAAI,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACV,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;gBAChB,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC9B,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAElB,OAAO,GAAG,EAAE;gBACX,GAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACtB,IAAI,GAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACrB,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;YACF,CAAC,CAAC;QACH,CAAC;QAED,UAAU,CAAC,QAAgB,EAAE,QAAuB;YACnD,IAAI,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;gBACV,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;gBAChB,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACtC,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAElB,OAAO,GAAG,EAAE;gBACX,GAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACtB,IAAI,GAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACrB,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACpC,CAAC;YACF,CAAC,CAAC;QACH,CAAC;QAED,GAAG,CAAC,IAAY,EAAE,QAAuB;YACxC,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,GAAG,EAAE,CAAC;gBACT,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACrB,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACpB,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;YACF,CAAC;QACF,CAAC;QAED,kBAAkB;YACjB,aAAa,CAAC,KAAK,EAAE,CAAC;YACtB,iBAAiB,CAAC,KAAK,EAAE,CAAC;YAC1B,YAAY,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;QAED,KAAK,CAAC,QAAuB;YAC5B,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC3B,OAAO,GAAG,EAAE;gBACX,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { EventBus, EventListener, Unsubscribe } from "./event-bus.js";
|
|
2
|
+
export { createEventBus } from "./event-bus.js";
|
|
3
|
+
export type { BaseEvent, CompactionCompletedEvent, CompactionEvent, CompactionStartedEvent, PermissionDecisionEvent, PermissionRequestedEvent, PermissionResolvedEvent, PlanCompletedEvent, PlanCreatedEvent, PlanProgressEvent, PlanStepCompletedEvent, PlanStepStartedEvent, RuntimeEvent, SessionClosedEvent, SessionClosingEvent, SessionCreatedEvent, SessionLifecycleEvent, SessionResumedEvent, SessionSuspendedEvent, TextDeltaEvent, TextStreamEvent, ThinkingDeltaEvent, ToolCompletedEvent, ToolDeniedEvent, ToolExecutionEvent, ToolStartedEvent, ToolUpdateEvent, } from "./runtime-event.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createEventBus = void 0;
|
|
4
|
+
var event_bus_js_1 = require("./event-bus.js");
|
|
5
|
+
Object.defineProperty(exports, "createEventBus", { enumerable: true, get: function () { return event_bus_js_1.createEventBus; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":";;;AACA,+CAAgD;AAAvC,8GAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standardized product-layer event taxonomy.
|
|
3
|
+
*
|
|
4
|
+
* All events consumed by UI, tools, and extensions must be one of these types.
|
|
5
|
+
* Raw upstream events from pi-mono are translated here by the EventNormalizer —
|
|
6
|
+
* they are never exposed directly.
|
|
7
|
+
*
|
|
8
|
+
* Events use a dual discriminant: `category` (broad area) and `type` (specific event).
|
|
9
|
+
* Consumers can filter at either granularity.
|
|
10
|
+
*/
|
|
11
|
+
import type { CompactionSummary, ModelDescriptor, PlanSummary, SessionId, SessionRecoveryData } from "../types/index.js";
|
|
12
|
+
/** Fields shared by every product-layer event. */
|
|
13
|
+
export interface BaseEvent {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly timestamp: number;
|
|
16
|
+
readonly sessionId: SessionId;
|
|
17
|
+
}
|
|
18
|
+
export interface SessionCreatedEvent extends BaseEvent {
|
|
19
|
+
readonly category: "session";
|
|
20
|
+
readonly type: "session_created";
|
|
21
|
+
readonly model: ModelDescriptor;
|
|
22
|
+
readonly toolSet: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
export interface SessionResumedEvent extends BaseEvent {
|
|
25
|
+
readonly category: "session";
|
|
26
|
+
readonly type: "session_resumed";
|
|
27
|
+
readonly recoveryData: SessionRecoveryData;
|
|
28
|
+
}
|
|
29
|
+
export interface SessionSuspendedEvent extends BaseEvent {
|
|
30
|
+
readonly category: "session";
|
|
31
|
+
readonly type: "session_suspended";
|
|
32
|
+
}
|
|
33
|
+
export interface SessionClosingEvent extends BaseEvent {
|
|
34
|
+
readonly category: "session";
|
|
35
|
+
readonly type: "session_closing";
|
|
36
|
+
}
|
|
37
|
+
export interface SessionClosedEvent extends BaseEvent {
|
|
38
|
+
readonly category: "session";
|
|
39
|
+
readonly type: "session_closed";
|
|
40
|
+
readonly recoveryData: SessionRecoveryData;
|
|
41
|
+
}
|
|
42
|
+
export type SessionLifecycleEvent = SessionCreatedEvent | SessionResumedEvent | SessionSuspendedEvent | SessionClosingEvent | SessionClosedEvent;
|
|
43
|
+
export interface ToolStartedEvent extends BaseEvent {
|
|
44
|
+
readonly category: "tool";
|
|
45
|
+
readonly type: "tool_started";
|
|
46
|
+
readonly toolName: string;
|
|
47
|
+
readonly toolCallId: string;
|
|
48
|
+
readonly parameters: Readonly<Record<string, unknown>>;
|
|
49
|
+
}
|
|
50
|
+
export interface ToolUpdateEvent extends BaseEvent {
|
|
51
|
+
readonly category: "tool";
|
|
52
|
+
readonly type: "tool_update";
|
|
53
|
+
readonly toolName: string;
|
|
54
|
+
readonly toolCallId: string;
|
|
55
|
+
readonly update: string;
|
|
56
|
+
}
|
|
57
|
+
export interface ToolCompletedEvent extends BaseEvent {
|
|
58
|
+
readonly category: "tool";
|
|
59
|
+
readonly type: "tool_completed";
|
|
60
|
+
readonly toolName: string;
|
|
61
|
+
readonly toolCallId: string;
|
|
62
|
+
readonly status: "success" | "failure";
|
|
63
|
+
readonly result?: string;
|
|
64
|
+
readonly durationMs: number;
|
|
65
|
+
}
|
|
66
|
+
export interface ToolDeniedEvent extends BaseEvent {
|
|
67
|
+
readonly category: "tool";
|
|
68
|
+
readonly type: "tool_denied";
|
|
69
|
+
readonly toolName: string;
|
|
70
|
+
readonly toolCallId: string;
|
|
71
|
+
readonly reason: string;
|
|
72
|
+
}
|
|
73
|
+
export type ToolExecutionEvent = ToolStartedEvent | ToolUpdateEvent | ToolCompletedEvent | ToolDeniedEvent;
|
|
74
|
+
export interface PlanCreatedEvent extends BaseEvent {
|
|
75
|
+
readonly category: "plan";
|
|
76
|
+
readonly type: "plan_created";
|
|
77
|
+
readonly planId: string;
|
|
78
|
+
readonly goal: string;
|
|
79
|
+
readonly stepCount: number;
|
|
80
|
+
}
|
|
81
|
+
export interface PlanStepStartedEvent extends BaseEvent {
|
|
82
|
+
readonly category: "plan";
|
|
83
|
+
readonly type: "plan_step_started";
|
|
84
|
+
readonly planId: string;
|
|
85
|
+
readonly stepId: string;
|
|
86
|
+
readonly stepDescription: string;
|
|
87
|
+
}
|
|
88
|
+
export interface PlanStepCompletedEvent extends BaseEvent {
|
|
89
|
+
readonly category: "plan";
|
|
90
|
+
readonly type: "plan_step_completed";
|
|
91
|
+
readonly planId: string;
|
|
92
|
+
readonly stepId: string;
|
|
93
|
+
readonly success: boolean;
|
|
94
|
+
}
|
|
95
|
+
export interface PlanStepFailedEvent extends BaseEvent {
|
|
96
|
+
readonly category: "plan";
|
|
97
|
+
readonly type: "plan_step_failed";
|
|
98
|
+
readonly planId: string;
|
|
99
|
+
readonly stepId: string;
|
|
100
|
+
readonly reason: string;
|
|
101
|
+
readonly reworkScheduled: boolean;
|
|
102
|
+
}
|
|
103
|
+
export interface PlanReworkEvent extends BaseEvent {
|
|
104
|
+
readonly category: "plan";
|
|
105
|
+
readonly type: "plan_rework";
|
|
106
|
+
readonly planId: string;
|
|
107
|
+
readonly stepId: string;
|
|
108
|
+
readonly reworkAttempt: number;
|
|
109
|
+
readonly focusAreas: readonly string[];
|
|
110
|
+
}
|
|
111
|
+
export interface PlanCompletedEvent extends BaseEvent {
|
|
112
|
+
readonly category: "plan";
|
|
113
|
+
readonly type: "plan_completed";
|
|
114
|
+
readonly planId: string;
|
|
115
|
+
readonly goal: string;
|
|
116
|
+
readonly success: boolean;
|
|
117
|
+
readonly summary: PlanSummary;
|
|
118
|
+
}
|
|
119
|
+
export type PlanProgressEvent = PlanCreatedEvent | PlanStepStartedEvent | PlanStepCompletedEvent | PlanStepFailedEvent | PlanReworkEvent | PlanCompletedEvent;
|
|
120
|
+
export interface CompactionStartedEvent extends BaseEvent {
|
|
121
|
+
readonly category: "compaction";
|
|
122
|
+
readonly type: "compaction_started";
|
|
123
|
+
}
|
|
124
|
+
export interface CompactionCompletedEvent extends BaseEvent {
|
|
125
|
+
readonly category: "compaction";
|
|
126
|
+
readonly type: "compaction_completed";
|
|
127
|
+
readonly summary: CompactionSummary;
|
|
128
|
+
}
|
|
129
|
+
export type CompactionEvent = CompactionStartedEvent | CompactionCompletedEvent;
|
|
130
|
+
export interface PermissionRequestedEvent extends BaseEvent {
|
|
131
|
+
readonly category: "permission";
|
|
132
|
+
readonly type: "permission_requested";
|
|
133
|
+
readonly toolName: string;
|
|
134
|
+
readonly toolCallId: string;
|
|
135
|
+
readonly riskLevel: string;
|
|
136
|
+
readonly reason?: string;
|
|
137
|
+
readonly targetPath?: string;
|
|
138
|
+
}
|
|
139
|
+
export interface PermissionResolvedEvent extends BaseEvent {
|
|
140
|
+
readonly category: "permission";
|
|
141
|
+
readonly type: "permission_resolved";
|
|
142
|
+
readonly toolName: string;
|
|
143
|
+
readonly toolCallId: string;
|
|
144
|
+
readonly decision: "allow" | "allow_for_session" | "allow_once" | "deny";
|
|
145
|
+
}
|
|
146
|
+
export type PermissionDecisionEvent = PermissionRequestedEvent | PermissionResolvedEvent;
|
|
147
|
+
export interface TextDeltaEvent extends BaseEvent {
|
|
148
|
+
readonly category: "text";
|
|
149
|
+
readonly type: "text_delta";
|
|
150
|
+
readonly content: string;
|
|
151
|
+
}
|
|
152
|
+
export interface ThinkingDeltaEvent extends BaseEvent {
|
|
153
|
+
readonly category: "text";
|
|
154
|
+
readonly type: "thinking_delta";
|
|
155
|
+
readonly content: string;
|
|
156
|
+
}
|
|
157
|
+
export type TextStreamEvent = TextDeltaEvent | ThinkingDeltaEvent;
|
|
158
|
+
export type RuntimeEvent = SessionLifecycleEvent | ToolExecutionEvent | PlanProgressEvent | CompactionEvent | PermissionDecisionEvent | TextStreamEvent;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Standardized product-layer event taxonomy.
|
|
4
|
+
*
|
|
5
|
+
* All events consumed by UI, tools, and extensions must be one of these types.
|
|
6
|
+
* Raw upstream events from pi-mono are translated here by the EventNormalizer —
|
|
7
|
+
* they are never exposed directly.
|
|
8
|
+
*
|
|
9
|
+
* Events use a dual discriminant: `category` (broad area) and `type` (specific event).
|
|
10
|
+
* Consumers can filter at either granularity.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
//# sourceMappingURL=runtime-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-event.js","sourceRoot":"","sources":["../../src/events/runtime-event.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ToolGovernor — the runtime integration point for tool governance.
|
|
3
|
+
*
|
|
4
|
+
* Wraps ToolCatalog, PermissionEngine, MutationQueue, and AuditLog into a
|
|
5
|
+
* single object that the SessionFacade uses to enforce governance on every
|
|
6
|
+
* tool execution event. The governor is created once per AppRuntime and
|
|
7
|
+
* shared across all sessions.
|
|
8
|
+
*
|
|
9
|
+
* Lifecycle:
|
|
10
|
+
* 1. beforeExecution() — called when a tool_starts event arrives
|
|
11
|
+
* 2. afterExecution() — called when a tool_completed event arrives
|
|
12
|
+
* 3. recordSessionApproval() — called when user grants session approval
|
|
13
|
+
*/
|
|
14
|
+
import type { ApprovalCacheEntry, AuditLog, MutationQueue, PermissionEngine, RiskLevel, ToolCatalog } from "@pickle-pee/tools";
|
|
15
|
+
/** Input for a pre-execution governance check. */
|
|
16
|
+
export interface ToolExecutionContext {
|
|
17
|
+
readonly sessionId: string;
|
|
18
|
+
readonly toolName: string;
|
|
19
|
+
readonly toolCallId: string;
|
|
20
|
+
readonly workingDirectory: string;
|
|
21
|
+
readonly sessionMode: string;
|
|
22
|
+
readonly isSubAgent: boolean;
|
|
23
|
+
readonly targetPath?: string;
|
|
24
|
+
readonly commandDigest?: string;
|
|
25
|
+
readonly parameters?: Readonly<Record<string, unknown>>;
|
|
26
|
+
}
|
|
27
|
+
/** Input for a post-execution governance record. */
|
|
28
|
+
export interface ToolExecutionResult {
|
|
29
|
+
readonly toolName: string;
|
|
30
|
+
readonly toolCallId: string;
|
|
31
|
+
readonly status: "success" | "failure";
|
|
32
|
+
readonly targetPath?: string;
|
|
33
|
+
readonly durationMs?: number;
|
|
34
|
+
}
|
|
35
|
+
/** Outcome of a pre-execution governance check. */
|
|
36
|
+
export type GovernorDecision = {
|
|
37
|
+
readonly type: "allow";
|
|
38
|
+
} | {
|
|
39
|
+
readonly type: "deny";
|
|
40
|
+
readonly reason: string;
|
|
41
|
+
readonly riskLevel: RiskLevel;
|
|
42
|
+
} | {
|
|
43
|
+
readonly type: "ask_user";
|
|
44
|
+
readonly reason: string;
|
|
45
|
+
readonly riskLevel: RiskLevel;
|
|
46
|
+
};
|
|
47
|
+
export interface ToolGovernor {
|
|
48
|
+
/** Check whether a tool invocation is permitted before execution. */
|
|
49
|
+
beforeExecution(context: ToolExecutionContext): GovernorDecision;
|
|
50
|
+
/** Record the outcome of a tool invocation after execution. */
|
|
51
|
+
afterExecution(result: ToolExecutionResult): void;
|
|
52
|
+
/** Record a session-scoped user approval. */
|
|
53
|
+
recordSessionApproval(entry: ApprovalCacheEntry): void;
|
|
54
|
+
/** Tool catalog — callers may register tools or query definitions. */
|
|
55
|
+
readonly catalog: ToolCatalog;
|
|
56
|
+
/** Permission engine — direct access for advanced use. */
|
|
57
|
+
readonly permissions: PermissionEngine;
|
|
58
|
+
/** Mutation queue — direct access for advanced use. */
|
|
59
|
+
readonly mutations: MutationQueue;
|
|
60
|
+
/** Audit log — query past tool invocations. */
|
|
61
|
+
readonly audit: AuditLog;
|
|
62
|
+
}
|
|
63
|
+
export declare function createToolGovernor(): ToolGovernor;
|