@equinor/fusion-framework-cli-plugin-ai-base 2.0.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @equinor/fusion-framework-cli-plugin-ai-base
2
2
 
3
+ ## 3.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - ece8f42: **BREAKING:** Replace Azure API key options with Fusion service discovery options.
8
+
9
+ CLI options now use `--env`, `--token`, `--tenant-id`, `--client-id`, `--chat-model`, `--embed-model`, and `--index-name` instead of `--openai-api-key`, `--openai-instance`, `--azure-search-endpoint`, etc. The `setupFramework` function bootstraps MSAL authentication and resolves the AI service endpoint via Fusion service discovery.
10
+
11
+ Ref: https://github.com/equinor/fusion-framework/issues/1008
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies [ece8f42]
16
+ - Updated dependencies [ece8f42]
17
+ - @equinor/fusion-framework-module-ai@4.0.0
18
+
3
19
  ## 2.0.1
4
20
 
5
21
  ### Patch Changes
package/README.md CHANGED
@@ -11,10 +11,9 @@ logic from this package.
11
11
 
12
12
  ## Who should use this
13
13
 
14
- Authors of **new Fusion CLI AI plugins** that need the same Azure OpenAI /
15
- Azure Cognitive Search options and framework setup that the existing plugins
16
- share. If you are building a Fusion application, use the published CLI
17
- plugins directly.
14
+ Authors of **new Fusion CLI AI plugins** that need the same Fusion service
15
+ discovery options and framework setup that the existing plugins share. If you
16
+ are building a Fusion application, use the published CLI plugins directly.
18
17
 
19
18
  ## Quick start
20
19
 
@@ -45,7 +44,7 @@ import {
45
44
  const myCommand = createCommand('my-task')
46
45
  .description('Run my custom AI task');
47
46
 
48
- // Attach core + chat + embedding options and pre-action validation
47
+ // Attach core auth + chat + embedding options and pre-action validation
49
48
  withOptions(myCommand, { includeChat: true, includeEmbedding: true });
50
49
 
51
50
  myCommand.action(async (options: AiOptions) => {
@@ -61,16 +60,10 @@ export const register = (program: Command) =>
61
60
  ### 3. Load a configuration file (optional)
62
61
 
63
62
  ```ts
64
- import {
65
- loadFusionAIConfig,
66
- configureFusionAI,
67
- } from '@equinor/fusion-framework-cli-plugin-ai-base';
63
+ import { loadFusionAIConfig } from '@equinor/fusion-framework-cli-plugin-ai-base';
68
64
 
69
- // fusion-ai.config.ts
70
- export default configureFusionAI(async () => ({
71
- apiKey: process.env.OPENAI_API_KEY,
72
- deployment: 'gpt-4',
73
- }));
65
+ // fusion-ai.config.ts — export a default configuration object
66
+ export default { includes: ['./src/**/*.ts'] };
74
67
 
75
68
  // at runtime
76
69
  const config = await loadFusionAIConfig('fusion-ai.config', {
@@ -91,7 +84,7 @@ The package exposes two entry points:
91
84
 
92
85
  | Export | Kind | Description |
93
86
  |---|---|---|
94
- | `setupFramework` | function | Initialise the Fusion Framework with Azure OpenAI chat, embedding, and vector-store modules |
87
+ | `setupFramework` | function | Initialise the Fusion Framework with AI module, MSAL auth, and service discovery |
95
88
  | `registerAiPlugin` | function | Register a Commander sub-command under the shared `ai` command group |
96
89
  | `loadFusionAIConfig` | function | Locate and import a `fusion-ai.config.{ts,mjs,js,json}` file |
97
90
  | `configureFusionAI` | function | Type-safe factory for writing configuration files |
@@ -116,14 +109,13 @@ without explicit flags.
116
109
 
117
110
  | Flag | Environment variable | Required | Default |
118
111
  |---|---|---|---|
119
- | `--openai-api-key` | `AZURE_OPENAI_API_KEY` | Yes | |
120
- | `--openai-api-version` | `AZURE_OPENAI_API_VERSION` | Yes | `2024-02-15-preview` |
121
- | `--openai-instance` | `AZURE_OPENAI_INSTANCE_NAME` | Yes | |
122
- | `--openai-chat-deployment` | `AZURE_OPENAI_CHAT_DEPLOYMENT_NAME` | When chat is enabled | |
123
- | `--openai-embedding-deployment` | `AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME` | When embedding is enabled | |
124
- | `--azure-search-endpoint` | `AZURE_SEARCH_ENDPOINT` | When search is enabled | |
125
- | `--azure-search-api-key` | `AZURE_SEARCH_API_KEY` | When search is enabled | — |
126
- | `--azure-search-index-name` | `AZURE_SEARCH_INDEX_NAME` | When search is enabled | — |
112
+ | `--env` | `FUSION_ENV` | No | `ci` |
113
+ | `--token` | `FUSION_TOKEN` | No | (MSAL interactive login) |
114
+ | `--tenant-id` | `FUSION_TENANT_ID` | No | Equinor default |
115
+ | `--client-id` | `FUSION_CLIENT_ID` | No | Fusion CLI default |
116
+ | `--chat-model` | `FUSION_AI_CHAT_MODEL` | When chat is enabled | `gpt-5.1-chat` |
117
+ | `--embed-model` | `FUSION_AI_EMBED_MODEL` | When embedding is enabled | `text-embedding-3-large` |
118
+ | `--index-name` | `FUSION_AI_INDEX_NAME` | When search is enabled | — |
127
119
 
128
120
  ## Key concepts
129
121
 
@@ -142,9 +134,9 @@ that includes the corresponding environment variable name.
142
134
 
143
135
  ### Framework bootstrap
144
136
 
145
- `setupFramework` creates a `ModulesConfigurator`, enables the AI module, and
146
- conditionally registers chat models, embedding models, and an Azure Cognitive
147
- Search vector store based on which options are present. The returned
137
+ `setupFramework` creates a Fusion Framework instance with MSAL authentication,
138
+ service discovery, and the AI module. It registers strategy-based model, embed,
139
+ and index providers resolved through Fusion's AI service. The returned
148
140
  `FrameworkInstance` is ready for downstream use.
149
141
 
150
142
  ## Consuming plugins
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAGL,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAqB,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAGL,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAA0B,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
@@ -1,90 +1,42 @@
1
1
  import { createOption } from 'commander';
2
- /**
3
- * Commander option for the Azure OpenAI API key (`--openai-api-key`).
4
- *
5
- * @remarks
6
- * Required for all Azure OpenAI operations. Falls back to the
7
- * `AZURE_OPENAI_API_KEY` environment variable when the flag is omitted.
8
- */
9
- export const apiKeyOption = createOption('--openai-api-key <key>', 'API key for Azure OpenAI services').env('AZURE_OPENAI_API_KEY');
10
- /**
11
- * Commander option for the Azure OpenAI API version (`--openai-api-version`).
12
- *
13
- * @remarks
14
- * Defaults to `2024-02-15-preview`. Falls back to the
15
- * `AZURE_OPENAI_API_VERSION` environment variable when the flag is omitted.
16
- */
17
- export const apiVersionOption = createOption('--openai-api-version <version>', 'Azure OpenAI API version')
18
- .env('AZURE_OPENAI_API_VERSION')
19
- .default('2024-02-15-preview');
20
- /**
21
- * Commander option for the Azure OpenAI instance name (`--openai-instance`).
22
- *
23
- * @remarks
24
- * Required for constructing the Azure OpenAI service endpoint. Falls back to
25
- * the `AZURE_OPENAI_INSTANCE_NAME` environment variable when the flag is omitted.
26
- */
27
- export const apiInstanceOption = createOption('--openai-instance <name>', 'Azure OpenAI instance name').env('AZURE_OPENAI_INSTANCE_NAME');
28
- /**
29
- * Commander option for the Azure OpenAI chat deployment (`--openai-chat-deployment`).
30
- *
31
- * @remarks
32
- * Required for chat-completion operations. Falls back to the
33
- * `AZURE_OPENAI_CHAT_DEPLOYMENT_NAME` environment variable when the flag is omitted.
34
- * Only added to a command when `withOptions` is called with `includeChat: true`.
35
- */
36
- export const chatDeploymentOption = createOption('--openai-chat-deployment <name>', 'Azure OpenAI chat deployment name').env('AZURE_OPENAI_CHAT_DEPLOYMENT_NAME');
37
- /**
38
- * Commander option for the Azure OpenAI embedding deployment (`--openai-embedding-deployment`).
39
- *
40
- * @remarks
41
- * Required for embedding and vector-search operations. Falls back to the
42
- * `AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME` environment variable when the flag is omitted.
43
- * Only added to a command when `withOptions` is called with `includeEmbedding: true`.
44
- */
45
- export const embeddingDeploymentOption = createOption('--openai-embedding-deployment <name>', 'Azure OpenAI embedding deployment name').env('AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME');
46
- /**
47
- * Commander option for the Azure Cognitive Search endpoint (`--azure-search-endpoint`).
48
- *
49
- * @remarks
50
- * Required for vector-search operations. Falls back to the
51
- * `AZURE_SEARCH_ENDPOINT` environment variable when the flag is omitted.
52
- * Only added to a command when `withOptions` is called with `includeSearch: true`.
53
- */
54
- export const azureSearchEndpointOption = createOption('--azure-search-endpoint <url>', 'Azure Search endpoint URL').env('AZURE_SEARCH_ENDPOINT');
55
- /**
56
- * Commander option for the Azure Cognitive Search API key (`--azure-search-api-key`).
57
- *
58
- * @remarks
59
- * Required for authenticating with Azure Cognitive Search. Falls back to the
60
- * `AZURE_SEARCH_API_KEY` environment variable when the flag is omitted.
61
- * Only added to a command when `withOptions` is called with `includeSearch: true`.
62
- */
63
- export const azureSearchApiKeyOption = createOption('--azure-search-api-key <key>', 'Azure Search API key').env('AZURE_SEARCH_API_KEY');
64
- /**
65
- * Commander option for the Azure Cognitive Search index name (`--azure-search-index-name`).
66
- *
67
- * @remarks
68
- * Identifies the target search index to query or write to. Falls back to the
69
- * `AZURE_SEARCH_INDEX_NAME` environment variable when the flag is omitted.
70
- * Only added to a command when `withOptions` is called with `includeSearch: true`.
71
- */
72
- export const azureSearchIndexNameOption = createOption('--azure-search-index-name <name>', 'Azure Search index name').env('AZURE_SEARCH_INDEX_NAME');
73
- /**
74
- * All AI-related Commander option definitions as a single object.
75
- *
76
- * @remarks
77
- * Use this default export for convenient bulk access when you need every option.
78
- * For selective inclusion prefer importing the named constants directly.
79
- */
2
+ // Default Fusion AAD identifiers (same defaults as the CLI's auth options)
3
+ const DEFAULT_TENANT_ID = '3aa4a235-b6e2-48d5-9195-7fcf05b459b0';
4
+ const DEFAULT_CLIENT_ID = 'a318b8e1-0295-4e17-98d5-35f67dfeba14';
5
+ const DEFAULT_MODEL_CHAT = 'gpt-5.1-chat';
6
+ const DEFAULT_MODEL_EMBED = 'text-embedding-3-large';
7
+ /** `--env` | `FUSION_ENV` Fusion environment for service discovery */
8
+ export const envOption = createOption('--env <env>', 'Fusion environment for service discovery')
9
+ .env('FUSION_ENV')
10
+ .default('ci');
11
+ /** `--token` | `FUSION_TOKEN` explicit bearer token */
12
+ export const tokenOption = createOption('--token <token>', 'Azure AD bearer token (skips interactive/silent MSAL auth)')
13
+ .env('FUSION_TOKEN')
14
+ .default(undefined);
15
+ /** `--tenant-id` | `FUSION_TENANT_ID` */
16
+ export const tenantIdOption = createOption('--tenant-id <id>', 'Azure AD tenant ID')
17
+ .env('FUSION_TENANT_ID')
18
+ .default(DEFAULT_TENANT_ID);
19
+ /** `--client-id` | `FUSION_CLIENT_ID` */
20
+ export const clientIdOption = createOption('--client-id <id>', 'Azure AD application client ID')
21
+ .env('FUSION_CLIENT_ID')
22
+ .default(DEFAULT_CLIENT_ID);
23
+ /** `--chat-model` | `FUSION_AI_CHAT_MODEL` */
24
+ export const chatModelOption = createOption('--chat-model <name>', 'Azure OpenAI chat model deployment name')
25
+ .env('FUSION_AI_CHAT_MODEL')
26
+ .default(DEFAULT_MODEL_CHAT);
27
+ /** `--embed-model` | `FUSION_AI_EMBED_MODEL` */
28
+ export const embedModelOption = createOption('--embed-model <name>', 'Azure OpenAI embedding model deployment name')
29
+ .env('FUSION_AI_EMBED_MODEL')
30
+ .default(DEFAULT_MODEL_EMBED);
31
+ /** `--index-name` | `FUSION_AI_INDEX_NAME` */
32
+ export const indexNameOption = createOption('--index-name <name>', 'Azure AI Search index name').env('FUSION_AI_INDEX_NAME');
80
33
  export default {
81
- apiKeyOption,
82
- apiVersionOption,
83
- apiInstanceOption,
84
- chatDeploymentOption,
85
- embeddingDeploymentOption,
86
- azureSearchEndpointOption,
87
- azureSearchApiKeyOption,
88
- azureSearchIndexNameOption,
34
+ envOption,
35
+ tokenOption,
36
+ tenantIdOption,
37
+ clientIdOption,
38
+ chatModelOption,
39
+ embedModelOption,
40
+ indexNameOption,
89
41
  };
90
42
  //# sourceMappingURL=options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/options/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CACtC,wBAAwB,EACxB,mCAAmC,CACpC,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAC1C,gCAAgC,EAChC,0BAA0B,CAC3B;KACE,GAAG,CAAC,0BAA0B,CAAC;KAC/B,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAC3C,0BAA0B,EAC1B,4BAA4B,CAC7B,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAC9C,iCAAiC,EACjC,mCAAmC,CACpC,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,YAAY,CACnD,sCAAsC,EACtC,wCAAwC,CACzC,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,YAAY,CACnD,+BAA+B,EAC/B,2BAA2B,CAC5B,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAE/B;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CACjD,8BAA8B,EAC9B,sBAAsB,CACvB,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAE9B;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CACpD,kCAAkC,EAClC,yBAAyB,CAC1B,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAEjC;;;;;;GAMG;AACH,eAAe;IACb,YAAY;IACZ,gBAAgB;IAChB,iBAAiB;IACjB,oBAAoB;IACpB,yBAAyB;IACzB,yBAAyB;IACzB,uBAAuB;IACvB,0BAA0B;CAC3B,CAAC"}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/options/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,2EAA2E;AAC3E,MAAM,iBAAiB,GAAG,sCAA+C,CAAC;AAC1E,MAAM,iBAAiB,GAAG,sCAA+C,CAAC;AAC1E,MAAM,kBAAkB,GAAG,cAAuB,CAAC;AACnD,MAAM,mBAAmB,GAAG,wBAAiC,CAAC;AAE9D,wEAAwE;AACxE,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,aAAa,EAAE,0CAA0C,CAAC;KAC7F,GAAG,CAAC,YAAY,CAAC;KACjB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjB,yDAAyD;AACzD,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CACrC,iBAAiB,EACjB,4DAA4D,CAC7D;KACE,GAAG,CAAC,cAAc,CAAC;KACnB,OAAO,CAAC,SAAS,CAAC,CAAC;AAEtB,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;KACjF,GAAG,CAAC,kBAAkB,CAAC;KACvB,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE9B,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC,kBAAkB,EAAE,gCAAgC,CAAC;KAC7F,GAAG,CAAC,kBAAkB,CAAC;KACvB,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE9B,8CAA8C;AAC9C,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CACzC,qBAAqB,EACrB,yCAAyC,CAC1C;KACE,GAAG,CAAC,sBAAsB,CAAC;KAC3B,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAE/B,gDAAgD;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAC1C,sBAAsB,EACtB,8CAA8C,CAC/C;KACE,GAAG,CAAC,uBAAuB,CAAC;KAC5B,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAEhC,8CAA8C;AAC9C,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CACzC,qBAAqB,EACrB,4BAA4B,CAC7B,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAE9B,eAAe;IACb,SAAS;IACT,WAAW;IACX,cAAc;IACd,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,eAAe;CAChB,CAAC"}
@@ -1,67 +1,25 @@
1
- /**
2
- * Zod validation schema and inferred type for AI command options.
3
- *
4
- * @packageDocumentation
5
- */
6
1
  import z from 'zod';
7
2
  /**
8
- * Base Zod schema for AI-related command options.
3
+ * Base Zod schema for Fusion AI command options.
9
4
  *
10
- * This schema defines the validation rules for all AI options. Other AI plugins
11
- * can extend this schema to add their own command-specific options.
5
+ * All fields are optional when omitted the service URL and token are
6
+ * resolved automatically from Fusion service discovery and MSAL auth.
12
7
  *
13
8
  * @example
14
9
  * ```ts
15
- * import { AiOptionsSchema } from '@equinor/fusion-framework-cli-plugin-ai-base';
16
- * import { z } from 'zod';
17
- *
18
- * const MyCommandOptionsSchema = AiOptionsSchema.extend({
19
- * myOption: z.string(),
20
- * });
10
+ * import { AiOptionsSchema } from '@equinor/fusion-framework-cli-plugin-ai-base/command-options';
11
+ * const MySchema = AiOptionsSchema.extend({ extra: z.string() });
21
12
  * ```
22
13
  */
23
14
  export const AiOptionsSchema = z
24
15
  .object({
25
- // Required AI options
26
- openaiApiKey: z
27
- .string({ message: 'Azure OpenAI API key is required and must be a non-empty string.' })
28
- .min(1, 'API key must be a non-empty string.')
29
- .describe('Azure OpenAI API key for authentication'),
30
- openaiApiVersion: z
31
- .string({ message: 'Azure OpenAI API version is required and must be a non-empty string.' })
32
- .min(1, 'API version must be a non-empty string.')
33
- .describe('Azure OpenAI API version'),
34
- openaiInstance: z
35
- .string({ message: 'Azure OpenAI instance name is required and must be a non-empty string.' })
36
- .min(1, 'Instance name must be a non-empty string.')
37
- .describe('Azure OpenAI instance name'),
38
- // Optional AI options
39
- openaiChatDeployment: z
40
- .string()
41
- .min(1, 'Chat deployment name must be a non-empty string.')
42
- .optional()
43
- .describe('Azure OpenAI chat deployment name'),
44
- openaiEmbeddingDeployment: z
45
- .string()
46
- .min(1, 'Embedding deployment name must be a non-empty string.')
47
- .optional()
48
- .describe('Azure OpenAI embedding deployment name'),
49
- azureSearchEndpoint: z
50
- .string()
51
- .url('Azure Search endpoint must be a valid URL.')
52
- .min(1, 'Azure Search endpoint must be a non-empty string.')
53
- .optional()
54
- .describe('Azure Search endpoint URL'),
55
- azureSearchApiKey: z
56
- .string()
57
- .min(1, 'Azure Search API key must be a non-empty string.')
58
- .optional()
59
- .describe('Azure Search API key'),
60
- azureSearchIndexName: z
61
- .string()
62
- .min(1, 'Azure Search index name must be a non-empty string.')
63
- .optional()
64
- .describe('Azure Search index name'),
16
+ env: z.string().optional(),
17
+ token: z.string().optional(),
18
+ tenantId: z.string().optional(),
19
+ clientId: z.string().optional(),
20
+ chatModel: z.string().min(1).optional(),
21
+ embedModel: z.string().min(1).optional(),
22
+ indexName: z.string().min(1).optional(),
65
23
  })
66
- .describe('Base AI-related command options');
24
+ .describe('Base Fusion AI command options');
67
25
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/options/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,sBAAsB;IACtB,YAAY,EAAE,CAAC;SACZ,MAAM,CAAC,EAAE,OAAO,EAAE,kEAAkE,EAAE,CAAC;SACvF,GAAG,CAAC,CAAC,EAAE,qCAAqC,CAAC;SAC7C,QAAQ,CAAC,yCAAyC,CAAC;IACtD,gBAAgB,EAAE,CAAC;SAChB,MAAM,CAAC,EAAE,OAAO,EAAE,sEAAsE,EAAE,CAAC;SAC3F,GAAG,CAAC,CAAC,EAAE,yCAAyC,CAAC;SACjD,QAAQ,CAAC,0BAA0B,CAAC;IACvC,cAAc,EAAE,CAAC;SACd,MAAM,CAAC,EAAE,OAAO,EAAE,wEAAwE,EAAE,CAAC;SAC7F,GAAG,CAAC,CAAC,EAAE,2CAA2C,CAAC;SACnD,QAAQ,CAAC,4BAA4B,CAAC;IAEzC,sBAAsB;IACtB,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,kDAAkD,CAAC;SAC1D,QAAQ,EAAE;SACV,QAAQ,CAAC,mCAAmC,CAAC;IAChD,yBAAyB,EAAE,CAAC;SACzB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,uDAAuD,CAAC;SAC/D,QAAQ,EAAE;SACV,QAAQ,CAAC,wCAAwC,CAAC;IACrD,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,GAAG,CAAC,4CAA4C,CAAC;SACjD,GAAG,CAAC,CAAC,EAAE,mDAAmD,CAAC;SAC3D,QAAQ,EAAE;SACV,QAAQ,CAAC,2BAA2B,CAAC;IACxC,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,kDAAkD,CAAC;SAC1D,QAAQ,EAAE;SACV,QAAQ,CAAC,sBAAsB,CAAC;IACnC,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,qDAAqD,CAAC;SAC7D,QAAQ,EAAE;SACV,QAAQ,CAAC,yBAAyB,CAAC;CACvC,CAAC;KACD,QAAQ,CAAC,iCAAiC,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/options/schema.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACxC,CAAC;KACD,QAAQ,CAAC,gCAAgC,CAAC,CAAC"}
@@ -1,11 +1,2 @@
1
- /**
2
- * Hand-authored TypeScript interface for AI CLI command options.
3
- *
4
- * @remarks
5
- * Use {@link AiOptions} when you need a lightweight type without pulling in Zod.
6
- * For runtime validation prefer {@link AiOptionsSchema} from the schema module.
7
- *
8
- * @packageDocumentation
9
- */
10
1
  export {};
11
2
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/options/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/options/types.ts"],"names":[],"mappings":""}
@@ -1,102 +1,43 @@
1
1
  import { InvalidOptionArgumentError } from 'commander';
2
- import { apiInstanceOption, apiKeyOption, apiVersionOption, azureSearchApiKeyOption, azureSearchEndpointOption, azureSearchIndexNameOption, chatDeploymentOption, embeddingDeploymentOption, } from './options.js';
2
+ import { chatModelOption, clientIdOption, embedModelOption, envOption, indexNameOption, tenantIdOption, tokenOption, } from './options.js';
3
3
  /**
4
- * Enhances a Commander command with AI-related options and validation.
4
+ * Enhances a Commander command with Fusion AI options and validation.
5
5
  *
6
- * This function adds Azure OpenAI and Azure Cognitive Search options to the provided
7
- * command, along with pre-action validation hooks to ensure required options are provided.
8
- * The function allows selective inclusion of chat, embedding, and search capabilities
9
- * based on the command's requirements.
6
+ * Core auth options (`--env`, `--token`, `--tenant-id`, `--client-id`) are always
7
+ * added. When no explicit `--token` is provided, the framework will authenticate
8
+ * via MSAL and resolve the AI service endpoint from Fusion service discovery.
10
9
  *
11
- * Options added:
12
- * - Core: `openaiApiKey`, `openaiApiVersion`, `openaiInstance` (always included)
13
- * - Chat: `openaiChatDeployment` (if includeChat is true)
14
- * - Embedding: `openaiEmbeddingDeployment` (if includeEmbedding is true)
15
- * - Search: `azureSearchEndpoint`, `azureSearchApiKey`, `azureSearchIndexName` (if includeSearch is true)
10
+ * Pass flags to include optional chat, embed, or index options and make
11
+ * them required at runtime via the `preAction` validation hook.
16
12
  *
17
- * @param command - The Commander command instance to enhance with AI options
18
- * @param args - Optional configuration object for selective feature inclusion
19
- * @param args.includeEmbedding - Whether to include and require embedding deployment option (default: false)
20
- * @param args.includeChat - Whether to include and require chat deployment option (default: false)
21
- * @param args.includeSearch - Whether to include and require Azure Search options (default: false)
22
- * @returns The enhanced command with AI options and validation hooks attached
23
- * @throws {InvalidOptionArgumentError} During command execution if required options are missing or invalid
24
- *
25
- * @example
26
- * ```ts
27
- * const chatCommand = createCommand('chat')
28
- * .description('Start a chat session');
29
- *
30
- * withOptions(chatCommand, { includeChat: true });
31
- * ```
13
+ * @param command - The Commander command to decorate with options.
14
+ * @param args - Feature flags controlling which optional options to add.
15
+ * @param args.includeChat - Add `--chat-model` and validate it at runtime.
16
+ * @param args.includeEmbedding - Add `--embed-model` and validate it at runtime.
17
+ * @param args.includeSearch - Add `--index-name` and validate it at runtime.
18
+ * @returns The decorated command.
32
19
  */
33
20
  export const withOptions = (command, args) => {
34
- // Core authentication options
35
- command.addOption(apiKeyOption);
36
- command.addOption(apiVersionOption);
37
- command.addOption(apiInstanceOption);
38
- // Deployment options
39
- if (args?.includeChat === true) {
40
- command.addOption(chatDeploymentOption);
41
- }
42
- if (args?.includeEmbedding === true) {
43
- command.addOption(embeddingDeploymentOption);
44
- }
45
- // Azure Search options
46
- if (args?.includeSearch === true) {
47
- command.addOption(azureSearchEndpointOption);
48
- command.addOption(azureSearchApiKeyOption);
49
- command.addOption(azureSearchIndexNameOption);
50
- }
51
- // Validation hook
21
+ command.addOption(envOption);
22
+ command.addOption(tokenOption);
23
+ command.addOption(tenantIdOption);
24
+ command.addOption(clientIdOption);
25
+ if (args?.includeChat)
26
+ command.addOption(chatModelOption);
27
+ if (args?.includeEmbedding)
28
+ command.addOption(embedModelOption);
29
+ if (args?.includeSearch)
30
+ command.addOption(indexNameOption);
52
31
  command.hook('preAction', (thisCommand) => {
53
- const options = thisCommand.opts();
54
- // Validate API key
55
- if (!options.openaiApiKey ||
56
- typeof options.openaiApiKey !== 'string' ||
57
- options.openaiApiKey.trim() === '') {
58
- throw new InvalidOptionArgumentError('Azure OpenAI API key is required. Provide it via --openai-api-key option or AZURE_OPENAI_API_KEY environment variable.');
59
- }
60
- // Validate API version
61
- if (!options.openaiApiVersion || typeof options.openaiApiVersion !== 'string') {
62
- throw new InvalidOptionArgumentError('API version must be a non-empty string.');
63
- }
64
- // Validate instance name
65
- if (!options.openaiInstance ||
66
- typeof options.openaiInstance !== 'string' ||
67
- options.openaiInstance.trim() === '') {
68
- throw new InvalidOptionArgumentError('Azure OpenAI instance name is required. Provide it via --openai-instance option or AZURE_OPENAI_INSTANCE_NAME environment variable.');
69
- }
70
- if (args?.includeChat === true) {
71
- if (!options.openaiChatDeployment ||
72
- typeof options.openaiChatDeployment !== 'string' ||
73
- options.openaiChatDeployment.trim() === '') {
74
- throw new InvalidOptionArgumentError('Chat deployment name is required and must be a non-empty string.');
75
- }
32
+ const opts = thisCommand.opts();
33
+ if (args?.includeChat && !opts.chatModel?.trim()) {
34
+ throw new InvalidOptionArgumentError('Chat model name is required. Provide --chat-model or set FUSION_AI_CHAT_MODEL.');
76
35
  }
77
- if (args?.includeEmbedding === true) {
78
- if (!options.openaiEmbeddingDeployment ||
79
- typeof options.openaiEmbeddingDeployment !== 'string' ||
80
- options.openaiEmbeddingDeployment.trim() === '') {
81
- throw new InvalidOptionArgumentError('Azure OpenAI embedding deployment name is required. Provide it via --openai-embedding-deployment option or AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME environment variable.');
82
- }
36
+ if (args?.includeEmbedding && !opts.embedModel?.trim()) {
37
+ throw new InvalidOptionArgumentError('Embedding model name is required. Provide --embed-model or set FUSION_AI_EMBED_MODEL.');
83
38
  }
84
- if (args?.includeSearch === true) {
85
- if (!options.azureSearchEndpoint ||
86
- typeof options.azureSearchEndpoint !== 'string' ||
87
- options.azureSearchEndpoint.trim() === '') {
88
- throw new InvalidOptionArgumentError('Azure Search endpoint is required and must be a non-empty string.');
89
- }
90
- if (!options.azureSearchApiKey ||
91
- typeof options.azureSearchApiKey !== 'string' ||
92
- options.azureSearchApiKey.trim() === '') {
93
- throw new InvalidOptionArgumentError('Azure Search API key is required. Provide it via --azure-search-api-key option or AZURE_SEARCH_API_KEY environment variable.');
94
- }
95
- if (!options.azureSearchIndexName ||
96
- typeof options.azureSearchIndexName !== 'string' ||
97
- options.azureSearchIndexName.trim() === '') {
98
- throw new InvalidOptionArgumentError('Azure Search index name is required and must be a non-empty string.');
99
- }
39
+ if (args?.includeSearch && !opts.indexName?.trim()) {
40
+ throw new InvalidOptionArgumentError('Index name is required. Provide --index-name or set FUSION_AI_INDEX_NAME.');
100
41
  }
101
42
  });
102
43
  return command;
@@ -1 +1 @@
1
- {"version":3,"file":"with-options.js","sourceRoot":"","sources":["../../../src/options/with-options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"with-options.js","sourceRoot":"","sources":["../../../src/options/with-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,0BAA0B,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,cAAc,EACd,WAAW,GACZ,MAAM,cAAc,CAAC;AAEtB;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,OAAgB,EAChB,IAIE,EACO,EAAE;IACX,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC/B,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAClC,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAElC,IAAI,IAAI,EAAE,WAAW;QAAE,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC1D,IAAI,IAAI,EAAE,gBAAgB;QAAE,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAChE,IAAI,IAAI,EAAE,aAAa;QAAE,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAE5D,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QAEhC,IAAI,IAAI,EAAE,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,0BAA0B,CAClC,gFAAgF,CACjF,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,EAAE,gBAAgB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC;YACvD,MAAM,IAAI,0BAA0B,CAClC,uFAAuF,CACxF,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,0BAA0B,CAClC,2EAA2E,CAC5E,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC"}