t3code-cli 0.11.0 → 0.13.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 (330) hide show
  1. package/README.md +42 -10
  2. package/dist/application.js +2 -2
  3. package/dist/auth.js +1 -1
  4. package/dist/bin.js +85549 -2668
  5. package/dist/cli.js +15 -2
  6. package/dist/config.js +120 -2
  7. package/dist/connection.js +2 -2
  8. package/dist/index.js +1 -1
  9. package/dist/node.js +6 -2
  10. package/dist/orchestration.js +2 -2
  11. package/dist/rolldown-runtime.js +1 -1
  12. package/dist/rpc.js +1 -1
  13. package/dist/runtime.js +2 -2
  14. package/dist/shared.js +23313 -8022
  15. package/dist/src/application/actions.d.ts +25 -0
  16. package/dist/src/application/index.d.ts +3 -3
  17. package/dist/src/application/layer.d.ts +66 -50
  18. package/dist/src/application/model-selection.d.ts +2 -2
  19. package/dist/src/application/models.d.ts +1 -1
  20. package/dist/src/application/project-commands.d.ts +23 -3
  21. package/dist/src/application/projects.d.ts +7 -7
  22. package/dist/src/application/service.d.ts +65 -2
  23. package/dist/src/application/shell-sequence.d.ts +25 -19
  24. package/dist/src/application/terminals.d.ts +8 -8
  25. package/dist/src/application/thread-commands.d.ts +19 -19
  26. package/dist/src/application/thread-update.d.ts +1 -1
  27. package/dist/src/application/thread-wait.d.ts +19 -15
  28. package/dist/src/application/threads.d.ts +134 -108
  29. package/dist/src/auth/error.d.ts +3 -3
  30. package/dist/src/auth/index.d.ts +1 -1
  31. package/dist/src/auth/layer.d.ts +36 -8
  32. package/dist/src/auth/local-base-dir.d.ts +5 -2
  33. package/dist/src/auth/local-origin.d.ts +3 -3
  34. package/dist/src/auth/local-token.d.ts +3 -3
  35. package/dist/src/auth/remote-error.d.ts +3 -0
  36. package/dist/src/auth/service.d.ts +15 -3
  37. package/dist/src/auth/type.d.ts +40 -1
  38. package/dist/src/cli/env/flag.d.ts +2 -0
  39. package/dist/src/cli/env/index.d.ts +2 -0
  40. package/dist/src/cli/env/selection-layer.d.ts +3 -0
  41. package/dist/src/cli/flags.d.ts +2 -0
  42. package/dist/src/cli/format/index.d.ts +1 -0
  43. package/dist/src/cli/format/output.d.ts +12 -0
  44. package/dist/src/cli/index.d.ts +4 -0
  45. package/dist/src/cli/runtime/index.d.ts +1 -0
  46. package/dist/src/cli/runtime/service.d.ts +16 -0
  47. package/dist/src/{scope → cli/scope}/resolve.d.ts +5 -4
  48. package/dist/src/config/config.d.ts +49 -0
  49. package/dist/src/config/credential/cipher-node.d.ts +3 -0
  50. package/dist/src/config/credential/cipher-web.d.ts +3 -0
  51. package/dist/src/config/credential/cipher.d.ts +29 -0
  52. package/dist/src/config/credential/env.d.ts +3 -0
  53. package/dist/src/config/credential/error.d.ts +8 -0
  54. package/dist/src/config/credential/index.d.ts +6 -0
  55. package/dist/src/config/credential/service.d.ts +34 -0
  56. package/dist/src/config/env/env.d.ts +55 -0
  57. package/dist/src/config/env/index.d.ts +2 -0
  58. package/dist/src/{layout/base-dir.d.ts → config/env/layout.d.ts} +0 -1
  59. package/dist/src/config/environment-name/index.d.ts +1 -0
  60. package/dist/src/config/environment-name/name.d.ts +10 -0
  61. package/dist/src/config/error.d.ts +4 -11
  62. package/dist/src/config/index.d.ts +10 -5
  63. package/dist/src/config/keystore/error.d.ts +8 -0
  64. package/dist/src/config/keystore/file.d.ts +9 -0
  65. package/dist/src/config/keystore/index.d.ts +4 -0
  66. package/dist/src/config/keystore/keyring-node.d.ts +4 -0
  67. package/dist/src/config/keystore/service.d.ts +33 -0
  68. package/dist/src/config/paths/index.d.ts +1 -0
  69. package/dist/src/config/paths/paths.d.ts +6 -0
  70. package/dist/src/config/persist/file-mode.d.ts +4 -0
  71. package/dist/src/config/persist/migration.d.ts +68 -0
  72. package/dist/src/config/persist/persist.d.ts +40 -0
  73. package/dist/src/config/persist/schema.d.ts +68 -0
  74. package/dist/src/config/resolve/resolve.d.ts +40 -0
  75. package/dist/src/config/selection/index.d.ts +1 -0
  76. package/dist/src/config/selection/resolve.d.ts +4 -0
  77. package/dist/src/config/selection/service.d.ts +10 -0
  78. package/dist/src/config/types.d.ts +36 -0
  79. package/dist/src/config/url/error.d.ts +10 -0
  80. package/dist/src/config/url/index.d.ts +2 -0
  81. package/dist/src/connection/error.d.ts +3 -1
  82. package/dist/src/connection/index.d.ts +0 -1
  83. package/dist/src/connection/prepared.d.ts +14 -0
  84. package/dist/src/contracts/index.d.ts +1 -1
  85. package/dist/src/domain/error.d.ts +14 -1
  86. package/dist/src/domain/helpers.d.ts +53 -43
  87. package/dist/src/domain/model-config.d.ts +92 -84
  88. package/dist/src/domain/thread-activities.d.ts +1 -1
  89. package/dist/src/domain/thread-lifecycle.d.ts +24 -20
  90. package/dist/src/index.d.ts +1 -2
  91. package/dist/src/{connection/node.d.ts → node/connection.d.ts} +1 -1
  92. package/dist/src/node/index.d.ts +1 -2
  93. package/dist/src/orchestration/index.d.ts +0 -1
  94. package/dist/src/orchestration/layer.d.ts +321 -390
  95. package/dist/src/orchestration/service.d.ts +1 -1
  96. package/dist/src/rpc/error.d.ts +4 -6
  97. package/dist/src/rpc/layer.d.ts +2036 -1917
  98. package/dist/src/rpc/operation.d.ts +4 -5732
  99. package/dist/src/rpc/service.d.ts +1 -1
  100. package/dist/src/rpc/session.d.ts +22 -0
  101. package/dist/src/rpc/ws-group.d.ts +456 -1032
  102. package/dist/src/runtime/index.d.ts +1 -2
  103. package/dist/src/runtime/layer.d.ts +12 -8
  104. package/dist/src/sql/node-sqlite-client.d.ts +1 -1
  105. package/dist/src/t3tools/index.d.ts +1 -1
  106. package/dist/t3tools.js +2 -2
  107. package/package.json +30 -25
  108. package/src/application/actions.test.ts +328 -0
  109. package/src/application/actions.ts +475 -0
  110. package/src/application/index.ts +9 -5
  111. package/src/application/layer.ts +9 -0
  112. package/src/application/model-selection.ts +2 -2
  113. package/src/application/project-commands.ts +23 -5
  114. package/src/application/projects.ts +6 -7
  115. package/src/application/service.ts +79 -1
  116. package/src/application/shell-sequence.ts +1 -1
  117. package/src/application/terminals.ts +2 -1
  118. package/src/application/thread-commands.ts +1 -1
  119. package/src/application/thread-update.ts +1 -1
  120. package/src/application/thread-wait.ts +5 -1
  121. package/src/application/threads.test.ts +9 -3
  122. package/src/application/threads.ts +6 -6
  123. package/src/auth/error.ts +4 -9
  124. package/src/auth/index.ts +7 -0
  125. package/src/auth/layer.test-utils.ts +34 -0
  126. package/src/auth/layer.ts +116 -34
  127. package/src/auth/local-base-dir.ts +13 -6
  128. package/src/auth/local-origin.ts +10 -7
  129. package/src/auth/local-token.ts +28 -23
  130. package/src/auth/remote-error.ts +17 -0
  131. package/src/auth/service.test.ts +200 -0
  132. package/src/auth/service.ts +27 -3
  133. package/src/auth/transport.ts +45 -114
  134. package/src/auth/type.ts +47 -1
  135. package/src/bin.ts +24 -6
  136. package/src/cli/action-format.ts +110 -0
  137. package/src/cli/action.ts +398 -0
  138. package/src/cli/app.ts +6 -0
  139. package/src/cli/auth.ts +76 -23
  140. package/src/cli/env/flag.ts +8 -0
  141. package/src/cli/env/index.ts +2 -0
  142. package/src/cli/env/selection-layer.test.ts +49 -0
  143. package/src/cli/env/selection-layer.ts +27 -0
  144. package/src/cli/env.ts +107 -0
  145. package/src/cli/extra-args.test.ts +32 -0
  146. package/src/cli/extra-args.ts +22 -0
  147. package/src/cli/flags.ts +11 -1
  148. package/src/cli/format/auth.ts +92 -0
  149. package/src/cli/format/human.ts +131 -0
  150. package/src/cli/format/index.ts +12 -0
  151. package/src/cli/format/model.ts +29 -0
  152. package/src/cli/format/output.ts +51 -0
  153. package/src/cli/format/project.ts +32 -0
  154. package/src/cli/format/terminal.ts +87 -0
  155. package/src/cli/{thread-format.test.ts → format/thread.test.ts} +6 -4
  156. package/src/cli/format/thread.ts +185 -0
  157. package/src/cli/index.ts +20 -0
  158. package/src/cli/interaction/confirm.ts +64 -0
  159. package/src/cli/{self-action.ts → interaction/self-action.ts} +8 -6
  160. package/src/cli/message-input.ts +1 -1
  161. package/src/cli/model.ts +9 -5
  162. package/src/cli/project.ts +13 -7
  163. package/src/cli/projects/delete.ts +13 -12
  164. package/src/cli/require.ts +9 -7
  165. package/src/cli/runtime/index.ts +1 -0
  166. package/src/cli/runtime/service.ts +28 -0
  167. package/src/{scope → cli/scope}/resolve.ts +11 -9
  168. package/src/cli/terminal/attach.ts +3 -6
  169. package/src/cli/terminal/create.ts +10 -9
  170. package/src/cli/terminal/destroy.ts +13 -11
  171. package/src/cli/terminal/list.ts +10 -9
  172. package/src/cli/terminal/read.test-utils.ts +48 -0
  173. package/src/cli/terminal/read.test.ts +35 -0
  174. package/src/cli/terminal/read.ts +3 -6
  175. package/src/cli/terminal/scope.ts +10 -5
  176. package/src/cli/terminal/shared.ts +1 -1
  177. package/src/cli/terminal/stream.ts +3 -6
  178. package/src/cli/terminal/wait.test.ts +5 -3
  179. package/src/cli/terminal/wait.ts +10 -9
  180. package/src/cli/terminal/write.test.ts +34 -0
  181. package/src/cli/terminal/write.ts +10 -9
  182. package/src/cli/threads/approve.ts +11 -7
  183. package/src/cli/threads/archive.ts +14 -9
  184. package/src/cli/threads/callback.ts +6 -4
  185. package/src/cli/threads/delete.ts +17 -11
  186. package/src/cli/threads/interrupt.ts +14 -9
  187. package/src/cli/threads/list.test.ts +5 -3
  188. package/src/cli/threads/list.ts +10 -10
  189. package/src/cli/threads/messages.ts +11 -7
  190. package/src/cli/threads/respond.ts +11 -7
  191. package/src/cli/threads/send.ts +19 -9
  192. package/src/cli/threads/show.ts +11 -7
  193. package/src/cli/threads/start.ts +18 -13
  194. package/src/cli/threads/unarchive.ts +11 -7
  195. package/src/cli/threads/update.ts +14 -9
  196. package/src/cli/threads/wait.ts +11 -7
  197. package/src/cli/wait-events.ts +1 -1
  198. package/src/config/config.ts +260 -0
  199. package/src/config/credential/cipher-node.ts +40 -0
  200. package/src/config/credential/cipher-web.ts +82 -0
  201. package/src/config/credential/cipher.ts +39 -0
  202. package/src/config/credential/env.ts +13 -0
  203. package/src/config/credential/error.ts +9 -0
  204. package/src/config/credential/index.ts +6 -0
  205. package/src/config/credential/service.test-utils.ts +25 -0
  206. package/src/config/credential/service.test.ts +116 -0
  207. package/src/config/credential/service.ts +205 -0
  208. package/src/config/env/env.test-utils.ts +14 -0
  209. package/src/config/env/env.ts +81 -0
  210. package/src/config/env/index.ts +2 -0
  211. package/src/{layout/base-dir.ts → config/env/layout.ts} +0 -9
  212. package/src/config/environment-name/index.ts +7 -0
  213. package/src/config/environment-name/name.test.ts +66 -0
  214. package/src/config/environment-name/name.ts +49 -0
  215. package/src/config/error.ts +6 -8
  216. package/src/config/index.ts +16 -5
  217. package/src/config/keystore/error.ts +9 -0
  218. package/src/config/keystore/file.ts +96 -0
  219. package/src/config/keystore/index.ts +4 -0
  220. package/src/config/keystore/keyring-node.test.ts +12 -0
  221. package/src/config/keystore/keyring-node.ts +100 -0
  222. package/src/config/keystore/service.test-utils.ts +15 -0
  223. package/src/config/keystore/service.test.ts +18 -0
  224. package/src/config/keystore/service.ts +29 -0
  225. package/src/config/layer.test-utils.ts +45 -0
  226. package/src/config/layer.test.ts +209 -0
  227. package/src/config/paths/index.ts +1 -0
  228. package/src/config/paths/paths.ts +36 -0
  229. package/src/config/persist/file-mode.ts +21 -0
  230. package/src/config/persist/migration.test.ts +71 -0
  231. package/src/config/persist/migration.ts +82 -0
  232. package/src/config/persist/persist.test.ts +113 -0
  233. package/src/config/persist/persist.ts +65 -0
  234. package/src/config/persist/schema.ts +37 -0
  235. package/src/config/platform.test-utils.ts +20 -0
  236. package/src/config/resolve/resolve.test-utils.ts +20 -0
  237. package/src/config/resolve/resolve.test.ts +137 -0
  238. package/src/config/resolve/resolve.ts +104 -0
  239. package/src/config/selection/index.ts +1 -0
  240. package/src/config/selection/resolve.ts +14 -0
  241. package/src/config/selection/service.ts +29 -0
  242. package/src/config/temp-home.test-utils.ts +7 -0
  243. package/src/config/types.ts +49 -0
  244. package/src/config/url/error.ts +8 -0
  245. package/src/config/url/index.ts +7 -0
  246. package/src/config/url/url.test.ts +31 -0
  247. package/src/connection/error.ts +4 -1
  248. package/src/connection/index.ts +0 -1
  249. package/src/connection/layer.ts +5 -2
  250. package/src/connection/prepared.ts +83 -0
  251. package/src/contracts/index.ts +1 -1
  252. package/src/domain/error.ts +20 -1
  253. package/src/domain/helpers.test.ts +1 -1
  254. package/src/domain/helpers.ts +1 -1
  255. package/src/domain/model-config.ts +1 -1
  256. package/src/domain/thread-activities.test.ts +1 -1
  257. package/src/domain/thread-activities.ts +1 -1
  258. package/src/domain/thread-lifecycle.test.ts +1 -1
  259. package/src/domain/thread-lifecycle.ts +1 -1
  260. package/src/effect.test-utils.ts +25 -0
  261. package/src/index.ts +1 -1
  262. package/src/{connection/node.ts → node/connection.ts} +1 -1
  263. package/src/node/index.ts +1 -2
  264. package/src/orchestration/index.ts +0 -1
  265. package/src/orchestration/layer.ts +3 -2
  266. package/src/orchestration/service.ts +1 -1
  267. package/src/rpc/error.ts +10 -17
  268. package/src/rpc/layer.ts +17 -51
  269. package/src/rpc/operation.ts +16 -2
  270. package/src/rpc/service.ts +2 -1
  271. package/src/rpc/session.ts +168 -0
  272. package/src/rpc/ws-group.ts +13 -27
  273. package/src/runtime/index.ts +2 -1
  274. package/src/runtime/layer.test-utils.ts +32 -0
  275. package/src/runtime/layer.test.ts +66 -0
  276. package/src/runtime/layer.ts +21 -12
  277. package/src/t3tools/index.ts +1 -1
  278. package/src/types/marked-terminal.d.ts +11 -0
  279. package/dist/layout.js +0 -2
  280. package/dist/scope.js +0 -2
  281. package/dist/src/cli/output-format.d.ts +0 -11
  282. package/dist/src/config/layer.d.ts +0 -22
  283. package/dist/src/config/service.d.ts +0 -22
  284. package/dist/src/environment/layer.d.ts +0 -3
  285. package/dist/src/environment/service.d.ts +0 -12
  286. package/dist/src/layout/index.d.ts +0 -1
  287. package/dist/upstream-t3code/packages/contracts/src/auth.d.ts +0 -441
  288. package/dist/upstream-t3code/packages/contracts/src/baseSchemas.d.ts +0 -38
  289. package/dist/upstream-t3code/packages/contracts/src/desktopBootstrap.d.ts +0 -14
  290. package/dist/upstream-t3code/packages/contracts/src/editor.d.ts +0 -124
  291. package/dist/upstream-t3code/packages/contracts/src/environment.d.ts +0 -64
  292. package/dist/upstream-t3code/packages/contracts/src/environmentHttp.d.ts +0 -762
  293. package/dist/upstream-t3code/packages/contracts/src/filesystem.d.ts +0 -26
  294. package/dist/upstream-t3code/packages/contracts/src/git.d.ts +0 -500
  295. package/dist/upstream-t3code/packages/contracts/src/index.d.ts +0 -25
  296. package/dist/upstream-t3code/packages/contracts/src/ipc.d.ts +0 -490
  297. package/dist/upstream-t3code/packages/contracts/src/keybindings.d.ts +0 -133
  298. package/dist/upstream-t3code/packages/contracts/src/model.d.ts +0 -112
  299. package/dist/upstream-t3code/packages/contracts/src/orchestration.d.ts +0 -6682
  300. package/dist/upstream-t3code/packages/contracts/src/project.d.ts +0 -45
  301. package/dist/upstream-t3code/packages/contracts/src/provider.d.ts +0 -116
  302. package/dist/upstream-t3code/packages/contracts/src/providerInstance.d.ts +0 -99
  303. package/dist/upstream-t3code/packages/contracts/src/providerRuntime.d.ts +0 -4276
  304. package/dist/upstream-t3code/packages/contracts/src/relay.d.ts +0 -1262
  305. package/dist/upstream-t3code/packages/contracts/src/relayClient.d.ts +0 -48
  306. package/dist/upstream-t3code/packages/contracts/src/remoteAccess.d.ts +0 -45
  307. package/dist/upstream-t3code/packages/contracts/src/review.d.ts +0 -37
  308. package/dist/upstream-t3code/packages/contracts/src/rpc.d.ts +0 -8218
  309. package/dist/upstream-t3code/packages/contracts/src/server.d.ts +0 -2291
  310. package/dist/upstream-t3code/packages/contracts/src/settings.d.ts +0 -271
  311. package/dist/upstream-t3code/packages/contracts/src/sourceControl.d.ts +0 -177
  312. package/dist/upstream-t3code/packages/contracts/src/terminal.d.ts +0 -330
  313. package/dist/upstream-t3code/packages/contracts/src/vcs.d.ts +0 -148
  314. package/src/cli/auth-format.ts +0 -45
  315. package/src/cli/confirm.ts +0 -31
  316. package/src/cli/model-format.ts +0 -18
  317. package/src/cli/output-format.ts +0 -45
  318. package/src/cli/project-format.ts +0 -18
  319. package/src/cli/terminal/commands.test.ts +0 -101
  320. package/src/cli/terminal-format.ts +0 -167
  321. package/src/cli/thread-format.ts +0 -128
  322. package/src/config/layer.ts +0 -105
  323. package/src/config/service.ts +0 -26
  324. package/src/environment/layer.ts +0 -12
  325. package/src/environment/service.ts +0 -13
  326. package/src/layout/index.ts +0 -1
  327. /package/dist/src/{scope → cli/scope}/index.d.ts +0 -0
  328. /package/dist/src/config/{url.d.ts → url/url.d.ts} +0 -0
  329. /package/src/{scope → cli/scope}/index.ts +0 -0
  330. /package/src/config/{url.ts → url/url.ts} +0 -0
@@ -0,0 +1,168 @@
1
+ import {
2
+ ConnectionBlockedError,
3
+ type ConnectionAttemptError,
4
+ ConnectionTransientError,
5
+ type PreparedConnection,
6
+ } from "@t3tools/client-runtime/connection";
7
+ import { WS_METHODS } from "@t3tools/contracts";
8
+ import * as Context from "effect/Context";
9
+ import * as Deferred from "effect/Deferred";
10
+ import * as Effect from "effect/Effect";
11
+ import * as Layer from "effect/Layer";
12
+ import * as Schedule from "effect/Schedule";
13
+ import type * as Scope from "effect/Scope";
14
+ import * as RpcClient from "effect/unstable/rpc/RpcClient";
15
+ import * as RpcSerialization from "effect/unstable/rpc/RpcSerialization";
16
+ import * as Socket from "effect/unstable/socket/Socket";
17
+
18
+ import type { WsClient as CliWsClient } from "./service.ts";
19
+ import type { CliServerConfig } from "./ws-group.ts";
20
+ import { CliWsRpcGroup } from "./ws-group.ts";
21
+
22
+ interface T3RpcSession {
23
+ readonly client: CliWsClient;
24
+ readonly initialConfig: Effect.Effect<CliServerConfig, ConnectionAttemptError>;
25
+ readonly ready: Effect.Effect<void, ConnectionAttemptError>;
26
+ readonly probe: Effect.Effect<void, ConnectionAttemptError>;
27
+ readonly closed: Effect.Effect<never, ConnectionTransientError>;
28
+ }
29
+
30
+ export class T3RpcSessionFactory extends Context.Service<
31
+ T3RpcSessionFactory,
32
+ {
33
+ readonly connect: (
34
+ connection: PreparedConnection,
35
+ ) => Effect.Effect<T3RpcSession, ConnectionAttemptError, Scope.Scope>;
36
+ }
37
+ >()("t3cli/T3RpcSessionFactory") {}
38
+
39
+ type SessionRpcError =
40
+ | Effect.Error<ReturnType<CliWsClient[typeof WS_METHODS.serverGetConfig]>>
41
+ | Effect.Error<ReturnType<CliWsClient[typeof WS_METHODS.serverProbe]>>;
42
+
43
+ const makeClient = RpcClient.make(CliWsRpcGroup);
44
+
45
+ const makeT3RpcSessionFactory = Effect.fn("makeT3RpcSessionFactory")(function* () {
46
+ const webSocketConstructor = yield* Socket.WebSocketConstructor;
47
+
48
+ const connect: T3RpcSessionFactory["Service"]["connect"] = Effect.fnUntraced(function* (
49
+ connection: PreparedConnection,
50
+ ) {
51
+ yield* Effect.annotateCurrentSpan({
52
+ "connection.environment.id": connection.environmentId,
53
+ });
54
+
55
+ const connected = yield* Deferred.make<void>();
56
+ const disconnected = yield* Deferred.make<never, ConnectionTransientError>();
57
+ const hooks = RpcClient.ConnectionHooks.of({
58
+ onConnect: Deferred.succeed(connected, undefined).pipe(Effect.asVoid),
59
+ onDisconnect: Deferred.isDone(connected).pipe(
60
+ Effect.flatMap((wasConnected) =>
61
+ Deferred.fail(
62
+ disconnected,
63
+ new ConnectionTransientError({
64
+ reason: "transport",
65
+ detail: wasConnected
66
+ ? `${connection.label} disconnected.`
67
+ : `${connection.label} could not establish a WebSocket connection.`,
68
+ }),
69
+ ),
70
+ ),
71
+ Effect.asVoid,
72
+ ),
73
+ });
74
+ const socketLayer = Socket.layerWebSocket(connection.socketUrl, {
75
+ openTimeout: "15 seconds",
76
+ }).pipe(Layer.provide(Layer.succeed(Socket.WebSocketConstructor, webSocketConstructor)));
77
+ const protocolLayer = Layer.effect(
78
+ RpcClient.Protocol,
79
+ RpcClient.makeProtocolSocket({
80
+ retryTransientErrors: false,
81
+ retryPolicy: Schedule.recurs(0),
82
+ }),
83
+ ).pipe(
84
+ Layer.provide(
85
+ Layer.mergeAll(
86
+ socketLayer,
87
+ RpcSerialization.layerJson,
88
+ Layer.succeed(RpcClient.ConnectionHooks, hooks),
89
+ ),
90
+ ),
91
+ );
92
+ const protocolContext = yield* Layer.build(protocolLayer).pipe(
93
+ Effect.withSpan("environment.websocket.connect"),
94
+ );
95
+ const client = yield* makeClient.pipe(Effect.provide(protocolContext));
96
+ const initialConfig = yield* Effect.cached(
97
+ client[WS_METHODS.serverGetConfig]({}).pipe(
98
+ catchSessionRpcErrors,
99
+ Effect.withSpan("environment.initialSync"),
100
+ ),
101
+ );
102
+ const probe = initialConfig.pipe(
103
+ Effect.flatMap((config) =>
104
+ Effect.gen(function* () {
105
+ if (config.environment.capabilities.connectionProbe) {
106
+ return yield* client[WS_METHODS.serverProbe]({});
107
+ }
108
+ return yield* client[WS_METHODS.serverGetConfig]({});
109
+ }).pipe(catchSessionRpcErrors),
110
+ ),
111
+ Effect.asVoid,
112
+ Effect.withSpan("clientRuntime.connection.rpcSession.probe"),
113
+ );
114
+
115
+ return {
116
+ client,
117
+ initialConfig,
118
+ ready: Deferred.await(connected).pipe(
119
+ Effect.andThen(initialConfig),
120
+ Effect.asVoid,
121
+ Effect.raceFirst(Deferred.await(disconnected)),
122
+ ),
123
+ probe,
124
+ closed: Deferred.await(disconnected),
125
+ } satisfies T3RpcSession;
126
+ });
127
+
128
+ return T3RpcSessionFactory.of({ connect });
129
+ });
130
+
131
+ export const T3RpcSessionFactoryLive = Layer.effect(T3RpcSessionFactory, makeT3RpcSessionFactory());
132
+
133
+ function catchSessionRpcErrors<A, R>(
134
+ effect: Effect.Effect<A, SessionRpcError, R>,
135
+ ): Effect.Effect<A, ConnectionAttemptError, R> {
136
+ return effect.pipe(
137
+ Effect.catchTags({
138
+ EnvironmentAuthorizationError: (error) =>
139
+ Effect.fail(
140
+ new ConnectionBlockedError({
141
+ reason: "permission",
142
+ detail: error.message,
143
+ }),
144
+ ),
145
+ KeybindingsConfigParseError: (error) =>
146
+ Effect.fail(
147
+ new ConnectionTransientError({
148
+ reason: "remote-unavailable",
149
+ detail: error.message,
150
+ }),
151
+ ),
152
+ ServerSettingsError: (error) =>
153
+ Effect.fail(
154
+ new ConnectionTransientError({
155
+ reason: "remote-unavailable",
156
+ detail: error.message,
157
+ }),
158
+ ),
159
+ RpcClientError: (error) =>
160
+ Effect.fail(
161
+ new ConnectionTransientError({
162
+ reason: "transport",
163
+ detail: error.message,
164
+ }),
165
+ ),
166
+ }),
167
+ );
168
+ }
@@ -1,16 +1,14 @@
1
1
  import {
2
2
  EnvironmentAuthorizationError,
3
3
  KeybindingsConfigError,
4
- OrchestrationDispatchCommandError,
5
- OrchestrationGetSnapshotError,
6
- ServerConfig,
7
4
  ServerProviders,
8
5
  ServerSettingsError,
9
- TerminalCwdError,
10
- TerminalHistoryError,
11
- TerminalNotRunningError,
12
- TerminalSessionLookupError,
13
6
  WS_METHODS,
7
+ WsOrchestrationDispatchCommandRpc,
8
+ WsOrchestrationGetArchivedShellSnapshotRpc,
9
+ WsOrchestrationSubscribeShellRpc,
10
+ WsOrchestrationSubscribeThreadRpc,
11
+ WsServerProbeRpc,
14
12
  WsSubscribeTerminalEventsRpc,
15
13
  WsSubscribeTerminalMetadataRpc,
16
14
  WsTerminalAttachRpc,
@@ -18,20 +16,18 @@ import {
18
16
  WsTerminalOpenRpc,
19
17
  WsTerminalResizeRpc,
20
18
  WsTerminalWriteRpc,
21
- WsOrchestrationDispatchCommandRpc,
22
- WsOrchestrationGetArchivedShellSnapshotRpc,
23
- WsOrchestrationSubscribeShellRpc,
24
- WsOrchestrationSubscribeThreadRpc,
25
- } from "#t3tools/contracts";
19
+ } from "@t3tools/contracts";
26
20
  import * as Schema from "effect/Schema";
27
21
  import { Rpc, RpcGroup } from "effect/unstable/rpc";
28
22
 
29
- export const FallbackServerConfig = Schema.Struct({
23
+ export const CliServerConfig = Schema.Struct({
24
+ environment: Schema.Struct({
25
+ capabilities: Schema.Struct({
26
+ connectionProbe: Schema.Boolean,
27
+ }),
28
+ }),
30
29
  providers: ServerProviders,
31
30
  });
32
- export type FallbackServerConfig = typeof FallbackServerConfig.Type;
33
-
34
- export const CliServerConfig = Schema.Union([ServerConfig, FallbackServerConfig]);
35
31
  export type CliServerConfig = typeof CliServerConfig.Type;
36
32
 
37
33
  export const WsServerGetConfigRpc = Rpc.make(WS_METHODS.serverGetConfig, {
@@ -52,16 +48,6 @@ export const CliWsRpcGroup = RpcGroup.make(
52
48
  WsOrchestrationGetArchivedShellSnapshotRpc,
53
49
  WsOrchestrationSubscribeShellRpc,
54
50
  WsOrchestrationSubscribeThreadRpc,
51
+ WsServerProbeRpc,
55
52
  WsServerGetConfigRpc,
56
53
  );
57
-
58
- export type CliRpcRequestError =
59
- | EnvironmentAuthorizationError
60
- | KeybindingsConfigError
61
- | OrchestrationDispatchCommandError
62
- | OrchestrationGetSnapshotError
63
- | TerminalCwdError
64
- | TerminalHistoryError
65
- | TerminalNotRunningError
66
- | TerminalSessionLookupError
67
- | ServerSettingsError;
@@ -1,6 +1,8 @@
1
1
  export {
2
2
  AppLayer,
3
3
  AuthAppLayer,
4
+ BaseAppLayer,
5
+ BaseAuthAppLayer,
4
6
  T3AuthLayer,
5
7
  T3AuthPairingLayer,
6
8
  T3AuthTransportLayer,
@@ -9,4 +11,3 @@ export {
9
11
  T3LocalAuthTokenLayer,
10
12
  T3OrchestrationLayer,
11
13
  } from "./layer.ts";
12
- export { NodeEnvironmentLive } from "../environment/layer.ts";
@@ -0,0 +1,32 @@
1
+ import * as Layer from "effect/Layer";
2
+
3
+ import * as CliSelection from "../cli/env/selection-layer.ts";
4
+ import * as CliRuntime from "../cli/runtime/service.ts";
5
+ import * as Config from "../config/config.ts";
6
+ import * as Credential from "../config/credential/service.ts";
7
+ import * as CredentialCipherNode from "../config/credential/cipher-node.ts";
8
+ import { ConfigPlatformLayer } from "../config/platform.test-utils.ts";
9
+ import { t3CliEnvConfigLayer } from "../config/env/env.test-utils.ts";
10
+ import * as Keystore from "../config/keystore/service.test-utils.ts";
11
+
12
+ export function cliConfigRoutingLayerTest(homeDir: string) {
13
+ const cliRuntimeLayer = CliRuntime.CliRuntime.layerTest({ cwd: homeDir });
14
+ const configLayer = t3CliEnvConfigLayer(homeDir, { T3CLI_ENV: "home" });
15
+ const platformEnvLayer = Layer.mergeAll(cliRuntimeLayer, configLayer);
16
+
17
+ return Layer.mergeAll(
18
+ ConfigPlatformLayer,
19
+ platformEnvLayer,
20
+ Config.layer.pipe(
21
+ Layer.provide(Credential.layer),
22
+ Layer.provide(
23
+ Layer.mergeAll(
24
+ platformEnvLayer,
25
+ CliSelection.layer.pipe(Layer.provide(platformEnvLayer)),
26
+ CredentialCipherNode.layerNode,
27
+ Keystore.unavailableKeystoreFactoryLayer,
28
+ ),
29
+ ),
30
+ ),
31
+ );
32
+ }
@@ -0,0 +1,66 @@
1
+ import "vite-plus/test/config";
2
+
3
+ import * as Effect from "effect/Effect";
4
+ import * as Ref from "effect/Ref";
5
+ import * as NodeServices from "@effect/platform-node/NodeServices";
6
+ import { assert, describe, it } from "@effect/vitest";
7
+ import { Command } from "effect/unstable/cli";
8
+
9
+ import { cliEnvironmentSetting } from "../cli/env/flag.ts";
10
+ import type { ResolvedConfig } from "../config/types.ts";
11
+ import { T3Config } from "../config/config.ts";
12
+ import { makeTempHomeScoped } from "../config/temp-home.test-utils.ts";
13
+ import { cliConfigRoutingLayerTest } from "./layer.test-utils.ts";
14
+
15
+ describe("CLI config routing", () => {
16
+ it.effect(
17
+ "routes --environment through Command.run to T3Config.resolve ahead of default and T3CLI_ENV",
18
+ () =>
19
+ Effect.gen(function* () {
20
+ return yield* makeTempHomeScoped("t3cli-runtime-");
21
+ }).pipe(
22
+ Effect.flatMap((homeDir) => {
23
+ const testLayer = cliConfigRoutingLayerTest(homeDir);
24
+ return Effect.gen(function* () {
25
+ const resolvedRef = yield* Ref.make<ResolvedConfig | undefined>(undefined);
26
+ const resolveProbeCommand = Command.make("resolve-probe", {}, () =>
27
+ Effect.gen(function* () {
28
+ const config = yield* T3Config;
29
+ const resolved = yield* config.resolve();
30
+ yield* Ref.set(resolvedRef, resolved);
31
+ }),
32
+ ).pipe(Command.withGlobalFlags([cliEnvironmentSetting]));
33
+ const runResolveProbe = Command.runWith(resolveProbeCommand, { version: "0.0.0-test" });
34
+
35
+ yield* Effect.gen(function* () {
36
+ const config = yield* T3Config;
37
+ yield* config.upsertEnvironment({
38
+ name: "home",
39
+ url: "https://home.example",
40
+ token: "home-token",
41
+ local: false,
42
+ });
43
+ yield* config.upsertEnvironment({
44
+ name: "work",
45
+ url: "https://work.example",
46
+ token: "work-token",
47
+ local: false,
48
+ });
49
+ }).pipe(Effect.provide(testLayer));
50
+
51
+ yield* runResolveProbe(["--environment", "work"]).pipe(Effect.provide(testLayer));
52
+
53
+ const resolved = yield* Ref.get(resolvedRef);
54
+ assert.isDefined(resolved);
55
+ assert.equal(resolved.source, "config");
56
+ if (resolved.source === "config") {
57
+ assert.equal(resolved.environment, "work");
58
+ assert.equal(resolved.token, "work-token");
59
+ }
60
+ });
61
+ }),
62
+ Effect.provide(NodeServices.layer),
63
+ Effect.scoped,
64
+ ),
65
+ );
66
+ });
@@ -10,16 +10,20 @@ import { T3LocalAuthOriginLive } from "../auth/local-origin.ts";
10
10
  import { T3LocalAuthTokenLive } from "../auth/local-token.ts";
11
11
  import { T3AuthPairingLive } from "../auth/pairing.ts";
12
12
  import { T3AuthTransportLive } from "../auth/transport.ts";
13
- import { T3ConfigLive } from "../config/layer.ts";
14
- import { T3Config } from "../config/service.ts";
13
+ import * as Config from "../config/config.ts";
14
+ import * as Credential from "../config/credential/service.ts";
15
+ import * as Selection from "../config/selection/service.ts";
15
16
  import { T3CodeConnectionError } from "../connection/error.ts";
17
+ import { T3PreparedConnectionProviderLive } from "../connection/prepared.ts";
16
18
  import { T3CodeConnectionProvider, makeT3CodeConnectionProvider } from "../connection/service.ts";
17
19
  import { T3OrchestrationLive } from "../orchestration/layer.ts";
18
20
  import { T3RpcLive } from "../rpc/layer.ts";
19
21
  import { T3RpcOperationsLive } from "../rpc/operation.ts";
22
+ import { T3RpcSessionFactoryLive } from "../rpc/session.ts";
20
23
  import { NodeSqlClientFactoryLive } from "../sql/node-sqlite-client.ts";
21
24
  import { NodeCliPathLayer } from "../cli-path/layer.ts";
22
25
 
26
+ export const T3ConfigLayer = Config.layer.pipe(Layer.provide(Credential.layer));
23
27
  export const T3AuthTransportLayer = T3AuthTransportLive.pipe(
24
28
  Layer.provide(NodeHttpClient.layerUndici),
25
29
  );
@@ -33,13 +37,13 @@ export const T3LocalAuthLayer = T3LocalAuthLive.pipe(
33
37
  export const T3AuthPairingLayer = T3AuthPairingLive.pipe(Layer.provide(T3AuthTransportLayer));
34
38
  export const T3AuthLayer = T3AuthLive.pipe(
35
39
  Layer.provide(
36
- Layer.mergeAll(T3ConfigLive, T3AuthTransportLayer, T3LocalAuthLayer, T3AuthPairingLayer),
40
+ Layer.mergeAll(T3ConfigLayer, T3AuthTransportLayer, T3LocalAuthLayer, T3AuthPairingLayer),
37
41
  ),
38
42
  );
39
43
  const T3ConfigConnectionProviderLayer = Layer.effect(
40
44
  T3CodeConnectionProvider,
41
45
  Effect.gen(function* () {
42
- const config = yield* T3Config;
46
+ const config = yield* Config.T3Config;
43
47
  return makeT3CodeConnectionProvider(
44
48
  config.resolve().pipe(
45
49
  Effect.map((resolved) => ({
@@ -56,14 +60,15 @@ const T3ConfigConnectionProviderLayer = Layer.effect(
56
60
  ),
57
61
  );
58
62
  }),
59
- ).pipe(Layer.provide(T3ConfigLive));
63
+ ).pipe(Layer.provide(T3ConfigLayer));
60
64
 
61
65
  const T3RpcLayer = T3RpcLive.pipe(
62
66
  Layer.provide(
63
67
  Layer.mergeAll(
64
- T3ConfigConnectionProviderLayer,
65
- T3AuthTransportLayer,
66
- NodeSocket.layerWebSocketConstructor,
68
+ T3PreparedConnectionProviderLive.pipe(
69
+ Layer.provide(Layer.mergeAll(T3ConfigConnectionProviderLayer, NodeHttpClient.layerUndici)),
70
+ ),
71
+ T3RpcSessionFactoryLive.pipe(Layer.provide(NodeSocket.layerWebSocketConstructor)),
67
72
  ),
68
73
  ),
69
74
  );
@@ -73,10 +78,8 @@ const T3ApplicationLayer = T3ApplicationLive.pipe(
73
78
  Layer.provide(Layer.mergeAll(T3RpcOperationsLayer, T3OrchestrationLayer)),
74
79
  );
75
80
 
76
- export const AuthAppLayer = Layer.mergeAll(T3ConfigLive, T3AuthLayer);
77
-
78
- export const AppLayer = Layer.mergeAll(
79
- T3ConfigLive,
81
+ export const BaseAppLayer = Layer.mergeAll(
82
+ T3ConfigLayer,
80
83
  T3AuthLayer,
81
84
  T3RpcLayer,
82
85
  T3RpcOperationsLayer,
@@ -84,3 +87,9 @@ export const AppLayer = Layer.mergeAll(
84
87
  T3ApplicationLayer,
85
88
  NodeCliPathLayer,
86
89
  );
90
+
91
+ export const BaseAuthAppLayer = Layer.mergeAll(T3ConfigLayer, T3AuthLayer);
92
+
93
+ export const AuthAppLayer = BaseAuthAppLayer.pipe(Layer.provideMerge(Selection.layer));
94
+
95
+ export const AppLayer = BaseAppLayer.pipe(Layer.provideMerge(Selection.layer));
@@ -1 +1 @@
1
- export * from "#t3tools/contracts";
1
+ export * from "@t3tools/contracts";
@@ -0,0 +1,11 @@
1
+ declare module "marked-terminal" {
2
+ import type { MarkedExtension } from "marked";
3
+
4
+ export type TerminalRendererOptions = {
5
+ readonly reflowText?: boolean;
6
+ readonly showSectionPrefix?: boolean;
7
+ readonly width?: number;
8
+ };
9
+
10
+ export function markedTerminal(options?: TerminalRendererOptions): MarkedExtension;
11
+ }
package/dist/layout.js DELETED
@@ -1,2 +0,0 @@
1
- import { L as readT3LayoutFromNodeProcess, R as resolveT3BaseDir } from "./shared.js";
2
- export { readT3LayoutFromNodeProcess, resolveT3BaseDir };
package/dist/scope.js DELETED
@@ -1,2 +0,0 @@
1
- import { Fd as resolveWorktreePath, Md as resolveCommandProjectRef, Nd as resolveProjectRef, Pd as resolveThreadId } from "./shared.js";
2
- export { resolveCommandProjectRef, resolveProjectRef, resolveThreadId, resolveWorktreePath };
@@ -1,11 +0,0 @@
1
- import type { EnvironmentShape } from "../environment/service.ts";
2
- export declare const humanJsonFormatChoices: readonly ["auto", "human", "json"];
3
- export declare const humanNdjsonFormatChoices: readonly ["auto", "human", "ndjson"];
4
- export declare const humanJsonNdjsonFormatChoices: readonly ["auto", "human", "json", "ndjson"];
5
- export type HumanJsonFormat = (typeof humanJsonFormatChoices)[number];
6
- export type HumanNdjsonFormat = (typeof humanNdjsonFormatChoices)[number];
7
- export type HumanJsonNdjsonFormat = (typeof humanJsonNdjsonFormatChoices)[number];
8
- export declare function resolveOutputFormat<T extends "json" | "ndjson">(format: "auto" | "human" | T, environment: EnvironmentShape, nonHumanFormat: T): "human" | T;
9
- export declare function canRenderLiveTerminal(environment: EnvironmentShape): boolean;
10
- export declare function isInteractiveHumanTerminal(environment: EnvironmentShape): boolean;
11
- export declare function isAgentEnvironment(environment: EnvironmentShape): boolean;
@@ -1,22 +0,0 @@
1
- import * as Effect from "effect/Effect";
2
- import * as FileSystem from "effect/FileSystem";
3
- import * as Layer from "effect/Layer";
4
- import * as Path from "effect/Path";
5
- import { Environment } from "../environment/service.ts";
6
- import { ConfigError } from "./error.ts";
7
- import { T3Config, type StoredConfig } from "./service.ts";
8
- export declare const makeT3Config: () => Effect.Effect<{
9
- readStored: () => Effect.Effect<{
10
- readonly url?: string;
11
- readonly token?: string;
12
- readonly local?: boolean;
13
- }, ConfigError, never>;
14
- writeStored: (config: StoredConfig) => Effect.Effect<void, ConfigError, never>;
15
- resolve: () => Effect.Effect<{
16
- url: string;
17
- token: string;
18
- source: "config" | "env";
19
- local: boolean;
20
- }, import("./error.ts").UrlError | ConfigError, never>;
21
- }, never, Environment | Path.Path | FileSystem.FileSystem>;
22
- export declare const T3ConfigLive: Layer.Layer<T3Config, never, Environment | Path.Path | FileSystem.FileSystem>;
@@ -1,22 +0,0 @@
1
- import * as Context from "effect/Context";
2
- import type * as Effect from "effect/Effect";
3
- import type { ConfigError, ConfigServiceError } from "./error.ts";
4
- export type StoredConfig = {
5
- readonly url?: string;
6
- readonly token?: string;
7
- readonly local?: boolean;
8
- };
9
- export type ResolvedConfig = {
10
- readonly url: string;
11
- readonly token: string;
12
- readonly source: "env" | "config";
13
- readonly local: boolean;
14
- };
15
- declare const T3Config_base: Context.ServiceClass<T3Config, "t3cli/T3Config", {
16
- readonly readStored: () => Effect.Effect<StoredConfig, ConfigError>;
17
- readonly writeStored: (config: StoredConfig) => Effect.Effect<void, ConfigError>;
18
- readonly resolve: () => Effect.Effect<ResolvedConfig, ConfigServiceError>;
19
- }>;
20
- export declare class T3Config extends T3Config_base {
21
- }
22
- export {};
@@ -1,3 +0,0 @@
1
- import * as Layer from "effect/Layer";
2
- import { Environment } from "./service.ts";
3
- export declare const NodeEnvironmentLive: Layer.Layer<Environment, never, never>;
@@ -1,12 +0,0 @@
1
- import * as Context from "effect/Context";
2
- export type EnvironmentShape = {
3
- readonly cwd: string;
4
- readonly homeDir: string;
5
- readonly env: Readonly<Record<string, string | undefined>>;
6
- readonly stdoutIsTTY: boolean;
7
- readonly stderrIsTTY: boolean;
8
- };
9
- declare const Environment_base: Context.ServiceClass<Environment, "t3cli/Environment", EnvironmentShape>;
10
- export declare class Environment extends Environment_base {
11
- }
12
- export {};
@@ -1 +0,0 @@
1
- export { readT3LayoutFromNodeProcess, resolveT3BaseDir, type T3Layout } from "./base-dir.ts";