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.
- package/README.md +42 -10
- package/dist/application.js +2 -2
- package/dist/auth.js +1 -1
- package/dist/bin.js +85549 -2668
- package/dist/cli.js +15 -2
- package/dist/config.js +120 -2
- package/dist/connection.js +2 -2
- package/dist/index.js +1 -1
- package/dist/node.js +6 -2
- package/dist/orchestration.js +2 -2
- package/dist/rolldown-runtime.js +1 -1
- package/dist/rpc.js +1 -1
- package/dist/runtime.js +2 -2
- package/dist/shared.js +23313 -8022
- package/dist/src/application/actions.d.ts +25 -0
- package/dist/src/application/index.d.ts +3 -3
- package/dist/src/application/layer.d.ts +66 -50
- package/dist/src/application/model-selection.d.ts +2 -2
- package/dist/src/application/models.d.ts +1 -1
- package/dist/src/application/project-commands.d.ts +23 -3
- package/dist/src/application/projects.d.ts +7 -7
- package/dist/src/application/service.d.ts +65 -2
- package/dist/src/application/shell-sequence.d.ts +25 -19
- package/dist/src/application/terminals.d.ts +8 -8
- package/dist/src/application/thread-commands.d.ts +19 -19
- package/dist/src/application/thread-update.d.ts +1 -1
- package/dist/src/application/thread-wait.d.ts +19 -15
- package/dist/src/application/threads.d.ts +134 -108
- package/dist/src/auth/error.d.ts +3 -3
- package/dist/src/auth/index.d.ts +1 -1
- package/dist/src/auth/layer.d.ts +36 -8
- package/dist/src/auth/local-base-dir.d.ts +5 -2
- package/dist/src/auth/local-origin.d.ts +3 -3
- package/dist/src/auth/local-token.d.ts +3 -3
- package/dist/src/auth/remote-error.d.ts +3 -0
- package/dist/src/auth/service.d.ts +15 -3
- package/dist/src/auth/type.d.ts +40 -1
- package/dist/src/cli/env/flag.d.ts +2 -0
- package/dist/src/cli/env/index.d.ts +2 -0
- package/dist/src/cli/env/selection-layer.d.ts +3 -0
- package/dist/src/cli/flags.d.ts +2 -0
- package/dist/src/cli/format/index.d.ts +1 -0
- package/dist/src/cli/format/output.d.ts +12 -0
- package/dist/src/cli/index.d.ts +4 -0
- package/dist/src/cli/runtime/index.d.ts +1 -0
- package/dist/src/cli/runtime/service.d.ts +16 -0
- package/dist/src/{scope → cli/scope}/resolve.d.ts +5 -4
- package/dist/src/config/config.d.ts +49 -0
- package/dist/src/config/credential/cipher-node.d.ts +3 -0
- package/dist/src/config/credential/cipher-web.d.ts +3 -0
- package/dist/src/config/credential/cipher.d.ts +29 -0
- package/dist/src/config/credential/env.d.ts +3 -0
- package/dist/src/config/credential/error.d.ts +8 -0
- package/dist/src/config/credential/index.d.ts +6 -0
- package/dist/src/config/credential/service.d.ts +34 -0
- package/dist/src/config/env/env.d.ts +55 -0
- package/dist/src/config/env/index.d.ts +2 -0
- package/dist/src/{layout/base-dir.d.ts → config/env/layout.d.ts} +0 -1
- package/dist/src/config/environment-name/index.d.ts +1 -0
- package/dist/src/config/environment-name/name.d.ts +10 -0
- package/dist/src/config/error.d.ts +4 -11
- package/dist/src/config/index.d.ts +10 -5
- package/dist/src/config/keystore/error.d.ts +8 -0
- package/dist/src/config/keystore/file.d.ts +9 -0
- package/dist/src/config/keystore/index.d.ts +4 -0
- package/dist/src/config/keystore/keyring-node.d.ts +4 -0
- package/dist/src/config/keystore/service.d.ts +33 -0
- package/dist/src/config/paths/index.d.ts +1 -0
- package/dist/src/config/paths/paths.d.ts +6 -0
- package/dist/src/config/persist/file-mode.d.ts +4 -0
- package/dist/src/config/persist/migration.d.ts +68 -0
- package/dist/src/config/persist/persist.d.ts +40 -0
- package/dist/src/config/persist/schema.d.ts +68 -0
- package/dist/src/config/resolve/resolve.d.ts +40 -0
- package/dist/src/config/selection/index.d.ts +1 -0
- package/dist/src/config/selection/resolve.d.ts +4 -0
- package/dist/src/config/selection/service.d.ts +10 -0
- package/dist/src/config/types.d.ts +36 -0
- package/dist/src/config/url/error.d.ts +10 -0
- package/dist/src/config/url/index.d.ts +2 -0
- package/dist/src/connection/error.d.ts +3 -1
- package/dist/src/connection/index.d.ts +0 -1
- package/dist/src/connection/prepared.d.ts +14 -0
- package/dist/src/contracts/index.d.ts +1 -1
- package/dist/src/domain/error.d.ts +14 -1
- package/dist/src/domain/helpers.d.ts +53 -43
- package/dist/src/domain/model-config.d.ts +92 -84
- package/dist/src/domain/thread-activities.d.ts +1 -1
- package/dist/src/domain/thread-lifecycle.d.ts +24 -20
- package/dist/src/index.d.ts +1 -2
- package/dist/src/{connection/node.d.ts → node/connection.d.ts} +1 -1
- package/dist/src/node/index.d.ts +1 -2
- package/dist/src/orchestration/index.d.ts +0 -1
- package/dist/src/orchestration/layer.d.ts +321 -390
- package/dist/src/orchestration/service.d.ts +1 -1
- package/dist/src/rpc/error.d.ts +4 -6
- package/dist/src/rpc/layer.d.ts +2036 -1917
- package/dist/src/rpc/operation.d.ts +4 -5732
- package/dist/src/rpc/service.d.ts +1 -1
- package/dist/src/rpc/session.d.ts +22 -0
- package/dist/src/rpc/ws-group.d.ts +456 -1032
- package/dist/src/runtime/index.d.ts +1 -2
- package/dist/src/runtime/layer.d.ts +12 -8
- package/dist/src/sql/node-sqlite-client.d.ts +1 -1
- package/dist/src/t3tools/index.d.ts +1 -1
- package/dist/t3tools.js +2 -2
- package/package.json +30 -25
- package/src/application/actions.test.ts +328 -0
- package/src/application/actions.ts +475 -0
- package/src/application/index.ts +9 -5
- package/src/application/layer.ts +9 -0
- package/src/application/model-selection.ts +2 -2
- package/src/application/project-commands.ts +23 -5
- package/src/application/projects.ts +6 -7
- package/src/application/service.ts +79 -1
- package/src/application/shell-sequence.ts +1 -1
- package/src/application/terminals.ts +2 -1
- package/src/application/thread-commands.ts +1 -1
- package/src/application/thread-update.ts +1 -1
- package/src/application/thread-wait.ts +5 -1
- package/src/application/threads.test.ts +9 -3
- package/src/application/threads.ts +6 -6
- package/src/auth/error.ts +4 -9
- package/src/auth/index.ts +7 -0
- package/src/auth/layer.test-utils.ts +34 -0
- package/src/auth/layer.ts +116 -34
- package/src/auth/local-base-dir.ts +13 -6
- package/src/auth/local-origin.ts +10 -7
- package/src/auth/local-token.ts +28 -23
- package/src/auth/remote-error.ts +17 -0
- package/src/auth/service.test.ts +200 -0
- package/src/auth/service.ts +27 -3
- package/src/auth/transport.ts +45 -114
- package/src/auth/type.ts +47 -1
- package/src/bin.ts +24 -6
- package/src/cli/action-format.ts +110 -0
- package/src/cli/action.ts +398 -0
- package/src/cli/app.ts +6 -0
- package/src/cli/auth.ts +76 -23
- package/src/cli/env/flag.ts +8 -0
- package/src/cli/env/index.ts +2 -0
- package/src/cli/env/selection-layer.test.ts +49 -0
- package/src/cli/env/selection-layer.ts +27 -0
- package/src/cli/env.ts +107 -0
- package/src/cli/extra-args.test.ts +32 -0
- package/src/cli/extra-args.ts +22 -0
- package/src/cli/flags.ts +11 -1
- package/src/cli/format/auth.ts +92 -0
- package/src/cli/format/human.ts +131 -0
- package/src/cli/format/index.ts +12 -0
- package/src/cli/format/model.ts +29 -0
- package/src/cli/format/output.ts +51 -0
- package/src/cli/format/project.ts +32 -0
- package/src/cli/format/terminal.ts +87 -0
- package/src/cli/{thread-format.test.ts → format/thread.test.ts} +6 -4
- package/src/cli/format/thread.ts +185 -0
- package/src/cli/index.ts +20 -0
- package/src/cli/interaction/confirm.ts +64 -0
- package/src/cli/{self-action.ts → interaction/self-action.ts} +8 -6
- package/src/cli/message-input.ts +1 -1
- package/src/cli/model.ts +9 -5
- package/src/cli/project.ts +13 -7
- package/src/cli/projects/delete.ts +13 -12
- package/src/cli/require.ts +9 -7
- package/src/cli/runtime/index.ts +1 -0
- package/src/cli/runtime/service.ts +28 -0
- package/src/{scope → cli/scope}/resolve.ts +11 -9
- package/src/cli/terminal/attach.ts +3 -6
- package/src/cli/terminal/create.ts +10 -9
- package/src/cli/terminal/destroy.ts +13 -11
- package/src/cli/terminal/list.ts +10 -9
- package/src/cli/terminal/read.test-utils.ts +48 -0
- package/src/cli/terminal/read.test.ts +35 -0
- package/src/cli/terminal/read.ts +3 -6
- package/src/cli/terminal/scope.ts +10 -5
- package/src/cli/terminal/shared.ts +1 -1
- package/src/cli/terminal/stream.ts +3 -6
- package/src/cli/terminal/wait.test.ts +5 -3
- package/src/cli/terminal/wait.ts +10 -9
- package/src/cli/terminal/write.test.ts +34 -0
- package/src/cli/terminal/write.ts +10 -9
- package/src/cli/threads/approve.ts +11 -7
- package/src/cli/threads/archive.ts +14 -9
- package/src/cli/threads/callback.ts +6 -4
- package/src/cli/threads/delete.ts +17 -11
- package/src/cli/threads/interrupt.ts +14 -9
- package/src/cli/threads/list.test.ts +5 -3
- package/src/cli/threads/list.ts +10 -10
- package/src/cli/threads/messages.ts +11 -7
- package/src/cli/threads/respond.ts +11 -7
- package/src/cli/threads/send.ts +19 -9
- package/src/cli/threads/show.ts +11 -7
- package/src/cli/threads/start.ts +18 -13
- package/src/cli/threads/unarchive.ts +11 -7
- package/src/cli/threads/update.ts +14 -9
- package/src/cli/threads/wait.ts +11 -7
- package/src/cli/wait-events.ts +1 -1
- package/src/config/config.ts +260 -0
- package/src/config/credential/cipher-node.ts +40 -0
- package/src/config/credential/cipher-web.ts +82 -0
- package/src/config/credential/cipher.ts +39 -0
- package/src/config/credential/env.ts +13 -0
- package/src/config/credential/error.ts +9 -0
- package/src/config/credential/index.ts +6 -0
- package/src/config/credential/service.test-utils.ts +25 -0
- package/src/config/credential/service.test.ts +116 -0
- package/src/config/credential/service.ts +205 -0
- package/src/config/env/env.test-utils.ts +14 -0
- package/src/config/env/env.ts +81 -0
- package/src/config/env/index.ts +2 -0
- package/src/{layout/base-dir.ts → config/env/layout.ts} +0 -9
- package/src/config/environment-name/index.ts +7 -0
- package/src/config/environment-name/name.test.ts +66 -0
- package/src/config/environment-name/name.ts +49 -0
- package/src/config/error.ts +6 -8
- package/src/config/index.ts +16 -5
- package/src/config/keystore/error.ts +9 -0
- package/src/config/keystore/file.ts +96 -0
- package/src/config/keystore/index.ts +4 -0
- package/src/config/keystore/keyring-node.test.ts +12 -0
- package/src/config/keystore/keyring-node.ts +100 -0
- package/src/config/keystore/service.test-utils.ts +15 -0
- package/src/config/keystore/service.test.ts +18 -0
- package/src/config/keystore/service.ts +29 -0
- package/src/config/layer.test-utils.ts +45 -0
- package/src/config/layer.test.ts +209 -0
- package/src/config/paths/index.ts +1 -0
- package/src/config/paths/paths.ts +36 -0
- package/src/config/persist/file-mode.ts +21 -0
- package/src/config/persist/migration.test.ts +71 -0
- package/src/config/persist/migration.ts +82 -0
- package/src/config/persist/persist.test.ts +113 -0
- package/src/config/persist/persist.ts +65 -0
- package/src/config/persist/schema.ts +37 -0
- package/src/config/platform.test-utils.ts +20 -0
- package/src/config/resolve/resolve.test-utils.ts +20 -0
- package/src/config/resolve/resolve.test.ts +137 -0
- package/src/config/resolve/resolve.ts +104 -0
- package/src/config/selection/index.ts +1 -0
- package/src/config/selection/resolve.ts +14 -0
- package/src/config/selection/service.ts +29 -0
- package/src/config/temp-home.test-utils.ts +7 -0
- package/src/config/types.ts +49 -0
- package/src/config/url/error.ts +8 -0
- package/src/config/url/index.ts +7 -0
- package/src/config/url/url.test.ts +31 -0
- package/src/connection/error.ts +4 -1
- package/src/connection/index.ts +0 -1
- package/src/connection/layer.ts +5 -2
- package/src/connection/prepared.ts +83 -0
- package/src/contracts/index.ts +1 -1
- package/src/domain/error.ts +20 -1
- package/src/domain/helpers.test.ts +1 -1
- package/src/domain/helpers.ts +1 -1
- package/src/domain/model-config.ts +1 -1
- package/src/domain/thread-activities.test.ts +1 -1
- package/src/domain/thread-activities.ts +1 -1
- package/src/domain/thread-lifecycle.test.ts +1 -1
- package/src/domain/thread-lifecycle.ts +1 -1
- package/src/effect.test-utils.ts +25 -0
- package/src/index.ts +1 -1
- package/src/{connection/node.ts → node/connection.ts} +1 -1
- package/src/node/index.ts +1 -2
- package/src/orchestration/index.ts +0 -1
- package/src/orchestration/layer.ts +3 -2
- package/src/orchestration/service.ts +1 -1
- package/src/rpc/error.ts +10 -17
- package/src/rpc/layer.ts +17 -51
- package/src/rpc/operation.ts +16 -2
- package/src/rpc/service.ts +2 -1
- package/src/rpc/session.ts +168 -0
- package/src/rpc/ws-group.ts +13 -27
- package/src/runtime/index.ts +2 -1
- package/src/runtime/layer.test-utils.ts +32 -0
- package/src/runtime/layer.test.ts +66 -0
- package/src/runtime/layer.ts +21 -12
- package/src/t3tools/index.ts +1 -1
- package/src/types/marked-terminal.d.ts +11 -0
- package/dist/layout.js +0 -2
- package/dist/scope.js +0 -2
- package/dist/src/cli/output-format.d.ts +0 -11
- package/dist/src/config/layer.d.ts +0 -22
- package/dist/src/config/service.d.ts +0 -22
- package/dist/src/environment/layer.d.ts +0 -3
- package/dist/src/environment/service.d.ts +0 -12
- package/dist/src/layout/index.d.ts +0 -1
- package/dist/upstream-t3code/packages/contracts/src/auth.d.ts +0 -441
- package/dist/upstream-t3code/packages/contracts/src/baseSchemas.d.ts +0 -38
- package/dist/upstream-t3code/packages/contracts/src/desktopBootstrap.d.ts +0 -14
- package/dist/upstream-t3code/packages/contracts/src/editor.d.ts +0 -124
- package/dist/upstream-t3code/packages/contracts/src/environment.d.ts +0 -64
- package/dist/upstream-t3code/packages/contracts/src/environmentHttp.d.ts +0 -762
- package/dist/upstream-t3code/packages/contracts/src/filesystem.d.ts +0 -26
- package/dist/upstream-t3code/packages/contracts/src/git.d.ts +0 -500
- package/dist/upstream-t3code/packages/contracts/src/index.d.ts +0 -25
- package/dist/upstream-t3code/packages/contracts/src/ipc.d.ts +0 -490
- package/dist/upstream-t3code/packages/contracts/src/keybindings.d.ts +0 -133
- package/dist/upstream-t3code/packages/contracts/src/model.d.ts +0 -112
- package/dist/upstream-t3code/packages/contracts/src/orchestration.d.ts +0 -6682
- package/dist/upstream-t3code/packages/contracts/src/project.d.ts +0 -45
- package/dist/upstream-t3code/packages/contracts/src/provider.d.ts +0 -116
- package/dist/upstream-t3code/packages/contracts/src/providerInstance.d.ts +0 -99
- package/dist/upstream-t3code/packages/contracts/src/providerRuntime.d.ts +0 -4276
- package/dist/upstream-t3code/packages/contracts/src/relay.d.ts +0 -1262
- package/dist/upstream-t3code/packages/contracts/src/relayClient.d.ts +0 -48
- package/dist/upstream-t3code/packages/contracts/src/remoteAccess.d.ts +0 -45
- package/dist/upstream-t3code/packages/contracts/src/review.d.ts +0 -37
- package/dist/upstream-t3code/packages/contracts/src/rpc.d.ts +0 -8218
- package/dist/upstream-t3code/packages/contracts/src/server.d.ts +0 -2291
- package/dist/upstream-t3code/packages/contracts/src/settings.d.ts +0 -271
- package/dist/upstream-t3code/packages/contracts/src/sourceControl.d.ts +0 -177
- package/dist/upstream-t3code/packages/contracts/src/terminal.d.ts +0 -330
- package/dist/upstream-t3code/packages/contracts/src/vcs.d.ts +0 -148
- package/src/cli/auth-format.ts +0 -45
- package/src/cli/confirm.ts +0 -31
- package/src/cli/model-format.ts +0 -18
- package/src/cli/output-format.ts +0 -45
- package/src/cli/project-format.ts +0 -18
- package/src/cli/terminal/commands.test.ts +0 -101
- package/src/cli/terminal-format.ts +0 -167
- package/src/cli/thread-format.ts +0 -128
- package/src/config/layer.ts +0 -105
- package/src/config/service.ts +0 -26
- package/src/environment/layer.ts +0 -12
- package/src/environment/service.ts +0 -13
- package/src/layout/index.ts +0 -1
- /package/dist/src/{scope → cli/scope}/index.d.ts +0 -0
- /package/dist/src/config/{url.d.ts → url/url.d.ts} +0 -0
- /package/src/{scope → cli/scope}/index.ts +0 -0
- /package/src/config/{url.ts → url/url.ts} +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ServerProvider } from "@t3tools/contracts";
|
|
2
|
+
|
|
3
|
+
import { formatTable } from "./human.ts";
|
|
4
|
+
|
|
5
|
+
export function formatModelsHuman(providers: ReadonlyArray<ServerProvider>) {
|
|
6
|
+
if (providers.length === 0) {
|
|
7
|
+
return "no models found\n";
|
|
8
|
+
}
|
|
9
|
+
return providers
|
|
10
|
+
.map((provider) => {
|
|
11
|
+
const models = provider.models;
|
|
12
|
+
const displayName = provider.displayName ?? provider.instanceId;
|
|
13
|
+
const header = `${displayName} (${provider.instanceId}) - ${provider.status}`;
|
|
14
|
+
if (models.length === 0) {
|
|
15
|
+
return `${header}\n no models`;
|
|
16
|
+
}
|
|
17
|
+
return `${header}\n${formatTable(
|
|
18
|
+
[
|
|
19
|
+
{ header: "slug", value: (model) => model.slug, maxWidth: 40 },
|
|
20
|
+
{ header: "name", value: (model) => model.name, maxWidth: 48 },
|
|
21
|
+
{ header: "custom", value: (model) => (model.isCustom ? "yes" : "no"), maxWidth: 6 },
|
|
22
|
+
{ header: "sub-provider", value: (model) => model.subProvider ?? "-", maxWidth: 24 },
|
|
23
|
+
],
|
|
24
|
+
models,
|
|
25
|
+
)}`;
|
|
26
|
+
})
|
|
27
|
+
.join("\n\n")
|
|
28
|
+
.concat("\n");
|
|
29
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as Option from "effect/Option";
|
|
2
|
+
|
|
3
|
+
import type { T3CliEnvShape } from "../../config/env/env.ts";
|
|
4
|
+
import type { CliRuntime } from "../runtime/service.ts";
|
|
5
|
+
|
|
6
|
+
export const humanJsonFormatChoices = ["auto", "human", "json"] as const;
|
|
7
|
+
export const humanNdjsonFormatChoices = ["auto", "human", "ndjson"] as const;
|
|
8
|
+
export const humanJsonNdjsonFormatChoices = ["auto", "human", "json", "ndjson"] as const;
|
|
9
|
+
|
|
10
|
+
export type HumanJsonFormat = (typeof humanJsonFormatChoices)[number];
|
|
11
|
+
export type HumanNdjsonFormat = (typeof humanNdjsonFormatChoices)[number];
|
|
12
|
+
export type HumanJsonNdjsonFormat = (typeof humanJsonNdjsonFormatChoices)[number];
|
|
13
|
+
|
|
14
|
+
export function resolveOutputFormat<T extends "json" | "ndjson">(
|
|
15
|
+
format: "auto" | "human" | T,
|
|
16
|
+
cliRuntime: CliRuntime["Service"],
|
|
17
|
+
t3CliEnv: T3CliEnvShape,
|
|
18
|
+
nonHumanFormat: T,
|
|
19
|
+
): "human" | T {
|
|
20
|
+
if (format !== "auto") {
|
|
21
|
+
return format;
|
|
22
|
+
}
|
|
23
|
+
return isHumanTerminal(cliRuntime, t3CliEnv) ? "human" : nonHumanFormat;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function canRenderLiveTerminal(cliRuntime: CliRuntime["Service"], t3CliEnv: T3CliEnvShape) {
|
|
27
|
+
return (
|
|
28
|
+
cliRuntime.stderrIsTTY &&
|
|
29
|
+
Option.getOrElse(t3CliEnv.term, () => "") !== "dumb" &&
|
|
30
|
+
!isAgentEnvironment(t3CliEnv)
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function isInteractiveHumanTerminal(
|
|
35
|
+
cliRuntime: CliRuntime["Service"],
|
|
36
|
+
t3CliEnv: T3CliEnvShape,
|
|
37
|
+
) {
|
|
38
|
+
return (
|
|
39
|
+
cliRuntime.stdoutIsTTY &&
|
|
40
|
+
!isAgentEnvironment(t3CliEnv) &&
|
|
41
|
+
Option.getOrElse(t3CliEnv.term, () => "") !== "dumb"
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function isHumanTerminal(cliRuntime: CliRuntime["Service"], t3CliEnv: T3CliEnvShape) {
|
|
46
|
+
return isInteractiveHumanTerminal(cliRuntime, t3CliEnv);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function isAgentEnvironment(t3CliEnv: T3CliEnvShape) {
|
|
50
|
+
return t3CliEnv.ci || t3CliEnv.codexCi || t3CliEnv.codexThreadId || t3CliEnv.t3cliAgent;
|
|
51
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { OrchestrationProjectShell } from "@t3tools/contracts";
|
|
2
|
+
|
|
3
|
+
import { formatRecord, formatTable } from "./human.ts";
|
|
4
|
+
|
|
5
|
+
export function formatProjectsHuman(projects: ReadonlyArray<OrchestrationProjectShell>) {
|
|
6
|
+
if (projects.length === 0) {
|
|
7
|
+
return "no projects\n";
|
|
8
|
+
}
|
|
9
|
+
return `${formatTable(
|
|
10
|
+
[
|
|
11
|
+
{ header: "title", value: (project) => project.title, maxWidth: 32 },
|
|
12
|
+
{ header: "id", value: (project) => project.id, maxWidth: 40 },
|
|
13
|
+
{ header: "path", value: (project) => project.workspaceRoot, maxWidth: 72 },
|
|
14
|
+
],
|
|
15
|
+
projects,
|
|
16
|
+
)}\n`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function formatProjectAddedHuman(project: OrchestrationProjectShell) {
|
|
20
|
+
return `project added\n${formatRecord([
|
|
21
|
+
{ field: "title", value: project.title },
|
|
22
|
+
{ field: "id", value: project.id },
|
|
23
|
+
{ field: "path", value: project.workspaceRoot },
|
|
24
|
+
])}`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function formatProjectDeletedHuman(input: {
|
|
28
|
+
readonly projectId: string;
|
|
29
|
+
readonly dispatch: { readonly sequence: number };
|
|
30
|
+
}) {
|
|
31
|
+
return `project deleted: ${input.projectId} (sequence ${input.dispatch.sequence})`;
|
|
32
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { TerminalSessionSnapshot, TerminalSummary } from "@t3tools/contracts";
|
|
2
|
+
|
|
3
|
+
import { formatTable } from "./human.ts";
|
|
4
|
+
|
|
5
|
+
type TerminalRow = {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly status: string;
|
|
8
|
+
readonly label: string;
|
|
9
|
+
readonly cwd: string;
|
|
10
|
+
readonly updated: string;
|
|
11
|
+
readonly process: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export function formatTerminalListHuman(terminals: ReadonlyArray<TerminalSummary>) {
|
|
15
|
+
if (terminals.length === 0) {
|
|
16
|
+
return "no terminals\n";
|
|
17
|
+
}
|
|
18
|
+
return `${formatTerminalTable(terminals.map(toSummaryRow))}\n`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function formatTerminalCreatedHuman(snapshot: TerminalSessionSnapshot) {
|
|
22
|
+
return `terminal created\n${formatTerminalTable([toSnapshotRow(snapshot)])}`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function formatTerminalWrittenHuman(input: {
|
|
26
|
+
readonly terminalId: string;
|
|
27
|
+
readonly threadId: string;
|
|
28
|
+
readonly bytes: number;
|
|
29
|
+
}) {
|
|
30
|
+
return `wrote ${input.bytes} bytes to ${input.terminalId} (${input.threadId})`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function formatTerminalDestroyedHuman(input: {
|
|
34
|
+
readonly terminalId: string;
|
|
35
|
+
readonly threadId: string;
|
|
36
|
+
}) {
|
|
37
|
+
return `destroyed ${input.terminalId} (${input.threadId})`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function formatTerminalTable(rows: ReadonlyArray<TerminalRow>) {
|
|
41
|
+
return formatTable(
|
|
42
|
+
[
|
|
43
|
+
{ header: "id", value: (row) => row.id, maxWidth: 44 },
|
|
44
|
+
{ header: "status", value: (row) => row.status, maxWidth: 8 },
|
|
45
|
+
{ header: "label", value: (row) => row.label, maxWidth: 24 },
|
|
46
|
+
{ header: "cwd", value: (row) => row.cwd, maxWidth: 40 },
|
|
47
|
+
{ header: "updated", value: (row) => row.updated, maxWidth: 24 },
|
|
48
|
+
{ header: "process", value: (row) => row.process, maxWidth: 20 },
|
|
49
|
+
],
|
|
50
|
+
rows,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function toSummaryRow(terminal: TerminalSummary): TerminalRow {
|
|
55
|
+
return {
|
|
56
|
+
id: terminal.terminalId,
|
|
57
|
+
status: terminal.status,
|
|
58
|
+
label: terminal.label,
|
|
59
|
+
cwd: terminal.cwd,
|
|
60
|
+
updated: terminal.updatedAt,
|
|
61
|
+
process: formatProcessInfo(terminal),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function toSnapshotRow(snapshot: TerminalSessionSnapshot): TerminalRow {
|
|
66
|
+
return {
|
|
67
|
+
id: snapshot.terminalId,
|
|
68
|
+
status: snapshot.status,
|
|
69
|
+
label: snapshot.label,
|
|
70
|
+
cwd: snapshot.cwd,
|
|
71
|
+
updated: snapshot.updatedAt,
|
|
72
|
+
process: formatProcessInfo(snapshot),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function formatProcessInfo(input: {
|
|
77
|
+
readonly pid: number | null;
|
|
78
|
+
readonly exitCode: number | null;
|
|
79
|
+
readonly exitSignal: number | null;
|
|
80
|
+
}) {
|
|
81
|
+
const parts = [
|
|
82
|
+
typeof input.pid === "number" ? `pid ${input.pid}` : null,
|
|
83
|
+
typeof input.exitCode === "number" ? `exit ${input.exitCode}` : null,
|
|
84
|
+
typeof input.exitSignal === "number" ? `sig ${input.exitSignal}` : null,
|
|
85
|
+
].filter((part): part is string => part !== null);
|
|
86
|
+
return parts.length > 0 ? parts.join(", ") : "-";
|
|
87
|
+
}
|
|
@@ -2,9 +2,9 @@ import "vite-plus/test/config";
|
|
|
2
2
|
|
|
3
3
|
import { assert, describe, it } from "@effect/vitest";
|
|
4
4
|
import { fromPartial } from "@total-typescript/shoehorn";
|
|
5
|
-
import type { OrchestrationThreadShell } from "
|
|
5
|
+
import type { OrchestrationThreadShell } from "@t3tools/contracts";
|
|
6
6
|
|
|
7
|
-
import { formatThreadsHuman } from "./thread
|
|
7
|
+
import { formatThreadsHuman } from "./thread.ts";
|
|
8
8
|
|
|
9
9
|
describe("formatThreadsHuman", () => {
|
|
10
10
|
it("appends (archived) for archived threads", () => {
|
|
@@ -26,7 +26,9 @@ describe("formatThreadsHuman", () => {
|
|
|
26
26
|
];
|
|
27
27
|
|
|
28
28
|
const output = formatThreadsHuman(threads);
|
|
29
|
-
assert.include(output, "
|
|
30
|
-
assert.include(output, "
|
|
29
|
+
assert.include(output, "title id status updated flags");
|
|
30
|
+
assert.include(output, "Active thread active-1");
|
|
31
|
+
assert.include(output, "Archived thread archived-1");
|
|
32
|
+
assert.include(output, "archived");
|
|
31
33
|
});
|
|
32
34
|
});
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import type { ThreadShow } from "../../application/threads.ts";
|
|
2
|
+
import type { WaitEvent } from "../../application/service.ts";
|
|
3
|
+
import type { OrchestrationThread, OrchestrationThreadShell } from "@t3tools/contracts";
|
|
4
|
+
import { latestAssistantMessage, threadStatus } from "../../domain/thread-lifecycle.ts";
|
|
5
|
+
import { formatChatTranscript, formatRecord, formatTable } from "./human.ts";
|
|
6
|
+
|
|
7
|
+
export function formatThreadShowJson(thread: ThreadShow) {
|
|
8
|
+
return {
|
|
9
|
+
id: thread.id,
|
|
10
|
+
projectId: thread.projectId,
|
|
11
|
+
title: thread.title,
|
|
12
|
+
status: thread.status,
|
|
13
|
+
session: thread.session,
|
|
14
|
+
latestTurn: thread.latestTurn,
|
|
15
|
+
modelSelection: thread.modelSelection,
|
|
16
|
+
runtimeMode: thread.runtimeMode,
|
|
17
|
+
interactionMode: thread.interactionMode,
|
|
18
|
+
branch: thread.branch,
|
|
19
|
+
worktreePath: thread.worktreePath,
|
|
20
|
+
archivedAt: thread.archivedAt,
|
|
21
|
+
createdAt: thread.createdAt,
|
|
22
|
+
updatedAt: thread.updatedAt,
|
|
23
|
+
messageCount: thread.messageCount,
|
|
24
|
+
hasPendingApprovals: thread.hasPendingApprovals,
|
|
25
|
+
hasPendingUserInput: thread.hasPendingUserInput,
|
|
26
|
+
hasActionableProposedPlan: thread.hasActionableProposedPlan,
|
|
27
|
+
pendingApprovals: thread.pendingApprovals,
|
|
28
|
+
pendingUserInputs: thread.pendingUserInputs,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function formatThreadShowHuman(thread: ThreadShow) {
|
|
33
|
+
const sections = [
|
|
34
|
+
formatRecord([
|
|
35
|
+
{ field: "title", value: thread.title },
|
|
36
|
+
{ field: "id", value: thread.id },
|
|
37
|
+
{ field: "project", value: thread.projectId },
|
|
38
|
+
{ field: "status", value: thread.status },
|
|
39
|
+
{
|
|
40
|
+
field: "model",
|
|
41
|
+
value: `${thread.modelSelection.instanceId}/${thread.modelSelection.model}`,
|
|
42
|
+
},
|
|
43
|
+
{ field: "runtime", value: thread.runtimeMode },
|
|
44
|
+
{ field: "interaction", value: thread.interactionMode },
|
|
45
|
+
...(thread.branch !== null ? [{ field: "branch", value: thread.branch }] : []),
|
|
46
|
+
...(thread.worktreePath !== null ? [{ field: "worktree", value: thread.worktreePath }] : []),
|
|
47
|
+
...(thread.archivedAt !== null ? [{ field: "archived", value: thread.archivedAt }] : []),
|
|
48
|
+
{ field: "messages", value: String(thread.messageCount) },
|
|
49
|
+
{ field: "updated", value: thread.updatedAt },
|
|
50
|
+
]),
|
|
51
|
+
];
|
|
52
|
+
if (thread.pendingApprovals.length > 0) {
|
|
53
|
+
sections.push(
|
|
54
|
+
`\npending approvals\n${formatTable(
|
|
55
|
+
[
|
|
56
|
+
{ header: "request", value: (approval) => approval.requestId, maxWidth: 40 },
|
|
57
|
+
{ header: "kind", value: (approval) => approval.requestKind, maxWidth: 16 },
|
|
58
|
+
{ header: "created", value: (approval) => approval.createdAt, maxWidth: 28 },
|
|
59
|
+
{ header: "detail", value: (approval) => approval.detail ?? "-", maxWidth: 72 },
|
|
60
|
+
],
|
|
61
|
+
thread.pendingApprovals,
|
|
62
|
+
)}`,
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
if (thread.pendingUserInputs.length > 0) {
|
|
66
|
+
sections.push(
|
|
67
|
+
`\npending user inputs\n${formatTable(
|
|
68
|
+
[
|
|
69
|
+
{ header: "request", value: (input) => input.requestId, maxWidth: 40 },
|
|
70
|
+
{ header: "questions", value: (input) => String(input.questions.length), maxWidth: 9 },
|
|
71
|
+
{ header: "created", value: (input) => input.createdAt, maxWidth: 28 },
|
|
72
|
+
{
|
|
73
|
+
header: "prompt",
|
|
74
|
+
value: (input) => input.questions.map((question) => question.question).join("\n"),
|
|
75
|
+
maxWidth: 72,
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
thread.pendingUserInputs,
|
|
79
|
+
)}`,
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
return `${sections.join("\n")}\n`;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function formatThreadsHuman(threads: ReadonlyArray<OrchestrationThreadShell>) {
|
|
86
|
+
if (threads.length === 0) {
|
|
87
|
+
return "no threads\n";
|
|
88
|
+
}
|
|
89
|
+
return `${formatTable(
|
|
90
|
+
[
|
|
91
|
+
{ header: "title", value: (thread) => thread.title, maxWidth: 36 },
|
|
92
|
+
{ header: "id", value: (thread) => thread.id, maxWidth: 40 },
|
|
93
|
+
{ header: "status", value: (thread) => threadStatus(thread), maxWidth: 18 },
|
|
94
|
+
{ header: "updated", value: (thread) => thread.updatedAt, maxWidth: 28 },
|
|
95
|
+
{ header: "flags", value: formatThreadFlags, maxWidth: 34 },
|
|
96
|
+
],
|
|
97
|
+
threads,
|
|
98
|
+
)}\n`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function formatThreadDeletedHuman(input: {
|
|
102
|
+
readonly threadId: string;
|
|
103
|
+
readonly dispatch: { readonly sequence: number };
|
|
104
|
+
}) {
|
|
105
|
+
return `thread deleted: ${input.threadId} (sequence ${input.dispatch.sequence})`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function formatThreadStartedHuman(input: {
|
|
109
|
+
readonly thread: OrchestrationThread;
|
|
110
|
+
readonly sequence: number;
|
|
111
|
+
}) {
|
|
112
|
+
return `thread started\n${formatRecord([
|
|
113
|
+
{ field: "title", value: input.thread.title },
|
|
114
|
+
{ field: "id", value: input.thread.id },
|
|
115
|
+
{ field: "status", value: threadStatus(input.thread) },
|
|
116
|
+
{ field: "sequence", value: String(input.sequence) },
|
|
117
|
+
])}`;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function formatThreadMessagesHuman(thread: OrchestrationThread, limit: number) {
|
|
121
|
+
const messages = limit === 0 ? thread.messages : thread.messages.slice(-limit);
|
|
122
|
+
return formatChatTranscript(messages);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function formatWaitDoneHuman(thread: OrchestrationThread) {
|
|
126
|
+
const latest = latestAssistantMessage(thread);
|
|
127
|
+
return `status: ${threadStatus(thread)}\n${
|
|
128
|
+
latest !== undefined ? `\n${formatChatTranscript([latest])}` : ""
|
|
129
|
+
}`;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function formatThreadMessagesJson(thread: OrchestrationThread, full: boolean) {
|
|
133
|
+
return full ? thread : { thread: stripThreadMessages(thread), messages: thread.messages };
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function formatWaitEventNdjson(event: WaitEvent) {
|
|
137
|
+
if (event.type !== "thread" && event.type !== "done") {
|
|
138
|
+
return event;
|
|
139
|
+
}
|
|
140
|
+
const compactThread = stripThreadHeavy(event.thread);
|
|
141
|
+
return event.type === "done"
|
|
142
|
+
? {
|
|
143
|
+
type: "done",
|
|
144
|
+
thread: compactThread,
|
|
145
|
+
latestAssistantMessage: latestAssistantMessage(event.thread) ?? null,
|
|
146
|
+
}
|
|
147
|
+
: {
|
|
148
|
+
type: "thread",
|
|
149
|
+
thread: compactThread,
|
|
150
|
+
messageCount: event.thread.messages.length,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function stripThreadMessages<T extends { readonly messages: unknown }>(thread: T) {
|
|
155
|
+
const { messages: _messages, ...rest } = thread;
|
|
156
|
+
return rest;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function formatThreadFlags(thread: OrchestrationThreadShell) {
|
|
160
|
+
const flags = [
|
|
161
|
+
thread.archivedAt !== null ? "archived" : null,
|
|
162
|
+
thread.hasPendingApprovals ? "approval" : null,
|
|
163
|
+
thread.hasPendingUserInput ? "input" : null,
|
|
164
|
+
thread.hasActionableProposedPlan ? "plan" : null,
|
|
165
|
+
].filter((flag): flag is string => flag !== null);
|
|
166
|
+
return flags.length > 0 ? flags.join(", ") : "-";
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function stripThreadHeavy<
|
|
170
|
+
T extends {
|
|
171
|
+
readonly messages: unknown;
|
|
172
|
+
readonly activities?: unknown;
|
|
173
|
+
readonly proposedPlans?: unknown;
|
|
174
|
+
readonly checkpoints?: unknown;
|
|
175
|
+
},
|
|
176
|
+
>(thread: T) {
|
|
177
|
+
const {
|
|
178
|
+
messages: _messages,
|
|
179
|
+
activities: _activities,
|
|
180
|
+
proposedPlans: _proposedPlans,
|
|
181
|
+
checkpoints: _checkpoints,
|
|
182
|
+
...rest
|
|
183
|
+
} = thread;
|
|
184
|
+
return rest;
|
|
185
|
+
}
|
package/src/cli/index.ts
CHANGED
|
@@ -8,3 +8,23 @@ export {
|
|
|
8
8
|
waitFormatFlag,
|
|
9
9
|
worktreeFlag,
|
|
10
10
|
} from "./flags.ts";
|
|
11
|
+
export * as Env from "./env/index.ts";
|
|
12
|
+
export * as Runtime from "./runtime/index.ts";
|
|
13
|
+
export {
|
|
14
|
+
resolveCommandProjectRef,
|
|
15
|
+
resolveProjectRef,
|
|
16
|
+
resolveThreadId,
|
|
17
|
+
resolveWorktreePath,
|
|
18
|
+
} from "./scope/index.ts";
|
|
19
|
+
export {
|
|
20
|
+
resolveOutputFormat,
|
|
21
|
+
canRenderLiveTerminal,
|
|
22
|
+
isInteractiveHumanTerminal,
|
|
23
|
+
isAgentEnvironment,
|
|
24
|
+
humanJsonFormatChoices,
|
|
25
|
+
humanNdjsonFormatChoices,
|
|
26
|
+
humanJsonNdjsonFormatChoices,
|
|
27
|
+
type HumanJsonFormat,
|
|
28
|
+
type HumanNdjsonFormat,
|
|
29
|
+
type HumanJsonNdjsonFormat,
|
|
30
|
+
} from "./format/index.ts";
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Prompt from "effect/unstable/cli/Prompt";
|
|
3
|
+
|
|
4
|
+
import { DestructiveConfirmationRequiredError } from "../error.ts";
|
|
5
|
+
import { isInteractiveHumanTerminal } from "../format/output.ts";
|
|
6
|
+
import type { T3CliEnvShape } from "../../config/env/env.ts";
|
|
7
|
+
import type { CliRuntime } from "../runtime/service.ts";
|
|
8
|
+
|
|
9
|
+
export const requireDestructiveConfirmation = Effect.fn("requireDestructiveConfirmation")(
|
|
10
|
+
function* (input: {
|
|
11
|
+
readonly message: string;
|
|
12
|
+
readonly yes: boolean;
|
|
13
|
+
readonly cliRuntime: CliRuntime["Service"];
|
|
14
|
+
readonly t3CliEnv: T3CliEnvShape;
|
|
15
|
+
}) {
|
|
16
|
+
if (input.yes) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (!isInteractiveHumanTerminal(input.cliRuntime, input.t3CliEnv)) {
|
|
20
|
+
yield* Effect.fail(
|
|
21
|
+
new DestructiveConfirmationRequiredError({
|
|
22
|
+
message: "destructive action requires --yes in non-interactive mode",
|
|
23
|
+
}),
|
|
24
|
+
);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const confirmed = yield* Prompt.run(Prompt.confirm({ message: input.message, initial: false }));
|
|
28
|
+
if (confirmed) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
yield* Effect.fail(new DestructiveConfirmationRequiredError({ message: "aborted" }));
|
|
32
|
+
},
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
export const requireEnvironmentReplaceConfirmation = Effect.fn(
|
|
36
|
+
"requireEnvironmentReplaceConfirmation",
|
|
37
|
+
)(function* (input: {
|
|
38
|
+
readonly name: string;
|
|
39
|
+
readonly replace: boolean;
|
|
40
|
+
readonly cliRuntime: CliRuntime["Service"];
|
|
41
|
+
readonly t3CliEnv: T3CliEnvShape;
|
|
42
|
+
}) {
|
|
43
|
+
if (input.replace) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (!isInteractiveHumanTerminal(input.cliRuntime, input.t3CliEnv)) {
|
|
47
|
+
yield* Effect.fail(
|
|
48
|
+
new DestructiveConfirmationRequiredError({
|
|
49
|
+
message: `environment '${input.name}' already exists: pass --replace`,
|
|
50
|
+
}),
|
|
51
|
+
);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const confirmed = yield* Prompt.run(
|
|
55
|
+
Prompt.confirm({
|
|
56
|
+
message: `Environment '${input.name}' already exists. Replace?`,
|
|
57
|
+
initial: false,
|
|
58
|
+
}),
|
|
59
|
+
);
|
|
60
|
+
if (confirmed) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
yield* Effect.fail(new DestructiveConfirmationRequiredError({ message: "aborted" }));
|
|
64
|
+
});
|
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
2
|
|
|
3
|
-
import { SelfActionError } from "
|
|
4
|
-
import { isAgentEnvironment } from "
|
|
5
|
-
import type {
|
|
3
|
+
import { SelfActionError } from "../error.ts";
|
|
4
|
+
import { isAgentEnvironment } from "../format/output.ts";
|
|
5
|
+
import type { T3CliEnvShape } from "../../config/env/env.ts";
|
|
6
|
+
import type { CliRuntime } from "../runtime/service.ts";
|
|
6
7
|
|
|
7
8
|
export const requireSelfActionConfirmation = Effect.fn("requireSelfActionConfirmation")(
|
|
8
9
|
function* (input: {
|
|
9
10
|
readonly threadId: string;
|
|
10
11
|
readonly force: boolean;
|
|
11
|
-
readonly
|
|
12
|
+
readonly cliRuntime: CliRuntime["Service"];
|
|
13
|
+
readonly t3CliEnv: T3CliEnvShape;
|
|
12
14
|
readonly action: string;
|
|
13
15
|
}) {
|
|
14
16
|
if (input.force) {
|
|
15
17
|
return;
|
|
16
18
|
}
|
|
17
|
-
if (!isAgentEnvironment(input.
|
|
19
|
+
if (!isAgentEnvironment(input.t3CliEnv)) {
|
|
18
20
|
return;
|
|
19
21
|
}
|
|
20
|
-
const callerThreadId = input.
|
|
22
|
+
const callerThreadId = input.t3CliEnv.scope.t3codeThreadId;
|
|
21
23
|
if (callerThreadId === undefined || callerThreadId.length === 0) {
|
|
22
24
|
return;
|
|
23
25
|
}
|
package/src/cli/message-input.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
2
|
import * as Schema from "effect/Schema";
|
|
3
|
-
import { ProviderUserInputAnswers } from "
|
|
3
|
+
import { ProviderUserInputAnswers } from "@t3tools/contracts";
|
|
4
4
|
|
|
5
5
|
import { MessageInputError } from "./error.ts";
|
|
6
6
|
import type { InputError } from "./input/error.ts";
|
package/src/cli/model.ts
CHANGED
|
@@ -2,11 +2,13 @@ import * as Effect from "effect/Effect";
|
|
|
2
2
|
import * as Option from "effect/Option";
|
|
3
3
|
import { Command, Flag } from "effect/unstable/cli";
|
|
4
4
|
|
|
5
|
+
import { extraArgsConfig } from "./extra-args.ts";
|
|
5
6
|
import { formatFlag } from "./flags.ts";
|
|
6
7
|
import { T3Application } from "../application/service.ts";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { CliRuntime } from "../cli/runtime/service.ts";
|
|
9
|
+
import { loadT3CliEnv } from "../config/env/env.ts";
|
|
10
|
+
import { formatModelsHuman } from "./format/model.ts";
|
|
11
|
+
import { resolveOutputFormat } from "./format/output.ts";
|
|
10
12
|
import { T3Output } from "./output/service.ts";
|
|
11
13
|
|
|
12
14
|
export function createModelCommand() {
|
|
@@ -22,14 +24,16 @@ const listCommand = Command.make(
|
|
|
22
24
|
all: Flag.boolean("all"),
|
|
23
25
|
provider: Flag.string("provider").pipe(Flag.optional),
|
|
24
26
|
format: formatFlag,
|
|
27
|
+
...extraArgsConfig,
|
|
25
28
|
},
|
|
26
29
|
({ all, provider, format }) =>
|
|
27
30
|
Effect.gen(function* () {
|
|
28
31
|
const application = yield* T3Application;
|
|
29
|
-
const
|
|
32
|
+
const cliRuntime = yield* CliRuntime;
|
|
33
|
+
const t3CliEnv = yield* loadT3CliEnv;
|
|
30
34
|
const output = yield* T3Output;
|
|
31
35
|
const providerValue = Option.getOrUndefined(provider);
|
|
32
|
-
const resolvedFormat = resolveOutputFormat(format,
|
|
36
|
+
const resolvedFormat = resolveOutputFormat(format, cliRuntime, t3CliEnv, "json");
|
|
33
37
|
const providers = yield* application.listModels({
|
|
34
38
|
all,
|
|
35
39
|
...(providerValue !== undefined && providerValue.length > 0
|
package/src/cli/project.ts
CHANGED
|
@@ -2,12 +2,14 @@ import * as Effect from "effect/Effect";
|
|
|
2
2
|
import * as Option from "effect/Option";
|
|
3
3
|
import { Command, Flag } from "effect/unstable/cli";
|
|
4
4
|
|
|
5
|
+
import { extraArgsConfig } from "./extra-args.ts";
|
|
5
6
|
import { formatFlag, projectPathFlag } from "./flags.ts";
|
|
6
|
-
import { formatProjectAddedHuman, formatProjectsHuman } from "./project
|
|
7
|
+
import { formatProjectAddedHuman, formatProjectsHuman } from "./format/project.ts";
|
|
7
8
|
import { deleteProjectCommand } from "./projects/delete.ts";
|
|
8
9
|
import { T3Application } from "../application/service.ts";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
10
|
+
import { CliRuntime } from "../cli/runtime/service.ts";
|
|
11
|
+
import { loadT3CliEnv } from "../config/env/env.ts";
|
|
12
|
+
import { resolveOutputFormat } from "./format/output.ts";
|
|
11
13
|
import { T3Output } from "./output/service.ts";
|
|
12
14
|
|
|
13
15
|
export function createProjectCommand() {
|
|
@@ -21,13 +23,15 @@ const listCommand = Command.make(
|
|
|
21
23
|
"list",
|
|
22
24
|
{
|
|
23
25
|
format: formatFlag,
|
|
26
|
+
...extraArgsConfig,
|
|
24
27
|
},
|
|
25
28
|
({ format }) =>
|
|
26
29
|
Effect.gen(function* () {
|
|
27
30
|
const application = yield* T3Application;
|
|
28
|
-
const
|
|
31
|
+
const cliRuntime = yield* CliRuntime;
|
|
32
|
+
const t3CliEnv = yield* loadT3CliEnv;
|
|
29
33
|
const output = yield* T3Output;
|
|
30
|
-
const resolvedFormat = resolveOutputFormat(format,
|
|
34
|
+
const resolvedFormat = resolveOutputFormat(format, cliRuntime, t3CliEnv, "json");
|
|
31
35
|
const snapshot = yield* application.loadShell();
|
|
32
36
|
if (resolvedFormat === "json") {
|
|
33
37
|
yield* output.printJson(snapshot.projects);
|
|
@@ -43,13 +47,15 @@ const addCommand = Command.make(
|
|
|
43
47
|
path: projectPathFlag,
|
|
44
48
|
title: Flag.string("title").pipe(Flag.optional),
|
|
45
49
|
format: formatFlag,
|
|
50
|
+
...extraArgsConfig,
|
|
46
51
|
},
|
|
47
52
|
({ path, title, format }) =>
|
|
48
53
|
Effect.gen(function* () {
|
|
49
54
|
const application = yield* T3Application;
|
|
50
|
-
const
|
|
55
|
+
const cliRuntime = yield* CliRuntime;
|
|
56
|
+
const t3CliEnv = yield* loadT3CliEnv;
|
|
51
57
|
const output = yield* T3Output;
|
|
52
|
-
const resolvedFormat = resolveOutputFormat(format,
|
|
58
|
+
const resolvedFormat = resolveOutputFormat(format, cliRuntime, t3CliEnv, "json");
|
|
53
59
|
const titleValue = Option.getOrUndefined(title);
|
|
54
60
|
const result = yield* application.addProject({
|
|
55
61
|
path,
|