@oscharko-dev/keiko-server 0.2.7 → 0.2.9

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 (302) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/chat-handlers.d.ts +18 -2
  3. package/dist/chat-handlers.d.ts.map +1 -1
  4. package/dist/chat-handlers.js +185 -3
  5. package/dist/command-runner-errors.d.ts +17 -0
  6. package/dist/command-runner-errors.d.ts.map +1 -0
  7. package/dist/command-runner-errors.js +37 -0
  8. package/dist/command-runner-evidence.d.ts +23 -0
  9. package/dist/command-runner-evidence.d.ts.map +1 -0
  10. package/dist/command-runner-evidence.js +69 -0
  11. package/dist/command-runner-routes.d.ts +7 -0
  12. package/dist/command-runner-routes.d.ts.map +1 -0
  13. package/dist/command-runner-routes.js +175 -0
  14. package/dist/command-runner.d.ts +29 -0
  15. package/dist/command-runner.d.ts.map +1 -0
  16. package/dist/command-runner.js +348 -0
  17. package/dist/conversation-prompt.d.ts +2 -2
  18. package/dist/conversation-prompt.d.ts.map +1 -1
  19. package/dist/conversation-prompt.js +17 -1
  20. package/dist/csp.d.ts.map +1 -1
  21. package/dist/csp.js +3 -0
  22. package/dist/deps.d.ts +28 -1
  23. package/dist/deps.d.ts.map +1 -1
  24. package/dist/deps.js +288 -13
  25. package/dist/discussion-prompt.d.ts +4 -0
  26. package/dist/discussion-prompt.d.ts.map +1 -0
  27. package/dist/discussion-prompt.js +19 -0
  28. package/dist/editor/agentActionAudit.d.ts +18 -0
  29. package/dist/editor/agentActionAudit.d.ts.map +1 -0
  30. package/dist/editor/agentActionAudit.js +80 -0
  31. package/dist/editor/agentRoutes.d.ts +1 -0
  32. package/dist/editor/agentRoutes.d.ts.map +1 -1
  33. package/dist/editor/agentRoutes.js +292 -55
  34. package/dist/editor/agentSessionRegistry.d.ts +35 -0
  35. package/dist/editor/agentSessionRegistry.d.ts.map +1 -0
  36. package/dist/editor/agentSessionRegistry.js +243 -0
  37. package/dist/editor/completionRoutes.d.ts.map +1 -1
  38. package/dist/editor/completionRoutes.js +5 -10
  39. package/dist/editor/languageRoutes.d.ts +12 -1
  40. package/dist/editor/languageRoutes.d.ts.map +1 -1
  41. package/dist/editor/languageRoutes.js +71 -8
  42. package/dist/editor/languageService.d.ts +3 -2
  43. package/dist/editor/languageService.d.ts.map +1 -1
  44. package/dist/editor/languageService.js +41 -3
  45. package/dist/editor/languageServiceHost.d.ts.map +1 -1
  46. package/dist/editor/languageServiceHost.js +2 -2
  47. package/dist/editor/lsp/hostLanguageOperation.d.ts +17 -0
  48. package/dist/editor/lsp/hostLanguageOperation.d.ts.map +1 -0
  49. package/dist/editor/lsp/hostLanguageOperation.js +436 -0
  50. package/dist/editor/lsp/hostLanguageProviders.d.ts +26 -0
  51. package/dist/editor/lsp/hostLanguageProviders.d.ts.map +1 -0
  52. package/dist/editor/lsp/hostLanguageProviders.js +161 -0
  53. package/dist/editor/lsp/lspFrameCodec.d.ts +13 -0
  54. package/dist/editor/lsp/lspFrameCodec.d.ts.map +1 -0
  55. package/dist/editor/lsp/lspFrameCodec.js +164 -0
  56. package/dist/editor/lsp/lspJsonRpcClient.d.ts +34 -0
  57. package/dist/editor/lsp/lspJsonRpcClient.d.ts.map +1 -0
  58. package/dist/editor/lsp/lspJsonRpcClient.js +173 -0
  59. package/dist/editor/lsp/lspLanguageProvider.d.ts +7 -0
  60. package/dist/editor/lsp/lspLanguageProvider.d.ts.map +1 -0
  61. package/dist/editor/lsp/lspLanguageProvider.js +29 -0
  62. package/dist/editor/lsp/lspLifecycleLedger.d.ts +5 -0
  63. package/dist/editor/lsp/lspLifecycleLedger.d.ts.map +1 -0
  64. package/dist/editor/lsp/lspLifecycleLedger.js +37 -0
  65. package/dist/editor/lsp/lspNodeAdapter.d.ts +31 -0
  66. package/dist/editor/lsp/lspNodeAdapter.d.ts.map +1 -0
  67. package/dist/editor/lsp/lspNodeAdapter.js +230 -0
  68. package/dist/editor/lsp/lspProcessManager.d.ts +24 -0
  69. package/dist/editor/lsp/lspProcessManager.d.ts.map +1 -0
  70. package/dist/editor/lsp/lspProcessManager.js +255 -0
  71. package/dist/editor/lsp/lspRestartThrottle.d.ts +6 -0
  72. package/dist/editor/lsp/lspRestartThrottle.d.ts.map +1 -0
  73. package/dist/editor/lsp/lspRestartThrottle.js +24 -0
  74. package/dist/editor/lsp/lspStatusRoute.d.ts +8 -0
  75. package/dist/editor/lsp/lspStatusRoute.d.ts.map +1 -0
  76. package/dist/editor/lsp/lspStatusRoute.js +22 -0
  77. package/dist/editor/lsp/lspTransport.d.ts +19 -0
  78. package/dist/editor/lsp/lspTransport.d.ts.map +1 -0
  79. package/dist/editor/lsp/lspTransport.js +55 -0
  80. package/dist/editor/lsp/testing/fakeLspProcess.d.ts +23 -0
  81. package/dist/editor/lsp/testing/fakeLspProcess.d.ts.map +1 -0
  82. package/dist/editor/lsp/testing/fakeLspProcess.js +132 -0
  83. package/dist/files.d.ts +63 -0
  84. package/dist/files.d.ts.map +1 -1
  85. package/dist/files.js +799 -1
  86. package/dist/gateway-readiness.d.ts +6 -0
  87. package/dist/gateway-readiness.d.ts.map +1 -0
  88. package/dist/gateway-readiness.js +624 -0
  89. package/dist/gateway-setup.d.ts +2 -0
  90. package/dist/gateway-setup.d.ts.map +1 -1
  91. package/dist/gateway-setup.js +275 -11
  92. package/dist/gitDelivery/actionSheetProjection.d.ts +30 -0
  93. package/dist/gitDelivery/actionSheetProjection.d.ts.map +1 -0
  94. package/dist/gitDelivery/actionSheetProjection.js +206 -0
  95. package/dist/gitDelivery/actionSheetRoutes.d.ts +29 -0
  96. package/dist/gitDelivery/actionSheetRoutes.d.ts.map +1 -0
  97. package/dist/gitDelivery/actionSheetRoutes.js +293 -0
  98. package/dist/gitDelivery/agentOperationsRoutes.d.ts +33 -0
  99. package/dist/gitDelivery/agentOperationsRoutes.d.ts.map +1 -0
  100. package/dist/gitDelivery/agentOperationsRoutes.js +405 -0
  101. package/dist/gitDelivery/commitRoutes.d.ts +23 -0
  102. package/dist/gitDelivery/commitRoutes.d.ts.map +1 -0
  103. package/dist/gitDelivery/commitRoutes.js +204 -0
  104. package/dist/gitDelivery/evidenceRoutes.d.ts +9 -0
  105. package/dist/gitDelivery/evidenceRoutes.d.ts.map +1 -0
  106. package/dist/gitDelivery/evidenceRoutes.js +101 -0
  107. package/dist/gitDelivery/execution.d.ts +38 -0
  108. package/dist/gitDelivery/execution.d.ts.map +1 -0
  109. package/dist/gitDelivery/execution.js +117 -0
  110. package/dist/gitDelivery/localMutationRoutes.d.ts +30 -0
  111. package/dist/gitDelivery/localMutationRoutes.d.ts.map +1 -0
  112. package/dist/gitDelivery/localMutationRoutes.js +165 -0
  113. package/dist/gitDelivery/mergeExecution.d.ts +63 -0
  114. package/dist/gitDelivery/mergeExecution.d.ts.map +1 -0
  115. package/dist/gitDelivery/mergeExecution.js +168 -0
  116. package/dist/gitDelivery/mergeRoutes.d.ts +12 -0
  117. package/dist/gitDelivery/mergeRoutes.d.ts.map +1 -0
  118. package/dist/gitDelivery/mergeRoutes.js +218 -0
  119. package/dist/gitDelivery/mutationEvidenceLedger.d.ts +23 -0
  120. package/dist/gitDelivery/mutationEvidenceLedger.d.ts.map +1 -0
  121. package/dist/gitDelivery/mutationEvidenceLedger.js +87 -0
  122. package/dist/gitDelivery/prExecution.d.ts +54 -0
  123. package/dist/gitDelivery/prExecution.d.ts.map +1 -0
  124. package/dist/gitDelivery/prExecution.js +192 -0
  125. package/dist/gitDelivery/prRoutes.d.ts +12 -0
  126. package/dist/gitDelivery/prRoutes.d.ts.map +1 -0
  127. package/dist/gitDelivery/prRoutes.js +256 -0
  128. package/dist/gitDelivery/pushExecution.d.ts +43 -0
  129. package/dist/gitDelivery/pushExecution.d.ts.map +1 -0
  130. package/dist/gitDelivery/pushExecution.js +124 -0
  131. package/dist/gitDelivery/pushRoutes.d.ts +12 -0
  132. package/dist/gitDelivery/pushRoutes.d.ts.map +1 -0
  133. package/dist/gitDelivery/pushRoutes.js +200 -0
  134. package/dist/gitDelivery/requestGuards.d.ts +15 -0
  135. package/dist/gitDelivery/requestGuards.d.ts.map +1 -0
  136. package/dist/gitDelivery/requestGuards.js +97 -0
  137. package/dist/gitDelivery/syncEvidence.d.ts +37 -0
  138. package/dist/gitDelivery/syncEvidence.d.ts.map +1 -0
  139. package/dist/gitDelivery/syncEvidence.js +85 -0
  140. package/dist/gitDelivery/syncExecution.d.ts +30 -0
  141. package/dist/gitDelivery/syncExecution.d.ts.map +1 -0
  142. package/dist/gitDelivery/syncExecution.js +266 -0
  143. package/dist/gitDelivery/syncRoutes.d.ts +13 -0
  144. package/dist/gitDelivery/syncRoutes.d.ts.map +1 -0
  145. package/dist/gitDelivery/syncRoutes.js +200 -0
  146. package/dist/gitPorcelainStatus.d.ts +15 -0
  147. package/dist/gitPorcelainStatus.d.ts.map +1 -0
  148. package/dist/gitPorcelainStatus.js +104 -0
  149. package/dist/gitRepositoryReads.d.ts +10 -0
  150. package/dist/gitRepositoryReads.d.ts.map +1 -0
  151. package/dist/gitRepositoryReads.js +314 -0
  152. package/dist/gitRepositoryRoutes.d.ts +7 -0
  153. package/dist/gitRepositoryRoutes.d.ts.map +1 -0
  154. package/dist/gitRepositoryRoutes.js +221 -0
  155. package/dist/gitRoutes.d.ts +66 -0
  156. package/dist/gitRoutes.d.ts.map +1 -0
  157. package/dist/gitRoutes.js +543 -0
  158. package/dist/governed-workflow.d.ts +2 -0
  159. package/dist/governed-workflow.d.ts.map +1 -1
  160. package/dist/governed-workflow.js +4 -0
  161. package/dist/grounded-qa-hybrid.d.ts.map +1 -1
  162. package/dist/grounded-qa-hybrid.js +2 -0
  163. package/dist/grounded-qa-multi-source.d.ts.map +1 -1
  164. package/dist/grounded-qa-multi-source.js +1 -0
  165. package/dist/grounded-qa.d.ts +11 -0
  166. package/dist/grounded-qa.d.ts.map +1 -1
  167. package/dist/grounded-qa.js +14 -4
  168. package/dist/headers.d.ts +4 -1
  169. package/dist/headers.d.ts.map +1 -1
  170. package/dist/headers.js +11 -4
  171. package/dist/index.d.ts +8 -1
  172. package/dist/index.d.ts.map +1 -1
  173. package/dist/index.js +9 -1
  174. package/dist/local-knowledge-grounded-qa.d.ts.map +1 -1
  175. package/dist/local-knowledge-grounded-qa.js +11 -2
  176. package/dist/qualityIntelligence/figmaSnapshotRoutes.d.ts +1 -1
  177. package/dist/qualityIntelligence/figmaSnapshotRoutes.d.ts.map +1 -1
  178. package/dist/qualityIntelligence/figmaSnapshotRoutes.js +1 -1
  179. package/dist/read-handlers.d.ts +5 -0
  180. package/dist/read-handlers.d.ts.map +1 -1
  181. package/dist/read-handlers.js +57 -1
  182. package/dist/routes.d.ts.map +1 -1
  183. package/dist/routes.js +260 -12
  184. package/dist/run-engine.d.ts.map +1 -1
  185. package/dist/run-engine.js +3 -0
  186. package/dist/run-handlers.d.ts +0 -1
  187. package/dist/run-handlers.d.ts.map +1 -1
  188. package/dist/run-handlers.js +64 -211
  189. package/dist/run-request.d.ts +11 -0
  190. package/dist/run-request.d.ts.map +1 -1
  191. package/dist/run-request.js +158 -10
  192. package/dist/runtime/capabilityDetector.d.ts +38 -0
  193. package/dist/runtime/capabilityDetector.d.ts.map +1 -0
  194. package/dist/runtime/capabilityDetector.js +443 -0
  195. package/dist/runtime/capabilityRoutes.d.ts +9 -0
  196. package/dist/runtime/capabilityRoutes.d.ts.map +1 -0
  197. package/dist/runtime/capabilityRoutes.js +45 -0
  198. package/dist/runtime/containerEngineDetector.d.ts +17 -0
  199. package/dist/runtime/containerEngineDetector.d.ts.map +1 -0
  200. package/dist/runtime/containerEngineDetector.js +222 -0
  201. package/dist/runtime/containerRoutes.d.ts +8 -0
  202. package/dist/runtime/containerRoutes.d.ts.map +1 -0
  203. package/dist/runtime/containerRoutes.js +207 -0
  204. package/dist/runtime/containerRunner-errors.d.ts +18 -0
  205. package/dist/runtime/containerRunner-errors.d.ts.map +1 -0
  206. package/dist/runtime/containerRunner-errors.js +42 -0
  207. package/dist/runtime/containerRunner-evidence.d.ts +24 -0
  208. package/dist/runtime/containerRunner-evidence.d.ts.map +1 -0
  209. package/dist/runtime/containerRunner-evidence.js +74 -0
  210. package/dist/runtime/containerRunner.d.ts +37 -0
  211. package/dist/runtime/containerRunner.d.ts.map +1 -0
  212. package/dist/runtime/containerRunner.js +443 -0
  213. package/dist/server.d.ts.map +1 -1
  214. package/dist/server.js +24 -4
  215. package/dist/store/db.d.ts.map +1 -1
  216. package/dist/store/db.js +2 -1
  217. package/dist/store/index.d.ts +1 -1
  218. package/dist/store/index.d.ts.map +1 -1
  219. package/dist/store/messages.d.ts +2 -1
  220. package/dist/store/messages.d.ts.map +1 -1
  221. package/dist/store/messages.js +46 -4
  222. package/dist/store/schema.d.ts +1 -1
  223. package/dist/store/schema.d.ts.map +1 -1
  224. package/dist/store/schema.js +68 -1
  225. package/dist/store/types.d.ts +3 -2
  226. package/dist/store/types.d.ts.map +1 -1
  227. package/dist/task-workspace/active-store.d.ts +21 -0
  228. package/dist/task-workspace/active-store.d.ts.map +1 -0
  229. package/dist/task-workspace/active-store.js +55 -0
  230. package/dist/task-workspace/authorization.d.ts +7 -0
  231. package/dist/task-workspace/authorization.d.ts.map +1 -0
  232. package/dist/task-workspace/authorization.js +54 -0
  233. package/dist/task-workspace/binding.d.ts +3 -0
  234. package/dist/task-workspace/binding.d.ts.map +1 -0
  235. package/dist/task-workspace/binding.js +22 -0
  236. package/dist/task-workspace/cleanup.d.ts +4 -0
  237. package/dist/task-workspace/cleanup.d.ts.map +1 -0
  238. package/dist/task-workspace/cleanup.js +428 -0
  239. package/dist/task-workspace/errors.d.ts +14 -0
  240. package/dist/task-workspace/errors.d.ts.map +1 -0
  241. package/dist/task-workspace/errors.js +81 -0
  242. package/dist/task-workspace/evidence.d.ts +32 -0
  243. package/dist/task-workspace/evidence.d.ts.map +1 -0
  244. package/dist/task-workspace/evidence.js +52 -0
  245. package/dist/task-workspace/field-safety.d.ts +3 -0
  246. package/dist/task-workspace/field-safety.d.ts.map +1 -0
  247. package/dist/task-workspace/field-safety.js +42 -0
  248. package/dist/task-workspace/health.d.ts +4 -0
  249. package/dist/task-workspace/health.d.ts.map +1 -0
  250. package/dist/task-workspace/health.js +163 -0
  251. package/dist/task-workspace/lifecycle.d.ts +3 -0
  252. package/dist/task-workspace/lifecycle.d.ts.map +1 -0
  253. package/dist/task-workspace/lifecycle.js +248 -0
  254. package/dist/task-workspace/locks.d.ts +13 -0
  255. package/dist/task-workspace/locks.d.ts.map +1 -0
  256. package/dist/task-workspace/locks.js +44 -0
  257. package/dist/task-workspace/managed-root.d.ts +7 -0
  258. package/dist/task-workspace/managed-root.d.ts.map +1 -0
  259. package/dist/task-workspace/managed-root.js +98 -0
  260. package/dist/task-workspace/mutex.d.ts +8 -0
  261. package/dist/task-workspace/mutex.d.ts.map +1 -0
  262. package/dist/task-workspace/mutex.js +82 -0
  263. package/dist/task-workspace/naming.d.ts +15 -0
  264. package/dist/task-workspace/naming.d.ts.map +1 -0
  265. package/dist/task-workspace/naming.js +0 -0
  266. package/dist/task-workspace/provisioning.d.ts +3 -0
  267. package/dist/task-workspace/provisioning.d.ts.map +1 -0
  268. package/dist/task-workspace/provisioning.js +528 -0
  269. package/dist/task-workspace/reconciliation.d.ts +15 -0
  270. package/dist/task-workspace/reconciliation.d.ts.map +1 -0
  271. package/dist/task-workspace/reconciliation.js +274 -0
  272. package/dist/task-workspace/repair.d.ts +3 -0
  273. package/dist/task-workspace/repair.d.ts.map +1 -0
  274. package/dist/task-workspace/repair.js +286 -0
  275. package/dist/task-workspace/routes.d.ts +19 -0
  276. package/dist/task-workspace/routes.d.ts.map +1 -0
  277. package/dist/task-workspace/routes.js +481 -0
  278. package/dist/task-workspace/store.d.ts +12 -0
  279. package/dist/task-workspace/store.d.ts.map +1 -0
  280. package/dist/task-workspace/store.js +128 -0
  281. package/dist/task-workspace/types.d.ts +170 -0
  282. package/dist/task-workspace/types.d.ts.map +1 -0
  283. package/dist/task-workspace/types.js +5 -0
  284. package/dist/voice-action-governance.d.ts +23 -0
  285. package/dist/voice-action-governance.d.ts.map +1 -0
  286. package/dist/voice-action-governance.js +126 -0
  287. package/dist/voice-handlers.d.ts +6 -0
  288. package/dist/voice-handlers.d.ts.map +1 -0
  289. package/dist/voice-handlers.js +570 -0
  290. package/dist/voice-realtime-grounded-tool.d.ts +31 -0
  291. package/dist/voice-realtime-grounded-tool.d.ts.map +1 -0
  292. package/dist/voice-realtime-grounded-tool.js +322 -0
  293. package/dist/voice-realtime.d.ts +69 -0
  294. package/dist/voice-realtime.d.ts.map +1 -0
  295. package/dist/voice-realtime.js +787 -0
  296. package/dist/workspace-state-handlers.d.ts +5 -0
  297. package/dist/workspace-state-handlers.d.ts.map +1 -0
  298. package/dist/workspace-state-handlers.js +106 -0
  299. package/package.json +20 -19
  300. package/dist/grounded-handoff.d.ts +0 -4
  301. package/dist/grounded-handoff.d.ts.map +0 -1
  302. package/dist/grounded-handoff.js +0 -445
@@ -0,0 +1,170 @@
1
+ import type { EvidenceStore } from "@oscharko-dev/keiko-evidence";
2
+ import type { GitWorktreeAdapter } from "@oscharko-dev/keiko-tools/internal/git-mutation";
3
+ import type { TaskWorkspaceDriftMarker, TaskWorkspaceLifecycleState, WorkspaceBinding, WorkspaceCleanupRefusalReason, WorkspaceHealthReport, WorkspaceInstance, WorkspaceInfo, WorkspaceReconciliationReport, WorkspaceReconciliationStatus, WorkspaceRecoveryStrategy } from "@oscharko-dev/keiko-contracts";
4
+ import type { ActiveWorkspacePointer, ActiveWorkspacePointerStore } from "./active-store.js";
5
+ import type { WorkspaceInstanceStore } from "./store.js";
6
+ import type { WorkspaceMutexRegistry } from "./mutex.js";
7
+ export interface WorkspaceProvisionRequest {
8
+ readonly repositoryRequestPath: string;
9
+ readonly taskId: string;
10
+ readonly baseBranch: string;
11
+ readonly requestedBy: string;
12
+ }
13
+ export interface WorkspaceProvisionResult {
14
+ readonly instance: WorkspaceInstance;
15
+ readonly binding: WorkspaceBinding;
16
+ readonly created: boolean;
17
+ }
18
+ export interface WorkspaceActivateRequest {
19
+ readonly workspaceId: string;
20
+ readonly taskId: string;
21
+ readonly requestedBy: string;
22
+ readonly acquireLock: boolean;
23
+ readonly expectedLifecycleState?: TaskWorkspaceLifecycleState | undefined;
24
+ }
25
+ export interface WorkspaceActivateResult {
26
+ readonly instance: WorkspaceInstance;
27
+ readonly binding: WorkspaceBinding;
28
+ }
29
+ export interface WorkspaceProvisioningService {
30
+ readonly provision: (request: WorkspaceProvisionRequest) => Promise<WorkspaceProvisionResult>;
31
+ readonly activate: (request: WorkspaceActivateRequest) => Promise<WorkspaceActivateResult>;
32
+ readonly getInstance: (workspaceId: string) => WorkspaceInstance | undefined;
33
+ }
34
+ export interface WorkspaceProvisioningServiceDeps {
35
+ readonly store: WorkspaceInstanceStore;
36
+ readonly evidenceStore: EvidenceStore;
37
+ readonly managedRoot: string;
38
+ readonly createAdapter: (workspace: WorkspaceInfo) => GitWorktreeAdapter;
39
+ readonly redactString: (input: string) => string;
40
+ readonly now: () => number;
41
+ readonly newId: () => string;
42
+ readonly lockTtlMs?: number | undefined;
43
+ readonly mutex: WorkspaceMutexRegistry;
44
+ }
45
+ export interface ActiveWorkspaceView {
46
+ readonly instance: WorkspaceInstance;
47
+ readonly binding: WorkspaceBinding;
48
+ readonly pointer: ActiveWorkspacePointer;
49
+ }
50
+ export interface SetActiveWorkspaceRequest {
51
+ readonly workspaceId: string;
52
+ readonly requestedBy: string;
53
+ readonly acquireLock: boolean;
54
+ }
55
+ export interface WorkspaceLifecycleActionRequest {
56
+ readonly workspaceId: string;
57
+ readonly requestedBy: string;
58
+ }
59
+ export interface WorkspaceLifecycleActionResult {
60
+ readonly instance: WorkspaceInstance;
61
+ readonly binding: WorkspaceBinding;
62
+ }
63
+ export interface WorkspaceLifecycleService {
64
+ readonly list: (repositoryRoot: string) => readonly WorkspaceInstance[];
65
+ readonly getActive: () => ActiveWorkspaceView | undefined;
66
+ readonly setActive: (request: SetActiveWorkspaceRequest) => Promise<ActiveWorkspaceView>;
67
+ readonly clearActive: () => void;
68
+ readonly pause: (request: WorkspaceLifecycleActionRequest) => Promise<WorkspaceLifecycleActionResult>;
69
+ readonly resume: (request: WorkspaceLifecycleActionRequest) => Promise<WorkspaceLifecycleActionResult>;
70
+ readonly prepareHandoff: (request: WorkspaceLifecycleActionRequest) => Promise<WorkspaceLifecycleActionResult>;
71
+ }
72
+ export interface WorkspaceLifecycleServiceDeps {
73
+ readonly store: WorkspaceInstanceStore;
74
+ readonly activePointerStore: ActiveWorkspacePointerStore;
75
+ readonly managedRoot: string;
76
+ readonly provisioning: WorkspaceProvisioningService;
77
+ readonly evidenceStore: EvidenceStore;
78
+ readonly redactString: (input: string) => string;
79
+ readonly now: () => number;
80
+ readonly newId: () => string;
81
+ readonly lockTtlMs?: number | undefined;
82
+ readonly mutex: WorkspaceMutexRegistry;
83
+ }
84
+ export interface WorkspaceReconciliationService {
85
+ readonly report: (repositoryRoot?: string) => WorkspaceReconciliationReport;
86
+ readonly reconcile: (repositoryRoot?: string) => Promise<WorkspaceReconciliationReport>;
87
+ }
88
+ export interface WorkspaceReconciliationServiceDeps {
89
+ readonly store: WorkspaceInstanceStore;
90
+ readonly activePointerStore: ActiveWorkspacePointerStore;
91
+ readonly evidenceStore: EvidenceStore;
92
+ readonly managedRoot: string;
93
+ readonly createAdapter: (workspace: WorkspaceInfo) => GitWorktreeAdapter;
94
+ readonly redactString: (input: string) => string;
95
+ readonly now: () => number;
96
+ readonly newId: () => string;
97
+ readonly lockTtlMs?: number | undefined;
98
+ }
99
+ export type WorkspaceRepairOutcome = "repaired" | "operator-required";
100
+ export interface WorkspaceRepairRequest {
101
+ readonly workspaceId: string;
102
+ readonly requestedBy: string;
103
+ readonly strategy: WorkspaceRecoveryStrategy;
104
+ readonly operatorApproved: boolean;
105
+ }
106
+ export interface WorkspaceRepairResult {
107
+ readonly instance: WorkspaceInstance;
108
+ readonly binding: WorkspaceBinding;
109
+ readonly strategy: WorkspaceRecoveryStrategy;
110
+ readonly applied: boolean;
111
+ readonly outcome: WorkspaceRepairOutcome;
112
+ readonly status: WorkspaceReconciliationStatus;
113
+ readonly driftMarkers: readonly TaskWorkspaceDriftMarker[];
114
+ readonly operatorActionRequired: boolean;
115
+ }
116
+ export interface WorkspaceRepairService {
117
+ readonly repair: (request: WorkspaceRepairRequest) => Promise<WorkspaceRepairResult>;
118
+ }
119
+ export interface WorkspaceRepairServiceDeps {
120
+ readonly store: WorkspaceInstanceStore;
121
+ readonly activePointerStore: ActiveWorkspacePointerStore;
122
+ readonly evidenceStore: EvidenceStore;
123
+ readonly provisioning: WorkspaceProvisioningService;
124
+ readonly managedRoot: string;
125
+ readonly createAdapter: (workspace: WorkspaceInfo) => GitWorktreeAdapter;
126
+ readonly redactString: (input: string) => string;
127
+ readonly now: () => number;
128
+ readonly newId: () => string;
129
+ readonly lockTtlMs?: number | undefined;
130
+ readonly mutex: WorkspaceMutexRegistry;
131
+ }
132
+ export type WorkspaceHealthServiceDeps = WorkspaceReconciliationServiceDeps;
133
+ export interface WorkspaceCleanupServiceDeps extends WorkspaceReconciliationServiceDeps {
134
+ readonly mutex: WorkspaceMutexRegistry;
135
+ }
136
+ export interface WorkspaceHealthService {
137
+ readonly report: (repositoryRoot?: string) => Promise<WorkspaceHealthReport>;
138
+ }
139
+ export type WorkspaceCleanupMode = "request" | "complete";
140
+ export interface WorkspaceCleanupRequest {
141
+ readonly workspaceId: string;
142
+ readonly requestedBy: string;
143
+ readonly operatorApproved: boolean;
144
+ readonly mode: WorkspaceCleanupMode;
145
+ }
146
+ export type WorkspaceCleanupOutcome = "requested" | "completed" | "refused";
147
+ export interface WorkspaceCleanupResult {
148
+ readonly outcome: WorkspaceCleanupOutcome;
149
+ readonly workspaceId: string;
150
+ readonly instance?: WorkspaceInstance;
151
+ readonly refusalReason?: WorkspaceCleanupRefusalReason;
152
+ }
153
+ export interface WorkspaceOrphanCleanupRequest {
154
+ readonly repositoryRoot?: string | undefined;
155
+ readonly requestedBy: string;
156
+ readonly operatorApproved: boolean;
157
+ }
158
+ export interface WorkspaceOrphanRefusal {
159
+ readonly orphanId: string;
160
+ readonly refusalReason: WorkspaceCleanupRefusalReason;
161
+ }
162
+ export interface WorkspaceOrphanCleanupResult {
163
+ readonly removed: number;
164
+ readonly refused: readonly WorkspaceOrphanRefusal[];
165
+ }
166
+ export interface WorkspaceCleanupService {
167
+ readonly cleanup: (request: WorkspaceCleanupRequest) => Promise<WorkspaceCleanupResult>;
168
+ readonly cleanupOrphans: (request: WorkspaceOrphanCleanupRequest) => Promise<WorkspaceOrphanCleanupResult>;
169
+ }
170
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/task-workspace/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ // Service-layer contracts for managed task-workspace provisioning + activation (Issue #445).
2
+ // The wire entities (WorkspaceInstance / WorkspaceBinding / WorkspaceActivation) stay owned by the
3
+ // #444 contract in @oscharko-dev/keiko-contracts; these are the request/result envelopes and the
4
+ // injectable dependency bundle the server-side service and BFF routes share.
5
+ export {};
@@ -0,0 +1,23 @@
1
+ import { type CommittedVoiceTranscriptProjection, type SpokenActionAuditRecord, type SpokenActionConfirmationInput, type VoiceProfile, type VoiceTranscriptSource } from "@oscharko-dev/keiko-contracts";
2
+ import { type WorkflowHandoffRequest } from "@oscharko-dev/keiko-contracts/workflow-handoff";
3
+ export declare function createSpokenActionDigest(input: SpokenActionConfirmationInput): string;
4
+ export interface SpokenActionGovernanceParams {
5
+ readonly projection: CommittedVoiceTranscriptProjection;
6
+ readonly profile: VoiceProfile;
7
+ readonly turnIndex: number;
8
+ readonly source: VoiceTranscriptSource;
9
+ readonly request: WorkflowHandoffRequest;
10
+ readonly providedConfirmationDigest: string | undefined;
11
+ }
12
+ export type SpokenActionDenyReason = "no-voice-capability" | "no-committed-transcript" | "confirmation-required" | "confirmation-stale" | "invalid-handoff-request" | "approval-token-mismatch";
13
+ export type SpokenActionGovernanceDecision = {
14
+ readonly allowed: true;
15
+ readonly request: WorkflowHandoffRequest;
16
+ readonly audit: SpokenActionAuditRecord;
17
+ } | {
18
+ readonly allowed: false;
19
+ readonly reason: SpokenActionDenyReason;
20
+ readonly audit: SpokenActionAuditRecord;
21
+ };
22
+ export declare function evaluateSpokenActionGovernance(params: SpokenActionGovernanceParams): SpokenActionGovernanceDecision;
23
+ //# sourceMappingURL=voice-action-governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-action-governance.d.ts","sourceRoot":"","sources":["../src/voice-action-governance.ts"],"names":[],"mappings":"AAcA,OAAO,EAKL,KAAK,kCAAkC,EACvC,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,EAKlC,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC3B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,sBAAsB,EAE5B,MAAM,gDAAgD,CAAC;AAMxD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,GAAG,MAAM,CAIrF;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,UAAU,EAAE,kCAAkC,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IAGzC,QAAQ,CAAC,0BAA0B,EAAE,MAAM,GAAG,SAAS,CAAC;CACzD;AAED,MAAM,MAAM,sBAAsB,GAC9B,qBAAqB,GACrB,yBAAyB,GACzB,uBAAuB,GACvB,oBAAoB,GACpB,yBAAyB,GACzB,yBAAyB,CAAC;AAE9B,MAAM,MAAM,8BAA8B,GACtC;IACE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;CACzC,GACD;IACE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;CACzC,CAAC;AAqHN,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,4BAA4B,GACnC,8BAA8B,CAwChC"}
@@ -0,0 +1,126 @@
1
+ // Server-side spoken-action governance (Epic #491, Issue #503, ADR-0066). Voice is an UNTRUSTED input
2
+ // source: a committed spoken transcript may PROPOSE a governed workflow handoff, but it can never EXECUTE
3
+ // one or weaken any existing gate. This module is the fail-closed enforcement layer that sits IN FRONT OF
4
+ // the existing governance (`validateWorkflowHandoffRequest` + the `userApprovalToken` equality check +
5
+ // `checkPatchAgainstScope` downstream). It ADDS preconditions; it removes none.
6
+ //
7
+ // The contract leaf (`voice-action-intent`) defines the pure normalization + classification. This module
8
+ // supplies the only IO the design needs — a one-way sha256 content digest (mirroring
9
+ // `createApprovalToken` in governed-workflow.ts) — and the deterministic decision procedure. The server
10
+ // NEVER trusts a client-supplied digest: it recomputes the expected digest from the committed projection
11
+ // it received and compares the two. Every path (allow and deny) emits a content-free
12
+ // `SpokenActionAuditRecord` carrying enums / counts / a digest only — never raw transcript text or audio.
13
+ import { createHash } from "node:crypto";
14
+ import { buildSpokenActionAuditRecord, canonicalizeSpokenActionConfirmation, normalizeSpokenActionProposal, voiceCanProposeAction, } from "@oscharko-dev/keiko-contracts";
15
+ import { validateWorkflowHandoffRequest, } from "@oscharko-dev/keiko-contracts/workflow-handoff";
16
+ import { approvalTokenInputFor, createApprovalToken } from "./governed-workflow.js";
17
+ // One-way content digest of the canonical confirmation seed. Identical shape to governed-workflow's
18
+ // `createApprovalToken` (sha256 hex), so the audit's `bindingDigest` validates against the leaf's
19
+ // `/^[0-9a-f]{64}$/` pattern. The seed carries committedText transiently; the digest is content-free.
20
+ export function createSpokenActionDigest(input) {
21
+ return createHash("sha256")
22
+ .update(canonicalizeSpokenActionConfirmation(input), "utf8")
23
+ .digest("hex");
24
+ }
25
+ function auditFor(proposal, disposition) {
26
+ return buildSpokenActionAuditRecord({
27
+ effectClass: proposal.effectClass,
28
+ state: disposition.state,
29
+ confirmationRequired: proposal.requiresConfirmation,
30
+ confirmed: disposition.confirmed,
31
+ outcome: disposition.outcome,
32
+ source: proposal.source,
33
+ turnIndex: proposal.turnIndex,
34
+ committedSegmentCount: proposal.committedSegmentCount,
35
+ committedChars: proposal.committedChars,
36
+ bindingDigest: disposition.bindingDigest,
37
+ });
38
+ }
39
+ // Audit for the two pre-proposal denials (no capability / no committed text). There is no proposal yet,
40
+ // so the record reports the fail-closed `unknown` effect and a denied outcome with no digest.
41
+ function preProposalAudit(params, effectClass) {
42
+ return buildSpokenActionAuditRecord({
43
+ effectClass,
44
+ state: "cancelled",
45
+ confirmationRequired: true,
46
+ confirmed: false,
47
+ outcome: "denied",
48
+ source: params.source,
49
+ turnIndex: params.turnIndex,
50
+ committedSegmentCount: params.projection.segmentCount,
51
+ committedChars: params.projection.text.length,
52
+ bindingDigest: "",
53
+ });
54
+ }
55
+ function deny(reason, audit) {
56
+ return { allowed: false, reason, audit };
57
+ }
58
+ // Confirmation check (AC3 / AC4). Read-only actions skip confirmation. For confirmation-requiring
59
+ // actions: a missing client digest is `confirmation-required`; a present-but-mismatched digest is
60
+ // `confirmation-stale` (the committed text / turn / effect changed since the user confirmed).
61
+ function checkConfirmation(proposal, providedDigest, expectedDigest) {
62
+ if (!proposal.requiresConfirmation) {
63
+ return undefined;
64
+ }
65
+ if (providedDigest === undefined) {
66
+ return "confirmation-required";
67
+ }
68
+ if (providedDigest !== expectedDigest) {
69
+ return "confirmation-stale";
70
+ }
71
+ return undefined;
72
+ }
73
+ // Deny for a missing/stale confirmation: a stale digest means the committed text / turn / effect changed
74
+ // since the user confirmed (`superseded`); a missing digest means confirmation was never given.
75
+ function denyConfirmation(proposal, reason, expectedDigest) {
76
+ const state = reason === "confirmation-stale" ? "superseded" : "awaiting-confirmation";
77
+ return deny(reason, auditFor(proposal, {
78
+ state,
79
+ outcome: "denied",
80
+ confirmed: false,
81
+ bindingDigest: expectedDigest,
82
+ }));
83
+ }
84
+ // Deny after a valid, fresh proposal failed an existing governance gate (invalid handoff / forged token).
85
+ // The confirmation step (if any) already passed, so the audit reports `confirmed` per the proposal.
86
+ function denyGovernance(proposal, reason, expectedDigest) {
87
+ return deny(reason, auditFor(proposal, {
88
+ state: "cancelled",
89
+ outcome: "denied",
90
+ confirmed: proposal.requiresConfirmation,
91
+ bindingDigest: expectedDigest,
92
+ }));
93
+ }
94
+ // Deterministic, fail-closed decision procedure. Denies on the first failing precondition; every branch
95
+ // emits a content-free audit record. Order is normative (see ADR-0066 D4): capability → committed text →
96
+ // confirmation freshness → handoff validity → approval-token equality → allow.
97
+ export function evaluateSpokenActionGovernance(params) {
98
+ if (!voiceCanProposeAction(params.profile)) {
99
+ return deny("no-voice-capability", preProposalAudit(params, "unknown"));
100
+ }
101
+ const proposal = normalizeSpokenActionProposal(params.projection, params.profile, params.turnIndex, params.source);
102
+ if (proposal === undefined) {
103
+ return deny("no-committed-transcript", preProposalAudit(params, "unknown"));
104
+ }
105
+ const expectedDigest = createSpokenActionDigest(proposal.confirmationInput);
106
+ const confirmationDeny = checkConfirmation(proposal, params.providedConfirmationDigest, expectedDigest);
107
+ if (confirmationDeny !== undefined) {
108
+ return denyConfirmation(proposal, confirmationDeny, expectedDigest);
109
+ }
110
+ if (!validateWorkflowHandoffRequest(params.request).ok) {
111
+ return denyGovernance(proposal, "invalid-handoff-request", expectedDigest);
112
+ }
113
+ if (params.request.userApprovalToken !== createApprovalToken(approvalTokenInputFor(params.request))) {
114
+ return denyGovernance(proposal, "approval-token-mismatch", expectedDigest);
115
+ }
116
+ return {
117
+ allowed: true,
118
+ request: params.request,
119
+ audit: auditFor(proposal, {
120
+ state: "routed",
121
+ outcome: "routed",
122
+ confirmed: proposal.requiresConfirmation,
123
+ bindingDigest: expectedDigest,
124
+ }),
125
+ };
126
+ }
@@ -0,0 +1,6 @@
1
+ import type { HandlerOutcome, RouteContext, RouteResult } from "./routes.js";
2
+ import type { UiHandlerDeps } from "./deps.js";
3
+ export declare function handleVoiceTranscribe(ctx: RouteContext, deps: UiHandlerDeps): Promise<RouteResult>;
4
+ export declare function handleVoiceSpeak(ctx: RouteContext, deps: UiHandlerDeps): Promise<RouteResult>;
5
+ export declare function handleVoiceSpeakStream(ctx: RouteContext, deps: UiHandlerDeps): Promise<HandlerOutcome>;
6
+ //# sourceMappingURL=voice-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-handlers.d.ts","sourceRoot":"","sources":["../src/voice-handlers.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AA+U/C,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CAkBtB;AAyPD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CAUtB;AA8DD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,cAAc,CAAC,CAkBzB"}