@xfey/tutti 0.1.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 (564) hide show
  1. package/README.md +50 -0
  2. package/dist/approvals/index.d.ts +3 -0
  3. package/dist/approvals/index.js +3 -0
  4. package/dist/approvals/manager.d.ts +47 -0
  5. package/dist/approvals/manager.js +180 -0
  6. package/dist/approvals/projections.d.ts +34 -0
  7. package/dist/approvals/projections.js +444 -0
  8. package/dist/artifacts/index.d.ts +4 -0
  9. package/dist/artifacts/index.js +4 -0
  10. package/dist/artifacts/manifest.d.ts +48 -0
  11. package/dist/artifacts/manifest.js +334 -0
  12. package/dist/artifacts/preview-runtime.d.ts +97 -0
  13. package/dist/artifacts/preview-runtime.js +585 -0
  14. package/dist/artifacts/static-preview.d.ts +17 -0
  15. package/dist/artifacts/static-preview.js +180 -0
  16. package/dist/chat-assistant/index.d.ts +66 -0
  17. package/dist/chat-assistant/index.js +268 -0
  18. package/dist/checks/index.d.ts +47 -0
  19. package/dist/checks/index.js +169 -0
  20. package/dist/collaboration-state/clarification-messages.d.ts +8 -0
  21. package/dist/collaboration-state/clarification-messages.js +180 -0
  22. package/dist/collaboration-state/clarification-records.d.ts +27 -0
  23. package/dist/collaboration-state/clarification-records.js +266 -0
  24. package/dist/collaboration-state/clarification-round-writes.d.ts +14 -0
  25. package/dist/collaboration-state/clarification-round-writes.js +58 -0
  26. package/dist/collaboration-state/clarification-rounds.d.ts +19 -0
  27. package/dist/collaboration-state/clarification-rounds.js +347 -0
  28. package/dist/collaboration-state/clarification-successors.d.ts +8 -0
  29. package/dist/collaboration-state/clarification-successors.js +318 -0
  30. package/dist/collaboration-state/execution-status.d.ts +3 -0
  31. package/dist/collaboration-state/execution-status.js +8 -0
  32. package/dist/collaboration-state/index.d.ts +17 -0
  33. package/dist/collaboration-state/index.js +16 -0
  34. package/dist/collaboration-state/messages.d.ts +25 -0
  35. package/dist/collaboration-state/messages.js +371 -0
  36. package/dist/collaboration-state/read-state.d.ts +7 -0
  37. package/dist/collaboration-state/read-state.js +136 -0
  38. package/dist/collaboration-state/recovery.d.ts +6 -0
  39. package/dist/collaboration-state/recovery.js +125 -0
  40. package/dist/collaboration-state/run-recording.d.ts +5 -0
  41. package/dist/collaboration-state/run-recording.js +216 -0
  42. package/dist/collaboration-state/run-results.d.ts +12 -0
  43. package/dist/collaboration-state/run-results.js +202 -0
  44. package/dist/collaboration-state/scratchpad-source-state.d.ts +46 -0
  45. package/dist/collaboration-state/scratchpad-source-state.js +207 -0
  46. package/dist/collaboration-state/scratchpad.d.ts +8 -0
  47. package/dist/collaboration-state/scratchpad.js +84 -0
  48. package/dist/collaboration-state/serialization.d.ts +16 -0
  49. package/dist/collaboration-state/serialization.js +71 -0
  50. package/dist/collaboration-state/storage-types.d.ts +136 -0
  51. package/dist/collaboration-state/storage-types.js +2 -0
  52. package/dist/collaboration-state/task-details.d.ts +5 -0
  53. package/dist/collaboration-state/task-details.js +25 -0
  54. package/dist/collaboration-state/types.d.ts +289 -0
  55. package/dist/collaboration-state/types.js +2 -0
  56. package/dist/collaboration-state/worklist.d.ts +11 -0
  57. package/dist/collaboration-state/worklist.js +286 -0
  58. package/dist/control-plane/clarification-commands.d.ts +34 -0
  59. package/dist/control-plane/clarification-commands.js +106 -0
  60. package/dist/control-plane/command-recovery.d.ts +3 -0
  61. package/dist/control-plane/command-recovery.js +79 -0
  62. package/dist/control-plane/context-sync.d.ts +47 -0
  63. package/dist/control-plane/context-sync.js +207 -0
  64. package/dist/control-plane/event-publishers.d.ts +24 -0
  65. package/dist/control-plane/event-publishers.js +192 -0
  66. package/dist/control-plane/execution-status.d.ts +13 -0
  67. package/dist/control-plane/execution-status.js +130 -0
  68. package/dist/control-plane/follow-up-context.d.ts +27 -0
  69. package/dist/control-plane/follow-up-context.js +93 -0
  70. package/dist/control-plane/follow-up-output.d.ts +53 -0
  71. package/dist/control-plane/follow-up-output.js +141 -0
  72. package/dist/control-plane/follow-up-run.d.ts +22 -0
  73. package/dist/control-plane/follow-up-run.js +90 -0
  74. package/dist/control-plane/follow-up-start.d.ts +26 -0
  75. package/dist/control-plane/follow-up-start.js +101 -0
  76. package/dist/control-plane/formatters.d.ts +12 -0
  77. package/dist/control-plane/formatters.js +47 -0
  78. package/dist/control-plane/index.d.ts +62 -0
  79. package/dist/control-plane/index.js +416 -0
  80. package/dist/control-plane/invalidations.d.ts +12 -0
  81. package/dist/control-plane/invalidations.js +67 -0
  82. package/dist/control-plane/procedure-logging.d.ts +11 -0
  83. package/dist/control-plane/procedure-logging.js +95 -0
  84. package/dist/control-plane/project-brief-refresh.d.ts +31 -0
  85. package/dist/control-plane/project-brief-refresh.js +105 -0
  86. package/dist/control-plane/project-context-bootstrap.d.ts +39 -0
  87. package/dist/control-plane/project-context-bootstrap.js +107 -0
  88. package/dist/control-plane/reference-summary-refresh.d.ts +22 -0
  89. package/dist/control-plane/reference-summary-refresh.js +344 -0
  90. package/dist/control-plane/run-lineage.d.ts +8 -0
  91. package/dist/control-plane/run-lineage.js +13 -0
  92. package/dist/control-plane/run-result-recording.d.ts +46 -0
  93. package/dist/control-plane/run-result-recording.js +81 -0
  94. package/dist/control-plane/run-scheduler.d.ts +35 -0
  95. package/dist/control-plane/run-scheduler.js +110 -0
  96. package/dist/control-plane/run-start.d.ts +30 -0
  97. package/dist/control-plane/run-start.js +167 -0
  98. package/dist/control-plane/scratchpad-auto-refresh.d.ts +32 -0
  99. package/dist/control-plane/scratchpad-auto-refresh.js +150 -0
  100. package/dist/control-plane/scratchpad-refresh-start.d.ts +60 -0
  101. package/dist/control-plane/scratchpad-refresh-start.js +240 -0
  102. package/dist/control-plane/scratchpad-refresh.d.ts +29 -0
  103. package/dist/control-plane/scratchpad-refresh.js +55 -0
  104. package/dist/control-plane/scratchpad-source-messages.d.ts +10 -0
  105. package/dist/control-plane/scratchpad-source-messages.js +131 -0
  106. package/dist/control-plane/startup-recovery.d.ts +19 -0
  107. package/dist/control-plane/startup-recovery.js +113 -0
  108. package/dist/control-plane/task-compile-continuation.d.ts +25 -0
  109. package/dist/control-plane/task-compile-continuation.js +127 -0
  110. package/dist/control-plane/task-compile-output.d.ts +29 -0
  111. package/dist/control-plane/task-compile-output.js +122 -0
  112. package/dist/control-plane/task-compile-start.d.ts +43 -0
  113. package/dist/control-plane/task-compile-start.js +280 -0
  114. package/dist/control-plane/task-proposal.d.ts +3 -0
  115. package/dist/control-plane/task-proposal.js +37 -0
  116. package/dist/control-plane/types.d.ts +155 -0
  117. package/dist/control-plane/types.js +2 -0
  118. package/dist/control-plane/workflows/index.d.ts +4 -0
  119. package/dist/control-plane/workflows/index.js +4 -0
  120. package/dist/control-plane/workflows/openai.d.ts +34 -0
  121. package/dist/control-plane/workflows/openai.js +411 -0
  122. package/dist/control-plane/workflows/structured-output-schemas.d.ts +9 -0
  123. package/dist/control-plane/workflows/structured-output-schemas.js +289 -0
  124. package/dist/control-plane/workflows/structured-output-validators.d.ts +15 -0
  125. package/dist/control-plane/workflows/structured-output-validators.js +295 -0
  126. package/dist/control-plane/workflows/structured-output.d.ts +3 -0
  127. package/dist/control-plane/workflows/structured-output.js +3 -0
  128. package/dist/control-plane/workflows/types.d.ts +274 -0
  129. package/dist/control-plane/workflows/types.js +2 -0
  130. package/dist/control-plane/worklist-terminal-feedback.d.ts +15 -0
  131. package/dist/control-plane/worklist-terminal-feedback.js +135 -0
  132. package/dist/index.d.ts +2 -0
  133. package/dist/index.js +32 -0
  134. package/dist/procedure-engine/index.d.ts +56 -0
  135. package/dist/procedure-engine/index.js +163 -0
  136. package/dist/project-brief/index.d.ts +4 -0
  137. package/dist/project-brief/index.js +3 -0
  138. package/dist/project-brief/repository.d.ts +5 -0
  139. package/dist/project-brief/repository.js +97 -0
  140. package/dist/project-brief/source.d.ts +8 -0
  141. package/dist/project-brief/source.js +75 -0
  142. package/dist/project-brief/types.d.ts +40 -0
  143. package/dist/project-brief/types.js +2 -0
  144. package/dist/project-docs/context.d.ts +34 -0
  145. package/dist/project-docs/context.js +86 -0
  146. package/dist/project-timeline/index.d.ts +20 -0
  147. package/dist/project-timeline/index.js +100 -0
  148. package/dist/prompt-templates/index.d.ts +13 -0
  149. package/dist/prompt-templates/index.js +86 -0
  150. package/dist/provider-usage/index.d.ts +37 -0
  151. package/dist/provider-usage/index.js +227 -0
  152. package/dist/providers/index.d.ts +2 -0
  153. package/dist/providers/index.js +2 -0
  154. package/dist/providers/openai/app-server/json-rpc.d.ts +71 -0
  155. package/dist/providers/openai/app-server/json-rpc.js +298 -0
  156. package/dist/providers/openai/app-server/permission-profile.d.ts +64 -0
  157. package/dist/providers/openai/app-server/permission-profile.js +67 -0
  158. package/dist/providers/openai/app-server/provider-config.d.ts +10 -0
  159. package/dist/providers/openai/app-server/provider-config.js +39 -0
  160. package/dist/providers/openai/app-server/read-only-procedure.d.ts +68 -0
  161. package/dist/providers/openai/app-server/read-only-procedure.js +293 -0
  162. package/dist/providers/openai/app-server/runtime-helpers.d.ts +20 -0
  163. package/dist/providers/openai/app-server/runtime-helpers.js +151 -0
  164. package/dist/providers/openai/app-server/skills.d.ts +82 -0
  165. package/dist/providers/openai/app-server/skills.js +222 -0
  166. package/dist/providers/openai/app-server/smoke-cli.d.ts +2 -0
  167. package/dist/providers/openai/app-server/smoke-cli.js +42 -0
  168. package/dist/providers/openai/app-server/smoke-helpers.d.ts +19 -0
  169. package/dist/providers/openai/app-server/smoke-helpers.js +125 -0
  170. package/dist/providers/openai/app-server/smoke-provider-input.d.ts +6 -0
  171. package/dist/providers/openai/app-server/smoke-provider-input.js +20 -0
  172. package/dist/providers/openai/app-server/smoke-types.d.ts +49 -0
  173. package/dist/providers/openai/app-server/smoke-types.js +20 -0
  174. package/dist/providers/openai/app-server/smoke.d.ts +9 -0
  175. package/dist/providers/openai/app-server/smoke.js +157 -0
  176. package/dist/providers/openai/app-server/workspace-write-run.d.ts +87 -0
  177. package/dist/providers/openai/app-server/workspace-write-run.js +379 -0
  178. package/dist/providers/openai/chat-assistant.d.ts +34 -0
  179. package/dist/providers/openai/chat-assistant.js +72 -0
  180. package/dist/providers/openai/codex-app-server.d.ts +126 -0
  181. package/dist/providers/openai/codex-app-server.js +147 -0
  182. package/dist/providers/openai/credential-store.d.ts +31 -0
  183. package/dist/providers/openai/credential-store.js +143 -0
  184. package/dist/providers/openai/credential-validation.d.ts +45 -0
  185. package/dist/providers/openai/credential-validation.js +190 -0
  186. package/dist/providers/openai/index.d.ts +13 -0
  187. package/dist/providers/openai/index.js +13 -0
  188. package/dist/providers/openai/machine-local-files.d.ts +19 -0
  189. package/dist/providers/openai/machine-local-files.js +55 -0
  190. package/dist/providers/openai/model-config.d.ts +4 -0
  191. package/dist/providers/openai/model-config.js +4 -0
  192. package/dist/providers/openai/provider-config-errors.d.ts +6 -0
  193. package/dist/providers/openai/provider-config-errors.js +13 -0
  194. package/dist/providers/openai/provider-config-shape.d.ts +3 -0
  195. package/dist/providers/openai/provider-config-shape.js +108 -0
  196. package/dist/providers/openai/provider-config-toml.d.ts +13 -0
  197. package/dist/providers/openai/provider-config-toml.js +113 -0
  198. package/dist/providers/openai/provider-config.d.ts +73 -0
  199. package/dist/providers/openai/provider-config.js +117 -0
  200. package/dist/providers/openai/provider-setup.d.ts +31 -0
  201. package/dist/providers/openai/provider-setup.js +88 -0
  202. package/dist/providers/openai/sdk-procedure-runner.d.ts +70 -0
  203. package/dist/providers/openai/sdk-procedure-runner.js +123 -0
  204. package/dist/providers/openai/token-usage.d.ts +11 -0
  205. package/dist/providers/openai/token-usage.js +90 -0
  206. package/dist/run-engine/index.d.ts +61 -0
  207. package/dist/run-engine/index.js +140 -0
  208. package/dist/run-pipeline/candidate-diff.d.ts +3 -0
  209. package/dist/run-pipeline/candidate-diff.js +10 -0
  210. package/dist/run-pipeline/openai.d.ts +41 -0
  211. package/dist/run-pipeline/openai.js +548 -0
  212. package/dist/run-pipeline/promotion-reconcile.d.ts +13 -0
  213. package/dist/run-pipeline/promotion-reconcile.js +138 -0
  214. package/dist/run-pipeline/result-projections.d.ts +39 -0
  215. package/dist/run-pipeline/result-projections.js +115 -0
  216. package/dist/run-pipeline/task-run-invocation.d.ts +6 -0
  217. package/dist/run-pipeline/task-run-invocation.js +130 -0
  218. package/dist/run-pipeline/task-run-output.d.ts +38 -0
  219. package/dist/run-pipeline/task-run-output.js +146 -0
  220. package/dist/server-shell/cli/args.d.ts +7 -0
  221. package/dist/server-shell/cli/args.js +30 -0
  222. package/dist/server-shell/cli/cli.d.ts +3 -0
  223. package/dist/server-shell/cli/cli.js +57 -0
  224. package/dist/server-shell/cli/errors.d.ts +9 -0
  225. package/dist/server-shell/cli/errors.js +53 -0
  226. package/dist/server-shell/cli/git-bootstrap.d.ts +24 -0
  227. package/dist/server-shell/cli/git-bootstrap.js +246 -0
  228. package/dist/server-shell/cli/host-lifecycle.d.ts +45 -0
  229. package/dist/server-shell/cli/host-lifecycle.js +298 -0
  230. package/dist/server-shell/cli/host-relay-status.d.ts +6 -0
  231. package/dist/server-shell/cli/host-relay-status.js +43 -0
  232. package/dist/server-shell/cli/host-runtime-endpoint.d.ts +22 -0
  233. package/dist/server-shell/cli/host-runtime-endpoint.js +120 -0
  234. package/dist/server-shell/cli/host-server-runtime.d.ts +30 -0
  235. package/dist/server-shell/cli/host-server-runtime.js +432 -0
  236. package/dist/server-shell/cli/index.d.ts +8 -0
  237. package/dist/server-shell/cli/index.js +8 -0
  238. package/dist/server-shell/cli/launch.d.ts +45 -0
  239. package/dist/server-shell/cli/launch.js +115 -0
  240. package/dist/server-shell/cli/machine-local.d.ts +69 -0
  241. package/dist/server-shell/cli/machine-local.js +223 -0
  242. package/dist/server-shell/cli/project-identity.d.ts +20 -0
  243. package/dist/server-shell/cli/project-identity.js +87 -0
  244. package/dist/server-shell/cli/relay-registration.d.ts +31 -0
  245. package/dist/server-shell/cli/relay-registration.js +61 -0
  246. package/dist/server-shell/command-idempotency/index.d.ts +44 -0
  247. package/dist/server-shell/command-idempotency/index.js +155 -0
  248. package/dist/server-shell/dev-runner/cli.d.ts +2 -0
  249. package/dist/server-shell/dev-runner/cli.js +10 -0
  250. package/dist/server-shell/dev-runner/config.d.ts +38 -0
  251. package/dist/server-shell/dev-runner/config.js +277 -0
  252. package/dist/server-shell/dev-runner/host-cli.d.ts +2 -0
  253. package/dist/server-shell/dev-runner/host-cli.js +22 -0
  254. package/dist/server-shell/dev-runner/index.d.ts +3 -0
  255. package/dist/server-shell/dev-runner/index.js +3 -0
  256. package/dist/server-shell/dev-runner/runner.d.ts +30 -0
  257. package/dist/server-shell/dev-runner/runner.js +236 -0
  258. package/dist/server-shell/http/create-server.d.ts +18 -0
  259. package/dist/server-shell/http/create-server.js +51 -0
  260. package/dist/server-shell/http/host-tunnel.d.ts +15 -0
  261. package/dist/server-shell/http/host-tunnel.js +154 -0
  262. package/dist/server-shell/http/logger.d.ts +7 -0
  263. package/dist/server-shell/http/logger.js +19 -0
  264. package/dist/server-shell/http/routes/agent-context-auth.d.ts +41 -0
  265. package/dist/server-shell/http/routes/agent-context-auth.js +73 -0
  266. package/dist/server-shell/http/routes/agent-context-errors.d.ts +6 -0
  267. package/dist/server-shell/http/routes/agent-context-errors.js +9 -0
  268. package/dist/server-shell/http/routes/agent-context-messages-routes.d.ts +4 -0
  269. package/dist/server-shell/http/routes/agent-context-messages-routes.js +74 -0
  270. package/dist/server-shell/http/routes/agent-context-project-doc-routes.d.ts +4 -0
  271. package/dist/server-shell/http/routes/agent-context-project-doc-routes.js +86 -0
  272. package/dist/server-shell/http/routes/agent-context-project-docs.d.ts +40 -0
  273. package/dist/server-shell/http/routes/agent-context-project-docs.js +98 -0
  274. package/dist/server-shell/http/routes/agent-context-query.d.ts +31 -0
  275. package/dist/server-shell/http/routes/agent-context-query.js +72 -0
  276. package/dist/server-shell/http/routes/agent-context-reference-routes.d.ts +4 -0
  277. package/dist/server-shell/http/routes/agent-context-reference-routes.js +82 -0
  278. package/dist/server-shell/http/routes/agent-context-references.d.ts +21 -0
  279. package/dist/server-shell/http/routes/agent-context-references.js +85 -0
  280. package/dist/server-shell/http/routes/agent-context-shared.d.ts +34 -0
  281. package/dist/server-shell/http/routes/agent-context-shared.js +44 -0
  282. package/dist/server-shell/http/routes/agent-context-skills-routes.d.ts +4 -0
  283. package/dist/server-shell/http/routes/agent-context-skills-routes.js +85 -0
  284. package/dist/server-shell/http/routes/agent-context-workspace-routes.d.ts +4 -0
  285. package/dist/server-shell/http/routes/agent-context-workspace-routes.js +130 -0
  286. package/dist/server-shell/http/routes/agent-context.d.ts +8 -0
  287. package/dist/server-shell/http/routes/agent-context.js +16 -0
  288. package/dist/server-shell/http/routes/health.d.ts +7 -0
  289. package/dist/server-shell/http/routes/health.js +41 -0
  290. package/dist/server-shell/http/routes/local-control.d.ts +40 -0
  291. package/dist/server-shell/http/routes/local-control.js +260 -0
  292. package/dist/server-shell/http/routes/project-api/approval-routes.d.ts +4 -0
  293. package/dist/server-shell/http/routes/project-api/approval-routes.js +64 -0
  294. package/dist/server-shell/http/routes/project-api/artifacts-routes.d.ts +8 -0
  295. package/dist/server-shell/http/routes/project-api/artifacts-routes.js +166 -0
  296. package/dist/server-shell/http/routes/project-api/clarification-routes.d.ts +4 -0
  297. package/dist/server-shell/http/routes/project-api/clarification-routes.js +150 -0
  298. package/dist/server-shell/http/routes/project-api/constants.d.ts +3 -0
  299. package/dist/server-shell/http/routes/project-api/constants.js +3 -0
  300. package/dist/server-shell/http/routes/project-api/errors.d.ts +26 -0
  301. package/dist/server-shell/http/routes/project-api/errors.js +41 -0
  302. package/dist/server-shell/http/routes/project-api/events-stream.d.ts +11 -0
  303. package/dist/server-shell/http/routes/project-api/events-stream.js +55 -0
  304. package/dist/server-shell/http/routes/project-api/execution-routes.d.ts +4 -0
  305. package/dist/server-shell/http/routes/project-api/execution-routes.js +92 -0
  306. package/dist/server-shell/http/routes/project-api/headers.d.ts +2 -0
  307. package/dist/server-shell/http/routes/project-api/headers.js +7 -0
  308. package/dist/server-shell/http/routes/project-api/invalidations.d.ts +10 -0
  309. package/dist/server-shell/http/routes/project-api/invalidations.js +57 -0
  310. package/dist/server-shell/http/routes/project-api/messages-routes.d.ts +8 -0
  311. package/dist/server-shell/http/routes/project-api/messages-routes.js +80 -0
  312. package/dist/server-shell/http/routes/project-api/openapi-approval-routes.d.ts +128 -0
  313. package/dist/server-shell/http/routes/project-api/openapi-approval-routes.js +32 -0
  314. package/dist/server-shell/http/routes/project-api/openapi-artifacts-routes.d.ts +51 -0
  315. package/dist/server-shell/http/routes/project-api/openapi-artifacts-routes.js +56 -0
  316. package/dist/server-shell/http/routes/project-api/openapi-collaboration-routes.d.ts +466 -0
  317. package/dist/server-shell/http/routes/project-api/openapi-collaboration-routes.js +165 -0
  318. package/dist/server-shell/http/routes/project-api/openapi-diagnostic-routes.d.ts +16 -0
  319. package/dist/server-shell/http/routes/project-api/openapi-diagnostic-routes.js +17 -0
  320. package/dist/server-shell/http/routes/project-api/openapi-execution-routes.d.ts +215 -0
  321. package/dist/server-shell/http/routes/project-api/openapi-execution-routes.js +75 -0
  322. package/dist/server-shell/http/routes/project-api/openapi-path-parameters.d.ts +9 -0
  323. package/dist/server-shell/http/routes/project-api/openapi-path-parameters.js +18 -0
  324. package/dist/server-shell/http/routes/project-api/openapi-skills-routes.d.ts +60 -0
  325. package/dist/server-shell/http/routes/project-api/openapi-skills-routes.js +51 -0
  326. package/dist/server-shell/http/routes/project-api/openapi-timeline-routes.d.ts +115 -0
  327. package/dist/server-shell/http/routes/project-api/openapi-timeline-routes.js +17 -0
  328. package/dist/server-shell/http/routes/project-api/openapi-viewer-routes.d.ts +323 -0
  329. package/dist/server-shell/http/routes/project-api/openapi-viewer-routes.js +120 -0
  330. package/dist/server-shell/http/routes/project-api/openapi-workspace-routes.d.ts +1317 -0
  331. package/dist/server-shell/http/routes/project-api/openapi-workspace-routes.js +95 -0
  332. package/dist/server-shell/http/routes/project-api/openapi.d.ts +2457 -0
  333. package/dist/server-shell/http/routes/project-api/openapi.js +30 -0
  334. package/dist/server-shell/http/routes/project-api/payload-validation.d.ts +6 -0
  335. package/dist/server-shell/http/routes/project-api/payload-validation.js +36 -0
  336. package/dist/server-shell/http/routes/project-api/project-docs-helpers.d.ts +9 -0
  337. package/dist/server-shell/http/routes/project-api/project-docs-helpers.js +17 -0
  338. package/dist/server-shell/http/routes/project-api/project-docs-routes.d.ts +8 -0
  339. package/dist/server-shell/http/routes/project-api/project-docs-routes.js +151 -0
  340. package/dist/server-shell/http/routes/project-api/project-timeline-projection.d.ts +8 -0
  341. package/dist/server-shell/http/routes/project-api/project-timeline-projection.js +658 -0
  342. package/dist/server-shell/http/routes/project-api/project-timeline-routes.d.ts +4 -0
  343. package/dist/server-shell/http/routes/project-api/project-timeline-routes.js +23 -0
  344. package/dist/server-shell/http/routes/project-api/read-state-routes.d.ts +8 -0
  345. package/dist/server-shell/http/routes/project-api/read-state-routes.js +82 -0
  346. package/dist/server-shell/http/routes/project-api/reference-files-routes.d.ts +8 -0
  347. package/dist/server-shell/http/routes/project-api/reference-files-routes.js +184 -0
  348. package/dist/server-shell/http/routes/project-api/reference-files.d.ts +17 -0
  349. package/dist/server-shell/http/routes/project-api/reference-files.js +212 -0
  350. package/dist/server-shell/http/routes/project-api/repo-projection.d.ts +3 -0
  351. package/dist/server-shell/http/routes/project-api/repo-projection.js +58 -0
  352. package/dist/server-shell/http/routes/project-api/schemas.d.ts +1351 -0
  353. package/dist/server-shell/http/routes/project-api/schemas.js +441 -0
  354. package/dist/server-shell/http/routes/project-api/session-requirements.d.ts +10 -0
  355. package/dist/server-shell/http/routes/project-api/session-requirements.js +60 -0
  356. package/dist/server-shell/http/routes/project-api/skills-helpers.d.ts +7 -0
  357. package/dist/server-shell/http/routes/project-api/skills-helpers.js +48 -0
  358. package/dist/server-shell/http/routes/project-api/skills-routes.d.ts +8 -0
  359. package/dist/server-shell/http/routes/project-api/skills-routes.js +185 -0
  360. package/dist/server-shell/http/routes/project-api/staged-uploads.d.ts +14 -0
  361. package/dist/server-shell/http/routes/project-api/staged-uploads.js +149 -0
  362. package/dist/server-shell/http/routes/project-api/system-routes.d.ts +8 -0
  363. package/dist/server-shell/http/routes/project-api/system-routes.js +141 -0
  364. package/dist/server-shell/http/routes/project-api/types.d.ts +137 -0
  365. package/dist/server-shell/http/routes/project-api/types.js +2 -0
  366. package/dist/server-shell/http/routes/project-api/viewer-projections.d.ts +17 -0
  367. package/dist/server-shell/http/routes/project-api/viewer-projections.js +102 -0
  368. package/dist/server-shell/http/routes/project-api/viewer-routes.d.ts +4 -0
  369. package/dist/server-shell/http/routes/project-api/viewer-routes.js +100 -0
  370. package/dist/server-shell/http/routes/project-api/workflow-routes.d.ts +4 -0
  371. package/dist/server-shell/http/routes/project-api/workflow-routes.js +85 -0
  372. package/dist/server-shell/http/routes/project-api/workspace-projections.d.ts +5 -0
  373. package/dist/server-shell/http/routes/project-api/workspace-projections.js +103 -0
  374. package/dist/server-shell/http/routes/project-api.d.ts +8 -0
  375. package/dist/server-shell/http/routes/project-api.js +34 -0
  376. package/dist/server-shell/http/sse-replay-buffer.d.ts +54 -0
  377. package/dist/server-shell/http/sse-replay-buffer.js +110 -0
  378. package/dist/server-shell/http/sse.d.ts +12 -0
  379. package/dist/server-shell/http/sse.js +22 -0
  380. package/dist/server-shell/http/static-web.d.ts +6 -0
  381. package/dist/server-shell/http/static-web.js +52 -0
  382. package/dist/server-shell/http/validation.d.ts +13 -0
  383. package/dist/server-shell/http/validation.js +136 -0
  384. package/dist/server-shell/http/workspace-events.d.ts +38 -0
  385. package/dist/server-shell/http/workspace-events.js +98 -0
  386. package/dist/server-shell/session/relay-session-context.d.ts +25 -0
  387. package/dist/server-shell/session/relay-session-context.js +49 -0
  388. package/dist/server-shell/smoke/e2e-client.d.ts +59 -0
  389. package/dist/server-shell/smoke/e2e-client.js +304 -0
  390. package/dist/server-shell/smoke/index.d.ts +2 -0
  391. package/dist/server-shell/smoke/index.js +2 -0
  392. package/dist/skills/constants.d.ts +8 -0
  393. package/dist/skills/constants.js +9 -0
  394. package/dist/skills/errors.d.ts +6 -0
  395. package/dist/skills/errors.js +9 -0
  396. package/dist/skills/index.d.ts +41 -0
  397. package/dist/skills/index.js +171 -0
  398. package/dist/skills/metadata.d.ts +8 -0
  399. package/dist/skills/metadata.js +80 -0
  400. package/dist/skills/zip-import.d.ts +18 -0
  401. package/dist/skills/zip-import.js +241 -0
  402. package/dist/store/command-recovery.d.ts +26 -0
  403. package/dist/store/command-recovery.js +71 -0
  404. package/dist/store/index.d.ts +6 -0
  405. package/dist/store/index.js +6 -0
  406. package/dist/store/lifecycle.d.ts +23 -0
  407. package/dist/store/lifecycle.js +53 -0
  408. package/dist/store/metadata.d.ts +18 -0
  409. package/dist/store/metadata.js +30 -0
  410. package/dist/store/migrations.d.ts +20 -0
  411. package/dist/store/migrations.js +76 -0
  412. package/dist/store/sqlite.d.ts +11 -0
  413. package/dist/store/sqlite.js +21 -0
  414. package/dist/workspace-ops/constants.d.ts +15 -0
  415. package/dist/workspace-ops/constants.js +20 -0
  416. package/dist/workspace-ops/errors.d.ts +8 -0
  417. package/dist/workspace-ops/errors.js +33 -0
  418. package/dist/workspace-ops/git.d.ts +13 -0
  419. package/dist/workspace-ops/git.js +53 -0
  420. package/dist/workspace-ops/index.d.ts +11 -0
  421. package/dist/workspace-ops/index.js +9 -0
  422. package/dist/workspace-ops/mainline.d.ts +2 -0
  423. package/dist/workspace-ops/mainline.js +16 -0
  424. package/dist/workspace-ops/project-doc-templates.d.ts +12 -0
  425. package/dist/workspace-ops/project-doc-templates.js +180 -0
  426. package/dist/workspace-ops/project-docs.d.ts +7 -0
  427. package/dist/workspace-ops/project-docs.js +156 -0
  428. package/dist/workspace-ops/reference-files.d.ts +3 -0
  429. package/dist/workspace-ops/reference-files.js +137 -0
  430. package/dist/workspace-ops/reference-metadata.d.ts +13 -0
  431. package/dist/workspace-ops/reference-metadata.js +86 -0
  432. package/dist/workspace-ops/reference-summaries.d.ts +17 -0
  433. package/dist/workspace-ops/reference-summaries.js +298 -0
  434. package/dist/workspace-ops/run-workspaces.d.ts +18 -0
  435. package/dist/workspace-ops/run-workspaces.js +271 -0
  436. package/dist/workspace-ops/types.d.ts +219 -0
  437. package/dist/workspace-ops/types.js +2 -0
  438. package/dist/workspace-ops/viewer-file.d.ts +4 -0
  439. package/dist/workspace-ops/viewer-file.js +207 -0
  440. package/dist/workspace-ops/viewer-git.d.ts +20 -0
  441. package/dist/workspace-ops/viewer-git.js +111 -0
  442. package/dist/workspace-ops/viewer-paths.d.ts +3 -0
  443. package/dist/workspace-ops/viewer-paths.js +13 -0
  444. package/dist/workspace-ops/viewer-tree.d.ts +9 -0
  445. package/dist/workspace-ops/viewer-tree.js +144 -0
  446. package/dist/workspace-ops/viewer.d.ts +5 -0
  447. package/dist/workspace-ops/viewer.js +5 -0
  448. package/migrations/0001_init.sql +674 -0
  449. package/migrations/0002_allow_sealed_round_successor_note.sql +14 -0
  450. package/migrations/0003_drop_scratchpad_source_message_refs.sql +1 -0
  451. package/migrations/0004_read_state.sql +109 -0
  452. package/migrations/0005_provider_usage.sql +15 -0
  453. package/migrations/0006_scratchpad_source_state.sql +29 -0
  454. package/migrations/0007_workspace_signal_read_state_scopes.sql +74 -0
  455. package/migrations/0008_provider_usage_anchors.sql +32 -0
  456. package/migrations/0009_project_timeline_events.sql +33 -0
  457. package/migrations/0010_project_brief.sql +13 -0
  458. package/migrations/0011_message_author_avatar.sql +5 -0
  459. package/migrations/README.md +44 -0
  460. package/node_modules/@tutti/relay-client/dist/host-control.d.ts +164 -0
  461. package/node_modules/@tutti/relay-client/dist/host-control.js +284 -0
  462. package/node_modules/@tutti/relay-client/dist/index.d.ts +3 -0
  463. package/node_modules/@tutti/relay-client/dist/index.js +3 -0
  464. package/node_modules/@tutti/relay-client/dist/tunnel-frames.d.ts +8 -0
  465. package/node_modules/@tutti/relay-client/dist/tunnel-frames.js +124 -0
  466. package/node_modules/@tutti/relay-client/dist/tunnel-types.d.ts +61 -0
  467. package/node_modules/@tutti/relay-client/dist/tunnel-types.js +2 -0
  468. package/node_modules/@tutti/relay-client/dist/tunnel.d.ts +4 -0
  469. package/node_modules/@tutti/relay-client/dist/tunnel.js +144 -0
  470. package/node_modules/@tutti/relay-client/package.json +18 -0
  471. package/node_modules/@tutti/shared/dist/domain/index.d.ts +59 -0
  472. package/node_modules/@tutti/shared/dist/domain/index.js +37 -0
  473. package/node_modules/@tutti/shared/dist/ids/index.d.ts +85 -0
  474. package/node_modules/@tutti/shared/dist/ids/index.js +88 -0
  475. package/node_modules/@tutti/shared/dist/index.d.ts +6 -0
  476. package/node_modules/@tutti/shared/dist/index.js +6 -0
  477. package/node_modules/@tutti/shared/dist/schemas/api/approvals.d.ts +307 -0
  478. package/node_modules/@tutti/shared/dist/schemas/api/approvals.js +110 -0
  479. package/node_modules/@tutti/shared/dist/schemas/api/artifacts.d.ts +173 -0
  480. package/node_modules/@tutti/shared/dist/schemas/api/artifacts.js +107 -0
  481. package/node_modules/@tutti/shared/dist/schemas/api/clarifications.d.ts +704 -0
  482. package/node_modules/@tutti/shared/dist/schemas/api/clarifications.js +224 -0
  483. package/node_modules/@tutti/shared/dist/schemas/api/index.d.ts +18 -0
  484. package/node_modules/@tutti/shared/dist/schemas/api/index.js +17 -0
  485. package/node_modules/@tutti/shared/dist/schemas/api/messages.d.ts +370 -0
  486. package/node_modules/@tutti/shared/dist/schemas/api/messages.js +134 -0
  487. package/node_modules/@tutti/shared/dist/schemas/api/openapi.d.ts +32 -0
  488. package/node_modules/@tutti/shared/dist/schemas/api/openapi.js +100 -0
  489. package/node_modules/@tutti/shared/dist/schemas/api/primitives.d.ts +109 -0
  490. package/node_modules/@tutti/shared/dist/schemas/api/primitives.js +174 -0
  491. package/node_modules/@tutti/shared/dist/schemas/api/project-timeline.d.ts +149 -0
  492. package/node_modules/@tutti/shared/dist/schemas/api/project-timeline.js +44 -0
  493. package/node_modules/@tutti/shared/dist/schemas/api/provider-config.d.ts +21 -0
  494. package/node_modules/@tutti/shared/dist/schemas/api/provider-config.js +33 -0
  495. package/node_modules/@tutti/shared/dist/schemas/api/provider-usage.d.ts +87 -0
  496. package/node_modules/@tutti/shared/dist/schemas/api/provider-usage.js +48 -0
  497. package/node_modules/@tutti/shared/dist/schemas/api/read-state.d.ts +89 -0
  498. package/node_modules/@tutti/shared/dist/schemas/api/read-state.js +39 -0
  499. package/node_modules/@tutti/shared/dist/schemas/api/runtime-events.d.ts +484 -0
  500. package/node_modules/@tutti/shared/dist/schemas/api/runtime-events.js +185 -0
  501. package/node_modules/@tutti/shared/dist/schemas/api/skills.d.ts +88 -0
  502. package/node_modules/@tutti/shared/dist/schemas/api/skills.js +71 -0
  503. package/node_modules/@tutti/shared/dist/schemas/api/types.d.ts +253 -0
  504. package/node_modules/@tutti/shared/dist/schemas/api/types.js +2 -0
  505. package/node_modules/@tutti/shared/dist/schemas/api/uploads.d.ts +103 -0
  506. package/node_modules/@tutti/shared/dist/schemas/api/uploads.js +78 -0
  507. package/node_modules/@tutti/shared/dist/schemas/api/viewer-reference.d.ts +484 -0
  508. package/node_modules/@tutti/shared/dist/schemas/api/viewer-reference.js +267 -0
  509. package/node_modules/@tutti/shared/dist/schemas/api/work-items.d.ts +264 -0
  510. package/node_modules/@tutti/shared/dist/schemas/api/work-items.js +196 -0
  511. package/node_modules/@tutti/shared/dist/schemas/api/workspace-commands.d.ts +179 -0
  512. package/node_modules/@tutti/shared/dist/schemas/api/workspace-commands.js +137 -0
  513. package/node_modules/@tutti/shared/dist/schemas/domain/index.d.ts +31 -0
  514. package/node_modules/@tutti/shared/dist/schemas/domain/index.js +49 -0
  515. package/node_modules/@tutti/shared/dist/schemas/internal/index.d.ts +46 -0
  516. package/node_modules/@tutti/shared/dist/schemas/internal/index.js +46 -0
  517. package/node_modules/@tutti/shared/dist/utils/command-idempotency/index.d.ts +40 -0
  518. package/node_modules/@tutti/shared/dist/utils/command-idempotency/index.js +100 -0
  519. package/node_modules/@tutti/shared/dist/utils/index.d.ts +5 -0
  520. package/node_modules/@tutti/shared/dist/utils/index.js +5 -0
  521. package/node_modules/@tutti/shared/dist/utils/logging/index.d.ts +34 -0
  522. package/node_modules/@tutti/shared/dist/utils/logging/index.js +130 -0
  523. package/node_modules/@tutti/shared/dist/utils/path-policy/index.d.ts +13 -0
  524. package/node_modules/@tutti/shared/dist/utils/path-policy/index.js +80 -0
  525. package/node_modules/@tutti/shared/dist/utils/redaction/index.d.ts +19 -0
  526. package/node_modules/@tutti/shared/dist/utils/redaction/index.js +158 -0
  527. package/node_modules/@tutti/shared/package.json +63 -0
  528. package/package.json +47 -0
  529. package/prompts/README.md +36 -0
  530. package/prompts/chat-assistant.md +43 -0
  531. package/prompts/codex/README.md +13 -0
  532. package/prompts/codex/no-write-smoke.md +35 -0
  533. package/prompts/procedures/README.md +38 -0
  534. package/prompts/procedures/context-sync.md +66 -0
  535. package/prompts/procedures/follow-up-check.md +83 -0
  536. package/prompts/procedures/project-brief-refresh.md +79 -0
  537. package/prompts/procedures/project-context-bootstrap.md +58 -0
  538. package/prompts/procedures/reference-file-summary.md +49 -0
  539. package/prompts/procedures/scratchpad-refresh.md +83 -0
  540. package/prompts/procedures/task-compile.md +116 -0
  541. package/prompts/prompt-flow-experiment-plan.md +203 -0
  542. package/prompts/prompt-flow-map.md +478 -0
  543. package/prompts/runs/README.md +17 -0
  544. package/prompts/runs/task-continuation.md +148 -0
  545. package/prompts/runs/task-retry.md +153 -0
  546. package/prompts/runs/task-run.md +135 -0
  547. package/prompts/skills/README.md +25 -0
  548. package/prompts/skills/read-main-chat/README.md +8 -0
  549. package/prompts/skills/read-main-chat/SKILL.md +18 -0
  550. package/prompts/skills/read-project-docs/README.md +13 -0
  551. package/prompts/skills/read-project-docs/SKILL.md +42 -0
  552. package/prompts/skills/read-references/README.md +9 -0
  553. package/prompts/skills/read-references/SKILL.md +26 -0
  554. package/prompts/skills/read-scratchpad/README.md +8 -0
  555. package/prompts/skills/read-scratchpad/SKILL.md +16 -0
  556. package/prompts/skills/read-user-skills/README.md +7 -0
  557. package/prompts/skills/read-user-skills/SKILL.md +22 -0
  558. package/prompts/skills/read-worklist/README.md +9 -0
  559. package/prompts/skills/read-worklist/SKILL.md +20 -0
  560. package/web/assets/Tutti-B7gEyTp1.png +0 -0
  561. package/web/assets/Tutti-square-BqFU7F0D.png +0 -0
  562. package/web/assets/index-CWkBgHap.js +29 -0
  563. package/web/assets/index-D8xJY8Gr.css +1 -0
  564. package/web/index.html +13 -0
@@ -0,0 +1,241 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import * as yauzl from "yauzl";
4
+ import { MAX_SKILL_DIRECTORY_DEPTH, MAX_SKILL_FILE_BYTES, MAX_SKILL_FILE_COUNT, MAX_SKILL_TOTAL_UNCOMPRESSED_BYTES, MAX_SKILL_ZIP_BYTES, SKILL_MD_FILE_NAME, } from "./constants.js";
5
+ import { SkillServiceError } from "./errors.js";
6
+ import { isValidSkillName, parseSkillMarkdown } from "./metadata.js";
7
+ const ZIP_MAGIC = Buffer.from([0x50, 0x4b, 0x03, 0x04]);
8
+ const UNIX_FILE_TYPE_MASK = 0o170000;
9
+ const UNIX_REGULAR_FILE = 0o100000;
10
+ const UNIX_DIRECTORY = 0o040000;
11
+ const UNIX_SYMLINK = 0o120000;
12
+ const INSTALL_FILE_MODE = 0o600;
13
+ const INSTALL_EXECUTABLE_FILE_MODE = 0o700;
14
+ export async function prepareUserSkillZipImport(options) {
15
+ validateZipUpload(options.zipBuffer);
16
+ if (!options.fileName.toLowerCase().endsWith(".zip")) {
17
+ throw new SkillServiceError("validation_failed", "Skill upload must be a zip file");
18
+ }
19
+ const entries = await readZipEntries(options.zipBuffer);
20
+ return buildImportCandidate(entries);
21
+ }
22
+ export function writeCandidateFiles(destinationRoot, candidate) {
23
+ mkdirSync(destinationRoot, { recursive: true, mode: 0o700 });
24
+ for (const file of candidate.files) {
25
+ const relativePath = candidate.rootPrefix === "" ? file.path : file.path.slice(candidate.rootPrefix.length + 1);
26
+ if (relativePath === "" || (relativePath === file.path && candidate.rootPrefix !== "")) {
27
+ throw new SkillServiceError("validation_failed", "Skill zip path is invalid");
28
+ }
29
+ const destination = join(destinationRoot, relativePath);
30
+ ensureInside(destinationRoot, destination);
31
+ mkdirSync(dirname(destination), { recursive: true, mode: 0o700 });
32
+ writeFileSync(destination, file.data, { mode: installModeForEntry(file.mode) });
33
+ }
34
+ }
35
+ function ensureInside(parent, child) {
36
+ const parentPath = resolve(parent);
37
+ const childPath = resolve(child);
38
+ if (childPath !== parentPath && !childPath.startsWith(`${parentPath}/`)) {
39
+ throw new SkillServiceError("validation_failed", "Skill path is invalid");
40
+ }
41
+ }
42
+ function toError(error) {
43
+ return error instanceof Error ? error : new Error(String(error));
44
+ }
45
+ function validateZipUpload(zipBuffer) {
46
+ if (zipBuffer.byteLength === 0 || zipBuffer.byteLength > MAX_SKILL_ZIP_BYTES) {
47
+ throw new SkillServiceError("invalid_zip", "Skill zip is invalid");
48
+ }
49
+ if (zipBuffer.subarray(0, 4).compare(ZIP_MAGIC) !== 0) {
50
+ throw new SkillServiceError("invalid_zip", "Skill zip is invalid");
51
+ }
52
+ }
53
+ async function readZipEntries(zipBuffer) {
54
+ const zipFile = await openZipFromBuffer(zipBuffer);
55
+ const entries = [];
56
+ let totalUncompressedBytes = 0;
57
+ try {
58
+ return await new Promise((resolvePromise, rejectPromise) => {
59
+ function reject(error) {
60
+ zipFile.close();
61
+ rejectPromise(toError(error));
62
+ }
63
+ zipFile.on("entry", (entry) => {
64
+ try {
65
+ const metadata = validateZipEntry(entry);
66
+ if (entries.length >= MAX_SKILL_FILE_COUNT) {
67
+ throw new SkillServiceError("validation_failed", "Skill zip has too many files");
68
+ }
69
+ if (entry.uncompressedSize > MAX_SKILL_FILE_BYTES) {
70
+ throw new SkillServiceError("validation_failed", "Skill file is too large");
71
+ }
72
+ totalUncompressedBytes += entry.uncompressedSize;
73
+ if (totalUncompressedBytes > MAX_SKILL_TOTAL_UNCOMPRESSED_BYTES) {
74
+ throw new SkillServiceError("validation_failed", "Skill zip is too large");
75
+ }
76
+ if (metadata.directory) {
77
+ entries.push(metadata);
78
+ zipFile.readEntry();
79
+ return;
80
+ }
81
+ zipFile.openReadStream(entry, (error, stream) => {
82
+ if (error !== null || stream === undefined) {
83
+ reject(error ?? new SkillServiceError("invalid_zip", "Skill zip is invalid"));
84
+ return;
85
+ }
86
+ collectStream(stream)
87
+ .then((data) => {
88
+ entries.push({ path: metadata.path, mode: metadata.mode, data });
89
+ zipFile.readEntry();
90
+ })
91
+ .catch(reject);
92
+ });
93
+ }
94
+ catch (error) {
95
+ reject(error);
96
+ }
97
+ });
98
+ zipFile.once("end", () => {
99
+ zipFile.close();
100
+ if (entries.length === 0) {
101
+ rejectPromise(new SkillServiceError("invalid_zip", "Skill zip is empty"));
102
+ return;
103
+ }
104
+ resolvePromise(entries);
105
+ });
106
+ zipFile.once("error", (error) => reject(error));
107
+ zipFile.readEntry();
108
+ });
109
+ }
110
+ catch (error) {
111
+ if (error instanceof SkillServiceError) {
112
+ throw error;
113
+ }
114
+ if (isYauzlPathValidationError(error)) {
115
+ throw new SkillServiceError("validation_failed", "Skill zip path is invalid");
116
+ }
117
+ throw new SkillServiceError("invalid_zip", "Skill zip is invalid");
118
+ }
119
+ }
120
+ function isYauzlPathValidationError(error) {
121
+ if (!(error instanceof Error)) {
122
+ return false;
123
+ }
124
+ return (error.message.includes("invalid relative path") ||
125
+ error.message.includes("absolute path") ||
126
+ error.message.includes("invalid characters in fileName"));
127
+ }
128
+ async function openZipFromBuffer(zipBuffer) {
129
+ return await new Promise((resolvePromise, rejectPromise) => {
130
+ yauzl.fromBuffer(zipBuffer, { lazyEntries: true, validateEntrySizes: true, strictFileNames: false }, (error, zipFile) => {
131
+ if (error !== null || zipFile === undefined) {
132
+ rejectPromise(new SkillServiceError("invalid_zip", "Skill zip is invalid"));
133
+ return;
134
+ }
135
+ resolvePromise(zipFile);
136
+ });
137
+ });
138
+ }
139
+ function validateZipEntry(entry) {
140
+ if (entry.isEncrypted()) {
141
+ throw new SkillServiceError("validation_failed", "Encrypted skill zips are not supported");
142
+ }
143
+ validateZipPath(entry.fileName);
144
+ const path = entry.fileName.replace(/\/+$/u, "");
145
+ const mode = (entry.externalFileAttributes >>> 16) & 0xffff;
146
+ const isDirectory = entry.fileName.endsWith("/");
147
+ const fileType = mode & UNIX_FILE_TYPE_MASK;
148
+ if (fileType === UNIX_SYMLINK) {
149
+ throw new SkillServiceError("validation_failed", "Skill zip contains a symlink");
150
+ }
151
+ if (fileType !== 0 && fileType !== UNIX_REGULAR_FILE && fileType !== UNIX_DIRECTORY) {
152
+ throw new SkillServiceError("validation_failed", "Skill zip contains a special file");
153
+ }
154
+ if (!isDirectory && fileType === UNIX_DIRECTORY) {
155
+ throw new SkillServiceError("validation_failed", "Skill zip contains an invalid entry");
156
+ }
157
+ if (isDirectory) {
158
+ return { path, directory: true, mode };
159
+ }
160
+ return { path, directory: false, mode };
161
+ }
162
+ function validateZipPath(path) {
163
+ if (path.length === 0 ||
164
+ path.startsWith("/") ||
165
+ /^[A-Za-z]:[\\/]/u.test(path) ||
166
+ path.includes("\\") ||
167
+ containsControlCharacter(path)) {
168
+ throw new SkillServiceError("validation_failed", "Skill zip path is invalid");
169
+ }
170
+ const normalized = path.replace(/\/+$/u, "");
171
+ const segments = normalized.split("/");
172
+ if (segments.length > MAX_SKILL_DIRECTORY_DEPTH) {
173
+ throw new SkillServiceError("validation_failed", "Skill zip path is too deep");
174
+ }
175
+ for (const segment of segments) {
176
+ if (segment === "" || segment === "." || segment === "..") {
177
+ throw new SkillServiceError("validation_failed", "Skill zip path is invalid");
178
+ }
179
+ }
180
+ }
181
+ function containsControlCharacter(value) {
182
+ for (const character of value) {
183
+ const codePoint = character.codePointAt(0);
184
+ if (codePoint !== undefined && (codePoint <= 0x1f || codePoint === 0x7f)) {
185
+ return true;
186
+ }
187
+ }
188
+ return false;
189
+ }
190
+ async function collectStream(stream) {
191
+ const chunks = [];
192
+ for await (const chunk of stream) {
193
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
194
+ }
195
+ return Buffer.concat(chunks);
196
+ }
197
+ function installModeForEntry(mode) {
198
+ return (mode & 0o111) === 0 ? INSTALL_FILE_MODE : INSTALL_EXECUTABLE_FILE_MODE;
199
+ }
200
+ function buildImportCandidate(entries) {
201
+ const files = entries.filter((entry) => !("directory" in entry));
202
+ if (files.length === 0) {
203
+ throw new SkillServiceError("invalid_zip", "Skill zip is empty");
204
+ }
205
+ const rootSkill = files.find((entry) => entry.path === SKILL_MD_FILE_NAME);
206
+ const rootPrefix = rootSkill === undefined ? inferSingleRoot(files.map((entry) => entry.path)) : "";
207
+ const skillPath = rootPrefix === "" ? SKILL_MD_FILE_NAME : `${rootPrefix}/${SKILL_MD_FILE_NAME}`;
208
+ const skillMd = files.find((entry) => entry.path === skillPath);
209
+ if (skillMd === undefined) {
210
+ throw new SkillServiceError("validation_failed", "SKILL.md is missing");
211
+ }
212
+ const metadata = parseSkillMarkdown(skillMd.data.toString("utf8"));
213
+ if (rootPrefix !== "" && rootPrefix !== metadata.name) {
214
+ throw new SkillServiceError("validation_failed", "Skill root does not match skill name");
215
+ }
216
+ return {
217
+ skillName: metadata.name,
218
+ rootPrefix,
219
+ files,
220
+ metadata,
221
+ };
222
+ }
223
+ function inferSingleRoot(paths) {
224
+ const roots = new Set();
225
+ for (const path of paths) {
226
+ const [root] = path.split("/");
227
+ if (root === undefined || root === SKILL_MD_FILE_NAME) {
228
+ throw new SkillServiceError("validation_failed", "Skill zip root is invalid");
229
+ }
230
+ roots.add(root);
231
+ }
232
+ if (roots.size !== 1) {
233
+ throw new SkillServiceError("validation_failed", "Skill zip must contain one skill root");
234
+ }
235
+ const [root] = [...roots];
236
+ if (root === undefined || !isValidSkillName(root)) {
237
+ throw new SkillServiceError("validation_failed", "Skill root is invalid");
238
+ }
239
+ return root;
240
+ }
241
+ //# sourceMappingURL=zip-import.js.map
@@ -0,0 +1,26 @@
1
+ import type { SqliteDatabase } from "./sqlite.js";
2
+ export type InProgressCommandIdempotencyRecord = {
3
+ command_id: string;
4
+ command_name: string;
5
+ target_ref: string | null;
6
+ request_hash: string;
7
+ updated_at: string;
8
+ };
9
+ export type CommandRecoveryResolution = {
10
+ status: "completed" | "failed";
11
+ disposition: unknown;
12
+ };
13
+ export type CommandRecoveryResolver = (db: SqliteDatabase, record: InProgressCommandIdempotencyRecord) => CommandRecoveryResolution | null;
14
+ export type CommandRecoveryScanResult = {
15
+ total_count: number;
16
+ completed_count: number;
17
+ failed_count: number;
18
+ interrupted_count: number;
19
+ };
20
+ export declare function readInProgressCommandIdempotencyRecords(db: SqliteDatabase): InProgressCommandIdempotencyRecord[];
21
+ export declare function finalizeCommandIdempotencyRecordAsInterrupted(db: SqliteDatabase, commandId: string, now?: () => Date): boolean;
22
+ export declare function recoverInProgressCommandIdempotencyRecords(db: SqliteDatabase, input?: {
23
+ resolve?: CommandRecoveryResolver;
24
+ now?: () => Date;
25
+ }): CommandRecoveryScanResult;
26
+ //# sourceMappingURL=command-recovery.d.ts.map
@@ -0,0 +1,71 @@
1
+ import { createInterruptedCommandDisposition, redactCommandDisposition, } from "@tutti/shared/utils/command-idempotency";
2
+ export function readInProgressCommandIdempotencyRecords(db) {
3
+ return db
4
+ .prepare(`
5
+ SELECT command_id, command_name, target_ref, request_hash, updated_at
6
+ FROM command_idempotency_records
7
+ WHERE status = 'in_progress'
8
+ ORDER BY updated_at ASC, command_name ASC, command_id ASC
9
+ `)
10
+ .all();
11
+ }
12
+ function finalizeCommandIdempotencyRecord(options) {
13
+ const completedAt = options.now().toISOString();
14
+ const dispositionJson = JSON.stringify(redactCommandDisposition(options.disposition));
15
+ const result = options.db
16
+ .prepare(`
17
+ UPDATE command_idempotency_records
18
+ SET status = ?,
19
+ disposition_json = ?,
20
+ updated_at = ?,
21
+ completed_at = ?
22
+ WHERE command_id = ?
23
+ AND status = 'in_progress'
24
+ `)
25
+ .run(options.status, dispositionJson, completedAt, completedAt, options.commandId);
26
+ return result.changes > 0;
27
+ }
28
+ export function finalizeCommandIdempotencyRecordAsInterrupted(db, commandId, now = () => new Date()) {
29
+ return finalizeCommandIdempotencyRecord({
30
+ db,
31
+ commandId,
32
+ status: "failed",
33
+ disposition: createInterruptedCommandDisposition(),
34
+ now,
35
+ });
36
+ }
37
+ export function recoverInProgressCommandIdempotencyRecords(db, input = {}) {
38
+ const records = readInProgressCommandIdempotencyRecords(db);
39
+ const now = input.now ?? (() => new Date());
40
+ const result = {
41
+ total_count: records.length,
42
+ completed_count: 0,
43
+ failed_count: 0,
44
+ interrupted_count: 0,
45
+ };
46
+ for (const record of records) {
47
+ const resolution = input.resolve?.(db, record) ?? null;
48
+ if (resolution !== null) {
49
+ if (finalizeCommandIdempotencyRecord({
50
+ db,
51
+ commandId: record.command_id,
52
+ status: resolution.status,
53
+ disposition: resolution.disposition,
54
+ now,
55
+ })) {
56
+ if (resolution.status === "completed") {
57
+ result.completed_count += 1;
58
+ }
59
+ else {
60
+ result.failed_count += 1;
61
+ }
62
+ }
63
+ continue;
64
+ }
65
+ if (finalizeCommandIdempotencyRecordAsInterrupted(db, record.command_id, now)) {
66
+ result.interrupted_count += 1;
67
+ }
68
+ }
69
+ return result;
70
+ }
71
+ //# sourceMappingURL=command-recovery.js.map
@@ -0,0 +1,6 @@
1
+ export * from "./command-recovery.js";
2
+ export * from "./lifecycle.js";
3
+ export * from "./metadata.js";
4
+ export * from "./migrations.js";
5
+ export * from "./sqlite.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,6 @@
1
+ export * from "./command-recovery.js";
2
+ export * from "./lifecycle.js";
3
+ export * from "./metadata.js";
4
+ export * from "./migrations.js";
5
+ export * from "./sqlite.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,23 @@
1
+ import type { ProjectId } from "@tutti/shared/ids";
2
+ import { type CommandRecoveryResolver, type CommandRecoveryScanResult } from "./command-recovery.js";
3
+ import { type HostStoreMetadata } from "./metadata.js";
4
+ import { type AppliedStoreMigration } from "./migrations.js";
5
+ import { type SqliteDatabase } from "./sqlite.js";
6
+ export type HostProjectStore = {
7
+ db: SqliteDatabase;
8
+ database_path: string;
9
+ metadata: HostStoreMetadata;
10
+ applied_migrations: AppliedStoreMigration[];
11
+ command_recovery: CommandRecoveryScanResult;
12
+ interrupted_command_count: number;
13
+ close: () => void;
14
+ };
15
+ export type OpenHostProjectStoreOptions = {
16
+ localStoreRoot: string;
17
+ projectId: ProjectId;
18
+ migrationsDirectory?: string;
19
+ commandRecoveryResolver?: CommandRecoveryResolver;
20
+ now?: () => Date;
21
+ };
22
+ export declare function openHostProjectStore(options: OpenHostProjectStoreOptions): HostProjectStore;
23
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1,53 @@
1
+ import { mkdirSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ import { join } from "node:path";
4
+ import { recoverInProgressCommandIdempotencyRecords, } from "./command-recovery.js";
5
+ import { initializeHostStoreMetadata } from "./metadata.js";
6
+ import { applyStoreMigrations, loadStoreMigrations, } from "./migrations.js";
7
+ import { openHostProjectDatabase } from "./sqlite.js";
8
+ const defaultMigrationsDirectory = fileURLToPath(new URL("../../migrations", import.meta.url));
9
+ function ensureLocalStoreRoot(localStoreRoot) {
10
+ mkdirSync(localStoreRoot, { recursive: true, mode: 0o700 });
11
+ }
12
+ export function openHostProjectStore(options) {
13
+ const now = options.now ?? (() => new Date());
14
+ const migrationsDirectory = options.migrationsDirectory ?? defaultMigrationsDirectory;
15
+ ensureLocalStoreRoot(options.localStoreRoot);
16
+ const databasePath = join(options.localStoreRoot, "tutti.sqlite");
17
+ const db = openHostProjectDatabase({ databasePath });
18
+ let opened = true;
19
+ try {
20
+ const appliedMigrations = applyStoreMigrations(db, loadStoreMigrations(migrationsDirectory), now);
21
+ const metadata = initializeHostStoreMetadata(db, {
22
+ projectId: options.projectId,
23
+ now,
24
+ });
25
+ const commandRecovery = recoverInProgressCommandIdempotencyRecords(db, {
26
+ ...(options.commandRecoveryResolver === undefined
27
+ ? {}
28
+ : { resolve: options.commandRecoveryResolver }),
29
+ now,
30
+ });
31
+ return {
32
+ db,
33
+ database_path: databasePath,
34
+ metadata,
35
+ applied_migrations: appliedMigrations,
36
+ command_recovery: commandRecovery,
37
+ interrupted_command_count: commandRecovery.interrupted_count,
38
+ close: () => {
39
+ if (!opened) {
40
+ return;
41
+ }
42
+ opened = false;
43
+ db.close();
44
+ },
45
+ };
46
+ }
47
+ catch (error) {
48
+ db.close();
49
+ opened = false;
50
+ throw error;
51
+ }
52
+ }
53
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1,18 @@
1
+ import type { ProjectId } from "@tutti/shared/ids";
2
+ import type { SqliteDatabase } from "./sqlite.js";
3
+ export type HostStoreMetadata = {
4
+ project_id: ProjectId;
5
+ schema_version: number;
6
+ created_at: string;
7
+ updated_at: string;
8
+ };
9
+ export type InitializeHostStoreMetadataOptions = {
10
+ projectId: ProjectId;
11
+ schemaVersion?: number;
12
+ now?: () => Date;
13
+ };
14
+ export declare class HostStoreMetadataMismatchError extends Error {
15
+ constructor(expectedProjectId: ProjectId, actualProjectId: string);
16
+ }
17
+ export declare function initializeHostStoreMetadata(db: SqliteDatabase, options: InitializeHostStoreMetadataOptions): HostStoreMetadata;
18
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1,30 @@
1
+ export class HostStoreMetadataMismatchError extends Error {
2
+ constructor(expectedProjectId, actualProjectId) {
3
+ super(`Host store metadata project_id mismatch: expected ${expectedProjectId}, got ${actualProjectId}`);
4
+ this.name = "HostStoreMetadataMismatchError";
5
+ }
6
+ }
7
+ export function initializeHostStoreMetadata(db, options) {
8
+ const schemaVersion = options.schemaVersion ?? 1;
9
+ const now = (options.now ?? (() => new Date()))().toISOString();
10
+ const existing = db
11
+ .prepare("SELECT project_id, schema_version, created_at, updated_at FROM store_metadata WHERE id = 'current'")
12
+ .get();
13
+ if (existing !== undefined) {
14
+ if (existing.project_id !== options.projectId) {
15
+ throw new HostStoreMetadataMismatchError(options.projectId, existing.project_id);
16
+ }
17
+ return existing;
18
+ }
19
+ db.prepare(`
20
+ INSERT INTO store_metadata (id, project_id, schema_version, created_at, updated_at)
21
+ VALUES ('current', ?, ?, ?, ?)
22
+ `).run(options.projectId, schemaVersion, now, now);
23
+ return {
24
+ project_id: options.projectId,
25
+ schema_version: schemaVersion,
26
+ created_at: now,
27
+ updated_at: now,
28
+ };
29
+ }
30
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1,20 @@
1
+ import type { SqliteDatabase } from "./sqlite.js";
2
+ export type StoreMigration = {
3
+ version: string;
4
+ filename: string;
5
+ sql: string;
6
+ checksum: string;
7
+ };
8
+ export type AppliedStoreMigration = {
9
+ version: string;
10
+ checksum: string;
11
+ applied_at: string;
12
+ };
13
+ export declare class StoreMigrationChecksumMismatchError extends Error {
14
+ constructor(version: string);
15
+ }
16
+ export declare function createMigrationChecksum(sql: string): string;
17
+ export declare function migrationVersionFromFilename(filename: string): string;
18
+ export declare function loadStoreMigrations(migrationsDirectory: string): StoreMigration[];
19
+ export declare function applyStoreMigrations(db: SqliteDatabase, migrations: readonly StoreMigration[], now?: () => Date): AppliedStoreMigration[];
20
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1,76 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readdirSync, readFileSync } from "node:fs";
3
+ import { basename, join } from "node:path";
4
+ const MIGRATION_FILENAME_PATTERN = /^\d{4}_[a-z0-9_]+\.sql$/u;
5
+ export class StoreMigrationChecksumMismatchError extends Error {
6
+ constructor(version) {
7
+ super(`Migration ${version} checksum does not match recorded schema_migrations row`);
8
+ this.name = "StoreMigrationChecksumMismatchError";
9
+ }
10
+ }
11
+ export function createMigrationChecksum(sql) {
12
+ return `sha256:${createHash("sha256").update(sql, "utf8").digest("hex")}`;
13
+ }
14
+ export function migrationVersionFromFilename(filename) {
15
+ if (!MIGRATION_FILENAME_PATTERN.test(filename)) {
16
+ throw new Error(`Invalid migration filename: ${filename}`);
17
+ }
18
+ return basename(filename, ".sql");
19
+ }
20
+ export function loadStoreMigrations(migrationsDirectory) {
21
+ return readdirSync(migrationsDirectory)
22
+ .filter((filename) => MIGRATION_FILENAME_PATTERN.test(filename))
23
+ .sort()
24
+ .map((filename) => {
25
+ const sql = readFileSync(join(migrationsDirectory, filename), "utf8");
26
+ return {
27
+ version: migrationVersionFromFilename(filename),
28
+ filename,
29
+ sql,
30
+ checksum: createMigrationChecksum(sql),
31
+ };
32
+ });
33
+ }
34
+ function ensureSchemaMigrationsTable(db) {
35
+ db.exec(`
36
+ CREATE TABLE IF NOT EXISTS schema_migrations (
37
+ version TEXT PRIMARY KEY,
38
+ checksum TEXT NOT NULL,
39
+ applied_at TEXT NOT NULL
40
+ );
41
+ `);
42
+ }
43
+ function readAppliedMigrationRows(db) {
44
+ const rows = db
45
+ .prepare("SELECT version, checksum FROM schema_migrations")
46
+ .all();
47
+ return new Map(rows.map((row) => [row.version, row]));
48
+ }
49
+ export function applyStoreMigrations(db, migrations, now = () => new Date()) {
50
+ ensureSchemaMigrationsTable(db);
51
+ const appliedRows = readAppliedMigrationRows(db);
52
+ const appliedMigrations = [];
53
+ const insertMigration = db.prepare("INSERT INTO schema_migrations (version, checksum, applied_at) VALUES (?, ?, ?)");
54
+ const applyMigration = db.transaction((migration, appliedAt) => {
55
+ db.exec(migration.sql);
56
+ insertMigration.run(migration.version, migration.checksum, appliedAt);
57
+ });
58
+ for (const migration of migrations) {
59
+ const applied = appliedRows.get(migration.version);
60
+ if (applied !== undefined) {
61
+ if (applied.checksum !== migration.checksum) {
62
+ throw new StoreMigrationChecksumMismatchError(migration.version);
63
+ }
64
+ continue;
65
+ }
66
+ const appliedAt = now().toISOString();
67
+ applyMigration(migration, appliedAt);
68
+ appliedMigrations.push({
69
+ version: migration.version,
70
+ checksum: migration.checksum,
71
+ applied_at: appliedAt,
72
+ });
73
+ }
74
+ return appliedMigrations;
75
+ }
76
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1,11 @@
1
+ import type { Database as BetterSqlite3Database, Options as BetterSqlite3Options } from "better-sqlite3";
2
+ export type SqliteDatabase = BetterSqlite3Database;
3
+ export type SqliteOpenOptions = BetterSqlite3Options;
4
+ export type OpenHostProjectDatabaseOptions = {
5
+ databasePath: string;
6
+ readonly?: boolean;
7
+ };
8
+ export declare function initializeSqliteConnection(db: SqliteDatabase): void;
9
+ export declare function openHostProjectDatabase(options: OpenHostProjectDatabaseOptions): SqliteDatabase;
10
+ export declare function withHostStoreTransaction<T>(db: SqliteDatabase, operation: (tx: SqliteDatabase) => T): T;
11
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1,21 @@
1
+ import { createRequire } from "node:module";
2
+ const loadNativeModule = createRequire(import.meta.url);
3
+ const Database = loadNativeModule("better-sqlite3");
4
+ export function initializeSqliteConnection(db) {
5
+ db.pragma("foreign_keys = ON");
6
+ db.pragma("journal_mode = WAL");
7
+ db.pragma("busy_timeout = 5000");
8
+ }
9
+ export function openHostProjectDatabase(options) {
10
+ const openOptions = {};
11
+ if (options.readonly !== undefined) {
12
+ openOptions.readonly = options.readonly;
13
+ }
14
+ const db = new Database(options.databasePath, openOptions);
15
+ initializeSqliteConnection(db);
16
+ return db;
17
+ }
18
+ export function withHostStoreTransaction(db, operation) {
19
+ return db.transaction(() => operation(db))();
20
+ }
21
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1,15 @@
1
+ export declare const WORKSPACE_OPS_MAINLINE_BRANCH: "tutti/mainline";
2
+ export declare const DEFAULT_VIEWER_MAX_BYTES = 204800;
3
+ export declare const MAX_VIEWER_MAX_BYTES = 1048576;
4
+ export declare const VIEWER_HARD_READ_LIMIT_BYTES: number;
5
+ export declare const REFERENCE_DIRECTORY_PATH: "docs/reference";
6
+ export declare const REFERENCE_FILES_DIRECTORY_PATH: "docs/reference/files";
7
+ export declare const REFERENCE_IMAGES_DIRECTORY_PATH: "docs/reference/images";
8
+ export declare const REFERENCE_INDEX_PATH: "docs/reference/README.md";
9
+ export declare const MAX_REFERENCE_UPLOAD_BYTES: number;
10
+ export declare const VIEWER_ASSET_READ_LIMIT_BYTES: number;
11
+ export declare const REFERENCE_IMAGE_ASSET_CACHE_VERSION: "reference-image-v1";
12
+ export declare const REFERENCE_IMAGE_THUMBNAIL_MAX_EDGE_PX = 512;
13
+ export declare const REFERENCE_IMAGE_PREVIEW_MAX_EDGE_PX = 1440;
14
+ export declare const PROJECT_DOC_PATHS: readonly ["product.md", "tech.md", "structure.md", "architecture-principles.md"];
15
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1,20 @@
1
+ export const WORKSPACE_OPS_MAINLINE_BRANCH = "tutti/mainline";
2
+ export const DEFAULT_VIEWER_MAX_BYTES = 204_800;
3
+ export const MAX_VIEWER_MAX_BYTES = 1_048_576;
4
+ export const VIEWER_HARD_READ_LIMIT_BYTES = 5 * 1024 * 1024;
5
+ export const REFERENCE_DIRECTORY_PATH = "docs/reference";
6
+ export const REFERENCE_FILES_DIRECTORY_PATH = "docs/reference/files";
7
+ export const REFERENCE_IMAGES_DIRECTORY_PATH = "docs/reference/images";
8
+ export const REFERENCE_INDEX_PATH = "docs/reference/README.md";
9
+ export const MAX_REFERENCE_UPLOAD_BYTES = 10 * 1024 * 1024;
10
+ export const VIEWER_ASSET_READ_LIMIT_BYTES = MAX_REFERENCE_UPLOAD_BYTES;
11
+ export const REFERENCE_IMAGE_ASSET_CACHE_VERSION = "reference-image-v1";
12
+ export const REFERENCE_IMAGE_THUMBNAIL_MAX_EDGE_PX = 512;
13
+ export const REFERENCE_IMAGE_PREVIEW_MAX_EDGE_PX = 1440;
14
+ export const PROJECT_DOC_PATHS = [
15
+ "product.md",
16
+ "tech.md",
17
+ "structure.md",
18
+ "architecture-principles.md",
19
+ ];
20
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1,8 @@
1
+ export type WorkspaceOpsErrorCode = "bad_request" | "forbidden" | "not_found" | "conflict" | "validation_failed" | "repo_snapshot_unavailable" | "git_failed";
2
+ export declare class WorkspaceOpsError extends Error {
3
+ readonly code: WorkspaceOpsErrorCode;
4
+ readonly statusCode: number;
5
+ readonly details?: unknown;
6
+ constructor(code: WorkspaceOpsErrorCode, message: string, details?: unknown);
7
+ }
8
+ //# sourceMappingURL=errors.d.ts.map