t3code-cli 0.4.0 → 0.5.1

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 (44) hide show
  1. package/dist/bin.js +4 -2
  2. package/dist/index.js +12 -2
  3. package/dist/{runtime-Cq64iuZr.js → runtime-KQVRmRk-.js} +229 -174
  4. package/dist/src/application/layer.d.ts +2 -2
  5. package/dist/src/auth/layer.d.ts +4 -2
  6. package/dist/src/auth/local-base-dir.d.ts +7 -0
  7. package/dist/src/auth/local-origin.d.ts +18 -0
  8. package/dist/src/auth/local-token.d.ts +26 -0
  9. package/dist/src/auth/local.d.ts +8 -11
  10. package/dist/src/auth/pairing.d.ts +6 -6
  11. package/dist/src/auth/service.d.ts +2 -1
  12. package/dist/src/auth/transport.d.ts +6 -3
  13. package/dist/src/auth/type.d.ts +18 -0
  14. package/dist/src/connection/error.d.ts +8 -0
  15. package/dist/src/connection/layer.d.ts +3 -0
  16. package/dist/src/connection/node.d.ts +2 -0
  17. package/dist/src/connection/service.d.ts +13 -0
  18. package/dist/src/connection/type.d.ts +10 -0
  19. package/dist/src/connection.d.ts +5 -0
  20. package/dist/src/index.d.ts +23 -1
  21. package/dist/src/rpc/error.d.ts +4 -3
  22. package/dist/src/rpc/layer.d.ts +5 -4
  23. package/dist/src/runtime.d.ts +9 -2
  24. package/package.json +1 -1
  25. package/src/auth/layer.ts +17 -0
  26. package/src/auth/local-base-dir.ts +22 -0
  27. package/src/auth/local-origin.ts +62 -0
  28. package/src/auth/local-token.ts +302 -0
  29. package/src/auth/local.ts +13 -348
  30. package/src/auth/pairing.ts +8 -19
  31. package/src/auth/service.ts +2 -1
  32. package/src/auth/transport.ts +17 -11
  33. package/src/auth/type.ts +22 -0
  34. package/src/cli/auth.ts +2 -0
  35. package/src/connection/error.ts +9 -0
  36. package/src/connection/layer.ts +10 -0
  37. package/src/connection/node.ts +12 -0
  38. package/src/connection/service.ts +26 -0
  39. package/src/connection/type.ts +12 -0
  40. package/src/connection.ts +9 -0
  41. package/src/index.ts +75 -1
  42. package/src/rpc/error.ts +4 -11
  43. package/src/rpc/layer.ts +25 -15
  44. package/src/runtime.ts +45 -7
@@ -772,5 +772,5 @@ export declare const makeT3Application: () => Effect.Effect<{
772
772
  readonly output: string | null;
773
773
  };
774
774
  }[], import("../rpc/error.ts").RpcError, never>;
775
- }, never, import("../environment/service.ts").Environment | import("effect/Path").Path | import("effect/Crypto").Crypto | import("../orchestration/service.ts").T3Orchestration>;
776
- export declare const T3ApplicationLive: Layer.Layer<T3Application, never, import("../environment/service.ts").Environment | import("effect/Path").Path | import("effect/Crypto").Crypto | import("../orchestration/service.ts").T3Orchestration>;
775
+ }, never, import("../index.ts").Environment | import("effect/Path").Path | import("effect/Crypto").Crypto | import("../orchestration/service.ts").T3Orchestration>;
776
+ export declare const T3ApplicationLive: Layer.Layer<T3Application, never, import("../index.ts").Environment | import("effect/Path").Path | import("effect/Crypto").Crypto | import("../orchestration/service.ts").T3Orchestration>;
@@ -6,9 +6,11 @@ import { T3LocalAuth } from "./local.ts";
6
6
  import { T3AuthPairing } from "./pairing.ts";
7
7
  import { T3Auth } from "./service.ts";
8
8
  import { T3AuthTransport } from "./transport.ts";
9
+ import type { AuthConfigInput } from "./type.ts";
9
10
  export declare const makeT3Auth: () => Effect.Effect<{
10
- pair: (pairingUrl: string) => Effect.Effect<import("./type.ts").PairResult, AuthConfigError | import("./error.ts").AuthPairingUrlError | import("./error.ts").AuthTransportError>;
11
- local: (input: import("./type.ts").LocalAuthInput) => Effect.Effect<import("./type.ts").LocalAuthResult, AuthConfigError | import("./error.ts").AuthLocalError>;
11
+ pair: (pairingUrl: string) => Effect.Effect<import("./type.ts").PairResult, import("./error.ts").AuthPairingUrlError | import("./error.ts").AuthTransportError>;
12
+ local: (input: import("./type.ts").LocalAuthInput) => Effect.Effect<import("./type.ts").LocalAuthResult, import("./error.ts").AuthLocalError>;
13
+ writeConfig: (input: AuthConfigInput) => Effect.Effect<void, AuthConfigError, never>;
12
14
  status: () => Effect.Effect<{
13
15
  readonly authenticated: boolean;
14
16
  readonly role?: "client" | "owner";
@@ -0,0 +1,7 @@
1
+ import type * as Path from "effect/Path";
2
+ import type { EnvironmentShape } from "../environment/service.ts";
3
+ export declare function resolveLocalBaseDir(input: {
4
+ readonly baseDir: string | undefined;
5
+ readonly environment: EnvironmentShape;
6
+ readonly path: Path.Path;
7
+ }): string;
@@ -0,0 +1,18 @@
1
+ import * as Context from "effect/Context";
2
+ import * as Effect from "effect/Effect";
3
+ import * as FileSystem from "effect/FileSystem";
4
+ import * as Layer from "effect/Layer";
5
+ import * as Path from "effect/Path";
6
+ import { Environment } from "../environment/service.ts";
7
+ import { AuthLocalError } from "./error.ts";
8
+ import type { LocalAuthOriginInput } from "./type.ts";
9
+ declare const T3LocalAuthOrigin_base: Context.ServiceClass<T3LocalAuthOrigin, "t3cli/T3LocalAuthOrigin", {
10
+ readonly resolve: (input?: LocalAuthOriginInput) => Effect.Effect<string, AuthLocalError>;
11
+ }>;
12
+ export declare class T3LocalAuthOrigin extends T3LocalAuthOrigin_base {
13
+ }
14
+ export declare const makeT3LocalAuthOrigin: () => Effect.Effect<{
15
+ resolve: (input?: LocalAuthOriginInput | undefined) => Effect.Effect<string, AuthLocalError, never>;
16
+ }, never, Environment | Path.Path | FileSystem.FileSystem>;
17
+ export declare const T3LocalAuthOriginLive: Layer.Layer<T3LocalAuthOrigin, never, Environment | Path.Path | FileSystem.FileSystem>;
18
+ export {};
@@ -0,0 +1,26 @@
1
+ import * as Context from "effect/Context";
2
+ import * as Crypto from "effect/Crypto";
3
+ import * as Effect from "effect/Effect";
4
+ import * as FileSystem from "effect/FileSystem";
5
+ import * as Layer from "effect/Layer";
6
+ import * as Path from "effect/Path";
7
+ import { Environment } from "../environment/service.ts";
8
+ import { SqlClientFactory } from "../sql/service.ts";
9
+ import { AuthLocalError } from "./error.ts";
10
+ import type { LocalAuthTokenInput, LocalAuthTokenResult } from "./type.ts";
11
+ declare const T3LocalAuthToken_base: Context.ServiceClass<T3LocalAuthToken, "t3cli/T3LocalAuthToken", {
12
+ readonly create: (input: LocalAuthTokenInput) => Effect.Effect<LocalAuthTokenResult, AuthLocalError>;
13
+ }>;
14
+ export declare class T3LocalAuthToken extends T3LocalAuthToken_base {
15
+ }
16
+ export declare const makeT3LocalAuthToken: () => Effect.Effect<{
17
+ create: (input: LocalAuthTokenInput) => Effect.Effect<{
18
+ token: string;
19
+ role: "client" | "owner";
20
+ expiresAt: string;
21
+ source: "local";
22
+ baseDir: string;
23
+ }, AuthLocalError, never>;
24
+ }, never, Environment | Path.Path | FileSystem.FileSystem | SqlClientFactory | Crypto.Crypto>;
25
+ export declare const T3LocalAuthTokenLive: Layer.Layer<T3LocalAuthToken, never, Environment | Path.Path | FileSystem.FileSystem | SqlClientFactory | Crypto.Crypto>;
26
+ export {};
@@ -1,27 +1,24 @@
1
1
  import * as Context from "effect/Context";
2
- import * as Crypto from "effect/Crypto";
3
2
  import * as Effect from "effect/Effect";
4
- import * as FileSystem from "effect/FileSystem";
5
3
  import * as Layer from "effect/Layer";
6
- import * as Path from "effect/Path";
7
- import { T3Config } from "../config/service.ts";
8
- import { Environment } from "../environment/service.ts";
9
- import { SqlClientFactory } from "../sql/service.ts";
10
- import { AuthConfigError, AuthLocalError } from "./error.ts";
4
+ import { AuthLocalError } from "./error.ts";
5
+ import { T3LocalAuthOrigin } from "./local-origin.ts";
6
+ import { T3LocalAuthToken } from "./local-token.ts";
11
7
  import type { LocalAuthInput, LocalAuthResult } from "./type.ts";
12
8
  declare const T3LocalAuth_base: Context.ServiceClass<T3LocalAuth, "t3cli/T3LocalAuth", {
13
- readonly local: (input: LocalAuthInput) => Effect.Effect<LocalAuthResult, AuthConfigError | AuthLocalError>;
9
+ readonly local: (input: LocalAuthInput) => Effect.Effect<LocalAuthResult, AuthLocalError>;
14
10
  }>;
15
11
  export declare class T3LocalAuth extends T3LocalAuth_base {
16
12
  }
17
13
  export declare const makeT3LocalAuth: () => Effect.Effect<{
18
14
  local: (input: LocalAuthInput) => Effect.Effect<{
19
15
  url: string;
16
+ token: string;
20
17
  role: "client" | "owner";
21
18
  expiresAt: string;
22
19
  source: "local";
23
20
  baseDir: string;
24
- }, AuthConfigError | AuthLocalError, never>;
25
- }, never, Environment | T3Config | SqlClientFactory | Path.Path | FileSystem.FileSystem | Crypto.Crypto>;
26
- export declare const T3LocalAuthLive: Layer.Layer<T3LocalAuth, never, Environment | T3Config | SqlClientFactory | Path.Path | FileSystem.FileSystem | Crypto.Crypto>;
21
+ }, AuthLocalError, never>;
22
+ }, never, T3LocalAuthOrigin | T3LocalAuthToken>;
23
+ export declare const T3LocalAuthLive: Layer.Layer<T3LocalAuth, never, T3LocalAuthOrigin | T3LocalAuthToken>;
27
24
  export {};
@@ -1,22 +1,22 @@
1
1
  import * as Context from "effect/Context";
2
2
  import * as Effect from "effect/Effect";
3
3
  import * as Layer from "effect/Layer";
4
- import { T3Config } from "../config/service.ts";
5
- import { AuthConfigError, AuthPairingUrlError, AuthTransportError } from "./error.ts";
4
+ import { AuthPairingUrlError, AuthTransportError } from "./error.ts";
6
5
  import { T3AuthTransport } from "./transport.ts";
7
6
  import type { PairingUrl, PairResult } from "./type.ts";
8
7
  declare const T3AuthPairing_base: Context.ServiceClass<T3AuthPairing, "t3cli/T3AuthPairing", {
9
- readonly pair: (pairingUrl: string) => Effect.Effect<PairResult, AuthConfigError | AuthPairingUrlError | AuthTransportError>;
8
+ readonly pair: (pairingUrl: string) => Effect.Effect<PairResult, AuthPairingUrlError | AuthTransportError>;
10
9
  }>;
11
10
  export declare class T3AuthPairing extends T3AuthPairing_base {
12
11
  }
13
12
  export declare const makeT3AuthPairing: () => Effect.Effect<{
14
13
  pair: (pairingUrl: string) => Effect.Effect<{
15
14
  url: string;
15
+ token: string;
16
16
  role: "client" | "owner";
17
17
  expiresAt: string;
18
- }, AuthPairingUrlError | AuthConfigError | AuthTransportError, never>;
19
- }, never, T3Config | T3AuthTransport>;
20
- export declare const T3AuthPairingLive: Layer.Layer<T3AuthPairing, never, T3Config | T3AuthTransport>;
18
+ }, AuthPairingUrlError | AuthTransportError, never>;
19
+ }, never, T3AuthTransport>;
20
+ export declare const T3AuthPairingLive: Layer.Layer<T3AuthPairing, never, T3AuthTransport>;
21
21
  export declare function parsePairingUrl(value: string): Effect.Effect<PairingUrl, AuthPairingUrlError>;
22
22
  export {};
@@ -2,10 +2,11 @@ import * as Context from "effect/Context";
2
2
  import type * as Effect from "effect/Effect";
3
3
  import type { AuthSessionState, AuthWebSocketTicketResult } from "./schema.ts";
4
4
  import type { AuthError } from "./error.ts";
5
- import type { LocalAuthInput, LocalAuthResult, PairResult } from "./type.ts";
5
+ import type { AuthConfigInput, LocalAuthInput, LocalAuthResult, PairResult } from "./type.ts";
6
6
  declare const T3Auth_base: Context.ServiceClass<T3Auth, "t3cli/T3Auth", {
7
7
  readonly pair: (value: string) => Effect.Effect<PairResult, AuthError>;
8
8
  readonly local: (input: LocalAuthInput) => Effect.Effect<LocalAuthResult, AuthError>;
9
+ readonly writeConfig: (input: AuthConfigInput) => Effect.Effect<void, AuthError>;
9
10
  readonly status: () => Effect.Effect<AuthSessionState, AuthError>;
10
11
  readonly issueWebSocketTicket: () => Effect.Effect<AuthWebSocketTicketResult, AuthError>;
11
12
  }>;
@@ -2,16 +2,19 @@ import * as Context from "effect/Context";
2
2
  import * as Effect from "effect/Effect";
3
3
  import * as Layer from "effect/Layer";
4
4
  import { HttpClient } from "effect/unstable/http";
5
- import type { ResolvedConfig } from "../config/service.ts";
6
5
  import { AuthTransportError } from "./error.ts";
7
6
  import { type AuthBearerBootstrapResult, type AuthSessionState, type AuthWebSocketTicketResult } from "./schema.ts";
7
+ export type AuthTransportConnection = {
8
+ readonly url: string;
9
+ readonly token: string;
10
+ };
8
11
  declare const T3AuthTransport_base: Context.ServiceClass<T3AuthTransport, "t3cli/T3AuthTransport", {
9
12
  readonly bootstrapBearer: (input: {
10
13
  readonly baseUrl: string;
11
14
  readonly credential: string;
12
15
  }) => Effect.Effect<AuthBearerBootstrapResult, AuthTransportError>;
13
- readonly getSession: (config: ResolvedConfig) => Effect.Effect<AuthSessionState, AuthTransportError>;
14
- readonly issueWebSocketTicket: (config: ResolvedConfig) => Effect.Effect<AuthWebSocketTicketResult, AuthTransportError>;
16
+ readonly getSession: (connection: AuthTransportConnection) => Effect.Effect<AuthSessionState, AuthTransportError>;
17
+ readonly issueWebSocketTicket: (connection: AuthTransportConnection) => Effect.Effect<AuthWebSocketTicketResult, AuthTransportError>;
15
18
  }>;
16
19
  export declare class T3AuthTransport extends T3AuthTransport_base {
17
20
  }
@@ -4,8 +4,13 @@ export type PairingUrl = {
4
4
  readonly baseUrl: string;
5
5
  readonly credential: string;
6
6
  };
7
+ export type AuthConfigInput = {
8
+ readonly url: string;
9
+ readonly token: string;
10
+ };
7
11
  export type PairResult = {
8
12
  readonly url: string;
13
+ readonly token: string;
9
14
  readonly role: AuthBearerBootstrapResult["role"];
10
15
  readonly expiresAt: string;
11
16
  };
@@ -16,8 +21,21 @@ export type LocalAuthInput = {
16
21
  readonly label: string;
17
22
  readonly subject: string;
18
23
  };
24
+ export type LocalAuthTokenInput = Omit<LocalAuthInput, "origin">;
25
+ export type LocalAuthOriginInput = {
26
+ readonly baseDir?: string;
27
+ readonly origin?: string;
28
+ };
29
+ export type LocalAuthTokenResult = {
30
+ readonly token: string;
31
+ readonly role: AuthSessionRole;
32
+ readonly expiresAt: string;
33
+ readonly source: "local";
34
+ readonly baseDir: string;
35
+ };
19
36
  export type LocalAuthResult = {
20
37
  readonly url: string;
38
+ readonly token: string;
21
39
  readonly role: AuthSessionRole;
22
40
  readonly expiresAt: string;
23
41
  readonly source: "local";
@@ -0,0 +1,8 @@
1
+ import * as Schema from "effect/Schema";
2
+ declare const T3CodeConnectionError_base: Schema.Class<T3CodeConnectionError, Schema.TaggedStruct<"T3CodeConnectionError", {
3
+ readonly message: Schema.String;
4
+ readonly cause: Schema.optionalKey<Schema.Unknown>;
5
+ }>, import("effect/Cause").YieldableError>;
6
+ export declare class T3CodeConnectionError extends T3CodeConnectionError_base {
7
+ }
8
+ export {};
@@ -0,0 +1,3 @@
1
+ import * as Layer from "effect/Layer";
2
+ export declare function makeT3CodeRpcLayer(): Layer.Layer<import("../rpc/service.ts").T3Rpc, never, import("effect/unstable/http/HttpClient").HttpClient | import("./service.ts").T3CodeConnectionProvider | import("effect/unstable/socket/Socket").WebSocketConstructor>;
3
+ export declare const T3CodeRpcLayer: Layer.Layer<import("../rpc/service.ts").T3Rpc, never, import("effect/unstable/http/HttpClient").HttpClient | import("./service.ts").T3CodeConnectionProvider | import("effect/unstable/socket/Socket").WebSocketConstructor>;
@@ -0,0 +1,2 @@
1
+ import * as Layer from "effect/Layer";
2
+ export declare const T3CodeNodeRpcLayer: Layer.Layer<import("../rpc/service.ts").T3Rpc, never, import("./service.ts").T3CodeConnectionProvider>;
@@ -0,0 +1,13 @@
1
+ import * as Context from "effect/Context";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Layer from "effect/Layer";
4
+ import type { T3CodeConnectionError } from "./error.ts";
5
+ import type { T3CodeConnection } from "./type.ts";
6
+ declare const T3CodeConnectionProvider_base: Context.ServiceClass<T3CodeConnectionProvider, "t3cli/T3CodeConnectionProvider", {
7
+ readonly get: Effect.Effect<T3CodeConnection, T3CodeConnectionError>;
8
+ }>;
9
+ export declare class T3CodeConnectionProvider extends T3CodeConnectionProvider_base {
10
+ }
11
+ export declare function makeT3CodeConnectionProvider(get: Effect.Effect<T3CodeConnection, T3CodeConnectionError>): T3CodeConnectionProvider["Service"];
12
+ export declare function T3CodeConnectionProviderLive(connection: T3CodeConnection): Layer.Layer<T3CodeConnectionProvider, never, never>;
13
+ export {};
@@ -0,0 +1,10 @@
1
+ export type T3CodeOrigin = {
2
+ readonly url: string;
3
+ };
4
+ export type T3CodeAuth = {
5
+ readonly token: string;
6
+ };
7
+ export type T3CodeConnection = {
8
+ readonly origin: T3CodeOrigin;
9
+ readonly auth: T3CodeAuth;
10
+ };
@@ -0,0 +1,5 @@
1
+ export { T3CodeConnectionError } from "./connection/error.ts";
2
+ export { T3CodeRpcLayer, makeT3CodeRpcLayer } from "./connection/layer.ts";
3
+ export { T3CodeNodeRpcLayer } from "./connection/node.ts";
4
+ export { T3CodeConnectionProvider, T3CodeConnectionProviderLive, makeT3CodeConnectionProvider, } from "./connection/service.ts";
5
+ export type { T3CodeAuth, T3CodeConnection, T3CodeOrigin } from "./connection/type.ts";
@@ -1,6 +1,28 @@
1
1
  export { T3Application } from "./application/service.ts";
2
2
  export type { SendThreadInput, StartThreadInput, StartThreadPolicy, WaitEvent, } from "./application/service.ts";
3
3
  export type { ApplicationError } from "./application/error.ts";
4
+ export { T3Auth } from "./auth/service.ts";
5
+ export { T3AuthLive, makeT3Auth } from "./auth/layer.ts";
6
+ export { T3LocalAuth, T3LocalAuthLive, makeT3LocalAuth } from "./auth/local.ts";
7
+ export { T3LocalAuthOrigin, T3LocalAuthOriginLive, makeT3LocalAuthOrigin, } from "./auth/local-origin.ts";
8
+ export { T3LocalAuthToken, T3LocalAuthTokenLive, makeT3LocalAuthToken, } from "./auth/local-token.ts";
9
+ export { T3AuthPairing, T3AuthPairingLive, makeT3AuthPairing, parsePairingUrl, } from "./auth/pairing.ts";
10
+ export { AuthConfigError, AuthLocalDatabaseError, AuthLocalError, AuthLocalSecretError, AuthLocalSigningError, AuthPairingUrlError, AuthTransportError, } from "./auth/error.ts";
11
+ export type { AuthError } from "./auth/error.ts";
12
+ export type { AuthSessionState, AuthWebSocketTicketResult } from "./auth/schema.ts";
13
+ export type { AuthConfigInput, AuthSessionRole, LocalAuthInput, LocalAuthOriginInput, LocalAuthResult, LocalAuthTokenInput, LocalAuthTokenResult, PairingUrl, PairResult, } from "./auth/type.ts";
14
+ export { T3Config } from "./config/service.ts";
15
+ export type { ResolvedConfig, StoredConfig } from "./config/service.ts";
16
+ export { T3ConfigLive, makeT3Config } from "./config/layer.ts";
17
+ export { ConfigError, UrlError } from "./config/error.ts";
18
+ export type { ConfigServiceError } from "./config/error.ts";
19
+ export { makeT3CodeConnectionProvider, makeT3CodeRpcLayer, T3CodeConnectionProvider, T3CodeConnectionProviderLive, T3CodeNodeRpcLayer, T3CodeRpcLayer, T3CodeConnectionError, } from "./connection.ts";
20
+ export type { T3CodeAuth, T3CodeConnection, T3CodeOrigin } from "./connection.ts";
21
+ export { Environment } from "./environment/service.ts";
22
+ export type { EnvironmentShape } from "./environment/service.ts";
4
23
  export { NodeEnvironmentLive } from "./environment/layer.ts";
5
- export { AppLayer, AuthAppLayer } from "./runtime.ts";
24
+ export { AppLayer, AuthAppLayer, T3AuthLayer, T3AuthPairingLayer, T3AuthTransportLayer, T3LocalAuthLayer, T3LocalAuthOriginLayer, T3LocalAuthTokenLayer, } from "./runtime.ts";
25
+ export { SqlClientFactory } from "./sql/service.ts";
26
+ export type { SqlClientFactoryShape, SqliteClientConfig } from "./sql/service.ts";
27
+ export { NodeSqlClientFactoryLive, NodeSqliteClientLive, makeNodeSqliteClient, } from "./sql/node-sqlite-client.ts";
6
28
  export type { OrchestrationMessage, OrchestrationProjectShell, OrchestrationShellSnapshot, OrchestrationThread, OrchestrationThreadShell, ServerProvider, } from "#t3tools/contracts";
@@ -2,12 +2,13 @@ import * as Schema from "effect/Schema";
2
2
  import { EnvironmentAuthorizationError, KeybindingsConfigError, OrchestrationDispatchCommandError, OrchestrationGetSnapshotError, ServerSettingsError } from "#t3tools/contracts";
3
3
  import { HttpClientError } from "effect/unstable/http";
4
4
  import { RpcClientError } from "effect/unstable/rpc";
5
- import { AuthConfigError, AuthLocalError, AuthPairingUrlError, AuthTransportError } from "../auth/error.ts";
6
- import { ConfigError, UrlError } from "../config/error.ts";
5
+ import { AuthTransportError } from "../auth/error.ts";
6
+ import { T3CodeConnectionError } from "../connection/error.ts";
7
+ import { UrlError } from "../config/error.ts";
7
8
  declare const RpcError_base: Schema.Class<RpcError, Schema.TaggedStruct<"RpcError", {
8
9
  readonly message: Schema.String;
9
10
  readonly method: Schema.optionalKey<Schema.String>;
10
- readonly cause: Schema.optionalKey<Schema.Union<readonly [typeof RpcClientError.RpcClientError, typeof EnvironmentAuthorizationError, typeof KeybindingsConfigError, typeof OrchestrationDispatchCommandError, typeof OrchestrationGetSnapshotError, typeof ServerSettingsError, typeof AuthConfigError, typeof AuthLocalError, typeof AuthPairingUrlError, typeof AuthTransportError, typeof ConfigError, typeof HttpClientError.HttpClientErrorSchema, typeof UrlError, Schema.instanceOf<Schema.SchemaError, unknown>]>>;
11
+ readonly cause: Schema.optionalKey<Schema.Union<readonly [typeof RpcClientError.RpcClientError, typeof EnvironmentAuthorizationError, typeof KeybindingsConfigError, typeof OrchestrationDispatchCommandError, typeof OrchestrationGetSnapshotError, typeof ServerSettingsError, typeof AuthTransportError, typeof T3CodeConnectionError, typeof HttpClientError.HttpClientErrorSchema, typeof UrlError, Schema.instanceOf<Schema.SchemaError, unknown>]>>;
11
12
  }>, import("effect/Cause").YieldableError>;
12
13
  export declare class RpcError extends RpcError_base {
13
14
  }
@@ -2,8 +2,9 @@ import * as Context from "effect/Context";
2
2
  import * as Effect from "effect/Effect";
3
3
  import * as Layer from "effect/Layer";
4
4
  import * as Scope from "effect/Scope";
5
- import { T3Auth } from "../auth/service.ts";
6
- import { T3Config } from "../config/service.ts";
5
+ import * as Socket from "effect/unstable/socket/Socket";
6
+ import { T3AuthTransport } from "../auth/transport.ts";
7
+ import { T3CodeConnectionProvider } from "../connection/service.ts";
7
8
  import { RpcError } from "./error.ts";
8
9
  import { T3Rpc } from "./service.ts";
9
10
  export declare const makeT3RpcLayer: () => Effect.Effect<{
@@ -4674,5 +4675,5 @@ export declare const makeT3RpcLayer: () => Effect.Effect<{
4674
4675
  }[];
4675
4676
  }, import("effect/unstable/rpc/RpcClientError").RpcClientError | (Discard extends true ? never : import("#t3tools/contracts").EnvironmentAuthorizationError | import("#t3tools/contracts").KeybindingsConfigError | import("#t3tools/contracts").ServerSettingsError), never>;
4676
4677
  }, RpcError, never>;
4677
- }, never, T3Config | Scope.Scope | T3Auth>;
4678
- export declare const T3RpcLive: Layer.Layer<T3Rpc, never, T3Config | T3Auth>;
4678
+ }, never, Scope.Scope | T3AuthTransport | T3CodeConnectionProvider | Socket.WebSocketConstructor>;
4679
+ export declare const T3RpcLive: Layer.Layer<T3Rpc, never, T3AuthTransport | T3CodeConnectionProvider | Socket.WebSocketConstructor>;
@@ -1,3 +1,10 @@
1
1
  import * as Layer from "effect/Layer";
2
- export declare const AuthAppLayer: Layer.Layer<import("./config/service.ts").T3Config | import("./auth/service.ts").T3Auth, never, import("./environment/service.ts").Environment | import("effect/Path").Path | import("effect/FileSystem").FileSystem | import("effect/Crypto").Crypto>;
3
- export declare const AppLayer: Layer.Layer<import("./index.ts").T3Application | import("./config/service.ts").T3Config | import("./auth/service.ts").T3Auth | import("./orchestration/service.ts").T3Orchestration | import("./rpc/service.ts").T3Rpc, never, import("./environment/service.ts").Environment | import("effect/Path").Path | import("effect/FileSystem").FileSystem | import("effect/Crypto").Crypto>;
2
+ import { T3Config } from "./config/service.ts";
3
+ export declare const T3AuthTransportLayer: Layer.Layer<import("./auth/transport.ts").T3AuthTransport, never, never>;
4
+ export declare const T3LocalAuthOriginLayer: Layer.Layer<import("./auth/local-origin.ts").T3LocalAuthOrigin, never, import("./index.ts").Environment | import("effect/Path").Path | import("effect/FileSystem").FileSystem>;
5
+ export declare const T3LocalAuthTokenLayer: Layer.Layer<import("./auth/local-token.ts").T3LocalAuthToken, never, import("./index.ts").Environment | import("effect/Path").Path | import("effect/FileSystem").FileSystem | import("effect/Crypto").Crypto>;
6
+ export declare const T3LocalAuthLayer: Layer.Layer<import("./auth/local.ts").T3LocalAuth, never, import("./index.ts").Environment | import("effect/Path").Path | import("effect/FileSystem").FileSystem | import("effect/Crypto").Crypto>;
7
+ export declare const T3AuthPairingLayer: Layer.Layer<import("./auth/pairing.ts").T3AuthPairing, never, never>;
8
+ export declare const T3AuthLayer: Layer.Layer<import("./index.ts").T3Auth, never, import("./index.ts").Environment | import("effect/Path").Path | import("effect/FileSystem").FileSystem | import("effect/Crypto").Crypto>;
9
+ export declare const AuthAppLayer: Layer.Layer<import("./index.ts").T3Auth | T3Config, never, import("./index.ts").Environment | import("effect/Path").Path | import("effect/FileSystem").FileSystem | import("effect/Crypto").Crypto>;
10
+ export declare const AppLayer: Layer.Layer<import("./index.ts").T3Application | import("./index.ts").T3Auth | T3Config | import("./rpc/service.ts").T3Rpc | import("./orchestration/service.ts").T3Orchestration, never, import("./index.ts").Environment | import("effect/Path").Path | import("effect/FileSystem").FileSystem | import("effect/Crypto").Crypto>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "t3code-cli",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "CLI for t3code",
5
5
  "keywords": [
6
6
  "claude",
package/src/auth/layer.ts CHANGED
@@ -7,6 +7,7 @@ import { T3LocalAuth } from "./local.ts";
7
7
  import { T3AuthPairing } from "./pairing.ts";
8
8
  import { T3Auth } from "./service.ts";
9
9
  import { T3AuthTransport } from "./transport.ts";
10
+ import type { AuthConfigInput } from "./type.ts";
10
11
 
11
12
  export const makeT3Auth = Effect.fn("makeT3Auth")(function* () {
12
13
  const config = yield* T3Config;
@@ -38,9 +39,25 @@ export const makeT3Auth = Effect.fn("makeT3Auth")(function* () {
38
39
  return yield* transport.issueWebSocketTicket(resolved);
39
40
  });
40
41
 
42
+ const writeConfig = Effect.fn("T3AuthLive.writeConfig")(function* (input: AuthConfigInput) {
43
+ const existing = yield* config.readStored().pipe(
44
+ Effect.catchTags({
45
+ ConfigError: (error) =>
46
+ Effect.fail(new AuthConfigError({ message: "auth config failed", cause: error })),
47
+ }),
48
+ );
49
+ yield* config.writeStored({ ...existing, url: input.url, token: input.token }).pipe(
50
+ Effect.catchTags({
51
+ ConfigError: (error) =>
52
+ Effect.fail(new AuthConfigError({ message: "auth config failed", cause: error })),
53
+ }),
54
+ );
55
+ });
56
+
41
57
  return {
42
58
  pair: pairing.pair,
43
59
  local: localAuth.local,
60
+ writeConfig,
44
61
  status,
45
62
  issueWebSocketTicket,
46
63
  };
@@ -0,0 +1,22 @@
1
+ import type * as Path from "effect/Path";
2
+
3
+ import type { EnvironmentShape } from "../environment/service.ts";
4
+
5
+ export function resolveLocalBaseDir(input: {
6
+ readonly baseDir: string | undefined;
7
+ readonly environment: EnvironmentShape;
8
+ readonly path: Path.Path;
9
+ }) {
10
+ const envBaseDir = input.environment.env["T3CODE_HOME"];
11
+ const raw = input.baseDir ?? envBaseDir;
12
+ if (raw === undefined || raw.length === 0) {
13
+ return input.path.join(input.environment.homeDir, ".t3");
14
+ }
15
+ if (raw === "~") {
16
+ return input.environment.homeDir;
17
+ }
18
+ if (raw.startsWith("~/") || raw.startsWith("~\\")) {
19
+ return input.path.join(input.environment.homeDir, raw.slice(2));
20
+ }
21
+ return input.path.resolve(input.environment.cwd, raw);
22
+ }
@@ -0,0 +1,62 @@
1
+ import * as Context from "effect/Context";
2
+ import * as Effect from "effect/Effect";
3
+ import * as FileSystem from "effect/FileSystem";
4
+ import * as Layer from "effect/Layer";
5
+ import * as Path from "effect/Path";
6
+
7
+ import { normalizeHttpBaseUrl } from "../config/url.ts";
8
+ import { Environment } from "../environment/service.ts";
9
+ import { AuthLocalError } from "./error.ts";
10
+ import { resolveLocalBaseDir } from "./local-base-dir.ts";
11
+ import { decodeAuthLocalRuntimeStateFromJson } from "./schema.ts";
12
+ import type { LocalAuthOriginInput } from "./type.ts";
13
+
14
+ export class T3LocalAuthOrigin extends Context.Service<
15
+ T3LocalAuthOrigin,
16
+ {
17
+ readonly resolve: (input?: LocalAuthOriginInput) => Effect.Effect<string, AuthLocalError>;
18
+ }
19
+ >()("t3cli/T3LocalAuthOrigin") {}
20
+
21
+ export const makeT3LocalAuthOrigin = Effect.fn("makeT3LocalAuthOrigin")(function* () {
22
+ const fs = yield* FileSystem.FileSystem;
23
+ const path = yield* Path.Path;
24
+ const environment = yield* Environment;
25
+
26
+ const resolve = Effect.fn("T3LocalAuthOriginLive.resolve")(function* (
27
+ input?: LocalAuthOriginInput,
28
+ ) {
29
+ const baseDir = resolveLocalBaseDir({ baseDir: input?.baseDir, environment, path });
30
+ if (input?.origin !== undefined) {
31
+ return yield* normalizeLocalOrigin(input.origin);
32
+ }
33
+
34
+ const runtimeStatePath = path.join(baseDir, "userdata", "server-runtime.json");
35
+ const raw = yield* fs.readFileString(runtimeStatePath).pipe(
36
+ Effect.mapError(
37
+ (error) =>
38
+ new AuthLocalError({
39
+ message: `local runtime state not found: ${runtimeStatePath}. Make sure T3 Code is running with Network access enabled, or pass --origin manually.`,
40
+ cause: error,
41
+ }),
42
+ ),
43
+ );
44
+ const state = yield* decodeAuthLocalRuntimeStateFromJson(raw).pipe(
45
+ Effect.mapError(
46
+ (error) =>
47
+ new AuthLocalError({ message: "local runtime state has invalid shape", cause: error }),
48
+ ),
49
+ );
50
+ return yield* normalizeLocalOrigin(state.origin);
51
+ });
52
+
53
+ return { resolve };
54
+ });
55
+
56
+ export const T3LocalAuthOriginLive = Layer.effect(T3LocalAuthOrigin, makeT3LocalAuthOrigin());
57
+
58
+ function normalizeLocalOrigin(origin: string) {
59
+ return normalizeHttpBaseUrl(origin).pipe(
60
+ Effect.mapError((error) => new AuthLocalError({ message: error.message, cause: error })),
61
+ );
62
+ }