t3code-cli 0.7.0 → 0.9.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 +90 -35
- package/dist/application.js +1 -1
- package/dist/auth.js +1 -2
- package/dist/bin.js +241 -45
- package/dist/cli.js +1 -1
- package/dist/config.js +1 -3
- package/dist/connection.js +1 -4
- package/dist/index.js +1 -4
- package/dist/layout.js +1 -1
- package/dist/orchestration.js +1 -1
- package/dist/rpc.js +1 -1
- package/dist/runtime.js +1 -2
- package/dist/scope.js +1 -1
- package/dist/shared.js +85492 -0
- package/dist/src/application/layer.d.ts +86 -2
- package/dist/src/application/models.d.ts +1 -0
- package/dist/src/application/projects.d.ts +10 -1
- package/dist/src/application/service.d.ts +30 -1
- package/dist/src/application/shell-sequence.d.ts +9 -0
- package/dist/src/application/thread-commands.d.ts +27 -1
- package/dist/src/application/thread-wait.d.ts +9 -0
- package/dist/src/application/threads.d.ts +102 -2
- package/dist/src/cli-path/layer.d.ts +3 -0
- package/dist/src/cli-path/service.d.ts +8 -0
- package/dist/src/domain/helpers.d.ts +9 -0
- package/dist/src/domain/model-config.d.ts +3 -0
- package/dist/src/domain/thread-activities.d.ts +14 -0
- package/dist/src/domain/thread-lifecycle.d.ts +10 -0
- package/dist/src/orchestration/layer.d.ts +215 -0
- package/dist/src/rpc/layer.d.ts +466 -0
- package/dist/src/rpc/ws-group.d.ts +142 -0
- package/dist/src/runtime/layer.d.ts +1 -1
- package/dist/t3tools.js +2 -2
- package/dist/upstream-t3code/packages/contracts/src/environmentHttp.d.ts +33 -10
- package/dist/upstream-t3code/packages/contracts/src/ipc.d.ts +6 -0
- package/dist/upstream-t3code/packages/contracts/src/orchestration.d.ts +657 -1
- package/dist/upstream-t3code/packages/contracts/src/provider.d.ts +14 -0
- package/dist/upstream-t3code/packages/contracts/src/providerRuntime.d.ts +175 -1
- package/dist/upstream-t3code/packages/contracts/src/rpc.d.ts +492 -0
- package/dist/upstream-t3code/packages/contracts/src/server.d.ts +45 -0
- package/dist/upstream-t3code/packages/contracts/src/settings.d.ts +21 -0
- package/dist/upstream-t3code/packages/contracts/src/terminal.d.ts +6 -3
- package/package.json +2 -2
- package/src/application/service.ts +32 -0
- package/src/application/thread-commands.ts +45 -0
- package/src/application/threads.ts +100 -1
- package/src/cli/error.ts +15 -0
- package/src/cli/message-input.ts +30 -0
- package/src/cli/thread-format.ts +47 -0
- package/src/cli/thread.ts +8 -0
- package/src/cli/threads/approve.ts +61 -0
- package/src/cli/threads/archive.ts +18 -3
- package/src/cli/threads/callback.ts +92 -0
- package/src/cli/threads/respond.ts +70 -0
- package/src/cli/threads/show.ts +43 -0
- package/src/cli-path/layer.ts +10 -0
- package/src/cli-path/service.ts +7 -0
- package/src/domain/thread-activities.test.ts +321 -0
- package/src/domain/thread-activities.ts +244 -0
- package/src/domain/thread-lifecycle.ts +2 -0
- package/src/runtime/layer.ts +2 -0
- package/dist/Context-DueQ9iMH.js +0 -4916
- package/dist/Path-D8WPdPwR.js +0 -11406
- package/dist/Schema-DsQxYh6_.js +0 -13581
- package/dist/UrlParams-BA6gBvaY.js +0 -205
- package/dist/base-dir-R12OMDso.js +0 -20
- package/dist/error-B2t1bAP9.js +0 -169
- package/dist/error-BHRnjLux.js +0 -15
- package/dist/error-jwMt3VoW.js +0 -54
- package/dist/flags-CM7_iGdA.js +0 -13371
- package/dist/layer-CfC5qZol.js +0 -1508
- package/dist/layer-DHhKS5jd.js +0 -13
- package/dist/layer-DUv99vsS.js +0 -72
- package/dist/layer-DvHnKBYj.js +0 -29466
- package/dist/layer-MqCKkIGD.js +0 -1206
- package/dist/scope-GycYiJ54.js +0 -29
- package/dist/service-CLmRO2Dp.js +0 -8
- package/dist/service-ybOWV9pL.js +0 -5
- package/dist/src-KdbHqrex.js +0 -8874
- package/dist/transport-D3zBdZ1h.js +0 -539
- package/dist/url-SlsaG8nY.js +0 -165
- /package/dist/{chunk-B5meny8j.js → rolldown-runtime.js} +0 -0
|
@@ -126,6 +126,7 @@ export declare const ServerProvider: Schema.Struct<{
|
|
|
126
126
|
readonly groupKey: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
127
127
|
}>>;
|
|
128
128
|
readonly showInteractionModeToggle: Schema.optional<Schema.Boolean>;
|
|
129
|
+
readonly requiresNewThreadForModelChange: Schema.optional<Schema.Boolean>;
|
|
129
130
|
readonly enabled: Schema.Boolean;
|
|
130
131
|
readonly installed: Schema.Boolean;
|
|
131
132
|
readonly version: Schema.NullOr<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
@@ -213,6 +214,7 @@ export declare const ServerProviders: Schema.$Array<Schema.Struct<{
|
|
|
213
214
|
readonly groupKey: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
214
215
|
}>>;
|
|
215
216
|
readonly showInteractionModeToggle: Schema.optional<Schema.Boolean>;
|
|
217
|
+
readonly requiresNewThreadForModelChange: Schema.optional<Schema.Boolean>;
|
|
216
218
|
readonly enabled: Schema.Boolean;
|
|
217
219
|
readonly installed: Schema.Boolean;
|
|
218
220
|
readonly version: Schema.NullOr<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
@@ -595,6 +597,7 @@ export declare const ServerConfig: Schema.Struct<{
|
|
|
595
597
|
readonly groupKey: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
596
598
|
}>>;
|
|
597
599
|
readonly showInteractionModeToggle: Schema.optional<Schema.Boolean>;
|
|
600
|
+
readonly requiresNewThreadForModelChange: Schema.optional<Schema.Boolean>;
|
|
598
601
|
readonly enabled: Schema.Boolean;
|
|
599
602
|
readonly installed: Schema.Boolean;
|
|
600
603
|
readonly version: Schema.NullOr<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
@@ -722,6 +725,11 @@ export declare const ServerConfig: Schema.Struct<{
|
|
|
722
725
|
readonly apiEndpoint: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.String, never, never>, never>;
|
|
723
726
|
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
724
727
|
}>, never>;
|
|
728
|
+
readonly grok: Schema.withDecodingDefault<Schema.Struct<{
|
|
729
|
+
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
730
|
+
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
731
|
+
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
732
|
+
}>, never>;
|
|
725
733
|
readonly opencode: Schema.withDecodingDefault<Schema.Struct<{
|
|
726
734
|
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
727
735
|
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
@@ -860,6 +868,7 @@ export declare const ServerConfigUpdatedPayload: Schema.Struct<{
|
|
|
860
868
|
readonly groupKey: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
861
869
|
}>>;
|
|
862
870
|
readonly showInteractionModeToggle: Schema.optional<Schema.Boolean>;
|
|
871
|
+
readonly requiresNewThreadForModelChange: Schema.optional<Schema.Boolean>;
|
|
863
872
|
readonly enabled: Schema.Boolean;
|
|
864
873
|
readonly installed: Schema.Boolean;
|
|
865
874
|
readonly version: Schema.NullOr<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
@@ -978,6 +987,11 @@ export declare const ServerConfigUpdatedPayload: Schema.Struct<{
|
|
|
978
987
|
readonly apiEndpoint: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.String, never, never>, never>;
|
|
979
988
|
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
980
989
|
}>, never>;
|
|
990
|
+
readonly grok: Schema.withDecodingDefault<Schema.Struct<{
|
|
991
|
+
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
992
|
+
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
993
|
+
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
994
|
+
}>, never>;
|
|
981
995
|
readonly opencode: Schema.withDecodingDefault<Schema.Struct<{
|
|
982
996
|
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
983
997
|
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
@@ -1054,6 +1068,7 @@ export declare const ServerConfigProviderStatusesPayload: Schema.Struct<{
|
|
|
1054
1068
|
readonly groupKey: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
1055
1069
|
}>>;
|
|
1056
1070
|
readonly showInteractionModeToggle: Schema.optional<Schema.Boolean>;
|
|
1071
|
+
readonly requiresNewThreadForModelChange: Schema.optional<Schema.Boolean>;
|
|
1057
1072
|
readonly enabled: Schema.Boolean;
|
|
1058
1073
|
readonly installed: Schema.Boolean;
|
|
1059
1074
|
readonly version: Schema.NullOr<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
@@ -1175,6 +1190,11 @@ export declare const ServerConfigSettingsUpdatedPayload: Schema.Struct<{
|
|
|
1175
1190
|
readonly apiEndpoint: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.String, never, never>, never>;
|
|
1176
1191
|
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
1177
1192
|
}>, never>;
|
|
1193
|
+
readonly grok: Schema.withDecodingDefault<Schema.Struct<{
|
|
1194
|
+
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
1195
|
+
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
1196
|
+
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
1197
|
+
}>, never>;
|
|
1178
1198
|
readonly opencode: Schema.withDecodingDefault<Schema.Struct<{
|
|
1179
1199
|
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
1180
1200
|
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
@@ -1271,6 +1291,7 @@ export declare const ServerConfigStreamSnapshotEvent: Schema.Struct<{
|
|
|
1271
1291
|
readonly groupKey: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
1272
1292
|
}>>;
|
|
1273
1293
|
readonly showInteractionModeToggle: Schema.optional<Schema.Boolean>;
|
|
1294
|
+
readonly requiresNewThreadForModelChange: Schema.optional<Schema.Boolean>;
|
|
1274
1295
|
readonly enabled: Schema.Boolean;
|
|
1275
1296
|
readonly installed: Schema.Boolean;
|
|
1276
1297
|
readonly version: Schema.NullOr<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
@@ -1398,6 +1419,11 @@ export declare const ServerConfigStreamSnapshotEvent: Schema.Struct<{
|
|
|
1398
1419
|
readonly apiEndpoint: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.String, never, never>, never>;
|
|
1399
1420
|
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
1400
1421
|
}>, never>;
|
|
1422
|
+
readonly grok: Schema.withDecodingDefault<Schema.Struct<{
|
|
1423
|
+
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
1424
|
+
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
1425
|
+
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
1426
|
+
}>, never>;
|
|
1401
1427
|
readonly opencode: Schema.withDecodingDefault<Schema.Struct<{
|
|
1402
1428
|
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
1403
1429
|
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
@@ -1482,6 +1508,7 @@ export declare const ServerConfigStreamProviderStatusesEvent: Schema.Struct<{
|
|
|
1482
1508
|
readonly groupKey: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
1483
1509
|
}>>;
|
|
1484
1510
|
readonly showInteractionModeToggle: Schema.optional<Schema.Boolean>;
|
|
1511
|
+
readonly requiresNewThreadForModelChange: Schema.optional<Schema.Boolean>;
|
|
1485
1512
|
readonly enabled: Schema.Boolean;
|
|
1486
1513
|
readonly installed: Schema.Boolean;
|
|
1487
1514
|
readonly version: Schema.NullOr<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
@@ -1607,6 +1634,11 @@ export declare const ServerConfigStreamSettingsUpdatedEvent: Schema.Struct<{
|
|
|
1607
1634
|
readonly apiEndpoint: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.String, never, never>, never>;
|
|
1608
1635
|
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
1609
1636
|
}>, never>;
|
|
1637
|
+
readonly grok: Schema.withDecodingDefault<Schema.Struct<{
|
|
1638
|
+
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
1639
|
+
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
1640
|
+
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
1641
|
+
}>, never>;
|
|
1610
1642
|
readonly opencode: Schema.withDecodingDefault<Schema.Struct<{
|
|
1611
1643
|
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
1612
1644
|
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
@@ -1704,6 +1736,7 @@ export declare const ServerConfigStreamEvent: Schema.Union<readonly [Schema.Stru
|
|
|
1704
1736
|
readonly groupKey: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
1705
1737
|
}>>;
|
|
1706
1738
|
readonly showInteractionModeToggle: Schema.optional<Schema.Boolean>;
|
|
1739
|
+
readonly requiresNewThreadForModelChange: Schema.optional<Schema.Boolean>;
|
|
1707
1740
|
readonly enabled: Schema.Boolean;
|
|
1708
1741
|
readonly installed: Schema.Boolean;
|
|
1709
1742
|
readonly version: Schema.NullOr<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
@@ -1831,6 +1864,11 @@ export declare const ServerConfigStreamEvent: Schema.Union<readonly [Schema.Stru
|
|
|
1831
1864
|
readonly apiEndpoint: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.String, never, never>, never>;
|
|
1832
1865
|
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
1833
1866
|
}>, never>;
|
|
1867
|
+
readonly grok: Schema.withDecodingDefault<Schema.Struct<{
|
|
1868
|
+
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
1869
|
+
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
1870
|
+
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
1871
|
+
}>, never>;
|
|
1834
1872
|
readonly opencode: Schema.withDecodingDefault<Schema.Struct<{
|
|
1835
1873
|
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
1836
1874
|
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
@@ -1911,6 +1949,7 @@ export declare const ServerConfigStreamEvent: Schema.Union<readonly [Schema.Stru
|
|
|
1911
1949
|
readonly groupKey: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
1912
1950
|
}>>;
|
|
1913
1951
|
readonly showInteractionModeToggle: Schema.optional<Schema.Boolean>;
|
|
1952
|
+
readonly requiresNewThreadForModelChange: Schema.optional<Schema.Boolean>;
|
|
1914
1953
|
readonly enabled: Schema.Boolean;
|
|
1915
1954
|
readonly installed: Schema.Boolean;
|
|
1916
1955
|
readonly version: Schema.NullOr<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
@@ -2034,6 +2073,11 @@ export declare const ServerConfigStreamEvent: Schema.Union<readonly [Schema.Stru
|
|
|
2034
2073
|
readonly apiEndpoint: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.String, never, never>, never>;
|
|
2035
2074
|
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
2036
2075
|
}>, never>;
|
|
2076
|
+
readonly grok: Schema.withDecodingDefault<Schema.Struct<{
|
|
2077
|
+
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
2078
|
+
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
2079
|
+
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
2080
|
+
}>, never>;
|
|
2037
2081
|
readonly opencode: Schema.withDecodingDefault<Schema.Struct<{
|
|
2038
2082
|
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
2039
2083
|
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
@@ -2197,6 +2241,7 @@ export declare const ServerProviderUpdatedPayload: Schema.Struct<{
|
|
|
2197
2241
|
readonly groupKey: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
2198
2242
|
}>>;
|
|
2199
2243
|
readonly showInteractionModeToggle: Schema.optional<Schema.Boolean>;
|
|
2244
|
+
readonly requiresNewThreadForModelChange: Schema.optional<Schema.Boolean>;
|
|
2200
2245
|
readonly enabled: Schema.Boolean;
|
|
2201
2246
|
readonly installed: Schema.Boolean;
|
|
2202
2247
|
readonly version: Schema.NullOr<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
@@ -3,6 +3,9 @@ import * as Schema from "effect/Schema";
|
|
|
3
3
|
export declare const TimestampFormat: Schema.Literals<readonly ["locale", "12-hour", "24-hour"]>;
|
|
4
4
|
export type TimestampFormat = typeof TimestampFormat.Type;
|
|
5
5
|
export declare const DEFAULT_TIMESTAMP_FORMAT: TimestampFormat;
|
|
6
|
+
export declare const ContextMenuStyle: Schema.Literals<readonly ["default", "native", "custom"]>;
|
|
7
|
+
export type ContextMenuStyle = typeof ContextMenuStyle.Type;
|
|
8
|
+
export declare const DEFAULT_CONTEXT_MENU_STYLE: ContextMenuStyle;
|
|
6
9
|
export declare const SidebarProjectSortOrder: Schema.Literals<readonly ["updated_at", "created_at", "manual"]>;
|
|
7
10
|
export type SidebarProjectSortOrder = typeof SidebarProjectSortOrder.Type;
|
|
8
11
|
export declare const DEFAULT_SIDEBAR_PROJECT_SORT_ORDER: SidebarProjectSortOrder;
|
|
@@ -21,6 +24,7 @@ export declare const ClientSettingsSchema: Schema.Struct<{
|
|
|
21
24
|
readonly autoOpenPlanSidebar: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
22
25
|
readonly confirmThreadArchive: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
23
26
|
readonly confirmThreadDelete: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
27
|
+
readonly contextMenuStyle: Schema.withDecodingDefault<Schema.Literals<readonly ["default", "native", "custom"]>, never>;
|
|
24
28
|
readonly dismissedProviderUpdateNotificationKeys: Schema.withDecodingDefault<Schema.$Array<Schema.decodeTo<Schema.String, Schema.String, never, never>>, never>;
|
|
25
29
|
readonly diffIgnoreWhitespace: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
26
30
|
readonly diffWordWrap: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
@@ -88,6 +92,12 @@ export declare const CursorSettings: Schema.Struct<{
|
|
|
88
92
|
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
89
93
|
}>;
|
|
90
94
|
export type CursorSettings = typeof CursorSettings.Type;
|
|
95
|
+
export declare const GrokSettings: Schema.Struct<{
|
|
96
|
+
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
97
|
+
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
98
|
+
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
99
|
+
}>;
|
|
100
|
+
export type GrokSettings = typeof GrokSettings.Type;
|
|
91
101
|
export declare const OpenCodeSettings: Schema.Struct<{
|
|
92
102
|
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
93
103
|
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
@@ -144,6 +154,11 @@ export declare const ServerSettings: Schema.Struct<{
|
|
|
144
154
|
readonly apiEndpoint: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.String, never, never>, never>;
|
|
145
155
|
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
146
156
|
}>, never>;
|
|
157
|
+
readonly grok: Schema.withDecodingDefault<Schema.Struct<{
|
|
158
|
+
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
159
|
+
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
160
|
+
readonly customModels: Schema.withDecodingDefault<Schema.$Array<Schema.String>, never>;
|
|
161
|
+
}>, never>;
|
|
147
162
|
readonly opencode: Schema.withDecodingDefault<Schema.Struct<{
|
|
148
163
|
readonly enabled: Schema.withDecodingDefault<Schema.Boolean, never>;
|
|
149
164
|
readonly binaryPath: Schema.withDecodingDefault<Schema.decodeTo<Schema.String, Schema.decodeTo<Schema.String, Schema.String, never, never>, never, never>, never>;
|
|
@@ -223,6 +238,11 @@ export declare const ServerSettingsPatch: Schema.Struct<{
|
|
|
223
238
|
readonly apiEndpoint: Schema.optionalKey<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
224
239
|
readonly customModels: Schema.optionalKey<Schema.$Array<Schema.String>>;
|
|
225
240
|
}>>;
|
|
241
|
+
readonly grok: Schema.optionalKey<Schema.Struct<{
|
|
242
|
+
readonly enabled: Schema.optionalKey<Schema.Boolean>;
|
|
243
|
+
readonly binaryPath: Schema.optionalKey<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
244
|
+
readonly customModels: Schema.optionalKey<Schema.$Array<Schema.String>>;
|
|
245
|
+
}>>;
|
|
226
246
|
readonly opencode: Schema.optionalKey<Schema.Struct<{
|
|
227
247
|
readonly enabled: Schema.optionalKey<Schema.Boolean>;
|
|
228
248
|
readonly binaryPath: Schema.optionalKey<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
@@ -250,6 +270,7 @@ export declare const ClientSettingsPatch: Schema.Struct<{
|
|
|
250
270
|
readonly autoOpenPlanSidebar: Schema.optionalKey<Schema.Boolean>;
|
|
251
271
|
readonly confirmThreadArchive: Schema.optionalKey<Schema.Boolean>;
|
|
252
272
|
readonly confirmThreadDelete: Schema.optionalKey<Schema.Boolean>;
|
|
273
|
+
readonly contextMenuStyle: Schema.optionalKey<Schema.Literals<readonly ["default", "native", "custom"]>>;
|
|
253
274
|
readonly diffIgnoreWhitespace: Schema.optionalKey<Schema.Boolean>;
|
|
254
275
|
readonly diffWordWrap: Schema.optionalKey<Schema.Boolean>;
|
|
255
276
|
readonly favorites: Schema.optionalKey<Schema.$Array<Schema.Struct<{
|
|
@@ -21,10 +21,11 @@ export declare const TerminalOpenInput: Schema.Struct<{
|
|
|
21
21
|
readonly cols: Schema.optional<Schema.Int>;
|
|
22
22
|
readonly rows: Schema.optional<Schema.Int>;
|
|
23
23
|
readonly env: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
|
|
24
|
+
readonly projectId: Schema.optional<Schema.brand<Schema.decodeTo<Schema.String, Schema.String, never, never>, "ProjectId">>;
|
|
24
25
|
readonly terminalId: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
25
26
|
readonly threadId: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
26
27
|
}>;
|
|
27
|
-
export type TerminalOpenInput =
|
|
28
|
+
export type TerminalOpenInput = typeof TerminalOpenInput.Type;
|
|
28
29
|
export declare const TerminalAttachInput: Schema.Struct<{
|
|
29
30
|
readonly cwd: Schema.optional<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
30
31
|
readonly worktreePath: Schema.optional<Schema.NullOr<Schema.decodeTo<Schema.String, Schema.String, never, never>>>;
|
|
@@ -32,10 +33,11 @@ export declare const TerminalAttachInput: Schema.Struct<{
|
|
|
32
33
|
readonly rows: Schema.optional<Schema.Int>;
|
|
33
34
|
readonly env: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
|
|
34
35
|
readonly restartIfNotRunning: Schema.optional<Schema.Boolean>;
|
|
36
|
+
readonly projectId: Schema.optional<Schema.brand<Schema.decodeTo<Schema.String, Schema.String, never, never>, "ProjectId">>;
|
|
35
37
|
readonly terminalId: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
36
38
|
readonly threadId: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
37
39
|
}>;
|
|
38
|
-
export type TerminalAttachInput =
|
|
40
|
+
export type TerminalAttachInput = typeof TerminalAttachInput.Type;
|
|
39
41
|
export declare const TerminalWriteInput: Schema.Struct<{
|
|
40
42
|
readonly data: Schema.String;
|
|
41
43
|
readonly terminalId: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
@@ -60,10 +62,11 @@ export declare const TerminalRestartInput: Schema.Struct<{
|
|
|
60
62
|
readonly cols: Schema.Int;
|
|
61
63
|
readonly rows: Schema.Int;
|
|
62
64
|
readonly env: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
|
|
65
|
+
readonly projectId: Schema.optional<Schema.brand<Schema.decodeTo<Schema.String, Schema.String, never, never>, "ProjectId">>;
|
|
63
66
|
readonly terminalId: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
64
67
|
readonly threadId: Schema.decodeTo<Schema.String, Schema.String, never, never>;
|
|
65
68
|
}>;
|
|
66
|
-
export type TerminalRestartInput =
|
|
69
|
+
export type TerminalRestartInput = typeof TerminalRestartInput.Type;
|
|
67
70
|
export declare const TerminalCloseInput: Schema.Struct<{
|
|
68
71
|
readonly terminalId: Schema.optional<Schema.decodeTo<Schema.String, Schema.String, never, never>>;
|
|
69
72
|
readonly deleteHistory: Schema.optional<Schema.Boolean>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "t3code-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "CLI for t3code",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"@types/node": "^25.9.1",
|
|
99
99
|
"typescript": "^6.0.3",
|
|
100
100
|
"vite-plus": "^0.1.24",
|
|
101
|
-
"@t3tools/contracts": "0.0.
|
|
101
|
+
"@t3tools/contracts": "0.0.27"
|
|
102
102
|
},
|
|
103
103
|
"engines": {
|
|
104
104
|
"node": ">=24.0.0"
|
|
@@ -9,10 +9,12 @@ import type {
|
|
|
9
9
|
OrchestrationShellSnapshot,
|
|
10
10
|
OrchestrationThread,
|
|
11
11
|
OrchestrationThreadShell,
|
|
12
|
+
ProviderUserInputAnswers,
|
|
12
13
|
ServerProvider,
|
|
13
14
|
} from "#t3tools/contracts";
|
|
14
15
|
|
|
15
16
|
import type { ApplicationError } from "./error.ts";
|
|
17
|
+
import type { ThreadShow } from "./threads.ts";
|
|
16
18
|
|
|
17
19
|
export type StartThreadInput = {
|
|
18
20
|
readonly projectRef?: string;
|
|
@@ -30,6 +32,12 @@ export type SendThreadInput = {
|
|
|
30
32
|
readonly options?: NonNullable<ModelSelection["options"]>;
|
|
31
33
|
};
|
|
32
34
|
|
|
35
|
+
export type CallbackThreadInput = {
|
|
36
|
+
readonly fromThreadId: string;
|
|
37
|
+
readonly targetThreadId: string;
|
|
38
|
+
readonly prompt: string;
|
|
39
|
+
};
|
|
40
|
+
|
|
33
41
|
export type StartThreadPolicy = {
|
|
34
42
|
readonly until: "dispatch" | "visible" | "complete";
|
|
35
43
|
};
|
|
@@ -65,6 +73,23 @@ export class T3Application extends Context.Service<
|
|
|
65
73
|
readonly getThreadMessages: (
|
|
66
74
|
threadId: string,
|
|
67
75
|
) => Effect.Effect<OrchestrationThread, ApplicationError>;
|
|
76
|
+
readonly showThread: (threadId: string) => Effect.Effect<ThreadShow, ApplicationError>;
|
|
77
|
+
readonly approveThread: (input: {
|
|
78
|
+
readonly threadId: string;
|
|
79
|
+
readonly requestId: string;
|
|
80
|
+
readonly decision: "accept" | "decline" | "cancel";
|
|
81
|
+
}) => Effect.Effect<
|
|
82
|
+
{ readonly threadId: string; readonly requestId: string; readonly dispatch: DispatchResult },
|
|
83
|
+
ApplicationError
|
|
84
|
+
>;
|
|
85
|
+
readonly respondToThread: (input: {
|
|
86
|
+
readonly threadId: string;
|
|
87
|
+
readonly requestId: string;
|
|
88
|
+
readonly answers: ProviderUserInputAnswers;
|
|
89
|
+
}) => Effect.Effect<
|
|
90
|
+
{ readonly threadId: string; readonly requestId: string; readonly dispatch: DispatchResult },
|
|
91
|
+
ApplicationError
|
|
92
|
+
>;
|
|
68
93
|
readonly archiveThread: (threadId: string) => Effect.Effect<DispatchResult, ApplicationError>;
|
|
69
94
|
readonly startThread: (
|
|
70
95
|
input: StartThreadInput,
|
|
@@ -93,5 +118,12 @@ export class T3Application extends Context.Service<
|
|
|
93
118
|
readonly waitForThread: (
|
|
94
119
|
threadId: string,
|
|
95
120
|
) => Effect.Effect<OrchestrationThread, ApplicationError>;
|
|
121
|
+
readonly callbackThread: (input: CallbackThreadInput) => Effect.Effect<
|
|
122
|
+
{
|
|
123
|
+
readonly dispatch: DispatchResult;
|
|
124
|
+
readonly targetThreadId: string;
|
|
125
|
+
},
|
|
126
|
+
ApplicationError
|
|
127
|
+
>;
|
|
96
128
|
}
|
|
97
129
|
>()("t3cli/T3Application") {}
|
|
@@ -2,12 +2,15 @@ import * as Crypto from "effect/Crypto";
|
|
|
2
2
|
import * as DateTime from "effect/DateTime";
|
|
3
3
|
import * as Effect from "effect/Effect";
|
|
4
4
|
import {
|
|
5
|
+
ApprovalRequestId,
|
|
5
6
|
CommandId,
|
|
6
7
|
MessageId,
|
|
7
8
|
ThreadId,
|
|
8
9
|
type ClientOrchestrationCommand,
|
|
9
10
|
type ModelSelection,
|
|
10
11
|
type OrchestrationProjectShell,
|
|
12
|
+
type ProviderApprovalDecision,
|
|
13
|
+
type ProviderUserInputAnswers,
|
|
11
14
|
} from "#t3tools/contracts";
|
|
12
15
|
import type { ServerConfigForCli } from "../orchestration/service.ts";
|
|
13
16
|
import { resolveModelSelection } from "./model-selection.ts";
|
|
@@ -97,3 +100,45 @@ export const makeThreadArchiveCommand = Effect.fn("makeThreadArchiveCommand")(fu
|
|
|
97
100
|
threadId: ThreadId.make(threadId),
|
|
98
101
|
} satisfies Extract<ClientOrchestrationCommand, { readonly type: "thread.archive" }>;
|
|
99
102
|
});
|
|
103
|
+
|
|
104
|
+
export const makeThreadApprovalRespondCommand = Effect.fn("makeThreadApprovalRespondCommand")(
|
|
105
|
+
function* (input: {
|
|
106
|
+
readonly threadId: string;
|
|
107
|
+
readonly requestId: string;
|
|
108
|
+
readonly decision: ProviderApprovalDecision;
|
|
109
|
+
}) {
|
|
110
|
+
const crypto = yield* Crypto.Crypto;
|
|
111
|
+
const createdAt = DateTime.formatIso(yield* DateTime.now);
|
|
112
|
+
return {
|
|
113
|
+
type: "thread.approval.respond",
|
|
114
|
+
commandId: CommandId.make(
|
|
115
|
+
`t3cli:thread-approve:${yield* crypto.randomUUIDv4.pipe(Effect.orDie)}`,
|
|
116
|
+
),
|
|
117
|
+
threadId: ThreadId.make(input.threadId),
|
|
118
|
+
requestId: ApprovalRequestId.make(input.requestId),
|
|
119
|
+
decision: input.decision,
|
|
120
|
+
createdAt,
|
|
121
|
+
} satisfies Extract<ClientOrchestrationCommand, { readonly type: "thread.approval.respond" }>;
|
|
122
|
+
},
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
export const makeThreadUserInputRespondCommand = Effect.fn("makeThreadUserInputRespondCommand")(
|
|
126
|
+
function* (input: {
|
|
127
|
+
readonly threadId: string;
|
|
128
|
+
readonly requestId: string;
|
|
129
|
+
readonly answers: ProviderUserInputAnswers;
|
|
130
|
+
}) {
|
|
131
|
+
const crypto = yield* Crypto.Crypto;
|
|
132
|
+
const createdAt = DateTime.formatIso(yield* DateTime.now);
|
|
133
|
+
return {
|
|
134
|
+
type: "thread.user-input.respond",
|
|
135
|
+
commandId: CommandId.make(
|
|
136
|
+
`t3cli:thread-respond:${yield* crypto.randomUUIDv4.pipe(Effect.orDie)}`,
|
|
137
|
+
),
|
|
138
|
+
threadId: ThreadId.make(input.threadId),
|
|
139
|
+
requestId: ApprovalRequestId.make(input.requestId),
|
|
140
|
+
answers: input.answers,
|
|
141
|
+
createdAt,
|
|
142
|
+
} satisfies Extract<ClientOrchestrationCommand, { readonly type: "thread.user-input.respond" }>;
|
|
143
|
+
},
|
|
144
|
+
);
|
|
@@ -7,12 +7,18 @@ import { T3Orchestration } from "../orchestration/service.ts";
|
|
|
7
7
|
import { ProjectLookupError, ThreadSessionError } from "../domain/error.ts";
|
|
8
8
|
import { resolveProjectScope } from "../domain/helpers.ts";
|
|
9
9
|
import { type StartThreadInput } from "./service.ts";
|
|
10
|
-
import type { SendThreadInput } from "./service.ts";
|
|
10
|
+
import type { SendThreadInput, CallbackThreadInput } from "./service.ts";
|
|
11
11
|
import { mergeModelOptions } from "./model-selection.ts";
|
|
12
|
+
import { derivePendingApprovals, derivePendingUserInputs } from "../domain/thread-activities.ts";
|
|
13
|
+
import { threadStatus, type ThreadLifecycleStatus } from "../domain/thread-lifecycle.ts";
|
|
14
|
+
import type { OrchestrationThread } from "#t3tools/contracts";
|
|
15
|
+
import type { ProviderApprovalDecision, ProviderUserInputAnswers } from "#t3tools/contracts";
|
|
12
16
|
import {
|
|
17
|
+
makeThreadApprovalRespondCommand,
|
|
13
18
|
makeThreadArchiveCommand,
|
|
14
19
|
makeThreadStartCommands,
|
|
15
20
|
makeThreadTurnContinueCommand,
|
|
21
|
+
makeThreadUserInputRespondCommand,
|
|
16
22
|
} from "./thread-commands.ts";
|
|
17
23
|
import {
|
|
18
24
|
waitForThread as waitForThreadUntilComplete,
|
|
@@ -45,6 +51,10 @@ export const makeThreadApplication = Effect.fn("makeThreadApplication")(function
|
|
|
45
51
|
) {
|
|
46
52
|
return yield* orchestration.getThreadSnapshot(threadId);
|
|
47
53
|
});
|
|
54
|
+
const showThread = Effect.fn("T3ApplicationLive.showThread")(function* (threadId: string) {
|
|
55
|
+
const thread = yield* orchestration.getThreadSnapshot(threadId);
|
|
56
|
+
return projectThreadShow(thread);
|
|
57
|
+
});
|
|
48
58
|
const archiveThread = Effect.fn("T3ApplicationLive.archiveThread")(function* (threadId: string) {
|
|
49
59
|
const command = yield* makeThreadArchiveCommand(threadId).pipe(
|
|
50
60
|
Effect.provideService(Crypto.Crypto, crypto),
|
|
@@ -171,18 +181,107 @@ export const makeThreadApplication = Effect.fn("makeThreadApplication")(function
|
|
|
171
181
|
yield* failIfThreadError(thread);
|
|
172
182
|
return thread;
|
|
173
183
|
});
|
|
184
|
+
const callbackThread = Effect.fn("T3ApplicationLive.callbackThread")(function* (
|
|
185
|
+
input: CallbackThreadInput,
|
|
186
|
+
) {
|
|
187
|
+
yield* waitForThreadUntilComplete({
|
|
188
|
+
orchestration,
|
|
189
|
+
threadId: input.fromThreadId,
|
|
190
|
+
});
|
|
191
|
+
const result = yield* sendThread(
|
|
192
|
+
{ threadId: input.targetThreadId, message: input.prompt },
|
|
193
|
+
{ until: "dispatch" },
|
|
194
|
+
);
|
|
195
|
+
return { dispatch: result.dispatch, targetThreadId: input.targetThreadId };
|
|
196
|
+
});
|
|
197
|
+
const approveThread = Effect.fn("T3ApplicationLive.approveThread")(function* (input: {
|
|
198
|
+
readonly threadId: string;
|
|
199
|
+
readonly requestId: string;
|
|
200
|
+
readonly decision: ProviderApprovalDecision;
|
|
201
|
+
}) {
|
|
202
|
+
const command = yield* makeThreadApprovalRespondCommand(input).pipe(
|
|
203
|
+
Effect.provideService(Crypto.Crypto, crypto),
|
|
204
|
+
);
|
|
205
|
+
const dispatch = yield* orchestration.dispatch(command);
|
|
206
|
+
return { threadId: input.threadId, requestId: input.requestId, dispatch };
|
|
207
|
+
});
|
|
208
|
+
const respondToThread = Effect.fn("T3ApplicationLive.respondToThread")(function* (input: {
|
|
209
|
+
readonly threadId: string;
|
|
210
|
+
readonly requestId: string;
|
|
211
|
+
readonly answers: ProviderUserInputAnswers;
|
|
212
|
+
}) {
|
|
213
|
+
const command = yield* makeThreadUserInputRespondCommand(input).pipe(
|
|
214
|
+
Effect.provideService(Crypto.Crypto, crypto),
|
|
215
|
+
);
|
|
216
|
+
const dispatch = yield* orchestration.dispatch(command);
|
|
217
|
+
return { threadId: input.threadId, requestId: input.requestId, dispatch };
|
|
218
|
+
});
|
|
174
219
|
|
|
175
220
|
return {
|
|
221
|
+
approveThread,
|
|
176
222
|
archiveThread,
|
|
177
223
|
listThreads,
|
|
178
224
|
getThreadMessages,
|
|
225
|
+
respondToThread,
|
|
179
226
|
sendThread,
|
|
227
|
+
showThread,
|
|
180
228
|
startThread,
|
|
181
229
|
watchThread,
|
|
182
230
|
waitForThread,
|
|
231
|
+
callbackThread,
|
|
183
232
|
};
|
|
184
233
|
});
|
|
185
234
|
|
|
235
|
+
export type ThreadShow = {
|
|
236
|
+
readonly id: string;
|
|
237
|
+
readonly projectId: string;
|
|
238
|
+
readonly title: string;
|
|
239
|
+
readonly status: ThreadLifecycleStatus;
|
|
240
|
+
readonly session: OrchestrationThread["session"];
|
|
241
|
+
readonly latestTurn: OrchestrationThread["latestTurn"];
|
|
242
|
+
readonly modelSelection: OrchestrationThread["modelSelection"];
|
|
243
|
+
readonly runtimeMode: OrchestrationThread["runtimeMode"];
|
|
244
|
+
readonly interactionMode: OrchestrationThread["interactionMode"];
|
|
245
|
+
readonly branch: OrchestrationThread["branch"];
|
|
246
|
+
readonly worktreePath: OrchestrationThread["worktreePath"];
|
|
247
|
+
readonly archivedAt: OrchestrationThread["archivedAt"];
|
|
248
|
+
readonly createdAt: string;
|
|
249
|
+
readonly updatedAt: string;
|
|
250
|
+
readonly messageCount: number;
|
|
251
|
+
readonly hasPendingApprovals: boolean;
|
|
252
|
+
readonly hasPendingUserInput: boolean;
|
|
253
|
+
readonly hasActionableProposedPlan: boolean;
|
|
254
|
+
readonly pendingApprovals: ReturnType<typeof derivePendingApprovals>;
|
|
255
|
+
readonly pendingUserInputs: ReturnType<typeof derivePendingUserInputs>;
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
function projectThreadShow(thread: OrchestrationThread): ThreadShow {
|
|
259
|
+
const pendingApprovals = derivePendingApprovals(thread.activities);
|
|
260
|
+
const pendingUserInputs = derivePendingUserInputs(thread.activities);
|
|
261
|
+
return {
|
|
262
|
+
id: thread.id,
|
|
263
|
+
projectId: thread.projectId,
|
|
264
|
+
title: thread.title,
|
|
265
|
+
status: threadStatus(thread),
|
|
266
|
+
session: thread.session,
|
|
267
|
+
latestTurn: thread.latestTurn,
|
|
268
|
+
modelSelection: thread.modelSelection,
|
|
269
|
+
runtimeMode: thread.runtimeMode,
|
|
270
|
+
interactionMode: thread.interactionMode,
|
|
271
|
+
branch: thread.branch,
|
|
272
|
+
worktreePath: thread.worktreePath,
|
|
273
|
+
archivedAt: thread.archivedAt,
|
|
274
|
+
createdAt: thread.createdAt,
|
|
275
|
+
updatedAt: thread.updatedAt,
|
|
276
|
+
messageCount: thread.messages.length,
|
|
277
|
+
hasPendingApprovals: pendingApprovals.length > 0,
|
|
278
|
+
hasPendingUserInput: pendingUserInputs.length > 0,
|
|
279
|
+
hasActionableProposedPlan: thread.proposedPlans.some((plan) => plan.implementedAt === null),
|
|
280
|
+
pendingApprovals,
|
|
281
|
+
pendingUserInputs,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
186
285
|
function failIfThreadError(thread: {
|
|
187
286
|
readonly id: string;
|
|
188
287
|
readonly session: { readonly status: string; readonly lastError: string | null } | null;
|
package/src/cli/error.ts
CHANGED
|
@@ -21,3 +21,18 @@ export class MissingThreadError extends Schema.TaggedErrorClass<MissingThreadErr
|
|
|
21
21
|
message: Schema.String,
|
|
22
22
|
},
|
|
23
23
|
) {}
|
|
24
|
+
|
|
25
|
+
export class SelfArchiveError extends Schema.TaggedErrorClass<SelfArchiveError>()(
|
|
26
|
+
"SelfArchiveError",
|
|
27
|
+
{
|
|
28
|
+
message: Schema.String,
|
|
29
|
+
threadId: Schema.String,
|
|
30
|
+
},
|
|
31
|
+
) {}
|
|
32
|
+
|
|
33
|
+
export class MissingRequestError extends Schema.TaggedErrorClass<MissingRequestError>()(
|
|
34
|
+
"MissingRequestError",
|
|
35
|
+
{
|
|
36
|
+
message: Schema.String,
|
|
37
|
+
},
|
|
38
|
+
) {}
|
package/src/cli/message-input.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { ProviderUserInputAnswers } from "#t3tools/contracts";
|
|
2
4
|
|
|
3
5
|
import { MessageInputError } from "./error.ts";
|
|
4
6
|
import type { InputError } from "./input/error.ts";
|
|
@@ -23,3 +25,31 @@ export function readInitialMessage(input: {
|
|
|
23
25
|
}
|
|
24
26
|
return Effect.succeed(input.message);
|
|
25
27
|
}
|
|
28
|
+
|
|
29
|
+
export function readJsonAnswers(input: {
|
|
30
|
+
readonly answers: string | undefined;
|
|
31
|
+
readonly fromStdin: boolean;
|
|
32
|
+
readonly readStdin: () => Effect.Effect<string, InputError>;
|
|
33
|
+
}) {
|
|
34
|
+
if (input.answers !== undefined && input.answers.length > 0 && input.fromStdin) {
|
|
35
|
+
return Effect.fail(new MessageInputError({ message: "pass --answers or --stdin, not both" }));
|
|
36
|
+
}
|
|
37
|
+
if (input.fromStdin) {
|
|
38
|
+
return input.readStdin().pipe(Effect.flatMap(parseJsonAnswers));
|
|
39
|
+
}
|
|
40
|
+
if (input.answers === undefined || input.answers.length === 0) {
|
|
41
|
+
return Effect.fail(
|
|
42
|
+
new MessageInputError({ message: "answers required unless --stdin is used" }),
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
return parseJsonAnswers(input.answers);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function parseJsonAnswers(text: string) {
|
|
49
|
+
try {
|
|
50
|
+
const parsed: unknown = JSON.parse(text);
|
|
51
|
+
return Effect.succeed(Schema.decodeUnknownSync(ProviderUserInputAnswers)(parsed));
|
|
52
|
+
} catch {
|
|
53
|
+
return Effect.fail(new MessageInputError({ message: "invalid JSON in answers" }));
|
|
54
|
+
}
|
|
55
|
+
}
|
package/src/cli/thread-format.ts
CHANGED
|
@@ -1,7 +1,54 @@
|
|
|
1
|
+
import type { ThreadShow } from "../application/threads.ts";
|
|
1
2
|
import type { WaitEvent } from "../application/service.ts";
|
|
2
3
|
import type { OrchestrationThread, OrchestrationThreadShell } from "#t3tools/contracts";
|
|
3
4
|
import { latestAssistantMessage, threadStatus } from "../domain/thread-lifecycle.ts";
|
|
4
5
|
|
|
6
|
+
export function formatThreadShowJson(thread: ThreadShow) {
|
|
7
|
+
return {
|
|
8
|
+
id: thread.id,
|
|
9
|
+
projectId: thread.projectId,
|
|
10
|
+
title: thread.title,
|
|
11
|
+
status: thread.status,
|
|
12
|
+
session: thread.session,
|
|
13
|
+
latestTurn: thread.latestTurn,
|
|
14
|
+
modelSelection: thread.modelSelection,
|
|
15
|
+
runtimeMode: thread.runtimeMode,
|
|
16
|
+
interactionMode: thread.interactionMode,
|
|
17
|
+
branch: thread.branch,
|
|
18
|
+
worktreePath: thread.worktreePath,
|
|
19
|
+
archivedAt: thread.archivedAt,
|
|
20
|
+
createdAt: thread.createdAt,
|
|
21
|
+
updatedAt: thread.updatedAt,
|
|
22
|
+
messageCount: thread.messageCount,
|
|
23
|
+
hasPendingApprovals: thread.hasPendingApprovals,
|
|
24
|
+
hasPendingUserInput: thread.hasPendingUserInput,
|
|
25
|
+
hasActionableProposedPlan: thread.hasActionableProposedPlan,
|
|
26
|
+
pendingApprovals: thread.pendingApprovals,
|
|
27
|
+
pendingUserInputs: thread.pendingUserInputs,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function formatThreadShowHuman(thread: ThreadShow) {
|
|
32
|
+
const lines = [
|
|
33
|
+
`title: ${thread.title}`,
|
|
34
|
+
`id: ${thread.id}`,
|
|
35
|
+
`status: ${thread.status}`,
|
|
36
|
+
`model: ${thread.modelSelection.instanceId}/${thread.modelSelection.model}`,
|
|
37
|
+
...(thread.branch !== null ? [`branch: ${thread.branch}`] : []),
|
|
38
|
+
...(thread.worktreePath !== null ? [`worktree: ${thread.worktreePath}`] : []),
|
|
39
|
+
`messages: ${thread.messageCount}`,
|
|
40
|
+
];
|
|
41
|
+
if (thread.pendingApprovals.length > 0) {
|
|
42
|
+
const requestIds = thread.pendingApprovals.map((approval) => approval.requestId).join(", ");
|
|
43
|
+
lines.push(`pending approvals: ${thread.pendingApprovals.length} (${requestIds})`);
|
|
44
|
+
}
|
|
45
|
+
if (thread.pendingUserInputs.length > 0) {
|
|
46
|
+
const requestIds = thread.pendingUserInputs.map((input) => input.requestId).join(", ");
|
|
47
|
+
lines.push(`pending user inputs: ${thread.pendingUserInputs.length} (${requestIds})`);
|
|
48
|
+
}
|
|
49
|
+
return `${lines.join("\n")}\n`;
|
|
50
|
+
}
|
|
51
|
+
|
|
5
52
|
export function formatThreadsHuman(threads: ReadonlyArray<OrchestrationThreadShell>) {
|
|
6
53
|
return threads
|
|
7
54
|
.map(
|