@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.
Files changed (149) hide show
  1. package/README.md +99 -0
  2. package/dist/adapters/index.d.ts +3 -0
  3. package/dist/adapters/index.js +10 -0
  4. package/dist/adapters/index.js.map +1 -0
  5. package/dist/adapters/kernel-session-adapter.d.ts +73 -0
  6. package/dist/adapters/kernel-session-adapter.js +10 -0
  7. package/dist/adapters/kernel-session-adapter.js.map +1 -0
  8. package/dist/adapters/pi-mono-event-bridge.d.ts +54 -0
  9. package/dist/adapters/pi-mono-event-bridge.js +159 -0
  10. package/dist/adapters/pi-mono-event-bridge.js.map +1 -0
  11. package/dist/adapters/pi-mono-session-adapter.d.ts +75 -0
  12. package/dist/adapters/pi-mono-session-adapter.js +490 -0
  13. package/dist/adapters/pi-mono-session-adapter.js.map +1 -0
  14. package/dist/create-app-runtime.d.ts +52 -0
  15. package/dist/create-app-runtime.js +163 -0
  16. package/dist/create-app-runtime.js.map +1 -0
  17. package/dist/domain/index.d.ts +1 -0
  18. package/dist/domain/index.js +5 -0
  19. package/dist/domain/index.js.map +1 -0
  20. package/dist/events/event-bus.d.ts +23 -0
  21. package/dist/events/event-bus.js +85 -0
  22. package/dist/events/event-bus.js.map +1 -0
  23. package/dist/events/index.d.ts +3 -0
  24. package/dist/events/index.js +6 -0
  25. package/dist/events/index.js.map +1 -0
  26. package/dist/events/runtime-event.d.ts +158 -0
  27. package/dist/events/runtime-event.js +13 -0
  28. package/dist/events/runtime-event.js.map +1 -0
  29. package/dist/governance/tool-governor.d.ts +63 -0
  30. package/dist/governance/tool-governor.js +639 -0
  31. package/dist/governance/tool-governor.js.map +1 -0
  32. package/dist/index.d.ts +33 -0
  33. package/dist/index.js +76 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/planning/index.d.ts +6 -0
  36. package/dist/planning/index.js +16 -0
  37. package/dist/planning/index.js.map +1 -0
  38. package/dist/planning/plan-engine.d.ts +49 -0
  39. package/dist/planning/plan-engine.js +174 -0
  40. package/dist/planning/plan-engine.js.map +1 -0
  41. package/dist/planning/plan-events.d.ts +14 -0
  42. package/dist/planning/plan-events.js +94 -0
  43. package/dist/planning/plan-events.js.map +1 -0
  44. package/dist/planning/plan-orchestrator.d.ts +56 -0
  45. package/dist/planning/plan-orchestrator.js +167 -0
  46. package/dist/planning/plan-orchestrator.js.map +1 -0
  47. package/dist/planning/plan-types.d.ts +36 -0
  48. package/dist/planning/plan-types.js +9 -0
  49. package/dist/planning/plan-types.js.map +1 -0
  50. package/dist/runtime-context.d.ts +21 -0
  51. package/dist/runtime-context.js +37 -0
  52. package/dist/runtime-context.js.map +1 -0
  53. package/dist/services/event-normalizer.d.ts +22 -0
  54. package/dist/services/event-normalizer.js +162 -0
  55. package/dist/services/event-normalizer.js.map +1 -0
  56. package/dist/services/index.d.ts +1 -0
  57. package/dist/services/index.js +7 -0
  58. package/dist/services/index.js.map +1 -0
  59. package/dist/session/session-events.d.ts +11 -0
  60. package/dist/session/session-events.js +52 -0
  61. package/dist/session/session-events.js.map +1 -0
  62. package/dist/session/session-facade.d.ts +88 -0
  63. package/dist/session/session-facade.js +439 -0
  64. package/dist/session/session-facade.js.map +1 -0
  65. package/dist/session/session-state.d.ts +14 -0
  66. package/dist/session/session-state.js +75 -0
  67. package/dist/session/session-state.js.map +1 -0
  68. package/dist/subagent/aggregation.d.ts +25 -0
  69. package/dist/subagent/aggregation.js +124 -0
  70. package/dist/subagent/aggregation.js.map +1 -0
  71. package/dist/subagent/index.d.ts +10 -0
  72. package/dist/subagent/index.js +29 -0
  73. package/dist/subagent/index.js.map +1 -0
  74. package/dist/subagent/path-scope.d.ts +24 -0
  75. package/dist/subagent/path-scope.js +86 -0
  76. package/dist/subagent/path-scope.js.map +1 -0
  77. package/dist/subagent/result-types.d.ts +61 -0
  78. package/dist/subagent/result-types.js +9 -0
  79. package/dist/subagent/result-types.js.map +1 -0
  80. package/dist/subagent/stop-condition.d.ts +34 -0
  81. package/dist/subagent/stop-condition.js +76 -0
  82. package/dist/subagent/stop-condition.js.map +1 -0
  83. package/dist/subagent/task-types.d.ts +48 -0
  84. package/dist/subagent/task-types.js +10 -0
  85. package/dist/subagent/task-types.js.map +1 -0
  86. package/dist/subagent/task-validator.d.ts +22 -0
  87. package/dist/subagent/task-validator.js +79 -0
  88. package/dist/subagent/task-validator.js.map +1 -0
  89. package/dist/subagent/verification.d.ts +22 -0
  90. package/dist/subagent/verification.js +55 -0
  91. package/dist/subagent/verification.js.map +1 -0
  92. package/dist/test/aggregation.test.d.ts +1 -0
  93. package/dist/test/aggregation.test.js +201 -0
  94. package/dist/test/aggregation.test.js.map +1 -0
  95. package/dist/test/create-app-runtime.test.d.ts +1 -0
  96. package/dist/test/create-app-runtime.test.js +286 -0
  97. package/dist/test/create-app-runtime.test.js.map +1 -0
  98. package/dist/test/event-bus.test.d.ts +1 -0
  99. package/dist/test/event-bus.test.js +81 -0
  100. package/dist/test/event-bus.test.js.map +1 -0
  101. package/dist/test/event-normalizer.test.d.ts +1 -0
  102. package/dist/test/event-normalizer.test.js +143 -0
  103. package/dist/test/event-normalizer.test.js.map +1 -0
  104. package/dist/test/path-scope.test.d.ts +1 -0
  105. package/dist/test/path-scope.test.js +71 -0
  106. package/dist/test/path-scope.test.js.map +1 -0
  107. package/dist/test/pi-mono-event-bridge.test.d.ts +1 -0
  108. package/dist/test/pi-mono-event-bridge.test.js +125 -0
  109. package/dist/test/pi-mono-event-bridge.test.js.map +1 -0
  110. package/dist/test/pi-mono-live.test.d.ts +1 -0
  111. package/dist/test/pi-mono-live.test.js +289 -0
  112. package/dist/test/pi-mono-live.test.js.map +1 -0
  113. package/dist/test/pi-mono-session-adapter.test.d.ts +1 -0
  114. package/dist/test/pi-mono-session-adapter.test.js +260 -0
  115. package/dist/test/pi-mono-session-adapter.test.js.map +1 -0
  116. package/dist/test/plan-engine.test.d.ts +1 -0
  117. package/dist/test/plan-engine.test.js +235 -0
  118. package/dist/test/plan-engine.test.js.map +1 -0
  119. package/dist/test/plan-events.test.d.ts +1 -0
  120. package/dist/test/plan-events.test.js +81 -0
  121. package/dist/test/plan-events.test.js.map +1 -0
  122. package/dist/test/plan-orchestrator.test.d.ts +1 -0
  123. package/dist/test/plan-orchestrator.test.js +324 -0
  124. package/dist/test/plan-orchestrator.test.js.map +1 -0
  125. package/dist/test/runtime-context.test.d.ts +1 -0
  126. package/dist/test/runtime-context.test.js +70 -0
  127. package/dist/test/runtime-context.test.js.map +1 -0
  128. package/dist/test/session-facade.test.d.ts +1 -0
  129. package/dist/test/session-facade.test.js +1011 -0
  130. package/dist/test/session-facade.test.js.map +1 -0
  131. package/dist/test/session-state.test.d.ts +1 -0
  132. package/dist/test/session-state.test.js +118 -0
  133. package/dist/test/session-state.test.js.map +1 -0
  134. package/dist/test/stop-condition.test.d.ts +1 -0
  135. package/dist/test/stop-condition.test.js +105 -0
  136. package/dist/test/stop-condition.test.js.map +1 -0
  137. package/dist/test/stubs/stub-kernel-session-adapter.d.ts +45 -0
  138. package/dist/test/stubs/stub-kernel-session-adapter.js +186 -0
  139. package/dist/test/stubs/stub-kernel-session-adapter.js.map +1 -0
  140. package/dist/test/task-validator.test.d.ts +1 -0
  141. package/dist/test/task-validator.test.js +97 -0
  142. package/dist/test/task-validator.test.js.map +1 -0
  143. package/dist/test/tool-governor.test.d.ts +1 -0
  144. package/dist/test/tool-governor.test.js +379 -0
  145. package/dist/test/tool-governor.test.js.map +1 -0
  146. package/dist/types/index.d.ts +77 -0
  147. package/dist/types/index.js +9 -0
  148. package/dist/types/index.js.map +1 -0
  149. package/package.json +28 -0
@@ -0,0 +1,88 @@
1
+ /**
2
+ * SessionFacade — the primary interface for interacting with a session.
3
+ *
4
+ * Wraps a KernelSessionAdapter, normalizes all upstream events through
5
+ * EventNormalizer, and exposes only product-layer RuntimeEvents.
6
+ * State transitions are tracked and broadcast to listeners.
7
+ *
8
+ * Core principle: raw upstream events are NEVER exposed.
9
+ */
10
+ import type { KernelSessionAdapter } from "../adapters/kernel-session-adapter.js";
11
+ import type { EventBus, Unsubscribe } from "../events/event-bus.js";
12
+ import type { ToolGovernor } from "../governance/tool-governor.js";
13
+ import type { PlanEngine } from "../planning/plan-engine.js";
14
+ import type { PlanOrchestrator } from "../planning/plan-orchestrator.js";
15
+ import type { RuntimeContext, SessionId, SessionState } from "../types/index.js";
16
+ export interface SessionFacade {
17
+ /** Session identifier. */
18
+ readonly id: SessionId;
19
+ /** Current session state snapshot. */
20
+ readonly state: SessionState;
21
+ /** Execution context for this session. */
22
+ readonly context: RuntimeContext;
23
+ /** Session-scoped event bus (standardized events only). */
24
+ readonly events: EventBus;
25
+ /** Send a user prompt through the session. */
26
+ prompt(input: string): Promise<void>;
27
+ /** Continue an existing conversation turn. */
28
+ continue(input: string): Promise<void>;
29
+ /** Abort the current streaming response. */
30
+ abort(): void;
31
+ /** Gracefully close the session, persisting state. */
32
+ close(): Promise<void>;
33
+ /** Resolve a pending permission request. */
34
+ resolvePermission(callId: string, decision: "allow" | "allow_for_session" | "allow_once" | "deny"): Promise<void>;
35
+ /** Subscribe to state changes. */
36
+ onStateChange(listener: (state: SessionState) => void): Unsubscribe;
37
+ /** Plan orchestrator — manage plans, enforce safety checks. Null if no plan engine provided. */
38
+ readonly plan: PlanOrchestrator | null;
39
+ /** Manual context compaction. Requires adapter support. */
40
+ compact(options?: {
41
+ readonly customInstructions?: string;
42
+ }): Promise<void>;
43
+ }
44
+ export declare class SessionFacadeImpl implements SessionFacade {
45
+ private _state;
46
+ private _context;
47
+ private readonly _events;
48
+ private readonly _adapter;
49
+ private readonly _globalBus;
50
+ private readonly _normalizer;
51
+ private readonly _governor;
52
+ private readonly _plan;
53
+ private readonly _usesAdapterGovernanceHook;
54
+ private readonly _stateListeners;
55
+ private readonly _pendingPermissions;
56
+ private readonly _bufferedToolExecutions;
57
+ private readonly _deniedToolCalls;
58
+ private _closed;
59
+ private _running;
60
+ constructor(adapter: KernelSessionAdapter, initialState: SessionState, context: RuntimeContext, globalBus: EventBus, governor?: ToolGovernor, planEngine?: PlanEngine);
61
+ get id(): SessionId;
62
+ get state(): SessionState;
63
+ get context(): RuntimeContext;
64
+ get events(): EventBus;
65
+ get plan(): PlanOrchestrator | null;
66
+ compact(options?: {
67
+ readonly customInstructions?: string;
68
+ }): Promise<void>;
69
+ prompt(input: string): Promise<void>;
70
+ continue(input: string): Promise<void>;
71
+ abort(): void;
72
+ close(): Promise<void>;
73
+ onStateChange(listener: (state: SessionState) => void): Unsubscribe;
74
+ resolvePermission(callId: string, decision: "allow" | "allow_for_session" | "allow_once" | "deny"): Promise<void>;
75
+ private processRawEvent;
76
+ private installAdapterGovernanceHook;
77
+ /**
78
+ * Apply governance rules to tool events.
79
+ */
80
+ private applyGovernance;
81
+ private emitRuntimeEvent;
82
+ private flushBufferedToolExecution;
83
+ private handleStateUpdate;
84
+ private transitionTask;
85
+ private notifyStateChange;
86
+ private assertOpen;
87
+ private assertNotRunning;
88
+ }
@@ -0,0 +1,439 @@
1
+ "use strict";
2
+ /**
3
+ * SessionFacade — the primary interface for interacting with a session.
4
+ *
5
+ * Wraps a KernelSessionAdapter, normalizes all upstream events through
6
+ * EventNormalizer, and exposes only product-layer RuntimeEvents.
7
+ * State transitions are tracked and broadcast to listeners.
8
+ *
9
+ * Core principle: raw upstream events are NEVER exposed.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SessionFacadeImpl = void 0;
13
+ const node_crypto_1 = require("node:crypto");
14
+ const node_path_1 = require("node:path");
15
+ const event_bus_js_1 = require("../events/event-bus.js");
16
+ const plan_orchestrator_js_1 = require("../planning/plan-orchestrator.js");
17
+ const runtime_context_js_1 = require("../runtime-context.js");
18
+ const event_normalizer_js_1 = require("../services/event-normalizer.js");
19
+ const session_events_js_1 = require("./session-events.js");
20
+ const session_state_js_1 = require("./session-state.js");
21
+ // ---------------------------------------------------------------------------
22
+ // Implementation
23
+ // ---------------------------------------------------------------------------
24
+ class SessionFacadeImpl {
25
+ _state;
26
+ _context;
27
+ _events;
28
+ _adapter;
29
+ _globalBus;
30
+ _normalizer;
31
+ _governor;
32
+ _plan;
33
+ _usesAdapterGovernanceHook;
34
+ _stateListeners = new Set();
35
+ _pendingPermissions = new Map();
36
+ _bufferedToolExecutions = new Map();
37
+ _deniedToolCalls = new Set();
38
+ _closed = false;
39
+ _running = false;
40
+ constructor(adapter, initialState, context, globalBus, governor, planEngine) {
41
+ this._adapter = adapter;
42
+ this._state = initialState;
43
+ this._context = context;
44
+ this._events = (0, event_bus_js_1.createEventBus)();
45
+ this._globalBus = globalBus;
46
+ this._normalizer = new event_normalizer_js_1.EventNormalizer(initialState.id);
47
+ this._governor = governor ?? null;
48
+ this._usesAdapterGovernanceHook = this.installAdapterGovernanceHook();
49
+ // Plan orchestration
50
+ if (planEngine) {
51
+ this._plan = (0, plan_orchestrator_js_1.createPlanOrchestrator)(planEngine, this._events, this._globalBus, initialState.id);
52
+ this._events.onCategory("plan", () => {
53
+ const summary = this._plan.summarize();
54
+ if (summary) {
55
+ this._state = (0, session_state_js_1.updatePlanSummary)(this._state, summary);
56
+ this.notifyStateChange();
57
+ }
58
+ });
59
+ }
60
+ else {
61
+ this._plan = null;
62
+ }
63
+ // Transition from creating/recovering → active
64
+ this._state = (0, session_state_js_1.updateSessionStatus)(this._state, "active");
65
+ }
66
+ get id() {
67
+ return this._state.id;
68
+ }
69
+ get state() {
70
+ return this._state;
71
+ }
72
+ get context() {
73
+ return this._context;
74
+ }
75
+ get events() {
76
+ return this._events;
77
+ }
78
+ get plan() {
79
+ return this._plan;
80
+ }
81
+ async compact(options) {
82
+ this.assertOpen();
83
+ this.assertNotRunning();
84
+ this._running = true;
85
+ this.transitionTask({ status: "running", currentTaskId: "compact", startedAt: Date.now() });
86
+ try {
87
+ if (!this._adapter.sendCompact) {
88
+ throw new Error("Adapter does not support compaction");
89
+ }
90
+ const stream = this._adapter.sendCompact(options?.customInstructions);
91
+ for await (const raw of stream) {
92
+ this.processRawEvent(raw);
93
+ }
94
+ }
95
+ finally {
96
+ this.transitionTask({ status: "idle", currentTaskId: null, startedAt: null });
97
+ this._running = false;
98
+ }
99
+ }
100
+ async prompt(input) {
101
+ this.assertOpen();
102
+ this.assertNotRunning();
103
+ this._running = true;
104
+ this.transitionTask({ status: "running", currentTaskId: null, startedAt: Date.now() });
105
+ try {
106
+ const stream = this._adapter.sendPrompt(input);
107
+ for await (const raw of stream) {
108
+ this.processRawEvent(raw);
109
+ }
110
+ }
111
+ finally {
112
+ this.transitionTask({ status: "idle", currentTaskId: null, startedAt: null });
113
+ this._running = false;
114
+ }
115
+ }
116
+ async continue(input) {
117
+ this.assertOpen();
118
+ this.assertNotRunning();
119
+ this._running = true;
120
+ this.transitionTask({ status: "running", currentTaskId: null, startedAt: Date.now() });
121
+ try {
122
+ const stream = this._adapter.sendContinue(input);
123
+ for await (const raw of stream) {
124
+ this.processRawEvent(raw);
125
+ }
126
+ }
127
+ finally {
128
+ this.transitionTask({ status: "idle", currentTaskId: null, startedAt: null });
129
+ this._running = false;
130
+ }
131
+ }
132
+ abort() {
133
+ this.assertOpen();
134
+ if (!this._running) {
135
+ return;
136
+ }
137
+ // Keep the running lock until the active stream actually settles.
138
+ this._adapter.abort();
139
+ }
140
+ async close() {
141
+ if (this._closed)
142
+ return;
143
+ this._closed = true;
144
+ this._state = (0, session_state_js_1.updateSessionStatus)(this._state, "closing");
145
+ this.notifyStateChange();
146
+ await this._adapter.close();
147
+ const closedEvent = (0, session_events_js_1.sessionClosed)(this._state.id, this._adapter.getRecoveryData());
148
+ this._events.emit(closedEvent);
149
+ this._globalBus.emit(closedEvent);
150
+ this._state = (0, session_state_js_1.updateSessionStatus)(this._state, "closed");
151
+ this.notifyStateChange();
152
+ this._events.removeAllListeners();
153
+ this._stateListeners.clear();
154
+ }
155
+ onStateChange(listener) {
156
+ this._stateListeners.add(listener);
157
+ return () => {
158
+ this._stateListeners.delete(listener);
159
+ };
160
+ }
161
+ async resolvePermission(callId, decision) {
162
+ this.assertOpen();
163
+ const pending = this._pendingPermissions.get(callId);
164
+ if (!pending) {
165
+ throw new Error(`No pending permission request for tool call: ${callId}`);
166
+ }
167
+ const resolvedEvent = {
168
+ id: (0, session_events_js_1.generateEventId)(),
169
+ timestamp: Date.now(),
170
+ sessionId: this._state.id,
171
+ category: "permission",
172
+ type: "permission_resolved",
173
+ toolName: pending.toolName,
174
+ toolCallId: callId,
175
+ decision,
176
+ };
177
+ this.emitRuntimeEvent(resolvedEvent);
178
+ if (decision === "allow_for_session" && this._governor) {
179
+ this._governor.recordSessionApproval({
180
+ sessionId: this._state.id.value,
181
+ toolName: pending.toolName,
182
+ riskLevel: pending.riskLevel,
183
+ targetPattern: computeSessionApprovalTargetPattern(pending.toolName, pending.targetPath, this._context.workingDirectory),
184
+ commandDigest: pending.commandDigest,
185
+ verdict: "allow_for_session",
186
+ grantedAt: Date.now(),
187
+ });
188
+ }
189
+ this._pendingPermissions.delete(callId);
190
+ if (typeof this._adapter.resolveToolPermission === "function") {
191
+ await this._adapter.resolveToolPermission(callId, decision);
192
+ }
193
+ this.flushBufferedToolExecution(callId, decision);
194
+ }
195
+ // -----------------------------------------------------------------------
196
+ // Internal helpers
197
+ // -----------------------------------------------------------------------
198
+ processRawEvent(raw) {
199
+ const normalized = this._normalizer.normalize(raw);
200
+ if (normalized === null)
201
+ return; // Drop unrecognized events
202
+ // Fallback governance interception for adapters that cannot pre-gate tools.
203
+ if (this._governor && !this._usesAdapterGovernanceHook && normalized.category === "tool") {
204
+ const governed = this.applyGovernance(normalized);
205
+ if (governed !== null) {
206
+ this.emitRuntimeEvent(governed);
207
+ }
208
+ return;
209
+ }
210
+ this.emitRuntimeEvent(normalized);
211
+ }
212
+ installAdapterGovernanceHook() {
213
+ if (!this._governor || typeof this._adapter.setToolExecutionGate !== "function") {
214
+ return false;
215
+ }
216
+ this._adapter.setToolExecutionGate({
217
+ beforeToolExecution: ({ toolName, toolCallId, parameters }) => {
218
+ const targetPath = extractTargetPath(parameters);
219
+ const decision = this._governor.beforeExecution({
220
+ sessionId: this._state.id.value,
221
+ toolName,
222
+ toolCallId,
223
+ workingDirectory: this._context.workingDirectory,
224
+ sessionMode: this._context.mode,
225
+ isSubAgent: false,
226
+ targetPath,
227
+ parameters,
228
+ });
229
+ if (decision.type === "allow") {
230
+ return decision;
231
+ }
232
+ if (decision.type === "ask_user") {
233
+ this._pendingPermissions.set(toolCallId, {
234
+ toolName,
235
+ riskLevel: decision.riskLevel,
236
+ targetPath,
237
+ commandDigest: extractCommandDigest(parameters),
238
+ });
239
+ }
240
+ return {
241
+ type: decision.type,
242
+ reason: decision.reason,
243
+ riskLevel: decision.riskLevel,
244
+ };
245
+ },
246
+ });
247
+ return true;
248
+ }
249
+ /**
250
+ * Apply governance rules to tool events.
251
+ */
252
+ applyGovernance(normalized) {
253
+ if (!this._governor)
254
+ return normalized;
255
+ if ((normalized.type === "tool_update" || normalized.type === "tool_completed") &&
256
+ this._deniedToolCalls.has(normalized.toolCallId)) {
257
+ return null;
258
+ }
259
+ if ((normalized.type === "tool_update" || normalized.type === "tool_completed") &&
260
+ this._bufferedToolExecutions.has(normalized.toolCallId)) {
261
+ this._bufferedToolExecutions.get(normalized.toolCallId).bufferedEvents.push(normalized);
262
+ return null;
263
+ }
264
+ if (normalized.type === "tool_started") {
265
+ const targetPath = typeof normalized.parameters?.file_path === "string"
266
+ ? normalized.parameters.file_path
267
+ : typeof normalized.parameters?.path === "string"
268
+ ? normalized.parameters.path
269
+ : undefined;
270
+ const decision = this._governor.beforeExecution({
271
+ sessionId: this._state.id.value,
272
+ toolName: normalized.toolName,
273
+ toolCallId: normalized.toolCallId,
274
+ workingDirectory: this._context.workingDirectory,
275
+ sessionMode: this._context.mode,
276
+ isSubAgent: false,
277
+ targetPath,
278
+ parameters: normalized.parameters,
279
+ });
280
+ if (decision.type === "deny") {
281
+ return {
282
+ id: normalized.id,
283
+ timestamp: normalized.timestamp,
284
+ sessionId: normalized.sessionId,
285
+ category: "tool",
286
+ type: "tool_denied",
287
+ toolName: normalized.toolName,
288
+ toolCallId: normalized.toolCallId,
289
+ reason: decision.reason,
290
+ };
291
+ }
292
+ if (decision.type === "ask_user") {
293
+ this._pendingPermissions.set(normalized.toolCallId, {
294
+ toolName: normalized.toolName,
295
+ riskLevel: decision.riskLevel,
296
+ targetPath,
297
+ commandDigest: extractCommandDigest(normalized.parameters),
298
+ });
299
+ this._bufferedToolExecutions.set(normalized.toolCallId, {
300
+ startedEvent: normalized,
301
+ bufferedEvents: [],
302
+ });
303
+ return {
304
+ id: normalized.id,
305
+ timestamp: normalized.timestamp,
306
+ sessionId: normalized.sessionId,
307
+ category: "permission",
308
+ type: "permission_requested",
309
+ toolName: normalized.toolName,
310
+ toolCallId: normalized.toolCallId,
311
+ riskLevel: decision.riskLevel,
312
+ };
313
+ }
314
+ return normalized;
315
+ }
316
+ if (normalized.type === "tool_completed") {
317
+ this._governor.afterExecution({
318
+ toolName: normalized.toolName,
319
+ toolCallId: normalized.toolCallId,
320
+ status: normalized.status,
321
+ durationMs: normalized.durationMs,
322
+ });
323
+ return normalized;
324
+ }
325
+ // tool_update, tool_denied, etc. — pass through
326
+ return normalized;
327
+ }
328
+ emitRuntimeEvent(event) {
329
+ this._events.emit(event);
330
+ this._globalBus.emit(event);
331
+ if (this._governor && event.type === "tool_completed") {
332
+ this._governor.afterExecution({
333
+ toolName: event.toolName,
334
+ toolCallId: event.toolCallId,
335
+ status: event.status,
336
+ durationMs: event.durationMs,
337
+ });
338
+ }
339
+ this.handleStateUpdate(event);
340
+ }
341
+ flushBufferedToolExecution(callId, decision) {
342
+ const buffered = this._bufferedToolExecutions.get(callId);
343
+ if (!buffered) {
344
+ return;
345
+ }
346
+ this._bufferedToolExecutions.delete(callId);
347
+ if (decision === "deny") {
348
+ this._deniedToolCalls.add(callId);
349
+ this.emitRuntimeEvent({
350
+ id: (0, session_events_js_1.generateEventId)(),
351
+ timestamp: Date.now(),
352
+ sessionId: this._state.id,
353
+ category: "tool",
354
+ type: "tool_denied",
355
+ toolName: buffered.startedEvent.toolName,
356
+ toolCallId: callId,
357
+ reason: "Permission denied by user",
358
+ });
359
+ return;
360
+ }
361
+ this.emitRuntimeEvent(buffered.startedEvent);
362
+ for (const event of buffered.bufferedEvents) {
363
+ this.emitRuntimeEvent(event);
364
+ }
365
+ }
366
+ handleStateUpdate(normalized) {
367
+ if (normalized.category === "compaction" && normalized.type === "compaction_completed") {
368
+ this._state = (0, session_state_js_1.updateSessionStatus)({ ...this._state, compactionSummary: normalized.summary }, this._state.status);
369
+ this.notifyStateChange();
370
+ }
371
+ }
372
+ transitionTask(taskState) {
373
+ this._state = (0, session_state_js_1.updateTaskState)(this._state, taskState);
374
+ this._context = (0, runtime_context_js_1.updateTaskState)(this._context, taskState);
375
+ this.notifyStateChange();
376
+ }
377
+ notifyStateChange() {
378
+ const snapshot = this._state;
379
+ for (const listener of this._stateListeners) {
380
+ listener(snapshot);
381
+ }
382
+ }
383
+ assertOpen() {
384
+ if (this._closed) {
385
+ throw new Error("Session is closed");
386
+ }
387
+ }
388
+ assertNotRunning() {
389
+ if (this._running) {
390
+ throw new Error("Session is already running a prompt or continue operation");
391
+ }
392
+ }
393
+ }
394
+ exports.SessionFacadeImpl = SessionFacadeImpl;
395
+ function extractTargetPath(parameters) {
396
+ if (!parameters) {
397
+ return undefined;
398
+ }
399
+ if (typeof parameters.file_path === "string") {
400
+ return parameters.file_path;
401
+ }
402
+ if (typeof parameters.path === "string") {
403
+ return parameters.path;
404
+ }
405
+ if (Array.isArray(parameters.file_paths)) {
406
+ const firstPath = parameters.file_paths.find((value) => typeof value === "string" && value.length > 0);
407
+ if (typeof firstPath === "string") {
408
+ return firstPath;
409
+ }
410
+ }
411
+ return undefined;
412
+ }
413
+ function extractCommandDigest(parameters) {
414
+ const command = parameters?.command;
415
+ if (typeof command !== "string" || command.length === 0) {
416
+ return undefined;
417
+ }
418
+ return `sha256:${(0, node_crypto_1.createHash)("sha256").update(command).digest("hex")}`;
419
+ }
420
+ function computeSessionApprovalTargetPattern(toolName, targetPath, workingDirectory) {
421
+ if (toolName === "write" || toolName === "edit") {
422
+ const normalizedWorkingDirectory = (0, node_path_1.normalize)(workingDirectory);
423
+ if (!targetPath) {
424
+ return `${normalizedWorkingDirectory}/**`;
425
+ }
426
+ const normalizedTarget = (0, node_path_1.normalize)(targetPath);
427
+ if (normalizedTarget === normalizedWorkingDirectory ||
428
+ normalizedTarget.startsWith(`${normalizedWorkingDirectory}/`)) {
429
+ return `${normalizedWorkingDirectory}/**`;
430
+ }
431
+ return `${(0, node_path_1.dirname)(normalizedTarget)}/**`;
432
+ }
433
+ if (!targetPath) {
434
+ return "*";
435
+ }
436
+ const normalizedTarget = (0, node_path_1.normalize)(targetPath);
437
+ return normalizedTarget;
438
+ }
439
+ //# sourceMappingURL=session-facade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-facade.js","sourceRoot":"","sources":["../../src/session/session-facade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * SessionState management — pure functions for creating, updating,
3
+ * serializing, and recovering session state.
4
+ *
5
+ * All functions return new objects; SessionState is treated as immutable.
6
+ */
7
+ import type { CompactionSummary, ModelDescriptor, PlanSummary, SessionId, SessionRecoveryData, SessionState, SessionStatus, TaskState, ToolSetDescriptor } from "../types/index.js";
8
+ export declare function createInitialSessionState(id: SessionId, model: ModelDescriptor, toolSet: ToolSetDescriptor): SessionState;
9
+ export declare function recoverSessionState(data: SessionRecoveryData): SessionState;
10
+ export declare function serializeForRecovery(state: SessionState): SessionRecoveryData;
11
+ export declare function updateSessionStatus(state: SessionState, status: SessionStatus): SessionState;
12
+ export declare function updateCompactionSummary(state: SessionState, summary: CompactionSummary): SessionState;
13
+ export declare function updateTaskState(state: SessionState, taskState: TaskState): SessionState;
14
+ export declare function updatePlanSummary(state: SessionState, planSummary: PlanSummary | null): SessionState;
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ /**
3
+ * SessionState management — pure functions for creating, updating,
4
+ * serializing, and recovering session state.
5
+ *
6
+ * All functions return new objects; SessionState is treated as immutable.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createInitialSessionState = createInitialSessionState;
10
+ exports.recoverSessionState = recoverSessionState;
11
+ exports.serializeForRecovery = serializeForRecovery;
12
+ exports.updateSessionStatus = updateSessionStatus;
13
+ exports.updateCompactionSummary = updateCompactionSummary;
14
+ exports.updateTaskState = updateTaskState;
15
+ exports.updatePlanSummary = updatePlanSummary;
16
+ // ---------------------------------------------------------------------------
17
+ // Creation
18
+ // ---------------------------------------------------------------------------
19
+ function createInitialSessionState(id, model, toolSet) {
20
+ const now = Date.now();
21
+ return {
22
+ id,
23
+ status: "creating",
24
+ createdAt: now,
25
+ updatedAt: now,
26
+ model,
27
+ toolSet,
28
+ planSummary: null,
29
+ compactionSummary: null,
30
+ taskState: { status: "idle", currentTaskId: null, startedAt: null },
31
+ };
32
+ }
33
+ // ---------------------------------------------------------------------------
34
+ // Recovery
35
+ // ---------------------------------------------------------------------------
36
+ function recoverSessionState(data) {
37
+ const now = Date.now();
38
+ return {
39
+ id: data.sessionId,
40
+ status: "recovering",
41
+ createdAt: now,
42
+ updatedAt: now,
43
+ model: data.model,
44
+ toolSet: new Set(data.toolSet),
45
+ planSummary: data.planSummary,
46
+ compactionSummary: data.compactionSummary,
47
+ taskState: data.taskState,
48
+ };
49
+ }
50
+ function serializeForRecovery(state) {
51
+ return {
52
+ sessionId: state.id,
53
+ model: state.model,
54
+ toolSet: [...state.toolSet],
55
+ planSummary: state.planSummary,
56
+ compactionSummary: state.compactionSummary,
57
+ taskState: state.taskState,
58
+ };
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // Updaters — return new state objects
62
+ // ---------------------------------------------------------------------------
63
+ function updateSessionStatus(state, status) {
64
+ return { ...state, status, updatedAt: Date.now() };
65
+ }
66
+ function updateCompactionSummary(state, summary) {
67
+ return { ...state, compactionSummary: summary, updatedAt: Date.now() };
68
+ }
69
+ function updateTaskState(state, taskState) {
70
+ return { ...state, taskState, updatedAt: Date.now() };
71
+ }
72
+ function updatePlanSummary(state, planSummary) {
73
+ return { ...state, planSummary, updatedAt: Date.now() };
74
+ }
75
+ //# sourceMappingURL=session-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/session/session-state.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAkBH,8DAiBC;AAMD,kDAaC;AAED,oDASC;AAMD,kDAEC;AAED,0DAEC;AAED,0CAEC;AAED,8CAEC;AAvED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,SAAgB,yBAAyB,CACxC,EAAa,EACb,KAAsB,EACtB,OAA0B;IAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO;QACN,EAAE;QACF,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,KAAK;QACL,OAAO;QACP,WAAW,EAAE,IAAI;QACjB,iBAAiB,EAAE,IAAI;QACvB,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;KACnE,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,SAAgB,mBAAmB,CAAC,IAAyB;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO;QACN,EAAE,EAAE,IAAI,CAAC,SAAS;QAClB,MAAM,EAAE,YAAY;QACpB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;QAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,SAAS,EAAE,IAAI,CAAC,SAAS;KACzB,CAAC;AACH,CAAC;AAED,SAAgB,oBAAoB,CAAC,KAAmB;IACvD,OAAO;QACN,SAAS,EAAE,KAAK,CAAC,EAAE;QACnB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QAC3B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,SAAS,EAAE,KAAK,CAAC,SAAS;KAC1B,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,SAAgB,mBAAmB,CAAC,KAAmB,EAAE,MAAqB;IAC7E,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACpD,CAAC;AAED,SAAgB,uBAAuB,CAAC,KAAmB,EAAE,OAA0B;IACtF,OAAO,EAAE,GAAG,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACxE,CAAC;AAED,SAAgB,eAAe,CAAC,KAAmB,EAAE,SAAoB;IACxE,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACvD,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAAmB,EAAE,WAA+B;IACrF,OAAO,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Main agent result aggregation and rework decision logic.
3
+ *
4
+ * Collects results from multiple subagent tasks, evaluates verification
5
+ * outcomes, and decides whether each task should be accepted, reworked,
6
+ * or abandoned.
7
+ */
8
+ import type { AggregationResult, ReworkDecision, SubagentResult } from "./result-types.js";
9
+ import type { SubagentTask } from "./task-types.js";
10
+ /** Aggregate results from multiple completed subagent tasks. */
11
+ export declare function aggregateResults(planId: string, results: readonly SubagentResult[], reworkDecisionsInput?: ReadonlyMap<string, ReworkDecision>): AggregationResult;
12
+ /**
13
+ * Decide whether a task result needs rework, should be accepted, or abandoned.
14
+ *
15
+ * Decision matrix:
16
+ * completed + all verifications passed → accept
17
+ * completed + verification failures + rework → rework (focus: failed names)
18
+ * completed + verification failures + no rework → abandon
19
+ * boundary_violation → abandon
20
+ * failed + rework available → rework
21
+ * failed + no rework → abandon
22
+ * stop_condition_triggered + rework → rework
23
+ * stop_condition_triggered + no rework → abandon
24
+ */
25
+ export declare function decideRework(task: SubagentTask, result: SubagentResult, maxReworkAttempts: number, currentReworkCount: number): ReworkDecision;