t3code-cli 0.11.0 → 0.12.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 +85526 -2662
- 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/rpc.js +1 -1
- package/dist/runtime.js +2 -2
- package/dist/shared.js +42956 -38119
- 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 +51 -35
- 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 +22 -2
- 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 +11 -0
- package/dist/src/application/terminals.d.ts +2 -2
- package/dist/src/application/thread-commands.d.ts +1 -1
- package/dist/src/application/thread-wait.d.ts +9 -0
- package/dist/src/application/threads.d.ts +56 -5
- package/dist/src/auth/error.d.ts +2 -1
- package/dist/src/auth/index.d.ts +1 -1
- package/dist/src/auth/layer.d.ts +34 -6
- 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/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/index.d.ts +0 -1
- 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 +16 -1
- package/dist/src/domain/model-config.d.ts +4 -1
- package/dist/src/domain/thread-activities.d.ts +1 -1
- package/dist/src/domain/thread-lifecycle.d.ts +10 -1
- 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 +153 -7
- package/dist/src/orchestration/service.d.ts +1 -1
- package/dist/src/rpc/error.d.ts +2 -2
- package/dist/src/rpc/index.d.ts +2 -3
- package/dist/src/rpc/layer.d.ts +574 -46
- package/dist/src/rpc/operation.d.ts +574 -46
- package/dist/src/rpc/ws-group.d.ts +184 -19
- package/dist/src/runtime/index.d.ts +1 -2
- package/dist/src/runtime/layer.d.ts +12 -8
- package/dist/src/t3tools/index.d.ts +1 -1
- package/dist/t3tools.js +2 -2
- package/package.json +25 -21
- 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 +1 -1
- package/src/application/threads.test.ts +9 -3
- package/src/application/threads.ts +6 -6
- package/src/auth/error.ts +2 -1
- 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/service.test.ts +200 -0
- package/src/auth/service.ts +27 -3
- package/src/auth/transport.ts +2 -2
- 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/index.ts +0 -1
- 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 +1 -1
- package/src/orchestration/service.ts +1 -1
- package/src/rpc/error.ts +2 -2
- package/src/rpc/index.ts +2 -3
- package/src/rpc/layer.ts +1 -1
- package/src/rpc/ws-group.ts +1 -1
- 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 +15 -9
- 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,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,
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
2
|
import { Command } from "effect/unstable/cli";
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { extraArgsConfig } from "../extra-args.ts";
|
|
5
|
+
import { requireDestructiveConfirmation } from "../interaction/confirm.ts";
|
|
5
6
|
import { forceFlag, formatFlag, projectFlag, yesFlag } from "../flags.ts";
|
|
6
|
-
import { formatProjectDeletedHuman } from "../project
|
|
7
|
+
import { formatProjectDeletedHuman } from "../format/project.ts";
|
|
7
8
|
import { requireCommandProjectRef } from "../require.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 const deleteProjectCommand = Command.make(
|
|
@@ -17,24 +19,23 @@ export const deleteProjectCommand = Command.make(
|
|
|
17
19
|
force: forceFlag,
|
|
18
20
|
yes: yesFlag,
|
|
19
21
|
format: formatFlag,
|
|
22
|
+
...extraArgsConfig,
|
|
20
23
|
},
|
|
21
24
|
({ project, force, yes, format }) =>
|
|
22
25
|
Effect.gen(function* () {
|
|
23
26
|
const application = yield* T3Application;
|
|
24
|
-
const
|
|
27
|
+
const cliRuntime = yield* CliRuntime;
|
|
28
|
+
const t3CliEnv = yield* loadT3CliEnv;
|
|
25
29
|
const output = yield* T3Output;
|
|
26
|
-
const projectRef = yield* requireCommandProjectRef({
|
|
27
|
-
project,
|
|
28
|
-
env: environment.env,
|
|
29
|
-
cwd: environment.cwd,
|
|
30
|
-
});
|
|
30
|
+
const projectRef = yield* requireCommandProjectRef({ project });
|
|
31
31
|
const resolvedProject = yield* application.resolveProject(projectRef);
|
|
32
32
|
yield* requireDestructiveConfirmation({
|
|
33
33
|
message: `Delete project ${resolvedProject.title} (${resolvedProject.id})?`,
|
|
34
34
|
yes,
|
|
35
|
-
|
|
35
|
+
cliRuntime,
|
|
36
|
+
t3CliEnv,
|
|
36
37
|
});
|
|
37
|
-
const resolvedFormat = resolveOutputFormat(format,
|
|
38
|
+
const resolvedFormat = resolveOutputFormat(format, cliRuntime, t3CliEnv, "json");
|
|
38
39
|
const result = yield* application.deleteProject({
|
|
39
40
|
projectId: resolvedProject.id,
|
|
40
41
|
...(force ? { force: true } : {}),
|
package/src/cli/require.ts
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
2
|
import * as Option from "effect/Option";
|
|
3
3
|
|
|
4
|
-
import { T3Config } from "../config/
|
|
4
|
+
import { T3Config } from "../config/config.ts";
|
|
5
|
+
import { loadT3CliEnv } from "../config/env/env.ts";
|
|
6
|
+
import { CliRuntime } from "../cli/runtime/service.ts";
|
|
5
7
|
import { ProjectLookupError } from "../domain/error.ts";
|
|
6
|
-
import { resolveCommandProjectRef } from "
|
|
8
|
+
import { resolveCommandProjectRef } from "./scope/index.ts";
|
|
7
9
|
|
|
8
10
|
export const requireCommandProjectRef = Effect.fn("requireCommandProjectRef")(function* (input: {
|
|
9
11
|
readonly project: Option.Option<string>;
|
|
10
|
-
readonly env: Readonly<Record<string, string | undefined>>;
|
|
11
|
-
readonly cwd: string;
|
|
12
12
|
}) {
|
|
13
|
+
const cliRuntime = yield* CliRuntime;
|
|
14
|
+
const t3CliEnv = yield* loadT3CliEnv;
|
|
13
15
|
const config = yield* T3Config;
|
|
14
16
|
const resolved = yield* config.resolve();
|
|
15
17
|
const ref = resolveCommandProjectRef({
|
|
16
18
|
value: Option.getOrUndefined(input.project),
|
|
17
|
-
|
|
18
|
-
cwd:
|
|
19
|
+
scope: t3CliEnv.scope,
|
|
20
|
+
cwd: cliRuntime.cwd,
|
|
19
21
|
isLocal: resolved.local,
|
|
20
22
|
});
|
|
21
23
|
if (ref === undefined) {
|
|
@@ -23,7 +25,7 @@ export const requireCommandProjectRef = Effect.fn("requireCommandProjectRef")(fu
|
|
|
23
25
|
new ProjectLookupError({
|
|
24
26
|
message:
|
|
25
27
|
"project is required: pass --project, set T3CODE_PROJECT_ROOT / T3CODE_PROJECT_ID, or use local auth",
|
|
26
|
-
ref:
|
|
28
|
+
ref: cliRuntime.cwd,
|
|
27
29
|
}),
|
|
28
30
|
);
|
|
29
31
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CliRuntime, layer } from "./service.ts";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as Context from "effect/Context";
|
|
2
|
+
import * as Layer from "effect/Layer";
|
|
3
|
+
|
|
4
|
+
export class CliRuntime extends Context.Service<
|
|
5
|
+
CliRuntime,
|
|
6
|
+
{
|
|
7
|
+
readonly cwd: string;
|
|
8
|
+
readonly stdoutIsTTY: boolean;
|
|
9
|
+
readonly stderrIsTTY: boolean;
|
|
10
|
+
}
|
|
11
|
+
>()("t3cli/CliRuntime") {
|
|
12
|
+
static layerTest = (input?: {
|
|
13
|
+
readonly cwd?: string;
|
|
14
|
+
readonly stdoutIsTTY?: boolean;
|
|
15
|
+
readonly stderrIsTTY?: boolean;
|
|
16
|
+
}) =>
|
|
17
|
+
Layer.succeed(CliRuntime, {
|
|
18
|
+
cwd: input?.cwd ?? process.cwd(),
|
|
19
|
+
stdoutIsTTY: input?.stdoutIsTTY ?? false,
|
|
20
|
+
stderrIsTTY: input?.stderrIsTTY ?? false,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const layer = Layer.succeed(CliRuntime, {
|
|
25
|
+
cwd: process.cwd(),
|
|
26
|
+
stdoutIsTTY: process.stdout.isTTY ?? false,
|
|
27
|
+
stderrIsTTY: process.stderr.isTTY ?? false,
|
|
28
|
+
});
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
import type { T3CliEnvScope } from "../../config/env/env.ts";
|
|
2
|
+
|
|
1
3
|
export function resolveProjectRef(input: {
|
|
2
4
|
readonly value: string | undefined;
|
|
3
|
-
readonly
|
|
5
|
+
readonly scope: T3CliEnvScope;
|
|
4
6
|
}): string | undefined {
|
|
5
7
|
if (input.value !== undefined && input.value.length > 0) {
|
|
6
8
|
return input.value;
|
|
7
9
|
}
|
|
8
|
-
const fromRoot = input.
|
|
10
|
+
const fromRoot = input.scope.t3codeProjectRoot;
|
|
9
11
|
if (fromRoot !== undefined && fromRoot.length > 0) {
|
|
10
12
|
return fromRoot;
|
|
11
13
|
}
|
|
12
|
-
const fromId = input.
|
|
14
|
+
const fromId = input.scope.t3codeProjectId;
|
|
13
15
|
if (fromId !== undefined && fromId.length > 0) {
|
|
14
16
|
return fromId;
|
|
15
17
|
}
|
|
@@ -18,11 +20,11 @@ export function resolveProjectRef(input: {
|
|
|
18
20
|
|
|
19
21
|
export function resolveCommandProjectRef(input: {
|
|
20
22
|
readonly value: string | undefined;
|
|
21
|
-
readonly
|
|
23
|
+
readonly scope: T3CliEnvScope;
|
|
22
24
|
readonly cwd: string;
|
|
23
25
|
readonly isLocal?: boolean;
|
|
24
26
|
}): string | undefined {
|
|
25
|
-
const explicit = resolveProjectRef({ value: input.value,
|
|
27
|
+
const explicit = resolveProjectRef({ value: input.value, scope: input.scope });
|
|
26
28
|
if (explicit !== undefined) {
|
|
27
29
|
return explicit;
|
|
28
30
|
}
|
|
@@ -34,13 +36,13 @@ export function resolveCommandProjectRef(input: {
|
|
|
34
36
|
|
|
35
37
|
export function resolveWorktreePath(input: {
|
|
36
38
|
readonly value: string | undefined;
|
|
37
|
-
readonly
|
|
39
|
+
readonly scope: T3CliEnvScope;
|
|
38
40
|
readonly inferred?: string;
|
|
39
41
|
}): string | undefined {
|
|
40
42
|
if (input.value !== undefined && input.value.length > 0) {
|
|
41
43
|
return input.value;
|
|
42
44
|
}
|
|
43
|
-
const fromEnv = input.
|
|
45
|
+
const fromEnv = input.scope.t3codeWorktreePath;
|
|
44
46
|
if (fromEnv !== undefined && fromEnv.length > 0) {
|
|
45
47
|
return fromEnv;
|
|
46
48
|
}
|
|
@@ -49,12 +51,12 @@ export function resolveWorktreePath(input: {
|
|
|
49
51
|
|
|
50
52
|
export function resolveThreadId(input: {
|
|
51
53
|
readonly value: string | undefined;
|
|
52
|
-
readonly
|
|
54
|
+
readonly scope: T3CliEnvScope;
|
|
53
55
|
}): string | undefined {
|
|
54
56
|
if (input.value !== undefined && input.value.length > 0) {
|
|
55
57
|
return input.value;
|
|
56
58
|
}
|
|
57
|
-
const fromEnv = input.
|
|
59
|
+
const fromEnv = input.scope.t3codeThreadId;
|
|
58
60
|
if (fromEnv !== undefined && fromEnv.length > 0) {
|
|
59
61
|
return fromEnv;
|
|
60
62
|
}
|
|
@@ -2,7 +2,7 @@ import * as Effect from "effect/Effect";
|
|
|
2
2
|
import { Argument, Command } from "effect/unstable/cli";
|
|
3
3
|
|
|
4
4
|
import { T3Application } from "../../application/service.ts";
|
|
5
|
-
import {
|
|
5
|
+
import { extraArgsConfig } from "../extra-args.ts";
|
|
6
6
|
import { threadFlag } from "../flags.ts";
|
|
7
7
|
import { requireCommandThreadId } from "./scope.ts";
|
|
8
8
|
import { runAttachedTerminalSession, toTerminalAttachTarget } from "./shared.ts";
|
|
@@ -12,15 +12,12 @@ export const attachTerminalCommand = Command.make(
|
|
|
12
12
|
{
|
|
13
13
|
thread: threadFlag,
|
|
14
14
|
terminalId: Argument.string("terminal-id"),
|
|
15
|
+
...extraArgsConfig,
|
|
15
16
|
},
|
|
16
17
|
({ thread, terminalId }) =>
|
|
17
18
|
Effect.gen(function* () {
|
|
18
19
|
const application = yield* T3Application;
|
|
19
|
-
const
|
|
20
|
-
const threadId = yield* requireCommandThreadId({
|
|
21
|
-
thread,
|
|
22
|
-
env: environment.env,
|
|
23
|
-
});
|
|
20
|
+
const threadId = yield* requireCommandThreadId({ thread });
|
|
24
21
|
const terminal = yield* application.getTerminal({
|
|
25
22
|
threadId,
|
|
26
23
|
terminalId,
|
|
@@ -2,11 +2,13 @@ import * as Effect from "effect/Effect";
|
|
|
2
2
|
import * as Option from "effect/Option";
|
|
3
3
|
import { Argument, Command, Flag } from "effect/unstable/cli";
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { extraArgsConfig } from "../extra-args.ts";
|
|
6
|
+
import { formatTerminalCreatedHuman } from "../format/terminal.ts";
|
|
6
7
|
import { T3Application } from "../../application/service.ts";
|
|
7
|
-
import {
|
|
8
|
+
import { CliRuntime } from "../../cli/runtime/service.ts";
|
|
9
|
+
import { loadT3CliEnv } from "../../config/env/env.ts";
|
|
8
10
|
import { formatFlag, threadFlag } from "../flags.ts";
|
|
9
|
-
import { resolveOutputFormat } from "../output
|
|
11
|
+
import { resolveOutputFormat } from "../format/output.ts";
|
|
10
12
|
import { T3Output } from "../output/service.ts";
|
|
11
13
|
import { requireCommandThreadId } from "./scope.ts";
|
|
12
14
|
import { runAttachedTerminalSession, snapshotToTerminalAttachTarget } from "./shared.ts";
|
|
@@ -19,16 +21,15 @@ export const createTerminalCommand = Command.make(
|
|
|
19
21
|
id: Flag.string("id").pipe(Flag.optional),
|
|
20
22
|
attach: Flag.boolean("attach"),
|
|
21
23
|
format: formatFlag,
|
|
24
|
+
...extraArgsConfig,
|
|
22
25
|
},
|
|
23
26
|
({ thread, command, id, attach, format }) =>
|
|
24
27
|
Effect.gen(function* () {
|
|
25
28
|
const application = yield* T3Application;
|
|
26
|
-
const
|
|
29
|
+
const cliRuntime = yield* CliRuntime;
|
|
30
|
+
const t3CliEnv = yield* loadT3CliEnv;
|
|
27
31
|
const output = yield* T3Output;
|
|
28
|
-
const threadId = yield* requireCommandThreadId({
|
|
29
|
-
thread,
|
|
30
|
-
env: environment.env,
|
|
31
|
-
});
|
|
32
|
+
const threadId = yield* requireCommandThreadId({ thread });
|
|
32
33
|
const terminalId = Option.getOrUndefined(id);
|
|
33
34
|
const commandValue = Option.getOrUndefined(command);
|
|
34
35
|
const snapshot = yield* application.createTerminal({
|
|
@@ -44,7 +45,7 @@ export const createTerminalCommand = Command.make(
|
|
|
44
45
|
return;
|
|
45
46
|
}
|
|
46
47
|
|
|
47
|
-
const resolvedFormat = resolveOutputFormat(format,
|
|
48
|
+
const resolvedFormat = resolveOutputFormat(format, cliRuntime, t3CliEnv, "json");
|
|
48
49
|
if (resolvedFormat === "json") {
|
|
49
50
|
yield* output.printJson(snapshot);
|
|
50
51
|
} else {
|