@skaile/forge-settings 0.0.0-stage → 1.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 +21 -0
- package/LICENSE +21 -0
- package/README.md +94 -2
- package/dist/module.d.mts +17 -0
- package/dist/module.json +9 -0
- package/dist/module.mjs +23 -0
- package/dist/runtime/ai-sdk/index.d.ts +45 -0
- package/dist/runtime/ai-sdk/index.js +39 -0
- package/dist/runtime/components/ForgeProvidersPanel.d.vue.ts +21 -0
- package/dist/runtime/components/ForgeProvidersPanel.vue +435 -0
- package/dist/runtime/components/ForgeProvidersPanel.vue.d.ts +21 -0
- package/dist/runtime/editor/index.d.ts +58 -0
- package/dist/runtime/editor/index.js +83 -0
- package/dist/runtime/model/errors.d.ts +24 -0
- package/dist/runtime/model/errors.js +10 -0
- package/dist/runtime/server/credential-policy.d.ts +60 -0
- package/dist/runtime/server/credential-policy.js +64 -0
- package/dist/runtime/server/credential-store.d.ts +184 -0
- package/dist/runtime/server/credential-store.js +234 -0
- package/dist/runtime/server/env-layers.d.ts +62 -0
- package/dist/runtime/server/env-layers.js +185 -0
- package/dist/runtime/server/env.d.ts +30 -0
- package/dist/runtime/server/env.js +15 -0
- package/dist/runtime/server/harness-settings.d.ts +150 -0
- package/dist/runtime/server/harness-settings.js +166 -0
- package/dist/runtime/server/index.d.ts +23 -0
- package/dist/runtime/server/index.js +14 -0
- package/dist/runtime/server/provider-discovery.d.ts +73 -0
- package/dist/runtime/server/provider-discovery.js +77 -0
- package/dist/runtime/server/provider-layers.d.ts +27 -0
- package/dist/runtime/server/provider-layers.js +37 -0
- package/dist/runtime/server/provider-service.d.ts +126 -0
- package/dist/runtime/server/provider-service.js +87 -0
- package/dist/runtime/server/provider-settings.d.ts +78 -0
- package/dist/runtime/server/provider-settings.js +81 -0
- package/dist/runtime/server/provider-write.d.ts +154 -0
- package/dist/runtime/server/provider-write.js +223 -0
- package/dist/runtime/server/settings-defaults.d.ts +26 -0
- package/dist/runtime/server/settings-defaults.js +46 -0
- package/dist/runtime/shared/env-vars.d.ts +55 -0
- package/dist/runtime/shared/env-vars.js +22 -0
- package/dist/runtime/shared/harness-providers.d.ts +62 -0
- package/dist/runtime/shared/harness-providers.js +38 -0
- package/dist/runtime/shared/harnesses.d.ts +19 -0
- package/dist/runtime/shared/harnesses.js +15 -0
- package/dist/runtime/shared/provider-registry.d.ts +255 -0
- package/dist/runtime/shared/provider-registry.js +112 -0
- package/dist/runtime/shared/settings-types.d.ts +84 -0
- package/dist/runtime/shared/settings-types.js +0 -0
- package/dist/runtime/shims-vue.d.ts +8 -0
- package/dist/runtime/vue/index.d.ts +14 -0
- package/dist/runtime/vue/index.js +6 -0
- package/dist/runtime/vue/settings-modal-scope.d.ts +62 -0
- package/dist/runtime/vue/settings-modal-scope.js +2 -0
- package/dist/runtime/vue/useProvidersPanel.d.ts +232 -0
- package/dist/runtime/vue/useProvidersPanel.js +655 -0
- package/dist/types.d.mts +9 -0
- package/package.json +117 -4
- package/src/runtime/ai-sdk/index.ts +91 -0
- package/src/runtime/components/ForgeProvidersPanel.vue +449 -0
- package/src/runtime/editor/index.ts +157 -0
- package/src/runtime/model/errors.ts +31 -0
- package/src/runtime/server/credential-policy.ts +137 -0
- package/src/runtime/server/credential-store.ts +473 -0
- package/src/runtime/server/env-layers.ts +290 -0
- package/src/runtime/server/env.ts +46 -0
- package/src/runtime/server/harness-settings.ts +373 -0
- package/src/runtime/server/index.ts +24 -0
- package/src/runtime/server/provider-discovery.ts +164 -0
- package/src/runtime/server/provider-layers.ts +70 -0
- package/src/runtime/server/provider-service.ts +244 -0
- package/src/runtime/server/provider-settings.ts +192 -0
- package/src/runtime/server/provider-write.ts +438 -0
- package/src/runtime/server/settings-defaults.ts +87 -0
- package/src/runtime/shared/env-vars.ts +82 -0
- package/src/runtime/shared/harness-providers.ts +118 -0
- package/src/runtime/shared/harnesses.ts +34 -0
- package/src/runtime/shared/provider-registry.ts +391 -0
- package/src/runtime/shared/settings-types.ts +87 -0
- package/src/runtime/shims-vue.d.ts +8 -0
- package/src/runtime/vue/index.ts +15 -0
- package/src/runtime/vue/settings-modal-scope.ts +66 -0
- package/src/runtime/vue/useProvidersPanel.ts +1087 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared brain for `components-nuxt-ui/ForgeProvidersPanel.vue` — the settings
|
|
3
|
+
* modal's Providers tab.
|
|
4
|
+
*
|
|
5
|
+
* It drives the registry editor: loading, the add/edit form, the delete confirmation,
|
|
6
|
+
* the "detected in environment" one-click adds, the per-row credential picker,
|
|
7
|
+
* the enabled toggle and every request live here.
|
|
8
|
+
*
|
|
9
|
+
* The panel writes one registry document — the scope's own `layer` — through
|
|
10
|
+
* `PUT|DELETE ${providersWriteUrl}/:id`. An entry a lower layer defines can be
|
|
11
|
+
* patched at workspace scope (`credential` / `enabled` only) and reset by
|
|
12
|
+
* deleting the patch. A key typed into the panel goes to the scope's `.env`
|
|
13
|
+
* route only; the provider route receives an `env:NAME` reference, never a
|
|
14
|
+
* value.
|
|
15
|
+
*/
|
|
16
|
+
import { type ComputedRef, type Ref, type WritableComputedRef } from "vue";
|
|
17
|
+
import { type EnvLayerId, type EnvSettingsDocument } from "../shared/env-vars.js";
|
|
18
|
+
import { type AIProviderCredentialKind, type AIProviderKind, type AIProviderSurface } from "../shared/provider-registry.js";
|
|
19
|
+
/** Registry document a provider entry is defined in. */
|
|
20
|
+
export type ProvidersPanelLayer = "instance" | "workspace";
|
|
21
|
+
/** Props both `ForgeProvidersPanel` variants declare. */
|
|
22
|
+
export interface ProvidersPanelProps {
|
|
23
|
+
/** `GET` merged view for this scope (`/api/providers` | `/api/workspaces/:id/providers`). */
|
|
24
|
+
providersUrl: string;
|
|
25
|
+
/** `PUT|DELETE ${providersWriteUrl}/:id`; `GET ${providersWriteUrl}/detected`. */
|
|
26
|
+
providersWriteUrl: string;
|
|
27
|
+
/** Catalog preset summaries. Default `/api/providers/presets`. */
|
|
28
|
+
presetsUrl?: string;
|
|
29
|
+
/**
|
|
30
|
+
* The scope's `.env` route. `GET` on load and after every write; keys typed
|
|
31
|
+
* into the panel write through it. Omitted, no key can be entered.
|
|
32
|
+
*/
|
|
33
|
+
environmentUrl?: string;
|
|
34
|
+
/** The scope's own registry document. */
|
|
35
|
+
layer: ProvidersPanelLayer;
|
|
36
|
+
/** Disables every write (non-admin at instance scope; provider lock). */
|
|
37
|
+
readOnly?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/** Emits both variants declare. */
|
|
40
|
+
export type ProvidersPanelEmit = (event: "changed") => void;
|
|
41
|
+
/** One entry of `GET ${providersUrl}?all=1`. */
|
|
42
|
+
export interface ProvidersPanelEntry {
|
|
43
|
+
id: string;
|
|
44
|
+
/** The entry's label, else its id. */
|
|
45
|
+
name: string;
|
|
46
|
+
kind: AIProviderKind;
|
|
47
|
+
/** Whether the credential reference resolved on the server. */
|
|
48
|
+
configured: boolean;
|
|
49
|
+
/** Why it did not resolve. Secret-free. */
|
|
50
|
+
error?: string;
|
|
51
|
+
credentialRef?: string;
|
|
52
|
+
credentialKind?: AIProviderCredentialKind;
|
|
53
|
+
hasEnvKey: boolean;
|
|
54
|
+
envKeyName?: string;
|
|
55
|
+
baseUrl?: string;
|
|
56
|
+
preset?: string;
|
|
57
|
+
surface?: AIProviderSurface;
|
|
58
|
+
enabled: boolean;
|
|
59
|
+
locked: boolean;
|
|
60
|
+
/** Registry documents holding the id, lowest first: `["instance"]`, `["workspace"]` or both. */
|
|
61
|
+
layers: ProvidersPanelLayer[];
|
|
62
|
+
/** The scope's own document's values for the editable fields the dialog does not show. */
|
|
63
|
+
layerFields?: Record<string, unknown>;
|
|
64
|
+
}
|
|
65
|
+
/** One catalog preset, as `GET /api/providers/presets` and `.../detected` list it. */
|
|
66
|
+
export interface ProvidersPanelPreset {
|
|
67
|
+
id: string;
|
|
68
|
+
label: string;
|
|
69
|
+
kind: AIProviderKind;
|
|
70
|
+
surface?: AIProviderSurface;
|
|
71
|
+
base_url?: string;
|
|
72
|
+
base_url_env?: string;
|
|
73
|
+
credential: {
|
|
74
|
+
kind: AIProviderCredentialKind;
|
|
75
|
+
env?: string;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** Where a row's entry lives relative to the scope's own document. */
|
|
79
|
+
export type ProvidersPanelRowState = "own" | "inherited" | "patched";
|
|
80
|
+
/** One entry of a row's credential select. */
|
|
81
|
+
export interface ProvidersPanelCredentialOption {
|
|
82
|
+
/** An env var NAME, a literal non-env ref, {@link CREDENTIAL_ENTER_KEY} or {@link CREDENTIAL_OTHER_REF}. */
|
|
83
|
+
value: string;
|
|
84
|
+
/** `NAME ••••hint` | `NAME (not set)` | the literal ref | `Enter a key…` | `Other reference…`. */
|
|
85
|
+
label: string;
|
|
86
|
+
defined?: boolean;
|
|
87
|
+
hint?: string;
|
|
88
|
+
source?: EnvLayerId;
|
|
89
|
+
action?: "enter-key" | "other-ref";
|
|
90
|
+
}
|
|
91
|
+
/** A table row: the entry plus what the panel derives for it. */
|
|
92
|
+
export interface ProvidersPanelRow extends ProvidersPanelEntry {
|
|
93
|
+
/** Own entry, an inherited one, or an inherited one this scope patched. */
|
|
94
|
+
state: ProvidersPanelRowState;
|
|
95
|
+
/** `instance` | `workspace` | `instance · overridden here`. */
|
|
96
|
+
badge: string;
|
|
97
|
+
/** Set on inherited rows. */
|
|
98
|
+
inheritedNote?: string;
|
|
99
|
+
/** Edit/Delete offered: the scope's document defines it and the panel is writable. */
|
|
100
|
+
editable: boolean;
|
|
101
|
+
/** Reset offered: a patched row of a writable panel. */
|
|
102
|
+
canReset: boolean;
|
|
103
|
+
/** The enabled switch is live. */
|
|
104
|
+
canToggle: boolean;
|
|
105
|
+
/** The entry takes a credential (its kind is not `none`). */
|
|
106
|
+
needsCredential: boolean;
|
|
107
|
+
/** The credential picker is live. */
|
|
108
|
+
canEditCredential: boolean;
|
|
109
|
+
/** The select's model: the env var NAME of an `env:` ref, else the literal ref, else `""`. */
|
|
110
|
+
credentialValue: string;
|
|
111
|
+
credentialOptions: ProvidersPanelCredentialOption[];
|
|
112
|
+
/** The preset it inherits, else its surface, else its kind. */
|
|
113
|
+
origin: string;
|
|
114
|
+
/** `configured · <source>`, `missing <VAR>`, the resolver's reason, or `No credential needed.`. */
|
|
115
|
+
status: string;
|
|
116
|
+
/** Which other layer defines or overrides the credential; see the panel contract. */
|
|
117
|
+
overrideNotices: string[];
|
|
118
|
+
}
|
|
119
|
+
/** The add/edit dialog's fields. */
|
|
120
|
+
export interface ProvidersPanelForm {
|
|
121
|
+
/** A preset id, or {@link CUSTOM_PRESET}. */
|
|
122
|
+
preset: string;
|
|
123
|
+
id: string;
|
|
124
|
+
/** Custom entries only. */
|
|
125
|
+
surface: string;
|
|
126
|
+
/** Empty: the preset's endpoint. */
|
|
127
|
+
baseUrl: string;
|
|
128
|
+
/** Adding only: the `env:` variable the credential references. */
|
|
129
|
+
envName: string;
|
|
130
|
+
/** Adding only, "Set value now": written to the scope's `.env`, never to the provider route. */
|
|
131
|
+
secret: string;
|
|
132
|
+
}
|
|
133
|
+
/** The preset select's value for an entry that names no preset. */
|
|
134
|
+
export declare const CUSTOM_PRESET = "__custom__";
|
|
135
|
+
/** Credential select value: open the inline key editor. */
|
|
136
|
+
export declare const CREDENTIAL_ENTER_KEY = "__enter_key__";
|
|
137
|
+
/** Credential select value: open the inline reference editor. */
|
|
138
|
+
export declare const CREDENTIAL_OTHER_REF = "__other_ref__";
|
|
139
|
+
/** What both `ForgeProvidersPanel` variants bind to. */
|
|
140
|
+
export interface ProvidersPanelState {
|
|
141
|
+
/** The scope's entries, disabled ones included, in registry order. */
|
|
142
|
+
rows: ComputedRef<ProvidersPanelRow[]>;
|
|
143
|
+
loading: Ref<boolean>;
|
|
144
|
+
loadError: Ref<string | null>;
|
|
145
|
+
/** Re-read the entries, the detected presets and the environment document. */
|
|
146
|
+
refresh: () => Promise<void>;
|
|
147
|
+
dialogVisible: Ref<boolean>;
|
|
148
|
+
dialogTitle: ComputedRef<string>;
|
|
149
|
+
/** The row being edited; `null` while adding. */
|
|
150
|
+
editing: Ref<ProvidersPanelEntry | null>;
|
|
151
|
+
form: ProvidersPanelForm;
|
|
152
|
+
/** A refusal from the form check or either request, shown in the dialog. */
|
|
153
|
+
dialogError: Ref<string | null>;
|
|
154
|
+
saving: Ref<boolean>;
|
|
155
|
+
/** Catalog presets plus "Custom" ({@link CUSTOM_PRESET}). */
|
|
156
|
+
presetOptions: ComputedRef<Array<{
|
|
157
|
+
label: string;
|
|
158
|
+
value: string;
|
|
159
|
+
}>>;
|
|
160
|
+
surfaceOptions: Array<{
|
|
161
|
+
label: string;
|
|
162
|
+
value: AIProviderSurface;
|
|
163
|
+
}>;
|
|
164
|
+
isCustom: ComputedRef<boolean>;
|
|
165
|
+
/** The surface select is shown: a custom `llm`/`embed` entry. */
|
|
166
|
+
showSurface: ComputedRef<boolean>;
|
|
167
|
+
baseUrlPlaceholder: ComputedRef<string>;
|
|
168
|
+
/** "Set value now" is offered: the scope has an `.env` route. */
|
|
169
|
+
canSetValue: ComputedRef<boolean>;
|
|
170
|
+
/** The dialog shows the env name and secret fields: adding, not editing. */
|
|
171
|
+
showCredentialFields: ComputedRef<boolean>;
|
|
172
|
+
idError: ComputedRef<string | null>;
|
|
173
|
+
openAdd: (presetId?: string) => void;
|
|
174
|
+
openEdit: (row: ProvidersPanelEntry) => void;
|
|
175
|
+
selectPreset: (value: string) => void;
|
|
176
|
+
saveProvider: () => Promise<void>;
|
|
177
|
+
deleteTarget: Ref<ProvidersPanelEntry | null>;
|
|
178
|
+
/** The confirmation dialog's `v-model`; closing it cancels. */
|
|
179
|
+
deleteOpen: WritableComputedRef<boolean>;
|
|
180
|
+
deleteError: Ref<string | null>;
|
|
181
|
+
deleting: Ref<boolean>;
|
|
182
|
+
requestDelete: (row: ProvidersPanelEntry) => void;
|
|
183
|
+
confirmDelete: () => Promise<void>;
|
|
184
|
+
/** Presets whose key is set in the scope's env and that no entry names. */
|
|
185
|
+
detected: Ref<ProvidersPanelPreset[]>;
|
|
186
|
+
/** Preset id whose one-click add is in flight. */
|
|
187
|
+
detectedBusy: Ref<string | null>;
|
|
188
|
+
detectedError: Ref<string | null>;
|
|
189
|
+
addDetected: (preset: ProvidersPanelPreset) => Promise<void>;
|
|
190
|
+
/** The credential select's `@update`: a NAME writes, the two actions open an editor. */
|
|
191
|
+
onCredentialSelect: (row: ProvidersPanelRow, value: string) => void;
|
|
192
|
+
setCredentialEnv: (row: ProvidersPanelRow, name: string) => Promise<void>;
|
|
193
|
+
setEnabled: (row: ProvidersPanelRow, enabled: boolean) => Promise<void>;
|
|
194
|
+
/** Delete the workspace patch of an inherited entry. */
|
|
195
|
+
resetPatch: (row: ProvidersPanelRow) => Promise<void>;
|
|
196
|
+
/** Row id with a write in flight. */
|
|
197
|
+
rowBusy: Ref<string | null>;
|
|
198
|
+
rowError: Ref<{
|
|
199
|
+
id: string;
|
|
200
|
+
message: string;
|
|
201
|
+
} | null>;
|
|
202
|
+
/** "Enter a key…" is offered: the scope has an editable `.env` route. */
|
|
203
|
+
canEnterKey: ComputedRef<boolean>;
|
|
204
|
+
/** Row id whose key editor is open. */
|
|
205
|
+
keyEditing: Ref<string | null>;
|
|
206
|
+
keyForm: {
|
|
207
|
+
name: string;
|
|
208
|
+
value: string;
|
|
209
|
+
};
|
|
210
|
+
keyError: Ref<string | null>;
|
|
211
|
+
openKeyEditor: (row: ProvidersPanelRow) => void;
|
|
212
|
+
cancelKeyEditor: () => void;
|
|
213
|
+
saveKeyEditor: () => Promise<void>;
|
|
214
|
+
/** Row id whose reference editor is open. */
|
|
215
|
+
refEditing: Ref<string | null>;
|
|
216
|
+
refForm: {
|
|
217
|
+
ref: string;
|
|
218
|
+
};
|
|
219
|
+
refError: Ref<string | null>;
|
|
220
|
+
openRefEditor: (row: ProvidersPanelRow) => void;
|
|
221
|
+
cancelRefEditor: () => void;
|
|
222
|
+
saveRefEditor: () => Promise<void>;
|
|
223
|
+
envDocument: Ref<EnvSettingsDocument | null>;
|
|
224
|
+
/** The environment document says the caller may write its layer. */
|
|
225
|
+
envEditable: ComputedRef<boolean>;
|
|
226
|
+
/** Draft new values per variable name. */
|
|
227
|
+
envValues: Record<string, string>;
|
|
228
|
+
envError: Ref<string | null>;
|
|
229
|
+
envBusy: Ref<boolean>;
|
|
230
|
+
setEnvValue: (name: string) => Promise<void>;
|
|
231
|
+
}
|
|
232
|
+
export declare function useProvidersPanel(props: ProvidersPanelProps, emit: ProvidersPanelEmit): ProvidersPanelState;
|