@agentuity/coder-tui 3.0.0-beta.1 → 3.0.0-beta.3

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 (64) hide show
  1. package/README.md +1 -1
  2. package/dist/chain-preview.d.ts +1 -1
  3. package/dist/chain-preview.d.ts.map +1 -1
  4. package/dist/chain-preview.js +1 -1
  5. package/dist/chain-preview.js.map +1 -1
  6. package/dist/commands.d.ts +1 -1
  7. package/dist/commands.d.ts.map +1 -1
  8. package/dist/footer.d.ts +1 -1
  9. package/dist/footer.d.ts.map +1 -1
  10. package/dist/hub-overlay.d.ts +1 -1
  11. package/dist/hub-overlay.d.ts.map +1 -1
  12. package/dist/hub-overlay.js +2 -2
  13. package/dist/hub-overlay.js.map +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +6 -6
  17. package/dist/index.js.map +1 -1
  18. package/dist/native-remote-ui-context.d.ts +1 -1
  19. package/dist/native-remote-ui-context.d.ts.map +1 -1
  20. package/dist/output-viewer.d.ts +1 -1
  21. package/dist/output-viewer.d.ts.map +1 -1
  22. package/dist/output-viewer.js +2 -2
  23. package/dist/output-viewer.js.map +1 -1
  24. package/dist/overlay.d.ts +1 -1
  25. package/dist/overlay.d.ts.map +1 -1
  26. package/dist/overlay.js +1 -1
  27. package/dist/overlay.js.map +1 -1
  28. package/dist/remote-session.d.ts +1 -1
  29. package/dist/remote-session.d.ts.map +1 -1
  30. package/dist/remote-tui.js +1 -1
  31. package/dist/remote-tui.js.map +1 -1
  32. package/dist/remote-ui-handler.d.ts +1 -1
  33. package/dist/remote-ui-handler.d.ts.map +1 -1
  34. package/dist/renderers.d.ts +2 -2
  35. package/dist/renderers.d.ts.map +1 -1
  36. package/dist/renderers.js +1 -1
  37. package/dist/renderers.js.map +1 -1
  38. package/dist/review.d.ts +1 -1
  39. package/dist/review.d.ts.map +1 -1
  40. package/dist/startup-logo.d.ts +1 -1
  41. package/dist/startup-logo.d.ts.map +1 -1
  42. package/dist/titlebar.d.ts +1 -1
  43. package/dist/titlebar.d.ts.map +1 -1
  44. package/package.json +5 -4
  45. package/src/chain-preview.ts +2 -2
  46. package/src/commands.ts +1 -1
  47. package/src/footer.ts +1 -1
  48. package/src/hub-overlay.ts +2 -2
  49. package/src/index.ts +6 -6
  50. package/src/native-remote-ui-context.ts +1 -1
  51. package/src/output-viewer.ts +2 -2
  52. package/src/overlay.ts +2 -2
  53. package/src/remote-session.ts +1 -1
  54. package/src/remote-tui.ts +1 -1
  55. package/src/remote-ui-handler.ts +1 -1
  56. package/src/renderers.ts +2 -2
  57. package/src/review.ts +1 -1
  58. package/src/startup-logo.ts +1 -1
  59. package/src/titlebar.ts +1 -1
  60. package/dist/aigateway.d.ts +0 -4
  61. package/dist/aigateway.d.ts.map +0 -1
  62. package/dist/aigateway.js +0 -178
  63. package/dist/aigateway.js.map +0 -1
  64. package/src/aigateway.ts +0 -256
package/dist/aigateway.js DELETED
@@ -1,178 +0,0 @@
1
- /**
2
- * Agentuity AI Gateway Custom Provider Extension
3
- *
4
- * Registers models from the Agentuity AI Gateway using the appropriate API type
5
- * based on model ID patterns. Models are loaded dynamically from the gateway's /models endpoint.
6
- *
7
- * Usage:
8
- * Use /model to switch to aigateway models
9
- */
10
- import { delimiter, join } from 'node:path';
11
- import { existsSync } from 'node:fs';
12
- import { execFileSync } from 'node:child_process';
13
- const MODEL_CATALOG_TIMEOUT_MS = 5_000;
14
- const KNOWN_APIS = new Set([
15
- 'openai-completions',
16
- 'mistral-conversations',
17
- 'openai-responses',
18
- 'azure-openai-responses',
19
- 'openai-codex-responses',
20
- 'anthropic-messages',
21
- 'bedrock-converse-stream',
22
- 'google-generative-ai',
23
- 'google-gemini-cli',
24
- 'google-vertex',
25
- ]);
26
- function getEnv(...keys) {
27
- for (const key of keys) {
28
- if (process.env[key]) {
29
- return process.env[key];
30
- }
31
- }
32
- }
33
- function normalizeCredential(value) {
34
- if (value === undefined || value === null) {
35
- return undefined;
36
- }
37
- const normalized = String(value).trim();
38
- return normalized.length > 0 ? normalized : undefined;
39
- }
40
- function isKnownApi(api) {
41
- return typeof api === 'string' && KNOWN_APIS.has(api);
42
- }
43
- function getRegion() {
44
- return getEnv('AGENTUITY_REGION') ?? 'usc';
45
- }
46
- function getBaseUrl() {
47
- const region = getRegion();
48
- return `https://aigateway-${region}.agentuity.cloud`;
49
- }
50
- async function fetchModels() {
51
- const baseUrl = getBaseUrl();
52
- let apiKey = normalizeCredential(getEnv('AGENTUITY_CODER_API_KEY', 'AGENTUITY_SDK_KEY', 'AGENTUITY_CLI_API_KEY', 'AGENTUITY_CLI_KEY'));
53
- let orgId = normalizeCredential(getEnv('AGENTUITY_ORGID', 'AGENTUITY_CLOUD_ORG_ID', 'AGENTUITY_ORG_ID'));
54
- if (!apiKey) {
55
- let found = false;
56
- const path = process.env.PATH?.split(delimiter) ?? [];
57
- for (const dir of path) {
58
- const fn = join(dir, 'agentuity');
59
- if (existsSync(fn)) {
60
- try {
61
- const res = execFileSync(fn, ['auth', 'apikey', '--json']);
62
- const apiKeyResult = JSON.parse(res.toString());
63
- apiKey = normalizeCredential(apiKeyResult.apiKey);
64
- found = true;
65
- if (!orgId) {
66
- const ores = execFileSync(fn, ['auth', 'org', 'current']);
67
- orgId = normalizeCredential(ores);
68
- if (!orgId) {
69
- console.warn('Cannot determine the org id. Use `agentuity auth org select` to select a default organization');
70
- return {};
71
- }
72
- }
73
- break;
74
- }
75
- catch (_ex) {
76
- //
77
- }
78
- }
79
- }
80
- if (!found) {
81
- console.warn('AGENTUITY_SDK_KEY, AGENTUITY_CLI_API_KEY or AGENTUITY_CLI_KEY not set and cannot find the agentuit cli, cannot fetch models from AI Gateway');
82
- return {};
83
- }
84
- }
85
- if (!apiKey) {
86
- console.warn('Cannot determine the API key, cannot fetch models from AI Gateway');
87
- return {};
88
- }
89
- process.env.AGENTUITY_AIGATEWAY_KEY = apiKey;
90
- if (orgId) {
91
- process.env.AGENTUITY_AIGATEWAY_ORGID = orgId;
92
- }
93
- const controller = new AbortController();
94
- const timeout = setTimeout(() => controller.abort(), MODEL_CATALOG_TIMEOUT_MS);
95
- try {
96
- const response = await fetch(`${baseUrl}/models`, { signal: controller.signal });
97
- if (!response.ok) {
98
- console.warn(`Failed to fetch models from AI Gateway: ${response.status} ${response.statusText}`);
99
- return {};
100
- }
101
- const payload = (await response.json());
102
- if (!payload.success) {
103
- console.warn(`Failed to load models. ${payload.message} ${payload}`);
104
- }
105
- return payload.data;
106
- }
107
- catch (error) {
108
- if (error instanceof Error && error.name === 'AbortError') {
109
- console.warn(`Timed out fetching models from AI Gateway after ${MODEL_CATALOG_TIMEOUT_MS}ms`);
110
- return {};
111
- }
112
- console.warn('Failed to fetch models from AI Gateway:', error);
113
- return {};
114
- }
115
- finally {
116
- clearTimeout(timeout);
117
- }
118
- }
119
- function toPiModel(m) {
120
- return {
121
- id: m.id,
122
- name: m.name,
123
- reasoning: m.reasoning,
124
- input: m.input_modalities,
125
- contextWindow: m.context_window ?? 40000,
126
- maxTokens: m.max_output_tokens ?? 64000,
127
- cost: {
128
- input: m.pricing?.input ?? 0,
129
- output: m.pricing?.output ?? 0,
130
- cacheRead: m.pricing?.cached_input ?? 0,
131
- cacheWrite: 0,
132
- },
133
- compat: {
134
- supportsDeveloperRole: false,
135
- },
136
- };
137
- }
138
- export async function setupAIGateway(pi) {
139
- const models = await fetchModels();
140
- const baseUrl = getBaseUrl();
141
- const allModels = [];
142
- for (const providerModels of Object.values(models)) {
143
- if (providerModels) {
144
- allModels.push(...providerModels);
145
- }
146
- }
147
- if (allModels.length === 0) {
148
- return;
149
- }
150
- const modelsByApi = new Map();
151
- for (const m of allModels) {
152
- const apiType = m.api;
153
- if (!isKnownApi(apiType)) {
154
- continue; // THIS SHOULD NEVER HAPPEN BUT JUST IN CASE
155
- }
156
- const existing = modelsByApi.get(apiType) ?? [];
157
- existing.push(toPiModel(m));
158
- modelsByApi.set(apiType, existing);
159
- }
160
- const headers = {};
161
- if (process.env.AGENTUITY_AIGATEWAY_ORGID) {
162
- headers['x-agentuity-orgid'] = process.env.AGENTUITY_AIGATEWAY_ORGID;
163
- }
164
- for (const [apiType, providerModels] of modelsByApi) {
165
- const apitok = apiType.split('-');
166
- const name = apitok.length >= 2 ? apitok.slice(0, 2).join('-') : apitok[0];
167
- const providerName = `agentuity/${name}`;
168
- pi.registerProvider(providerName, {
169
- baseUrl,
170
- apiKey: 'AGENTUITY_AIGATEWAY_KEY',
171
- headers,
172
- authHeader: true,
173
- api: apiType,
174
- models: providerModels,
175
- });
176
- }
177
- }
178
- //# sourceMappingURL=aigateway.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aigateway.js","sourceRoot":"","sources":["../src/aigateway.ts"],"names":[],"mappings":"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"}
package/src/aigateway.ts DELETED
@@ -1,256 +0,0 @@
1
- /**
2
- * Agentuity AI Gateway Custom Provider Extension
3
- *
4
- * Registers models from the Agentuity AI Gateway using the appropriate API type
5
- * based on model ID patterns. Models are loaded dynamically from the gateway's /models endpoint.
6
- *
7
- * Usage:
8
- * Use /model to switch to aigateway models
9
- */
10
- import { delimiter, join } from 'node:path';
11
- import { existsSync } from 'node:fs';
12
- import { execFileSync } from 'node:child_process';
13
- import type { ExtensionAPI, ProviderModelConfig } from '@mariozechner/pi-coding-agent';
14
-
15
- export type KnownApi =
16
- | 'openai-completions'
17
- | 'mistral-conversations'
18
- | 'openai-responses'
19
- | 'azure-openai-responses'
20
- | 'openai-codex-responses'
21
- | 'anthropic-messages'
22
- | 'bedrock-converse-stream'
23
- | 'google-generative-ai'
24
- | 'google-gemini-cli'
25
- | 'google-vertex';
26
-
27
- const MODEL_CATALOG_TIMEOUT_MS = 5_000;
28
-
29
- const KNOWN_APIS = new Set<string>([
30
- 'openai-completions',
31
- 'mistral-conversations',
32
- 'openai-responses',
33
- 'azure-openai-responses',
34
- 'openai-codex-responses',
35
- 'anthropic-messages',
36
- 'bedrock-converse-stream',
37
- 'google-generative-ai',
38
- 'google-gemini-cli',
39
- 'google-vertex',
40
- ] satisfies KnownApi[]);
41
-
42
- interface AIGatewayModels {
43
- [key: string]: AIGatewayModel[];
44
- }
45
-
46
- interface AIGatewayModelResponse {
47
- success: boolean;
48
- data: AIGatewayModels;
49
- message?: string;
50
- error?: string;
51
- }
52
-
53
- interface AIGatewayModel {
54
- id: string;
55
- name: string;
56
- api: KnownApi;
57
- reasoning: boolean;
58
- input_modalities?: ('text' | 'image')[];
59
- context_window?: number;
60
- max_output_tokens?: number;
61
- pricing?: {
62
- input: number;
63
- output: number;
64
- cached_input: number;
65
- unit: 'per_million_tokens';
66
- currency: 'USD';
67
- };
68
- }
69
-
70
- function getEnv(...keys: string[]): string | undefined {
71
- for (const key of keys) {
72
- if (process.env[key]) {
73
- return process.env[key];
74
- }
75
- }
76
- }
77
-
78
- function normalizeCredential(value: unknown): string | undefined {
79
- if (value === undefined || value === null) {
80
- return undefined;
81
- }
82
- const normalized = String(value).trim();
83
- return normalized.length > 0 ? normalized : undefined;
84
- }
85
-
86
- function isKnownApi(api: unknown): api is KnownApi {
87
- return typeof api === 'string' && KNOWN_APIS.has(api);
88
- }
89
-
90
- function getRegion(): string {
91
- return getEnv('AGENTUITY_REGION') ?? 'usc';
92
- }
93
-
94
- function getBaseUrl(): string {
95
- const region = getRegion();
96
- return `https://aigateway-${region}.agentuity.cloud`;
97
- }
98
-
99
- async function fetchModels(): Promise<AIGatewayModels> {
100
- const baseUrl = getBaseUrl();
101
- let apiKey = normalizeCredential(
102
- getEnv(
103
- 'AGENTUITY_CODER_API_KEY',
104
- 'AGENTUITY_SDK_KEY',
105
- 'AGENTUITY_CLI_API_KEY',
106
- 'AGENTUITY_CLI_KEY'
107
- )
108
- );
109
- let orgId = normalizeCredential(
110
- getEnv('AGENTUITY_ORGID', 'AGENTUITY_CLOUD_ORG_ID', 'AGENTUITY_ORG_ID')
111
- );
112
-
113
- if (!apiKey) {
114
- let found = false;
115
- const path = process.env.PATH?.split(delimiter) ?? [];
116
- for (const dir of path) {
117
- const fn = join(dir, 'agentuity');
118
- if (existsSync(fn)) {
119
- try {
120
- const res = execFileSync(fn, ['auth', 'apikey', '--json']);
121
- const apiKeyResult = JSON.parse(res.toString()) as { apiKey: string };
122
- apiKey = normalizeCredential(apiKeyResult.apiKey);
123
- found = true;
124
- if (!orgId) {
125
- const ores = execFileSync(fn, ['auth', 'org', 'current']);
126
- orgId = normalizeCredential(ores);
127
- if (!orgId) {
128
- console.warn(
129
- 'Cannot determine the org id. Use `agentuity auth org select` to select a default organization'
130
- );
131
- return {};
132
- }
133
- }
134
- break;
135
- } catch (_ex) {
136
- //
137
- }
138
- }
139
- }
140
- if (!found) {
141
- console.warn(
142
- 'AGENTUITY_SDK_KEY, AGENTUITY_CLI_API_KEY or AGENTUITY_CLI_KEY not set and cannot find the agentuit cli, cannot fetch models from AI Gateway'
143
- );
144
- return {};
145
- }
146
- }
147
-
148
- if (!apiKey) {
149
- console.warn('Cannot determine the API key, cannot fetch models from AI Gateway');
150
- return {};
151
- }
152
-
153
- process.env.AGENTUITY_AIGATEWAY_KEY = apiKey;
154
- if (orgId) {
155
- process.env.AGENTUITY_AIGATEWAY_ORGID = orgId;
156
- }
157
-
158
- const controller = new AbortController();
159
- const timeout = setTimeout(() => controller.abort(), MODEL_CATALOG_TIMEOUT_MS);
160
-
161
- try {
162
- const response = await fetch(`${baseUrl}/models`, { signal: controller.signal });
163
-
164
- if (!response.ok) {
165
- console.warn(
166
- `Failed to fetch models from AI Gateway: ${response.status} ${response.statusText}`
167
- );
168
- return {};
169
- }
170
-
171
- const payload = (await response.json()) as AIGatewayModelResponse;
172
-
173
- if (!payload.success) {
174
- console.warn(`Failed to load models. ${payload.message} ${payload}`);
175
- }
176
-
177
- return payload.data;
178
- } catch (error) {
179
- if (error instanceof Error && error.name === 'AbortError') {
180
- console.warn(
181
- `Timed out fetching models from AI Gateway after ${MODEL_CATALOG_TIMEOUT_MS}ms`
182
- );
183
- return {};
184
- }
185
- console.warn('Failed to fetch models from AI Gateway:', error);
186
- return {};
187
- } finally {
188
- clearTimeout(timeout);
189
- }
190
- }
191
-
192
- function toPiModel(m: AIGatewayModel): ProviderModelConfig {
193
- return {
194
- id: m.id,
195
- name: m.name,
196
- reasoning: m.reasoning,
197
- input: m.input_modalities as ('text' | 'image')[],
198
- contextWindow: m.context_window ?? 40000,
199
- maxTokens: m.max_output_tokens ?? 64000,
200
- cost: {
201
- input: m.pricing?.input ?? 0,
202
- output: m.pricing?.output ?? 0,
203
- cacheRead: m.pricing?.cached_input ?? 0,
204
- cacheWrite: 0,
205
- },
206
- compat: {
207
- supportsDeveloperRole: false,
208
- },
209
- };
210
- }
211
-
212
- export async function setupAIGateway(pi: ExtensionAPI) {
213
- const models = await fetchModels();
214
- const baseUrl = getBaseUrl();
215
-
216
- const allModels: AIGatewayModel[] = [];
217
- for (const providerModels of Object.values(models)) {
218
- if (providerModels) {
219
- allModels.push(...providerModels);
220
- }
221
- }
222
- if (allModels.length === 0) {
223
- return;
224
- }
225
-
226
- const modelsByApi = new Map<KnownApi, ProviderModelConfig[]>();
227
-
228
- for (const m of allModels) {
229
- const apiType = m.api;
230
- if (!isKnownApi(apiType)) {
231
- continue; // THIS SHOULD NEVER HAPPEN BUT JUST IN CASE
232
- }
233
- const existing = modelsByApi.get(apiType) ?? [];
234
- existing.push(toPiModel(m));
235
- modelsByApi.set(apiType, existing);
236
- }
237
-
238
- const headers: Record<string, string> = {};
239
- if (process.env.AGENTUITY_AIGATEWAY_ORGID) {
240
- headers['x-agentuity-orgid'] = process.env.AGENTUITY_AIGATEWAY_ORGID;
241
- }
242
-
243
- for (const [apiType, providerModels] of modelsByApi) {
244
- const apitok = apiType.split('-');
245
- const name = apitok.length >= 2 ? apitok.slice(0, 2).join('-') : apitok[0];
246
- const providerName = `agentuity/${name}`;
247
- pi.registerProvider(providerName, {
248
- baseUrl,
249
- apiKey: 'AGENTUITY_AIGATEWAY_KEY',
250
- headers,
251
- authHeader: true,
252
- api: apiType,
253
- models: providerModels,
254
- });
255
- }
256
- }