@defai.digital/ax-cli 3.6.1 → 3.7.1
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 +129 -16
- package/config-defaults/settings.yaml +24 -0
- package/dist/agent/llm-agent.d.ts +48 -3
- package/dist/agent/llm-agent.js +145 -40
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/agent/subagent.d.ts +6 -0
- package/dist/agent/subagent.js +41 -24
- package/dist/agent/subagent.js.map +1 -1
- package/dist/constants.d.ts +13 -0
- package/dist/constants.js +28 -0
- package/dist/constants.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/mcp/client.js +2 -2
- package/dist/mcp/client.js.map +1 -1
- package/dist/schemas/settings-schemas.d.ts +17 -0
- package/dist/schemas/settings-schemas.js +15 -0
- package/dist/schemas/settings-schemas.js.map +1 -1
- package/dist/sdk/errors.d.ts +93 -0
- package/dist/sdk/errors.js +124 -0
- package/dist/sdk/errors.js.map +1 -0
- package/dist/sdk/index.d.ts +116 -46
- package/dist/sdk/index.js +178 -57
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/progress-reporter.d.ts +111 -0
- package/dist/sdk/progress-reporter.js +178 -0
- package/dist/sdk/progress-reporter.js.map +1 -0
- package/dist/sdk/testing.d.ts +184 -0
- package/dist/sdk/testing.js +291 -0
- package/dist/sdk/testing.js.map +1 -0
- package/dist/sdk/tool-registry.d.ts +163 -0
- package/dist/sdk/tool-registry.js +218 -0
- package/dist/sdk/tool-registry.js.map +1 -0
- package/dist/sdk/unified-logger.d.ts +163 -0
- package/dist/sdk/unified-logger.js +274 -0
- package/dist/sdk/unified-logger.js.map +1 -0
- package/dist/sdk/version.d.ts +59 -0
- package/dist/sdk/version.js +64 -0
- package/dist/sdk/version.js.map +1 -0
- package/dist/tools/bash.d.ts +4 -0
- package/dist/tools/bash.js +22 -2
- package/dist/tools/bash.js.map +1 -1
- package/dist/ui/components/chat-history.d.ts +2 -0
- package/dist/ui/components/chat-history.js +32 -81
- package/dist/ui/components/chat-history.js.map +1 -1
- package/dist/ui/components/chat-interface.js +3 -3
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/components/status-bar.d.ts +2 -0
- package/dist/ui/components/status-bar.js +33 -9
- package/dist/ui/components/status-bar.js.map +1 -1
- package/dist/ui/components/tool-group-display.d.ts +15 -0
- package/dist/ui/components/tool-group-display.js +91 -0
- package/dist/ui/components/tool-group-display.js.map +1 -0
- package/dist/ui/hooks/use-enhanced-input.js +43 -6
- package/dist/ui/hooks/use-enhanced-input.js.map +1 -1
- package/dist/ui/hooks/use-input-handler.d.ts +2 -0
- package/dist/ui/hooks/use-input-handler.js +13 -7
- package/dist/ui/hooks/use-input-handler.js.map +1 -1
- package/dist/ui/utils/change-summarizer.d.ts +20 -0
- package/dist/ui/utils/change-summarizer.js +193 -0
- package/dist/ui/utils/change-summarizer.js.map +1 -0
- package/dist/ui/utils/tool-grouper.d.ts +62 -0
- package/dist/ui/utils/tool-grouper.js +224 -0
- package/dist/ui/utils/tool-grouper.js.map +1 -0
- package/dist/utils/config-loader.d.ts +4 -0
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/paste-utils.js +45 -19
- package/dist/utils/paste-utils.js.map +1 -1
- package/dist/utils/token-counter.d.ts +12 -0
- package/dist/utils/token-counter.js +32 -4
- package/dist/utils/token-counter.js.map +1 -1
- package/package.json +2 -2
- package/packages/schemas/package.json +1 -1
- package/.ax-cli/CUSTOM.md +0 -269
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-11e9e0ba-c39d-4fd2-aa77-bc818811c921.json +0 -69
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-2b260b98-b418-4c7c-9694-e2b94967e662.json +0 -24
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-2dd84869-e62d-46c8-9885-7e45f37f36e2.json +0 -69
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-484dc350-353f-4808-9ed1-ebb3cefdab37.json +0 -24
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-74a18b87-6172-4215-962b-44bb9f46a662.json +0 -69
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-7e03601e-e8ab-4cd7-9841-a74b66adf78f.json +0 -69
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-7f9c6562-771f-4fd0-adcf-9e7e9ac34ae8.json +0 -44
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-870a5fb9-6e82-4ff2-8ec8-af4c251cc514.json +0 -44
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-93946601-0e83-456c-ba47-def9713124dd.json +0 -24
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-e1ebe666-4c3a-4367-ba5c-27fe512a9c70.json +0 -24
- package/.ax-cli/checkpoints/2025-11-21/checkpoint-15743e7d-430c-4d76-b6fc-955d7a5c250c.json +0 -44
- package/.ax-cli/checkpoints/2025-11-21/checkpoint-25cf7679-0b3f-4988-83d7-704548fbba91.json +0 -69
- package/.ax-cli/checkpoints/2025-11-21/checkpoint-54aedbac-6db0-464e-8ebb-dbb3979e6dca.json +0 -24
- package/.ax-cli/checkpoints/2025-11-21/checkpoint-7658aed8-fe5d-4222-903f-1a7c63717ea7.json +0 -24
- package/.ax-cli/checkpoints/2025-11-21/checkpoint-c9c13497-40dc-4294-a327-6a5fc854eaa1.json +0 -69
- package/.ax-cli/checkpoints/metadata.json +0 -62
- package/.ax-cli/index.json +0 -44
- package/.ax-cli/memory.json +0 -62
- package/.ax-cli/settings.json +0 -1
- package/ax.config.json +0 -333
- package/dist/agent/chat-history-manager.d.ts +0 -56
- package/dist/agent/chat-history-manager.js +0 -150
- package/dist/agent/chat-history-manager.js.map +0 -1
- package/dist/agent/tool-manager.d.ts +0 -39
- package/dist/agent/tool-manager.js +0 -76
- package/dist/agent/tool-manager.js.map +0 -1
- package/dist/hooks/use-chat-reducer.d.ts +0 -61
- package/dist/hooks/use-chat-reducer.js +0 -118
- package/dist/hooks/use-chat-reducer.js.map +0 -1
- package/dist/hooks/use-enhanced-input.d.ts +0 -40
- package/dist/hooks/use-enhanced-input.js +0 -249
- package/dist/hooks/use-enhanced-input.js.map +0 -1
- package/dist/hooks/use-input-handler.d.ts +0 -46
- package/dist/hooks/use-input-handler.js +0 -1430
- package/dist/hooks/use-input-handler.js.map +0 -1
- package/dist/hooks/use-input-history.d.ts +0 -9
- package/dist/hooks/use-input-history.js +0 -112
- package/dist/hooks/use-input-history.js.map +0 -1
- package/dist/index.js.bak +0 -664
- package/dist/tools/web-search/engines/brave.d.ts +0 -16
- package/dist/tools/web-search/engines/brave.js +0 -99
- package/dist/tools/web-search/engines/brave.js.map +0 -1
- package/dist/tools/web-search/engines/tavily.d.ts +0 -17
- package/dist/tools/web-search/engines/tavily.js +0 -73
- package/dist/tools/web-search/engines/tavily.js.map +0 -1
- package/dist/utils/paste-collapse.d.ts +0 -46
- package/dist/utils/paste-collapse.js +0 -77
- package/dist/utils/paste-collapse.js.map +0 -1
- package/packages/schemas/dist/index.d.ts +0 -14
- package/packages/schemas/dist/index.d.ts.map +0 -1
- package/packages/schemas/dist/index.js +0 -19
- package/packages/schemas/dist/index.js.map +0 -1
- package/packages/schemas/dist/public/core/brand-types.d.ts +0 -308
- package/packages/schemas/dist/public/core/brand-types.d.ts.map +0 -1
- package/packages/schemas/dist/public/core/brand-types.js +0 -243
- package/packages/schemas/dist/public/core/brand-types.js.map +0 -1
- package/packages/schemas/dist/public/core/enums.d.ts +0 -227
- package/packages/schemas/dist/public/core/enums.d.ts.map +0 -1
- package/packages/schemas/dist/public/core/enums.js +0 -222
- package/packages/schemas/dist/public/core/enums.js.map +0 -1
- package/packages/schemas/dist/public/core/id-types.d.ts +0 -286
- package/packages/schemas/dist/public/core/id-types.d.ts.map +0 -1
- package/packages/schemas/dist/public/core/id-types.js +0 -136
- package/packages/schemas/dist/public/core/id-types.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"brand-types.d.ts","sourceRoot":"","sources":["../../../src/public/core/brand-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,CAAC,MAAM,OAAO,EAAE,OAAO,MAAM,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAEhE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAC3C,MAAM,EAAE,OAAO,GACd,MAAM,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAIvB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAElE;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAE5E;;;;;;;;;;GAUG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EACpD,MAAM,EAAE;IAAE,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,CAAC;IAAC,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,EACxH,SAAS,EAAE,CAAC;IAGV;;OAEG;;uBAEc,OAAO,KAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;2BAIjB,OAAO,KAAG;YAAE,OAAO,EAAE,IAAI,CAAC;YAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;SAAE,GAAG;YAAE,OAAO,EAAE,KAAK,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAE;;IASxG;;;OAGG;mBACY,OAAO,KAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAKpC;;OAEG;gBACS,OAAO,KAAG,KAAK,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAK1C;;OAEG;;EAGN;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG"}
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Brand Types Utilities for @ax-cli/schemas
|
|
3
|
-
*
|
|
4
|
-
* CRITICAL SECURITY WARNING:
|
|
5
|
-
* =========================
|
|
6
|
-
* Brand types are COMPILE-TIME ONLY markers. They provide ZERO runtime validation.
|
|
7
|
-
*
|
|
8
|
-
* **YOU MUST VALIDATE ALL INPUTS AT SYSTEM BOUNDARIES**
|
|
9
|
-
*
|
|
10
|
-
* Unsafe usage (WILL FAIL IN PRODUCTION):
|
|
11
|
-
* ```typescript
|
|
12
|
-
* const tenantId = userInput as TenantId; // ❌ NO RUNTIME VALIDATION!
|
|
13
|
-
* ```
|
|
14
|
-
*
|
|
15
|
-
* Safe usage (REQUIRED):
|
|
16
|
-
* ```typescript
|
|
17
|
-
* const result = TenantId.parse(userInput); // ✅ Validates with Zod
|
|
18
|
-
* if (result.success) {
|
|
19
|
-
* const tenantId = result.data; // Type-safe AND runtime-safe
|
|
20
|
-
* }
|
|
21
|
-
* ```
|
|
22
|
-
*
|
|
23
|
-
* WHEN TO USE BRAND TYPES:
|
|
24
|
-
* - Preventing ID mixing at compile time (ApiKeyId vs TenantId)
|
|
25
|
-
* - Enforcing domain boundaries in function signatures
|
|
26
|
-
* - Type-level documentation of intent
|
|
27
|
-
*
|
|
28
|
-
* WHEN TO VALIDATE:
|
|
29
|
-
* - API boundaries (HTTP requests, MCP inputs)
|
|
30
|
-
* - File I/O (reading configs, user settings)
|
|
31
|
-
* - Database queries (WHERE clauses with user IDs)
|
|
32
|
-
* - Environment variables
|
|
33
|
-
* - Command-line arguments
|
|
34
|
-
*
|
|
35
|
-
* PERFORMANCE:
|
|
36
|
-
* Brand types have ZERO runtime cost. They are erased during compilation.
|
|
37
|
-
*
|
|
38
|
-
* @module brand-types
|
|
39
|
-
* @see {@link https://github.com/microsoft/TypeScript/issues/4895|TypeScript Nominal Types}
|
|
40
|
-
*/
|
|
41
|
-
/**
|
|
42
|
-
* Creates a branded value.
|
|
43
|
-
*
|
|
44
|
-
* WARNING: This function performs NO VALIDATION. It is a type-level assertion only.
|
|
45
|
-
*
|
|
46
|
-
* Use this ONLY in trusted contexts after validation:
|
|
47
|
-
* - Inside schema .transform() after Zod validation
|
|
48
|
-
* - After database queries that return validated data
|
|
49
|
-
* - In test fixtures with known-good values
|
|
50
|
-
*
|
|
51
|
-
* DO NOT use with user input directly:
|
|
52
|
-
* ```typescript
|
|
53
|
-
* // ❌ UNSAFE - No validation!
|
|
54
|
-
* const userId = brand<string, 'UserId'>(req.body.userId);
|
|
55
|
-
*
|
|
56
|
-
* // ✅ SAFE - Validated first
|
|
57
|
-
* const result = UserIdSchema.safeParse(req.body.userId);
|
|
58
|
-
* if (result.success) {
|
|
59
|
-
* const userId = result.data; // Already branded by schema
|
|
60
|
-
* }
|
|
61
|
-
* ```
|
|
62
|
-
*
|
|
63
|
-
* @template T - The base type
|
|
64
|
-
* @template B - The brand identifier
|
|
65
|
-
* @param value - The value to brand
|
|
66
|
-
* @returns The same value, but with a brand type
|
|
67
|
-
*
|
|
68
|
-
* @example
|
|
69
|
-
* ```typescript
|
|
70
|
-
* // Safe usage in tests
|
|
71
|
-
* const mockTenantId = brand<string, 'TenantId'>("test-tenant-123");
|
|
72
|
-
*
|
|
73
|
-
* // Safe usage after validation
|
|
74
|
-
* const schema = z.string().uuid().transform(v => brand<string, 'TenantId'>(v));
|
|
75
|
-
* const tenantId = schema.parse(userInput); // Validated AND branded
|
|
76
|
-
* ```
|
|
77
|
-
*/
|
|
78
|
-
export function brand(value) {
|
|
79
|
-
return value;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Type guard to check if a value is already branded with a specific brand.
|
|
83
|
-
*
|
|
84
|
-
* NOTE: This only works if the value was created using the brand() function.
|
|
85
|
-
* It CANNOT detect fake brands created with `as` casts.
|
|
86
|
-
*
|
|
87
|
-
* @template T - The base type
|
|
88
|
-
* @template B - The brand identifier
|
|
89
|
-
* @param value - The value to check
|
|
90
|
-
* @returns true if the value has the correct brand (compile-time only)
|
|
91
|
-
*
|
|
92
|
-
* @example
|
|
93
|
-
* ```typescript
|
|
94
|
-
* const value: string | TenantId = getTenantId();
|
|
95
|
-
*
|
|
96
|
-
* if (isBranded<string, 'TenantId'>(value)) {
|
|
97
|
-
* const tenantId: TenantId = value; // TypeScript knows it's branded
|
|
98
|
-
* }
|
|
99
|
-
* ```
|
|
100
|
-
*/
|
|
101
|
-
export function isBranded(_value) {
|
|
102
|
-
// At runtime, branded types are indistinguishable from their base type
|
|
103
|
-
// This function exists only for type narrowing
|
|
104
|
-
return true;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Removes the brand from a branded type, returning the base type.
|
|
108
|
-
*
|
|
109
|
-
* Use this when you need to pass a branded value to a function that
|
|
110
|
-
* expects the base type (e.g., logging, serialization).
|
|
111
|
-
*
|
|
112
|
-
* @template T - The base type
|
|
113
|
-
* @template B - The brand identifier
|
|
114
|
-
* @param value - The branded value
|
|
115
|
-
* @returns The same value, but with the brand removed
|
|
116
|
-
*
|
|
117
|
-
* @example
|
|
118
|
-
* ```typescript
|
|
119
|
-
* const tenantId: TenantId = getTenantId();
|
|
120
|
-
*
|
|
121
|
-
* // Pass to function expecting plain string
|
|
122
|
-
* console.log(unbrand(tenantId)); // string, not TenantId
|
|
123
|
-
*
|
|
124
|
-
* // Serialize to JSON
|
|
125
|
-
* const json = JSON.stringify({ id: unbrand(tenantId) });
|
|
126
|
-
* ```
|
|
127
|
-
*/
|
|
128
|
-
export function unbrand(value) {
|
|
129
|
-
return value;
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Creates a type-safe brand factory with validation.
|
|
133
|
-
*
|
|
134
|
-
* This is the RECOMMENDED way to create brand types with runtime validation.
|
|
135
|
-
*
|
|
136
|
-
* @template T - The base type
|
|
137
|
-
* @template B - The brand identifier
|
|
138
|
-
* @param schema - Zod schema for validation
|
|
139
|
-
* @param brandName - The brand identifier
|
|
140
|
-
* @returns Object with parse, create, and is methods
|
|
141
|
-
*
|
|
142
|
-
* @example
|
|
143
|
-
* ```typescript
|
|
144
|
-
* import { z } from 'zod';
|
|
145
|
-
*
|
|
146
|
-
* const TenantId = createBrandFactory(
|
|
147
|
-
* z.string().uuid(),
|
|
148
|
-
* 'TenantId'
|
|
149
|
-
* );
|
|
150
|
-
*
|
|
151
|
-
* // Type-safe parsing with validation
|
|
152
|
-
* const result = TenantId.parse(userInput);
|
|
153
|
-
* if (result.success) {
|
|
154
|
-
* const tenantId = result.data; // Brand<string, 'TenantId'>
|
|
155
|
-
* }
|
|
156
|
-
*
|
|
157
|
-
* // Create new ID
|
|
158
|
-
* const newId = TenantId.create(); // Generates UUID
|
|
159
|
-
*
|
|
160
|
-
* // Type guard
|
|
161
|
-
* if (TenantId.is(value)) {
|
|
162
|
-
* // value is Brand<string, 'TenantId'>
|
|
163
|
-
* }
|
|
164
|
-
* ```
|
|
165
|
-
*/
|
|
166
|
-
export function createBrandFactory(schema, brandName) {
|
|
167
|
-
return {
|
|
168
|
-
/**
|
|
169
|
-
* The Zod schema with brand transformation.
|
|
170
|
-
*/
|
|
171
|
-
schema: {
|
|
172
|
-
parse: (input) => {
|
|
173
|
-
const validated = schema.parse(input);
|
|
174
|
-
return brand(validated);
|
|
175
|
-
},
|
|
176
|
-
safeParse: (input) => {
|
|
177
|
-
const result = schema.safeParse(input);
|
|
178
|
-
if (result.success) {
|
|
179
|
-
return { success: true, data: brand(result.data) };
|
|
180
|
-
}
|
|
181
|
-
return { success: false, error: result.error };
|
|
182
|
-
},
|
|
183
|
-
},
|
|
184
|
-
/**
|
|
185
|
-
* Parse and validate input, returning branded value.
|
|
186
|
-
* Throws on validation failure.
|
|
187
|
-
*/
|
|
188
|
-
parse: (input) => {
|
|
189
|
-
const validated = schema.parse(input);
|
|
190
|
-
return brand(validated);
|
|
191
|
-
},
|
|
192
|
-
/**
|
|
193
|
-
* Type guard to check if a value is this brand.
|
|
194
|
-
*/
|
|
195
|
-
is: (value) => {
|
|
196
|
-
const result = schema.safeParse(value);
|
|
197
|
-
return result.success;
|
|
198
|
-
},
|
|
199
|
-
/**
|
|
200
|
-
* Brand name identifier.
|
|
201
|
-
*/
|
|
202
|
-
brandName,
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* BEST PRACTICES SUMMARY:
|
|
207
|
-
* =======================
|
|
208
|
-
*
|
|
209
|
-
* 1. ALWAYS validate at boundaries:
|
|
210
|
-
* - API inputs: Use Zod schemas
|
|
211
|
-
* - Database outputs: Use Zod schemas
|
|
212
|
-
* - File I/O: Use Zod schemas
|
|
213
|
-
* - CLI args: Use Zod schemas
|
|
214
|
-
*
|
|
215
|
-
* 2. NEVER cast to brand types:
|
|
216
|
-
* ❌ const id = userInput as TenantId;
|
|
217
|
-
* ✅ const id = TenantIdSchema.parse(userInput);
|
|
218
|
-
*
|
|
219
|
-
* 3. Use createBrandFactory for all brand types:
|
|
220
|
-
* - Provides validation
|
|
221
|
-
* - Provides type guards
|
|
222
|
-
* - Centralizes brand creation
|
|
223
|
-
*
|
|
224
|
-
* 4. Document which functions validate:
|
|
225
|
-
* ```typescript
|
|
226
|
-
* // @validates TenantId - performs Zod validation
|
|
227
|
-
* function parseTenantId(input: string): TenantId {
|
|
228
|
-
* return TenantIdSchema.parse(input);
|
|
229
|
-
* }
|
|
230
|
-
*
|
|
231
|
-
* // @assumes TenantId - no validation, requires validated input
|
|
232
|
-
* function formatTenantId(id: TenantId): string {
|
|
233
|
-
* return `tenant:${unbrand(id)}`;
|
|
234
|
-
* }
|
|
235
|
-
* ```
|
|
236
|
-
*
|
|
237
|
-
* 5. Test brand type enforcement:
|
|
238
|
-
* ```typescript
|
|
239
|
-
* // Should fail to compile
|
|
240
|
-
* const apiKey: ApiKeyId = getTenantId(); // ❌
|
|
241
|
-
* ```
|
|
242
|
-
*/
|
|
243
|
-
//# sourceMappingURL=brand-types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"brand-types.js","sourceRoot":"","sources":["../../../src/public/core/brand-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAuDH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,UAAU,KAAK,CAAsB,KAAQ;IACjD,OAAO,KAAoB,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,SAAS,CACvB,MAAe;IAEf,uEAAuE;IACvE,+CAA+C;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,OAAO,CAAsB,KAAkB;IAC7D,OAAO,KAAU,CAAC;AACpB,CAAC;AA4BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAwH,EACxH,SAAY;IAEZ,OAAO;QACL;;WAEG;QACH,MAAM,EAAE;YACN,KAAK,EAAE,CAAC,KAAc,EAAe,EAAE;gBACrC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACtC,OAAO,KAAK,CAAO,SAAS,CAAC,CAAC;YAChC,CAAC;YACD,SAAS,EAAE,CAAC,KAAc,EAA6E,EAAE;gBACvG,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACvC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAO,MAAM,CAAC,IAAS,CAAC,EAAE,CAAC;gBAChE,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACjD,CAAC;SACF;QAED;;;WAGG;QACH,KAAK,EAAE,CAAC,KAAc,EAAe,EAAE;YACrC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtC,OAAO,KAAK,CAAO,SAAS,CAAC,CAAC;QAChC,CAAC;QAED;;WAEG;QACH,EAAE,EAAE,CAAC,KAAc,EAAwB,EAAE;YAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACvC,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QAED;;WAEG;QACH,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG"}
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Centralized Enums for @ax-cli/schemas
|
|
3
|
-
*
|
|
4
|
-
* This file contains all enumeration types used across the ax-cli ecosystem.
|
|
5
|
-
* Using Zod enums provides:
|
|
6
|
-
* - Runtime validation
|
|
7
|
-
* - TypeScript type inference
|
|
8
|
-
* - Exhaustiveness checking
|
|
9
|
-
* - Auto-completion support
|
|
10
|
-
*
|
|
11
|
-
* SECURITY: Always validate enum values at system boundaries (API, file I/O, CLI args).
|
|
12
|
-
*
|
|
13
|
-
* @module enums
|
|
14
|
-
*/
|
|
15
|
-
import { z } from 'zod';
|
|
16
|
-
/**
|
|
17
|
-
* Message Role Enum - Roles for chat messages in AI conversations
|
|
18
|
-
*
|
|
19
|
-
* Used in:
|
|
20
|
-
* - GrokMessageSchema (src/grok/types.ts)
|
|
21
|
-
* - Chat message payloads
|
|
22
|
-
* - Message history tracking
|
|
23
|
-
*
|
|
24
|
-
* @security MUST validate at API boundaries when accepting message objects
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```typescript
|
|
28
|
-
* const roleResult = MessageRoleEnum.safeParse(userInput);
|
|
29
|
-
* if (roleResult.success) {
|
|
30
|
-
* const role = roleResult.data; // 'system' | 'user' | 'assistant' | 'tool'
|
|
31
|
-
* }
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
export declare const MessageRoleEnum: z.ZodEnum<["system", "user", "assistant", "tool"]>;
|
|
35
|
-
/**
|
|
36
|
-
* Extract the TypeScript type from MessageRoleEnum
|
|
37
|
-
*/
|
|
38
|
-
export type MessageRole = z.infer<typeof MessageRoleEnum>;
|
|
39
|
-
/**
|
|
40
|
-
* Finish Reason Enum - Reasons why an AI response completed
|
|
41
|
-
*
|
|
42
|
-
* Used in:
|
|
43
|
-
* - GrokResponseSchema (src/grok/types.ts)
|
|
44
|
-
* - API response tracking
|
|
45
|
-
* - Usage analytics
|
|
46
|
-
*
|
|
47
|
-
* Values:
|
|
48
|
-
* - `stop`: Natural completion (model decided to stop)
|
|
49
|
-
* - `length`: Stopped due to max token limit
|
|
50
|
-
* - `tool_calls`: Stopped to execute tool calls
|
|
51
|
-
* - `content_filter`: Stopped due to content policy violation
|
|
52
|
-
*
|
|
53
|
-
* @security MUST validate at API boundaries
|
|
54
|
-
*
|
|
55
|
-
* @example
|
|
56
|
-
* ```typescript
|
|
57
|
-
* const result = FinishReasonEnum.safeParse(response.finish_reason);
|
|
58
|
-
* if (result.success) {
|
|
59
|
-
* switch (result.data) {
|
|
60
|
-
* case 'stop':
|
|
61
|
-
* // Natural completion
|
|
62
|
-
* break;
|
|
63
|
-
* case 'length':
|
|
64
|
-
* // Truncated response
|
|
65
|
-
* break;
|
|
66
|
-
* case 'tool_calls':
|
|
67
|
-
* // Need to execute tools
|
|
68
|
-
* break;
|
|
69
|
-
* case 'content_filter':
|
|
70
|
-
* // Content policy violation
|
|
71
|
-
* break;
|
|
72
|
-
* }
|
|
73
|
-
* }
|
|
74
|
-
* ```
|
|
75
|
-
*/
|
|
76
|
-
export declare const FinishReasonEnum: z.ZodEnum<["stop", "length", "tool_calls", "content_filter"]>;
|
|
77
|
-
/**
|
|
78
|
-
* Extract the TypeScript type from FinishReasonEnum
|
|
79
|
-
*/
|
|
80
|
-
export type FinishReason = z.infer<typeof FinishReasonEnum>;
|
|
81
|
-
/**
|
|
82
|
-
* Transport Enum - Communication protocols for MCP servers
|
|
83
|
-
*
|
|
84
|
-
* Used in:
|
|
85
|
-
* - MCPServerConfigSchema (src/mcp/config.ts)
|
|
86
|
-
* - MCP server initialization
|
|
87
|
-
* - Transport layer selection
|
|
88
|
-
*
|
|
89
|
-
* Values:
|
|
90
|
-
* - `stdio`: Standard input/output (for local processes)
|
|
91
|
-
* - `http`: HTTP protocol (for remote servers)
|
|
92
|
-
* - `sse`: Server-Sent Events (for streaming)
|
|
93
|
-
*
|
|
94
|
-
* @security MUST validate at MCP configuration boundaries
|
|
95
|
-
*
|
|
96
|
-
* @example
|
|
97
|
-
* ```typescript
|
|
98
|
-
* const config = {
|
|
99
|
-
* transport: TransportEnum.parse('stdio'),
|
|
100
|
-
* command: 'node',
|
|
101
|
-
* args: ['server.js']
|
|
102
|
-
* };
|
|
103
|
-
* ```
|
|
104
|
-
*/
|
|
105
|
-
export declare const TransportEnum: z.ZodEnum<["stdio", "http", "sse"]>;
|
|
106
|
-
/**
|
|
107
|
-
* Extract the TypeScript type from TransportEnum
|
|
108
|
-
*/
|
|
109
|
-
export type Transport = z.infer<typeof TransportEnum>;
|
|
110
|
-
/**
|
|
111
|
-
* Editor Command Enum - Commands for text editor tool
|
|
112
|
-
*
|
|
113
|
-
* Used in:
|
|
114
|
-
* - EditorCommand interface (src/tools/text-editor.ts)
|
|
115
|
-
* - Text editing operations
|
|
116
|
-
* - Command validation
|
|
117
|
-
*
|
|
118
|
-
* Values:
|
|
119
|
-
* - `view`: View file contents (read-only)
|
|
120
|
-
* - `str_replace`: Replace string in file (search and replace)
|
|
121
|
-
* - `create`: Create new file with content
|
|
122
|
-
* - `insert`: Insert content at specific line
|
|
123
|
-
* - `undo_edit`: Undo the last edit operation
|
|
124
|
-
*
|
|
125
|
-
* @security MUST validate at tool execution boundaries
|
|
126
|
-
* @security Command execution should be sandboxed to prevent file system abuse
|
|
127
|
-
*
|
|
128
|
-
* @example
|
|
129
|
-
* ```typescript
|
|
130
|
-
* const command = EditorCommandEnum.parse('str_replace');
|
|
131
|
-
* switch (command) {
|
|
132
|
-
* case 'view':
|
|
133
|
-
* return viewFile(path);
|
|
134
|
-
* case 'str_replace':
|
|
135
|
-
* return replaceString(path, oldStr, newStr);
|
|
136
|
-
* case 'create':
|
|
137
|
-
* return createFile(path, content);
|
|
138
|
-
* case 'insert':
|
|
139
|
-
* return insertContent(path, line, content);
|
|
140
|
-
* case 'undo_edit':
|
|
141
|
-
* return undoLastEdit();
|
|
142
|
-
* }
|
|
143
|
-
* ```
|
|
144
|
-
*/
|
|
145
|
-
export declare const EditorCommandEnum: z.ZodEnum<["view", "str_replace", "create", "insert", "undo_edit"]>;
|
|
146
|
-
/**
|
|
147
|
-
* Extract the TypeScript type from EditorCommandEnum
|
|
148
|
-
*/
|
|
149
|
-
export type EditorCommand = z.infer<typeof EditorCommandEnum>;
|
|
150
|
-
/**
|
|
151
|
-
* EXHAUSTIVENESS CHECKING EXAMPLES
|
|
152
|
-
*
|
|
153
|
-
* Zod enums enable TypeScript exhaustiveness checking via switch statements:
|
|
154
|
-
*
|
|
155
|
-
* ```typescript
|
|
156
|
-
* function handleFinishReason(reason: FinishReason): string {
|
|
157
|
-
* switch (reason) {
|
|
158
|
-
* case 'stop':
|
|
159
|
-
* return 'Completed successfully';
|
|
160
|
-
* case 'length':
|
|
161
|
-
* return 'Reached token limit';
|
|
162
|
-
* case 'tool_calls':
|
|
163
|
-
* return 'Executing tools';
|
|
164
|
-
* case 'content_filter':
|
|
165
|
-
* return 'Content filtered';
|
|
166
|
-
* // TypeScript will error if any case is missing!
|
|
167
|
-
* }
|
|
168
|
-
* }
|
|
169
|
-
* ```
|
|
170
|
-
*
|
|
171
|
-
* VALIDATION AT BOUNDARIES
|
|
172
|
-
*
|
|
173
|
-
* Always validate enum values from external sources:
|
|
174
|
-
*
|
|
175
|
-
* ```typescript
|
|
176
|
-
* // API endpoint
|
|
177
|
-
* app.post('/api/message', (req, res) => {
|
|
178
|
-
* const roleResult = MessageRoleEnum.safeParse(req.body.role);
|
|
179
|
-
* if (!roleResult.success) {
|
|
180
|
-
* return res.status(400).json({
|
|
181
|
-
* error: 'Invalid message role',
|
|
182
|
-
* details: roleResult.error
|
|
183
|
-
* });
|
|
184
|
-
* }
|
|
185
|
-
*
|
|
186
|
-
* // Safe to use - validated
|
|
187
|
-
* const message = createMessage(roleResult.data, req.body.content);
|
|
188
|
-
* });
|
|
189
|
-
* ```
|
|
190
|
-
*
|
|
191
|
-
* MIGRATION FROM STRING LITERALS
|
|
192
|
-
*
|
|
193
|
-
* Before (unsafe):
|
|
194
|
-
* ```typescript
|
|
195
|
-
* type MessageRole = 'system' | 'user' | 'assistant' | 'tool';
|
|
196
|
-
* const role: MessageRole = userInput as MessageRole; // No runtime validation!
|
|
197
|
-
* ```
|
|
198
|
-
*
|
|
199
|
-
* After (safe):
|
|
200
|
-
* ```typescript
|
|
201
|
-
* const roleResult = MessageRoleEnum.safeParse(userInput);
|
|
202
|
-
* if (roleResult.success) {
|
|
203
|
-
* const role: MessageRole = roleResult.data; // Validated!
|
|
204
|
-
* }
|
|
205
|
-
* ```
|
|
206
|
-
*/
|
|
207
|
-
/**
|
|
208
|
-
* BEST PRACTICES SUMMARY
|
|
209
|
-
*
|
|
210
|
-
* 1. **Always validate at boundaries:**
|
|
211
|
-
* - Use `.safeParse()` for user input
|
|
212
|
-
* - Use `.parse()` when you want to throw on invalid input
|
|
213
|
-
*
|
|
214
|
-
* 2. **Use exhaustive switch statements:**
|
|
215
|
-
* - TypeScript will warn if you miss a case
|
|
216
|
-
* - Helps catch bugs when enums are extended
|
|
217
|
-
*
|
|
218
|
-
* 3. **Document enum usage:**
|
|
219
|
-
* - List where each enum is used
|
|
220
|
-
* - Explain what each value means
|
|
221
|
-
* - Note security implications
|
|
222
|
-
*
|
|
223
|
-
* 4. **Never cast to enum types:**
|
|
224
|
-
* - ❌ `const role = userInput as MessageRole`
|
|
225
|
-
* - ✅ `const role = MessageRoleEnum.parse(userInput)`
|
|
226
|
-
*/
|
|
227
|
-
//# sourceMappingURL=enums.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enums.d.ts","sourceRoot":"","sources":["../../../src/public/core/enums.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,eAAe,oDAAkD,CAAC;AAE/E;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,gBAAgB,+DAK3B,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,aAAa,qCAAmC,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,iBAAiB,qEAM5B,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG"}
|
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Centralized Enums for @ax-cli/schemas
|
|
3
|
-
*
|
|
4
|
-
* This file contains all enumeration types used across the ax-cli ecosystem.
|
|
5
|
-
* Using Zod enums provides:
|
|
6
|
-
* - Runtime validation
|
|
7
|
-
* - TypeScript type inference
|
|
8
|
-
* - Exhaustiveness checking
|
|
9
|
-
* - Auto-completion support
|
|
10
|
-
*
|
|
11
|
-
* SECURITY: Always validate enum values at system boundaries (API, file I/O, CLI args).
|
|
12
|
-
*
|
|
13
|
-
* @module enums
|
|
14
|
-
*/
|
|
15
|
-
import { z } from 'zod';
|
|
16
|
-
/**
|
|
17
|
-
* Message Role Enum - Roles for chat messages in AI conversations
|
|
18
|
-
*
|
|
19
|
-
* Used in:
|
|
20
|
-
* - GrokMessageSchema (src/grok/types.ts)
|
|
21
|
-
* - Chat message payloads
|
|
22
|
-
* - Message history tracking
|
|
23
|
-
*
|
|
24
|
-
* @security MUST validate at API boundaries when accepting message objects
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```typescript
|
|
28
|
-
* const roleResult = MessageRoleEnum.safeParse(userInput);
|
|
29
|
-
* if (roleResult.success) {
|
|
30
|
-
* const role = roleResult.data; // 'system' | 'user' | 'assistant' | 'tool'
|
|
31
|
-
* }
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
export const MessageRoleEnum = z.enum(['system', 'user', 'assistant', 'tool']);
|
|
35
|
-
/**
|
|
36
|
-
* Finish Reason Enum - Reasons why an AI response completed
|
|
37
|
-
*
|
|
38
|
-
* Used in:
|
|
39
|
-
* - GrokResponseSchema (src/grok/types.ts)
|
|
40
|
-
* - API response tracking
|
|
41
|
-
* - Usage analytics
|
|
42
|
-
*
|
|
43
|
-
* Values:
|
|
44
|
-
* - `stop`: Natural completion (model decided to stop)
|
|
45
|
-
* - `length`: Stopped due to max token limit
|
|
46
|
-
* - `tool_calls`: Stopped to execute tool calls
|
|
47
|
-
* - `content_filter`: Stopped due to content policy violation
|
|
48
|
-
*
|
|
49
|
-
* @security MUST validate at API boundaries
|
|
50
|
-
*
|
|
51
|
-
* @example
|
|
52
|
-
* ```typescript
|
|
53
|
-
* const result = FinishReasonEnum.safeParse(response.finish_reason);
|
|
54
|
-
* if (result.success) {
|
|
55
|
-
* switch (result.data) {
|
|
56
|
-
* case 'stop':
|
|
57
|
-
* // Natural completion
|
|
58
|
-
* break;
|
|
59
|
-
* case 'length':
|
|
60
|
-
* // Truncated response
|
|
61
|
-
* break;
|
|
62
|
-
* case 'tool_calls':
|
|
63
|
-
* // Need to execute tools
|
|
64
|
-
* break;
|
|
65
|
-
* case 'content_filter':
|
|
66
|
-
* // Content policy violation
|
|
67
|
-
* break;
|
|
68
|
-
* }
|
|
69
|
-
* }
|
|
70
|
-
* ```
|
|
71
|
-
*/
|
|
72
|
-
export const FinishReasonEnum = z.enum([
|
|
73
|
-
'stop',
|
|
74
|
-
'length',
|
|
75
|
-
'tool_calls',
|
|
76
|
-
'content_filter',
|
|
77
|
-
]);
|
|
78
|
-
/**
|
|
79
|
-
* Transport Enum - Communication protocols for MCP servers
|
|
80
|
-
*
|
|
81
|
-
* Used in:
|
|
82
|
-
* - MCPServerConfigSchema (src/mcp/config.ts)
|
|
83
|
-
* - MCP server initialization
|
|
84
|
-
* - Transport layer selection
|
|
85
|
-
*
|
|
86
|
-
* Values:
|
|
87
|
-
* - `stdio`: Standard input/output (for local processes)
|
|
88
|
-
* - `http`: HTTP protocol (for remote servers)
|
|
89
|
-
* - `sse`: Server-Sent Events (for streaming)
|
|
90
|
-
*
|
|
91
|
-
* @security MUST validate at MCP configuration boundaries
|
|
92
|
-
*
|
|
93
|
-
* @example
|
|
94
|
-
* ```typescript
|
|
95
|
-
* const config = {
|
|
96
|
-
* transport: TransportEnum.parse('stdio'),
|
|
97
|
-
* command: 'node',
|
|
98
|
-
* args: ['server.js']
|
|
99
|
-
* };
|
|
100
|
-
* ```
|
|
101
|
-
*/
|
|
102
|
-
export const TransportEnum = z.enum(['stdio', 'http', 'sse']);
|
|
103
|
-
/**
|
|
104
|
-
* Editor Command Enum - Commands for text editor tool
|
|
105
|
-
*
|
|
106
|
-
* Used in:
|
|
107
|
-
* - EditorCommand interface (src/tools/text-editor.ts)
|
|
108
|
-
* - Text editing operations
|
|
109
|
-
* - Command validation
|
|
110
|
-
*
|
|
111
|
-
* Values:
|
|
112
|
-
* - `view`: View file contents (read-only)
|
|
113
|
-
* - `str_replace`: Replace string in file (search and replace)
|
|
114
|
-
* - `create`: Create new file with content
|
|
115
|
-
* - `insert`: Insert content at specific line
|
|
116
|
-
* - `undo_edit`: Undo the last edit operation
|
|
117
|
-
*
|
|
118
|
-
* @security MUST validate at tool execution boundaries
|
|
119
|
-
* @security Command execution should be sandboxed to prevent file system abuse
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* ```typescript
|
|
123
|
-
* const command = EditorCommandEnum.parse('str_replace');
|
|
124
|
-
* switch (command) {
|
|
125
|
-
* case 'view':
|
|
126
|
-
* return viewFile(path);
|
|
127
|
-
* case 'str_replace':
|
|
128
|
-
* return replaceString(path, oldStr, newStr);
|
|
129
|
-
* case 'create':
|
|
130
|
-
* return createFile(path, content);
|
|
131
|
-
* case 'insert':
|
|
132
|
-
* return insertContent(path, line, content);
|
|
133
|
-
* case 'undo_edit':
|
|
134
|
-
* return undoLastEdit();
|
|
135
|
-
* }
|
|
136
|
-
* ```
|
|
137
|
-
*/
|
|
138
|
-
export const EditorCommandEnum = z.enum([
|
|
139
|
-
'view',
|
|
140
|
-
'str_replace',
|
|
141
|
-
'create',
|
|
142
|
-
'insert',
|
|
143
|
-
'undo_edit',
|
|
144
|
-
]);
|
|
145
|
-
/**
|
|
146
|
-
* EXHAUSTIVENESS CHECKING EXAMPLES
|
|
147
|
-
*
|
|
148
|
-
* Zod enums enable TypeScript exhaustiveness checking via switch statements:
|
|
149
|
-
*
|
|
150
|
-
* ```typescript
|
|
151
|
-
* function handleFinishReason(reason: FinishReason): string {
|
|
152
|
-
* switch (reason) {
|
|
153
|
-
* case 'stop':
|
|
154
|
-
* return 'Completed successfully';
|
|
155
|
-
* case 'length':
|
|
156
|
-
* return 'Reached token limit';
|
|
157
|
-
* case 'tool_calls':
|
|
158
|
-
* return 'Executing tools';
|
|
159
|
-
* case 'content_filter':
|
|
160
|
-
* return 'Content filtered';
|
|
161
|
-
* // TypeScript will error if any case is missing!
|
|
162
|
-
* }
|
|
163
|
-
* }
|
|
164
|
-
* ```
|
|
165
|
-
*
|
|
166
|
-
* VALIDATION AT BOUNDARIES
|
|
167
|
-
*
|
|
168
|
-
* Always validate enum values from external sources:
|
|
169
|
-
*
|
|
170
|
-
* ```typescript
|
|
171
|
-
* // API endpoint
|
|
172
|
-
* app.post('/api/message', (req, res) => {
|
|
173
|
-
* const roleResult = MessageRoleEnum.safeParse(req.body.role);
|
|
174
|
-
* if (!roleResult.success) {
|
|
175
|
-
* return res.status(400).json({
|
|
176
|
-
* error: 'Invalid message role',
|
|
177
|
-
* details: roleResult.error
|
|
178
|
-
* });
|
|
179
|
-
* }
|
|
180
|
-
*
|
|
181
|
-
* // Safe to use - validated
|
|
182
|
-
* const message = createMessage(roleResult.data, req.body.content);
|
|
183
|
-
* });
|
|
184
|
-
* ```
|
|
185
|
-
*
|
|
186
|
-
* MIGRATION FROM STRING LITERALS
|
|
187
|
-
*
|
|
188
|
-
* Before (unsafe):
|
|
189
|
-
* ```typescript
|
|
190
|
-
* type MessageRole = 'system' | 'user' | 'assistant' | 'tool';
|
|
191
|
-
* const role: MessageRole = userInput as MessageRole; // No runtime validation!
|
|
192
|
-
* ```
|
|
193
|
-
*
|
|
194
|
-
* After (safe):
|
|
195
|
-
* ```typescript
|
|
196
|
-
* const roleResult = MessageRoleEnum.safeParse(userInput);
|
|
197
|
-
* if (roleResult.success) {
|
|
198
|
-
* const role: MessageRole = roleResult.data; // Validated!
|
|
199
|
-
* }
|
|
200
|
-
* ```
|
|
201
|
-
*/
|
|
202
|
-
/**
|
|
203
|
-
* BEST PRACTICES SUMMARY
|
|
204
|
-
*
|
|
205
|
-
* 1. **Always validate at boundaries:**
|
|
206
|
-
* - Use `.safeParse()` for user input
|
|
207
|
-
* - Use `.parse()` when you want to throw on invalid input
|
|
208
|
-
*
|
|
209
|
-
* 2. **Use exhaustive switch statements:**
|
|
210
|
-
* - TypeScript will warn if you miss a case
|
|
211
|
-
* - Helps catch bugs when enums are extended
|
|
212
|
-
*
|
|
213
|
-
* 3. **Document enum usage:**
|
|
214
|
-
* - List where each enum is used
|
|
215
|
-
* - Explain what each value means
|
|
216
|
-
* - Note security implications
|
|
217
|
-
*
|
|
218
|
-
* 4. **Never cast to enum types:**
|
|
219
|
-
* - ❌ `const role = userInput as MessageRole`
|
|
220
|
-
* - ✅ `const role = MessageRoleEnum.parse(userInput)`
|
|
221
|
-
*/
|
|
222
|
-
//# sourceMappingURL=enums.js.map
|