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.
Files changed (82) hide show
  1. package/README.md +90 -35
  2. package/dist/application.js +1 -1
  3. package/dist/auth.js +1 -2
  4. package/dist/bin.js +241 -45
  5. package/dist/cli.js +1 -1
  6. package/dist/config.js +1 -3
  7. package/dist/connection.js +1 -4
  8. package/dist/index.js +1 -4
  9. package/dist/layout.js +1 -1
  10. package/dist/orchestration.js +1 -1
  11. package/dist/rpc.js +1 -1
  12. package/dist/runtime.js +1 -2
  13. package/dist/scope.js +1 -1
  14. package/dist/shared.js +85492 -0
  15. package/dist/src/application/layer.d.ts +86 -2
  16. package/dist/src/application/models.d.ts +1 -0
  17. package/dist/src/application/projects.d.ts +10 -1
  18. package/dist/src/application/service.d.ts +30 -1
  19. package/dist/src/application/shell-sequence.d.ts +9 -0
  20. package/dist/src/application/thread-commands.d.ts +27 -1
  21. package/dist/src/application/thread-wait.d.ts +9 -0
  22. package/dist/src/application/threads.d.ts +102 -2
  23. package/dist/src/cli-path/layer.d.ts +3 -0
  24. package/dist/src/cli-path/service.d.ts +8 -0
  25. package/dist/src/domain/helpers.d.ts +9 -0
  26. package/dist/src/domain/model-config.d.ts +3 -0
  27. package/dist/src/domain/thread-activities.d.ts +14 -0
  28. package/dist/src/domain/thread-lifecycle.d.ts +10 -0
  29. package/dist/src/orchestration/layer.d.ts +215 -0
  30. package/dist/src/rpc/layer.d.ts +466 -0
  31. package/dist/src/rpc/ws-group.d.ts +142 -0
  32. package/dist/src/runtime/layer.d.ts +1 -1
  33. package/dist/t3tools.js +2 -2
  34. package/dist/upstream-t3code/packages/contracts/src/environmentHttp.d.ts +33 -10
  35. package/dist/upstream-t3code/packages/contracts/src/ipc.d.ts +6 -0
  36. package/dist/upstream-t3code/packages/contracts/src/orchestration.d.ts +657 -1
  37. package/dist/upstream-t3code/packages/contracts/src/provider.d.ts +14 -0
  38. package/dist/upstream-t3code/packages/contracts/src/providerRuntime.d.ts +175 -1
  39. package/dist/upstream-t3code/packages/contracts/src/rpc.d.ts +492 -0
  40. package/dist/upstream-t3code/packages/contracts/src/server.d.ts +45 -0
  41. package/dist/upstream-t3code/packages/contracts/src/settings.d.ts +21 -0
  42. package/dist/upstream-t3code/packages/contracts/src/terminal.d.ts +6 -3
  43. package/package.json +2 -2
  44. package/src/application/service.ts +32 -0
  45. package/src/application/thread-commands.ts +45 -0
  46. package/src/application/threads.ts +100 -1
  47. package/src/cli/error.ts +15 -0
  48. package/src/cli/message-input.ts +30 -0
  49. package/src/cli/thread-format.ts +47 -0
  50. package/src/cli/thread.ts +8 -0
  51. package/src/cli/threads/approve.ts +61 -0
  52. package/src/cli/threads/archive.ts +18 -3
  53. package/src/cli/threads/callback.ts +92 -0
  54. package/src/cli/threads/respond.ts +70 -0
  55. package/src/cli/threads/show.ts +43 -0
  56. package/src/cli-path/layer.ts +10 -0
  57. package/src/cli-path/service.ts +7 -0
  58. package/src/domain/thread-activities.test.ts +321 -0
  59. package/src/domain/thread-activities.ts +244 -0
  60. package/src/domain/thread-lifecycle.ts +2 -0
  61. package/src/runtime/layer.ts +2 -0
  62. package/dist/Context-DueQ9iMH.js +0 -4916
  63. package/dist/Path-D8WPdPwR.js +0 -11406
  64. package/dist/Schema-DsQxYh6_.js +0 -13581
  65. package/dist/UrlParams-BA6gBvaY.js +0 -205
  66. package/dist/base-dir-R12OMDso.js +0 -20
  67. package/dist/error-B2t1bAP9.js +0 -169
  68. package/dist/error-BHRnjLux.js +0 -15
  69. package/dist/error-jwMt3VoW.js +0 -54
  70. package/dist/flags-CM7_iGdA.js +0 -13371
  71. package/dist/layer-CfC5qZol.js +0 -1508
  72. package/dist/layer-DHhKS5jd.js +0 -13
  73. package/dist/layer-DUv99vsS.js +0 -72
  74. package/dist/layer-DvHnKBYj.js +0 -29466
  75. package/dist/layer-MqCKkIGD.js +0 -1206
  76. package/dist/scope-GycYiJ54.js +0 -29
  77. package/dist/service-CLmRO2Dp.js +0 -8
  78. package/dist/service-ybOWV9pL.js +0 -5
  79. package/dist/src-KdbHqrex.js +0 -8874
  80. package/dist/transport-D3zBdZ1h.js +0 -539
  81. package/dist/url-SlsaG8nY.js +0 -165
  82. /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 = Schema.Codec.Encoded<typeof 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 = Schema.Codec.Encoded<typeof 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 = Schema.Codec.Encoded<typeof 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.7.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.24"
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
+ ) {}
@@ -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
+ }
@@ -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(