@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,33 @@
1
+ export { bridgePiMonoEvent, createInitialBridgeState, type PiMonoBridgeResult, type PiMonoBridgeState, PiMonoSessionAdapter, type PiMonoSessionAdapterOptions, } from "./adapters/index.js";
2
+ export type { KernelSessionAdapter, RawUpstreamEvent } from "./adapters/kernel-session-adapter.js";
3
+ export type { AppRuntime, AppRuntimeConfig } from "./create-app-runtime.js";
4
+ export { createAppRuntime } from "./create-app-runtime.js";
5
+ export type { EventBus, EventListener, Unsubscribe } from "./events/event-bus.js";
6
+ export { createEventBus } from "./events/event-bus.js";
7
+ export type { BaseEvent, CompactionCompletedEvent, CompactionEvent, CompactionStartedEvent, PermissionDecisionEvent, PermissionRequestedEvent, PermissionResolvedEvent, PlanCompletedEvent, PlanCreatedEvent, PlanProgressEvent, PlanReworkEvent, PlanStepCompletedEvent, PlanStepFailedEvent, PlanStepStartedEvent, RuntimeEvent, SessionClosedEvent, SessionClosingEvent, SessionCreatedEvent, SessionLifecycleEvent, SessionResumedEvent, SessionSuspendedEvent, TextDeltaEvent, TextStreamEvent, ThinkingDeltaEvent, ToolCompletedEvent, ToolDeniedEvent, ToolExecutionEvent, ToolStartedEvent, ToolUpdateEvent, } from "./events/runtime-event.js";
8
+ export type { GovernorDecision, ToolExecutionContext, ToolExecutionResult, ToolGovernor, } from "./governance/tool-governor.js";
9
+ export { createToolGovernor } from "./governance/tool-governor.js";
10
+ export type { Plan, PlanEngine } from "./planning/plan-engine.js";
11
+ export { createPlanEngine } from "./planning/plan-engine.js";
12
+ export { planCompleted, planCreated, planRework, planStepCompleted, planStepFailed, planStepStarted, } from "./planning/plan-events.js";
13
+ export type { PlanOrchestrator } from "./planning/plan-orchestrator.js";
14
+ export { createPlanOrchestrator } from "./planning/plan-orchestrator.js";
15
+ export type { PlanOutcomeReason, PlanStatus, PlanStep, PlanStepDetail, PlanStepStatus, PlanSummary, } from "./planning/plan-types.js";
16
+ export type { RuntimeContextParams } from "./runtime-context.js";
17
+ export { createRuntimeContext, updateTaskState } from "./runtime-context.js";
18
+ export { EventNormalizer } from "./services/event-normalizer.js";
19
+ export { generateEventId, sessionClosed, sessionCreated, sessionResumed } from "./session/session-events.js";
20
+ export type { SessionFacade } from "./session/session-facade.js";
21
+ export { SessionFacadeImpl } from "./session/session-facade.js";
22
+ export { createInitialSessionState, recoverSessionState, serializeForRecovery, updateCompactionSummary, updatePlanSummary, updateSessionStatus, updateTaskState as updateSessionTaskState, } from "./session/session-state.js";
23
+ export { aggregateResults, decideRework } from "./subagent/aggregation.js";
24
+ export { isPathAllowed, isPathForbidden, scopesOverlap, wouldViolateBoundary } from "./subagent/path-scope.js";
25
+ export type { AggregationResult, ReworkDecision, SubagentResult, SubagentResultStatus, SubagentRuntimeSnapshot, TaskRisk, VerificationResult, } from "./subagent/result-types.js";
26
+ export type { SubagentRuntimeState } from "./subagent/stop-condition.js";
27
+ export { createInitialRuntimeState, evaluateStopConditions, recordBoundaryViolation, recordError, recordModification, updateElapsedTime, } from "./subagent/stop-condition.js";
28
+ export type { PathScope, StopCondition, StopConditionType, SubagentTask, TaskInputs, Verification, VerificationType, } from "./subagent/task-types.js";
29
+ export type { ValidationResult } from "./subagent/task-validator.js";
30
+ export { hasConsistentScope, hasRequiredFields, validateTask } from "./subagent/task-validator.js";
31
+ export type { VerificationEvaluation } from "./subagent/verification.js";
32
+ export { evaluateVerifications, isVerificationTrustworthy } from "./subagent/verification.js";
33
+ export type { CliMode, CompactionSummary, ModelDescriptor, RuntimeContext, SessionId, SessionRecoveryData, SessionState, SessionStatus, TaskState, TaskStatus, ToolSetDescriptor, } from "./types/index.js";
package/dist/index.js ADDED
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ // Runtime — the shared product-layer runtime.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.isVerificationTrustworthy = exports.evaluateVerifications = exports.validateTask = exports.hasRequiredFields = exports.hasConsistentScope = exports.updateElapsedTime = exports.recordModification = exports.recordError = exports.recordBoundaryViolation = exports.evaluateStopConditions = exports.createInitialRuntimeState = exports.wouldViolateBoundary = exports.scopesOverlap = exports.isPathForbidden = exports.isPathAllowed = exports.decideRework = exports.aggregateResults = exports.updateSessionTaskState = exports.updateSessionStatus = exports.updatePlanSummary = exports.updateCompactionSummary = exports.serializeForRecovery = exports.recoverSessionState = exports.createInitialSessionState = exports.SessionFacadeImpl = exports.sessionResumed = exports.sessionCreated = exports.sessionClosed = exports.generateEventId = exports.EventNormalizer = exports.updateTaskState = exports.createRuntimeContext = exports.createPlanOrchestrator = exports.planStepStarted = exports.planStepFailed = exports.planStepCompleted = exports.planRework = exports.planCreated = exports.planCompleted = exports.createPlanEngine = exports.createToolGovernor = exports.createEventBus = exports.createAppRuntime = exports.PiMonoSessionAdapter = exports.createInitialBridgeState = exports.bridgePiMonoEvent = void 0;
5
+ var index_js_1 = require("./adapters/index.js");
6
+ Object.defineProperty(exports, "bridgePiMonoEvent", { enumerable: true, get: function () { return index_js_1.bridgePiMonoEvent; } });
7
+ Object.defineProperty(exports, "createInitialBridgeState", { enumerable: true, get: function () { return index_js_1.createInitialBridgeState; } });
8
+ Object.defineProperty(exports, "PiMonoSessionAdapter", { enumerable: true, get: function () { return index_js_1.PiMonoSessionAdapter; } });
9
+ // Entry point
10
+ var create_app_runtime_js_1 = require("./create-app-runtime.js");
11
+ Object.defineProperty(exports, "createAppRuntime", { enumerable: true, get: function () { return create_app_runtime_js_1.createAppRuntime; } });
12
+ // Events
13
+ var event_bus_js_1 = require("./events/event-bus.js");
14
+ Object.defineProperty(exports, "createEventBus", { enumerable: true, get: function () { return event_bus_js_1.createEventBus; } });
15
+ // Governance
16
+ var tool_governor_js_1 = require("./governance/tool-governor.js");
17
+ Object.defineProperty(exports, "createToolGovernor", { enumerable: true, get: function () { return tool_governor_js_1.createToolGovernor; } });
18
+ // Planning
19
+ var plan_engine_js_1 = require("./planning/plan-engine.js");
20
+ Object.defineProperty(exports, "createPlanEngine", { enumerable: true, get: function () { return plan_engine_js_1.createPlanEngine; } });
21
+ var plan_events_js_1 = require("./planning/plan-events.js");
22
+ Object.defineProperty(exports, "planCompleted", { enumerable: true, get: function () { return plan_events_js_1.planCompleted; } });
23
+ Object.defineProperty(exports, "planCreated", { enumerable: true, get: function () { return plan_events_js_1.planCreated; } });
24
+ Object.defineProperty(exports, "planRework", { enumerable: true, get: function () { return plan_events_js_1.planRework; } });
25
+ Object.defineProperty(exports, "planStepCompleted", { enumerable: true, get: function () { return plan_events_js_1.planStepCompleted; } });
26
+ Object.defineProperty(exports, "planStepFailed", { enumerable: true, get: function () { return plan_events_js_1.planStepFailed; } });
27
+ Object.defineProperty(exports, "planStepStarted", { enumerable: true, get: function () { return plan_events_js_1.planStepStarted; } });
28
+ var plan_orchestrator_js_1 = require("./planning/plan-orchestrator.js");
29
+ Object.defineProperty(exports, "createPlanOrchestrator", { enumerable: true, get: function () { return plan_orchestrator_js_1.createPlanOrchestrator; } });
30
+ var runtime_context_js_1 = require("./runtime-context.js");
31
+ Object.defineProperty(exports, "createRuntimeContext", { enumerable: true, get: function () { return runtime_context_js_1.createRuntimeContext; } });
32
+ Object.defineProperty(exports, "updateTaskState", { enumerable: true, get: function () { return runtime_context_js_1.updateTaskState; } });
33
+ // Services
34
+ var event_normalizer_js_1 = require("./services/event-normalizer.js");
35
+ Object.defineProperty(exports, "EventNormalizer", { enumerable: true, get: function () { return event_normalizer_js_1.EventNormalizer; } });
36
+ // Session events
37
+ var session_events_js_1 = require("./session/session-events.js");
38
+ Object.defineProperty(exports, "generateEventId", { enumerable: true, get: function () { return session_events_js_1.generateEventId; } });
39
+ Object.defineProperty(exports, "sessionClosed", { enumerable: true, get: function () { return session_events_js_1.sessionClosed; } });
40
+ Object.defineProperty(exports, "sessionCreated", { enumerable: true, get: function () { return session_events_js_1.sessionCreated; } });
41
+ Object.defineProperty(exports, "sessionResumed", { enumerable: true, get: function () { return session_events_js_1.sessionResumed; } });
42
+ var session_facade_js_1 = require("./session/session-facade.js");
43
+ Object.defineProperty(exports, "SessionFacadeImpl", { enumerable: true, get: function () { return session_facade_js_1.SessionFacadeImpl; } });
44
+ var session_state_js_1 = require("./session/session-state.js");
45
+ Object.defineProperty(exports, "createInitialSessionState", { enumerable: true, get: function () { return session_state_js_1.createInitialSessionState; } });
46
+ Object.defineProperty(exports, "recoverSessionState", { enumerable: true, get: function () { return session_state_js_1.recoverSessionState; } });
47
+ Object.defineProperty(exports, "serializeForRecovery", { enumerable: true, get: function () { return session_state_js_1.serializeForRecovery; } });
48
+ Object.defineProperty(exports, "updateCompactionSummary", { enumerable: true, get: function () { return session_state_js_1.updateCompactionSummary; } });
49
+ Object.defineProperty(exports, "updatePlanSummary", { enumerable: true, get: function () { return session_state_js_1.updatePlanSummary; } });
50
+ Object.defineProperty(exports, "updateSessionStatus", { enumerable: true, get: function () { return session_state_js_1.updateSessionStatus; } });
51
+ Object.defineProperty(exports, "updateSessionTaskState", { enumerable: true, get: function () { return session_state_js_1.updateTaskState; } });
52
+ // Subagent — aggregation
53
+ var aggregation_js_1 = require("./subagent/aggregation.js");
54
+ Object.defineProperty(exports, "aggregateResults", { enumerable: true, get: function () { return aggregation_js_1.aggregateResults; } });
55
+ Object.defineProperty(exports, "decideRework", { enumerable: true, get: function () { return aggregation_js_1.decideRework; } });
56
+ // Subagent — path scope
57
+ var path_scope_js_1 = require("./subagent/path-scope.js");
58
+ Object.defineProperty(exports, "isPathAllowed", { enumerable: true, get: function () { return path_scope_js_1.isPathAllowed; } });
59
+ Object.defineProperty(exports, "isPathForbidden", { enumerable: true, get: function () { return path_scope_js_1.isPathForbidden; } });
60
+ Object.defineProperty(exports, "scopesOverlap", { enumerable: true, get: function () { return path_scope_js_1.scopesOverlap; } });
61
+ Object.defineProperty(exports, "wouldViolateBoundary", { enumerable: true, get: function () { return path_scope_js_1.wouldViolateBoundary; } });
62
+ var stop_condition_js_1 = require("./subagent/stop-condition.js");
63
+ Object.defineProperty(exports, "createInitialRuntimeState", { enumerable: true, get: function () { return stop_condition_js_1.createInitialRuntimeState; } });
64
+ Object.defineProperty(exports, "evaluateStopConditions", { enumerable: true, get: function () { return stop_condition_js_1.evaluateStopConditions; } });
65
+ Object.defineProperty(exports, "recordBoundaryViolation", { enumerable: true, get: function () { return stop_condition_js_1.recordBoundaryViolation; } });
66
+ Object.defineProperty(exports, "recordError", { enumerable: true, get: function () { return stop_condition_js_1.recordError; } });
67
+ Object.defineProperty(exports, "recordModification", { enumerable: true, get: function () { return stop_condition_js_1.recordModification; } });
68
+ Object.defineProperty(exports, "updateElapsedTime", { enumerable: true, get: function () { return stop_condition_js_1.updateElapsedTime; } });
69
+ var task_validator_js_1 = require("./subagent/task-validator.js");
70
+ Object.defineProperty(exports, "hasConsistentScope", { enumerable: true, get: function () { return task_validator_js_1.hasConsistentScope; } });
71
+ Object.defineProperty(exports, "hasRequiredFields", { enumerable: true, get: function () { return task_validator_js_1.hasRequiredFields; } });
72
+ Object.defineProperty(exports, "validateTask", { enumerable: true, get: function () { return task_validator_js_1.validateTask; } });
73
+ var verification_js_1 = require("./subagent/verification.js");
74
+ Object.defineProperty(exports, "evaluateVerifications", { enumerable: true, get: function () { return verification_js_1.evaluateVerifications; } });
75
+ Object.defineProperty(exports, "isVerificationTrustworthy", { enumerable: true, get: function () { return verification_js_1.isVerificationTrustworthy; } });
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,8CAA8C;;;AAE9C,gDAO6B;AAN5B,6GAAA,iBAAiB,OAAA;AACjB,oHAAA,wBAAwB,OAAA;AAGxB,gHAAA,oBAAoB,OAAA;AAMrB,cAAc;AACd,iEAA2D;AAAlD,yHAAA,gBAAgB,OAAA;AAEzB,SAAS;AACT,sDAAuD;AAA9C,8GAAA,cAAc,OAAA;AAuCvB,aAAa;AACb,kEAAmE;AAA1D,sHAAA,kBAAkB,OAAA;AAE3B,WAAW;AACX,4DAA6D;AAApD,kHAAA,gBAAgB,OAAA;AACzB,4DAOmC;AANlC,+GAAA,aAAa,OAAA;AACb,6GAAA,WAAW,OAAA;AACX,4GAAA,UAAU,OAAA;AACV,mHAAA,iBAAiB,OAAA;AACjB,gHAAA,cAAc,OAAA;AACd,iHAAA,eAAe,OAAA;AAGhB,wEAAyE;AAAhE,8HAAA,sBAAsB,OAAA;AAY/B,2DAA6E;AAApE,0HAAA,oBAAoB,OAAA;AAAE,qHAAA,eAAe,OAAA;AAC9C,WAAW;AACX,sEAAiE;AAAxD,sHAAA,eAAe,OAAA;AACxB,iBAAiB;AACjB,iEAA6G;AAApG,oHAAA,eAAe,OAAA;AAAE,kHAAA,aAAa,OAAA;AAAE,mHAAA,cAAc,OAAA;AAAE,mHAAA,cAAc,OAAA;AAGvE,iEAAgE;AAAvD,sHAAA,iBAAiB,OAAA;AAC1B,+DAQoC;AAPnC,6HAAA,yBAAyB,OAAA;AACzB,uHAAA,mBAAmB,OAAA;AACnB,wHAAA,oBAAoB,OAAA;AACpB,2HAAA,uBAAuB,OAAA;AACvB,qHAAA,iBAAiB,OAAA;AACjB,uHAAA,mBAAmB,OAAA;AACnB,0HAAA,eAAe,OAA0B;AAE1C,yBAAyB;AACzB,4DAA2E;AAAlE,kHAAA,gBAAgB,OAAA;AAAE,8GAAA,YAAY,OAAA;AACvC,wBAAwB;AACxB,0DAA+G;AAAtG,8GAAA,aAAa,OAAA;AAAE,gHAAA,eAAe,OAAA;AAAE,8GAAA,aAAa,OAAA;AAAE,qHAAA,oBAAoB,OAAA;AAa5E,kEAOsC;AANrC,8HAAA,yBAAyB,OAAA;AACzB,2HAAA,sBAAsB,OAAA;AACtB,4HAAA,uBAAuB,OAAA;AACvB,gHAAA,WAAW,OAAA;AACX,uHAAA,kBAAkB,OAAA;AAClB,sHAAA,iBAAiB,OAAA;AAalB,kEAAmG;AAA1F,uHAAA,kBAAkB,OAAA;AAAE,sHAAA,iBAAiB,OAAA;AAAE,iHAAA,YAAY,OAAA;AAG5D,8DAA8F;AAArF,wHAAA,qBAAqB,OAAA;AAAE,4HAAA,yBAAyB,OAAA"}
@@ -0,0 +1,6 @@
1
+ export type { Plan, PlanEngine } from "./plan-engine.js";
2
+ export { createPlanEngine } from "./plan-engine.js";
3
+ export { planCompleted, planCreated, planRework, planStepCompleted, planStepFailed, planStepStarted, } from "./plan-events.js";
4
+ export type { PlanOrchestrator } from "./plan-orchestrator.js";
5
+ export { createPlanOrchestrator } from "./plan-orchestrator.js";
6
+ export type { PlanOutcomeReason, PlanStatus, PlanStep, PlanStepDetail, PlanStepStatus, PlanSummary, } from "./plan-types.js";
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ // planning/ — Plan engine, orchestrator, types, and event factories.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createPlanOrchestrator = exports.planStepStarted = exports.planStepFailed = exports.planStepCompleted = exports.planRework = exports.planCreated = exports.planCompleted = exports.createPlanEngine = void 0;
5
+ var plan_engine_js_1 = require("./plan-engine.js");
6
+ Object.defineProperty(exports, "createPlanEngine", { enumerable: true, get: function () { return plan_engine_js_1.createPlanEngine; } });
7
+ var plan_events_js_1 = require("./plan-events.js");
8
+ Object.defineProperty(exports, "planCompleted", { enumerable: true, get: function () { return plan_events_js_1.planCompleted; } });
9
+ Object.defineProperty(exports, "planCreated", { enumerable: true, get: function () { return plan_events_js_1.planCreated; } });
10
+ Object.defineProperty(exports, "planRework", { enumerable: true, get: function () { return plan_events_js_1.planRework; } });
11
+ Object.defineProperty(exports, "planStepCompleted", { enumerable: true, get: function () { return plan_events_js_1.planStepCompleted; } });
12
+ Object.defineProperty(exports, "planStepFailed", { enumerable: true, get: function () { return plan_events_js_1.planStepFailed; } });
13
+ Object.defineProperty(exports, "planStepStarted", { enumerable: true, get: function () { return plan_events_js_1.planStepStarted; } });
14
+ var plan_orchestrator_js_1 = require("./plan-orchestrator.js");
15
+ Object.defineProperty(exports, "createPlanOrchestrator", { enumerable: true, get: function () { return plan_orchestrator_js_1.createPlanOrchestrator; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/planning/index.ts"],"names":[],"mappings":";AAAA,qEAAqE;;;AAGrE,mDAAoD;AAA3C,kHAAA,gBAAgB,OAAA;AACzB,mDAO0B;AANzB,+GAAA,aAAa,OAAA;AACb,6GAAA,WAAW,OAAA;AACX,4GAAA,UAAU,OAAA;AACV,mHAAA,iBAAiB,OAAA;AACjB,gHAAA,cAAc,OAAA;AACd,iHAAA,eAAe,OAAA;AAGhB,+DAAgE;AAAvD,8HAAA,sBAAsB,OAAA"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Plan state machine and lifecycle management.
3
+ *
4
+ * Provides immutable state transitions for plan objects. Every method returns
5
+ * a new Plan instance — the input is never mutated. Invalid transitions throw
6
+ * descriptive errors so that bugs surface early during development.
7
+ *
8
+ * Lifecycle:
9
+ * draft → active → completed | failed | abandoned
10
+ * draft → abandoned
11
+ *
12
+ * Step lifecycle:
13
+ * pending → in_progress → completed | failed
14
+ * pending → skipped
15
+ * failed → in_progress (rework, if under limit)
16
+ */
17
+ import type { SubagentResult } from "../subagent/result-types.js";
18
+ import type { PlanOutcomeReason, PlanStatus, PlanStepDetail, PlanSummary } from "./plan-types.js";
19
+ export interface Plan {
20
+ readonly planId: string;
21
+ readonly goal: string;
22
+ readonly status: PlanStatus;
23
+ readonly steps: readonly PlanStepDetail[];
24
+ readonly createdAt: number;
25
+ readonly updatedAt: number;
26
+ readonly outcomeReason?: PlanOutcomeReason;
27
+ readonly maxReworkAttempts: number;
28
+ }
29
+ export interface PlanEngine {
30
+ /** Create a new plan in "draft" status with the given step descriptions. */
31
+ createDraft(planId: string, goal: string, stepDescriptions: readonly string[]): Plan;
32
+ /** Transition plan from "draft" to "active". */
33
+ activate(plan: Plan): Plan;
34
+ /** Start a step: transitions to "in_progress" and links a subagent taskId. */
35
+ startStep(plan: Plan, stepIndex: number, taskId: string): Plan;
36
+ /** Complete a step successfully with the subagent result. */
37
+ completeStep(plan: Plan, stepIndex: number, result: SubagentResult): Plan;
38
+ /** Fail a step with the subagent result. */
39
+ failStep(plan: Plan, stepIndex: number, result: SubagentResult): Plan;
40
+ /** Skip a pending step. */
41
+ skipStep(plan: Plan, stepIndex: number): Plan;
42
+ /** Abandon the plan with a reason. */
43
+ abandon(plan: Plan, reason: PlanOutcomeReason): Plan;
44
+ /** Derive a lightweight PlanSummary from the current plan state. */
45
+ summarize(plan: Plan): PlanSummary;
46
+ /** Get the index of the next pending step, or null if none. */
47
+ nextPendingStep(plan: Plan): number | null;
48
+ }
49
+ export declare function createPlanEngine(maxReworkAttempts?: number): PlanEngine;
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ /**
3
+ * Plan state machine and lifecycle management.
4
+ *
5
+ * Provides immutable state transitions for plan objects. Every method returns
6
+ * a new Plan instance — the input is never mutated. Invalid transitions throw
7
+ * descriptive errors so that bugs surface early during development.
8
+ *
9
+ * Lifecycle:
10
+ * draft → active → completed | failed | abandoned
11
+ * draft → abandoned
12
+ *
13
+ * Step lifecycle:
14
+ * pending → in_progress → completed | failed
15
+ * pending → skipped
16
+ * failed → in_progress (rework, if under limit)
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.createPlanEngine = createPlanEngine;
20
+ // ---------------------------------------------------------------------------
21
+ // Factory
22
+ // ---------------------------------------------------------------------------
23
+ function createPlanEngine(maxReworkAttempts = 2) {
24
+ function assertStatus(plan, ...expected) {
25
+ if (!expected.includes(plan.status)) {
26
+ throw new Error(`Plan "${plan.planId}" is ${plan.status}, expected ${expected.join(" or ")}`);
27
+ }
28
+ }
29
+ function assertStepStatus(step, index, ...expected) {
30
+ if (!expected.includes(step.status)) {
31
+ throw new Error(`Step ${index} ("${step.stepId}") is ${step.status}, expected ${expected.join(" or ")}`);
32
+ }
33
+ }
34
+ function assertIndex(plan, stepIndex) {
35
+ if (stepIndex < 0 || stepIndex >= plan.steps.length) {
36
+ throw new Error(`Step index ${stepIndex} out of range [0, ${plan.steps.length})`);
37
+ }
38
+ }
39
+ function updateSteps(plan, stepIndex, patcher) {
40
+ const steps = plan.steps.map((s, i) => (i === stepIndex ? patcher(s) : s));
41
+ return { ...plan, steps, updatedAt: Date.now() };
42
+ }
43
+ function isTerminal(plan) {
44
+ return plan.status === "completed" || plan.status === "failed" || plan.status === "abandoned";
45
+ }
46
+ function checkAutoComplete(plan) {
47
+ const allDone = plan.steps.every((s) => s.status === "completed" || s.status === "skipped");
48
+ if (allDone) {
49
+ return {
50
+ ...plan,
51
+ status: "completed",
52
+ outcomeReason: "all_steps_completed",
53
+ updatedAt: Date.now(),
54
+ };
55
+ }
56
+ return plan;
57
+ }
58
+ return {
59
+ createDraft(planId, goal, stepDescriptions) {
60
+ if (!stepDescriptions || stepDescriptions.length === 0) {
61
+ throw new Error("Plan must have at least one step");
62
+ }
63
+ const now = Date.now();
64
+ const steps = stepDescriptions.map((desc, i) => ({
65
+ stepId: `${planId}-step-${i + 1}`,
66
+ description: desc,
67
+ status: "pending",
68
+ reworkCount: 0,
69
+ }));
70
+ return {
71
+ planId,
72
+ goal,
73
+ status: "draft",
74
+ steps,
75
+ createdAt: now,
76
+ updatedAt: now,
77
+ maxReworkAttempts,
78
+ };
79
+ },
80
+ activate(plan) {
81
+ assertStatus(plan, "draft");
82
+ return { ...plan, status: "active", updatedAt: Date.now() };
83
+ },
84
+ startStep(plan, stepIndex, taskId) {
85
+ assertStatus(plan, "active");
86
+ assertIndex(plan, stepIndex);
87
+ assertStepStatus(plan.steps[stepIndex], stepIndex, "pending", "failed");
88
+ const step = plan.steps[stepIndex];
89
+ // If reworking a failed step, increment rework count
90
+ const reworkCount = step.status === "failed" ? step.reworkCount + 1 : step.reworkCount;
91
+ if (step.status === "failed" && reworkCount > plan.maxReworkAttempts) {
92
+ throw new Error(`Step ${stepIndex} ("${step.stepId}") has exceeded max rework attempts (${plan.maxReworkAttempts})`);
93
+ }
94
+ return updateSteps(plan, stepIndex, (s) => ({
95
+ ...s,
96
+ status: "in_progress",
97
+ taskId,
98
+ reworkCount,
99
+ result: undefined,
100
+ }));
101
+ },
102
+ completeStep(plan, stepIndex, result) {
103
+ assertStatus(plan, "active");
104
+ assertIndex(plan, stepIndex);
105
+ assertStepStatus(plan.steps[stepIndex], stepIndex, "in_progress");
106
+ if (result.status !== "completed") {
107
+ throw new Error(`completeStep requires result.status "completed", got "${result.status}". Use failStep for non-completed results.`);
108
+ }
109
+ const updated = updateSteps(plan, stepIndex, (s) => ({
110
+ ...s,
111
+ status: "completed",
112
+ result,
113
+ }));
114
+ return checkAutoComplete(updated);
115
+ },
116
+ failStep(plan, stepIndex, result) {
117
+ assertStatus(plan, "active");
118
+ assertIndex(plan, stepIndex);
119
+ assertStepStatus(plan.steps[stepIndex], stepIndex, "in_progress");
120
+ const updated = updateSteps(plan, stepIndex, (s) => ({
121
+ ...s,
122
+ status: "failed",
123
+ result,
124
+ }));
125
+ // If this step has exhausted rework attempts, fail the whole plan
126
+ const step = updated.steps[stepIndex];
127
+ if (step.reworkCount >= plan.maxReworkAttempts) {
128
+ return {
129
+ ...updated,
130
+ status: "failed",
131
+ outcomeReason: "rework_limit_exceeded",
132
+ updatedAt: Date.now(),
133
+ };
134
+ }
135
+ return updated;
136
+ },
137
+ skipStep(plan, stepIndex) {
138
+ assertStatus(plan, "active");
139
+ assertIndex(plan, stepIndex);
140
+ assertStepStatus(plan.steps[stepIndex], stepIndex, "pending");
141
+ const updated = updateSteps(plan, stepIndex, (s) => ({
142
+ ...s,
143
+ status: "skipped",
144
+ }));
145
+ return checkAutoComplete(updated);
146
+ },
147
+ abandon(plan, reason) {
148
+ if (isTerminal(plan)) {
149
+ throw new Error(`Plan "${plan.planId}" is already ${plan.status} and cannot be abandoned`);
150
+ }
151
+ return {
152
+ ...plan,
153
+ status: "abandoned",
154
+ outcomeReason: reason,
155
+ updatedAt: Date.now(),
156
+ };
157
+ },
158
+ summarize(plan) {
159
+ const completedSteps = plan.steps.filter((s) => s.status === "completed" || s.status === "skipped").length;
160
+ return {
161
+ planId: plan.planId,
162
+ goal: plan.goal,
163
+ status: plan.status,
164
+ stepCount: plan.steps.length,
165
+ completedSteps,
166
+ };
167
+ },
168
+ nextPendingStep(plan) {
169
+ const index = plan.steps.findIndex((s) => s.status === "pending");
170
+ return index === -1 ? null : index;
171
+ },
172
+ };
173
+ }
174
+ //# sourceMappingURL=plan-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-engine.js","sourceRoot":"","sources":["../../src/planning/plan-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Factory functions for plan lifecycle events.
3
+ *
4
+ * Follows the same pattern as session-events.ts: auto-fills id and timestamp
5
+ * so callers don't repeat boilerplate.
6
+ */
7
+ import type { PlanCompletedEvent, PlanCreatedEvent, PlanReworkEvent, PlanStepCompletedEvent, PlanStepFailedEvent, PlanStepStartedEvent } from "../events/runtime-event.js";
8
+ import type { PlanSummary, SessionId } from "../types/index.js";
9
+ export declare function planCreated(sessionId: SessionId, planId: string, goal: string, stepCount: number): PlanCreatedEvent;
10
+ export declare function planStepStarted(sessionId: SessionId, planId: string, stepId: string, stepDescription: string): PlanStepStartedEvent;
11
+ export declare function planStepCompleted(sessionId: SessionId, planId: string, stepId: string, success: boolean): PlanStepCompletedEvent;
12
+ export declare function planStepFailed(sessionId: SessionId, planId: string, stepId: string, reason: string, reworkScheduled: boolean): PlanStepFailedEvent;
13
+ export declare function planRework(sessionId: SessionId, planId: string, stepId: string, reworkAttempt: number, focusAreas: readonly string[]): PlanReworkEvent;
14
+ export declare function planCompleted(sessionId: SessionId, planId: string, goal: string, success: boolean, summary: PlanSummary): PlanCompletedEvent;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /**
3
+ * Factory functions for plan lifecycle events.
4
+ *
5
+ * Follows the same pattern as session-events.ts: auto-fills id and timestamp
6
+ * so callers don't repeat boilerplate.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.planCreated = planCreated;
10
+ exports.planStepStarted = planStepStarted;
11
+ exports.planStepCompleted = planStepCompleted;
12
+ exports.planStepFailed = planStepFailed;
13
+ exports.planRework = planRework;
14
+ exports.planCompleted = planCompleted;
15
+ const session_events_js_1 = require("../session/session-events.js");
16
+ // ---------------------------------------------------------------------------
17
+ // Event factories
18
+ // ---------------------------------------------------------------------------
19
+ function planCreated(sessionId, planId, goal, stepCount) {
20
+ return {
21
+ id: (0, session_events_js_1.generateEventId)(),
22
+ timestamp: Date.now(),
23
+ sessionId,
24
+ category: "plan",
25
+ type: "plan_created",
26
+ planId,
27
+ goal,
28
+ stepCount,
29
+ };
30
+ }
31
+ function planStepStarted(sessionId, planId, stepId, stepDescription) {
32
+ return {
33
+ id: (0, session_events_js_1.generateEventId)(),
34
+ timestamp: Date.now(),
35
+ sessionId,
36
+ category: "plan",
37
+ type: "plan_step_started",
38
+ planId,
39
+ stepId,
40
+ stepDescription,
41
+ };
42
+ }
43
+ function planStepCompleted(sessionId, planId, stepId, success) {
44
+ return {
45
+ id: (0, session_events_js_1.generateEventId)(),
46
+ timestamp: Date.now(),
47
+ sessionId,
48
+ category: "plan",
49
+ type: "plan_step_completed",
50
+ planId,
51
+ stepId,
52
+ success,
53
+ };
54
+ }
55
+ function planStepFailed(sessionId, planId, stepId, reason, reworkScheduled) {
56
+ return {
57
+ id: (0, session_events_js_1.generateEventId)(),
58
+ timestamp: Date.now(),
59
+ sessionId,
60
+ category: "plan",
61
+ type: "plan_step_failed",
62
+ planId,
63
+ stepId,
64
+ reason,
65
+ reworkScheduled,
66
+ };
67
+ }
68
+ function planRework(sessionId, planId, stepId, reworkAttempt, focusAreas) {
69
+ return {
70
+ id: (0, session_events_js_1.generateEventId)(),
71
+ timestamp: Date.now(),
72
+ sessionId,
73
+ category: "plan",
74
+ type: "plan_rework",
75
+ planId,
76
+ stepId,
77
+ reworkAttempt,
78
+ focusAreas,
79
+ };
80
+ }
81
+ function planCompleted(sessionId, planId, goal, success, summary) {
82
+ return {
83
+ id: (0, session_events_js_1.generateEventId)(),
84
+ timestamp: Date.now(),
85
+ sessionId,
86
+ category: "plan",
87
+ type: "plan_completed",
88
+ planId,
89
+ goal,
90
+ success,
91
+ summary,
92
+ };
93
+ }
94
+ //# sourceMappingURL=plan-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-events.js","sourceRoot":"","sources":["../../src/planning/plan-events.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAiBH,kCAWC;AAED,0CAgBC;AAED,8CAgBC;AAED,wCAkBC;AAED,gCAkBC;AAED,sCAkBC;AAlHD,oEAA+D;AAG/D,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,SAAgB,WAAW,CAAC,SAAoB,EAAE,MAAc,EAAE,IAAY,EAAE,SAAiB;IAChG,OAAO;QACN,EAAE,EAAE,IAAA,mCAAe,GAAE;QACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,SAAS;QACT,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,cAAc;QACpB,MAAM;QACN,IAAI;QACJ,SAAS;KACT,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAC9B,SAAoB,EACpB,MAAc,EACd,MAAc,EACd,eAAuB;IAEvB,OAAO;QACN,EAAE,EAAE,IAAA,mCAAe,GAAE;QACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,SAAS;QACT,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,mBAAmB;QACzB,MAAM;QACN,MAAM;QACN,eAAe;KACf,CAAC;AACH,CAAC;AAED,SAAgB,iBAAiB,CAChC,SAAoB,EACpB,MAAc,EACd,MAAc,EACd,OAAgB;IAEhB,OAAO;QACN,EAAE,EAAE,IAAA,mCAAe,GAAE;QACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,SAAS;QACT,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,qBAAqB;QAC3B,MAAM;QACN,MAAM;QACN,OAAO;KACP,CAAC;AACH,CAAC;AAED,SAAgB,cAAc,CAC7B,SAAoB,EACpB,MAAc,EACd,MAAc,EACd,MAAc,EACd,eAAwB;IAExB,OAAO;QACN,EAAE,EAAE,IAAA,mCAAe,GAAE;QACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,SAAS;QACT,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,kBAAkB;QACxB,MAAM;QACN,MAAM;QACN,MAAM;QACN,eAAe;KACf,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CACzB,SAAoB,EACpB,MAAc,EACd,MAAc,EACd,aAAqB,EACrB,UAA6B;IAE7B,OAAO;QACN,EAAE,EAAE,IAAA,mCAAe,GAAE;QACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,SAAS;QACT,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,aAAa;QACnB,MAAM;QACN,MAAM;QACN,aAAa;QACb,UAAU;KACV,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAC5B,SAAoB,EACpB,MAAc,EACd,IAAY,EACZ,OAAgB,EAChB,OAAoB;IAEpB,OAAO;QACN,EAAE,EAAE,IAAA,mCAAe,GAAE;QACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,SAAS;QACT,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,gBAAgB;QACtB,MAAM;QACN,IAAI;QACJ,OAAO;QACP,OAAO;KACP,CAAC;AACH,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Plan orchestration runtime integration.
3
+ *
4
+ * Connects the plan engine, path scope checking, stop condition evaluation,
5
+ * and result aggregation into a single service that enforces all P4 safety
6
+ * guarantees. This is the runtime integration point — external callers
7
+ * (CLI commands, plan execution drivers) interact with plans through this.
8
+ *
9
+ * Safety guarantees enforced by submitResult():
10
+ * 1. Boundary check: modifiedPaths are validated against the assigned task's scope
11
+ * 2. Stop condition check: runtime state is evaluated against stop conditions
12
+ * 3. Both checks cause auto-fail before completeStep is called
13
+ * 4. Rework decisions are made automatically for failed steps
14
+ */
15
+ import type { EventBus } from "../events/event-bus.js";
16
+ import type { SubagentResult } from "../subagent/result-types.js";
17
+ import type { SubagentTask } from "../subagent/task-types.js";
18
+ import type { SessionId } from "../types/index.js";
19
+ import type { Plan, PlanEngine } from "./plan-engine.js";
20
+ import type { PlanSummary } from "./plan-types.js";
21
+ export interface PlanOrchestrator {
22
+ /** Underlying plan engine. */
23
+ readonly engine: PlanEngine;
24
+ /** Current active plan, or null if no plan has been created yet. */
25
+ readonly activePlan: Plan | null;
26
+ /**
27
+ * Create a draft plan and immediately activate it.
28
+ * Emits `plan_created` to both event buses.
29
+ */
30
+ createAndActivate(planId: string, goal: string, steps: string[]): Plan;
31
+ /**
32
+ * Assign a SubagentTask to a step, validate it, and start the step.
33
+ * Emits `plan_step_started` to both event buses.
34
+ */
35
+ assignTask(stepIndex: number, task: SubagentTask): Plan;
36
+ /**
37
+ * Submit a result for a step. This is the main safety gate:
38
+ *
39
+ * 1. If result.status === "completed":
40
+ * a. Check boundary violations on modifiedPaths
41
+ * b. Evaluate stop conditions
42
+ * c. If violations or stop conditions → auto-fail (never calls completeStep)
43
+ * d. Otherwise → complete step
44
+ * 2. If result.status !== "completed" → fail step
45
+ * 3. For failures: decideRework, emit plan_rework if scheduled
46
+ * 4. If plan auto-completes: emit plan_completed
47
+ */
48
+ submitResult(stepIndex: number, result: SubagentResult): Plan;
49
+ /** Skip a pending step. */
50
+ skipStep(stepIndex: number): Plan;
51
+ /** Abandon the plan. Emits `plan_completed` with success=false. */
52
+ abandonPlan(reason: string): Plan;
53
+ /** Get current plan summary, or null if no active plan. */
54
+ summarize(): PlanSummary | null;
55
+ }
56
+ export declare function createPlanOrchestrator(engine: PlanEngine, sessionBus: EventBus, globalBus: EventBus, sessionId: SessionId): PlanOrchestrator;