@cat-factory/app 0.49.2 → 0.50.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/app/components/layout/IntegrationsHub.vue +3 -66
- package/app/components/layout/SideBar.vue +39 -0
- package/app/components/settings/ExecutionBackendSelector.vue +171 -0
- package/app/components/settings/InfrastructureWindow.vue +36 -126
- package/app/components/settings/LocalContainerPoolSettings.vue +181 -0
- package/app/components/settings/ProviderConnectionTab.vue +25 -12
- package/app/pages/index.vue +0 -4
- package/app/stores/auth.ts +10 -1
- package/app/stores/ui.ts +14 -18
- package/i18n/locales/en.json +21 -22
- package/i18n/locales/es.json +24 -25
- package/i18n/locales/fr.json +24 -25
- package/i18n/locales/pl.json +24 -25
- package/i18n/locales/uk.json +24 -25
- package/package.json +2 -2
- package/app/components/settings/LocalModeSettingsPanel.vue +0 -195
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
// Local-mode-only: the warm-container pool + per-repo checkout reuse. These are a
|
|
3
|
+
// per-DEPLOYMENT singleton stored in the DB (they replaced the LOCAL_POOL_* / HARNESS_* env
|
|
4
|
+
// vars), so a developer tunes them here instead of editing .env. The warm pool keeps idle
|
|
5
|
+
// harness containers ready and re-leases one (preferring repo affinity) to each run — far
|
|
6
|
+
// faster startup than a cold container per run. Saving applies the new sizing to the running
|
|
7
|
+
// service immediately (live resize, no restart); in-flight runs keep the container they hold,
|
|
8
|
+
// and the checkout config applies to containers started after the save.
|
|
9
|
+
//
|
|
10
|
+
// Previously a standalone modal (LocalModeSettingsPanel); now folded into the Agent-containers
|
|
11
|
+
// tab of the Infrastructure window, since the warm pool IS the local agent-container runtime.
|
|
12
|
+
import { reactive, ref, watch } from 'vue'
|
|
13
|
+
|
|
14
|
+
const { t } = useI18n()
|
|
15
|
+
const store = useLocalSettingsStore()
|
|
16
|
+
const toast = useToast()
|
|
17
|
+
|
|
18
|
+
const saving = ref(false)
|
|
19
|
+
|
|
20
|
+
// Editable draft. `idleMinutes` and `cleanKeep` are friendlier renderings of the stored
|
|
21
|
+
// `pool.idleTtlMs` (ms) and `checkout.cleanKeep` (string[]).
|
|
22
|
+
const draft = reactive({
|
|
23
|
+
size: 0,
|
|
24
|
+
minWarm: 0,
|
|
25
|
+
max: null as number | null,
|
|
26
|
+
idleMinutes: 10,
|
|
27
|
+
workspaceRoot: '/workspace',
|
|
28
|
+
cleanKeep: 'node_modules,.venv,target,.gradle,.pnpm-store',
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
function syncDraft() {
|
|
32
|
+
const s = store.settings
|
|
33
|
+
if (!s) return
|
|
34
|
+
draft.size = s.pool.size
|
|
35
|
+
draft.minWarm = s.pool.minWarm
|
|
36
|
+
draft.max = s.pool.max
|
|
37
|
+
draft.idleMinutes = Math.round(s.pool.idleTtlMs / 60_000)
|
|
38
|
+
draft.workspaceRoot = s.checkout.workspaceRoot
|
|
39
|
+
draft.cleanKeep = s.checkout.cleanKeep.join(',')
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Load + hydrate the draft on mount (the tab only mounts in local mode).
|
|
43
|
+
void store.load().then(syncDraft)
|
|
44
|
+
watch(() => store.settings, syncDraft)
|
|
45
|
+
|
|
46
|
+
async function save() {
|
|
47
|
+
const cleanKeep = draft.cleanKeep
|
|
48
|
+
.split(',')
|
|
49
|
+
.map((s) => s.trim())
|
|
50
|
+
.filter(Boolean)
|
|
51
|
+
saving.value = true
|
|
52
|
+
try {
|
|
53
|
+
await store.save({
|
|
54
|
+
pool: {
|
|
55
|
+
size: Math.max(0, Math.floor(draft.size)),
|
|
56
|
+
minWarm: Math.max(0, Math.floor(draft.minWarm)),
|
|
57
|
+
max: draft.max == null ? null : Math.max(0, Math.floor(draft.max)),
|
|
58
|
+
idleTtlMs: Math.max(0, Math.floor(draft.idleMinutes * 60_000)),
|
|
59
|
+
},
|
|
60
|
+
checkout: { workspaceRoot: draft.workspaceRoot.trim() || '/workspace', cleanKeep },
|
|
61
|
+
})
|
|
62
|
+
toast.add({
|
|
63
|
+
title: t('settings.localMode.toast.saved'),
|
|
64
|
+
icon: 'i-lucide-check',
|
|
65
|
+
color: 'success',
|
|
66
|
+
})
|
|
67
|
+
} catch (e) {
|
|
68
|
+
toast.add({
|
|
69
|
+
title: t('settings.localMode.toast.saveFailed'),
|
|
70
|
+
description: e instanceof Error ? e.message : String(e),
|
|
71
|
+
icon: 'i-lucide-triangle-alert',
|
|
72
|
+
color: 'error',
|
|
73
|
+
})
|
|
74
|
+
} finally {
|
|
75
|
+
saving.value = false
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
</script>
|
|
79
|
+
|
|
80
|
+
<template>
|
|
81
|
+
<div class="space-y-6" data-testid="local-container-pool-settings">
|
|
82
|
+
<i18n-t
|
|
83
|
+
keypath="settings.localMode.intro"
|
|
84
|
+
tag="p"
|
|
85
|
+
class="text-xs text-slate-400"
|
|
86
|
+
scope="global"
|
|
87
|
+
>
|
|
88
|
+
<template #poolVars>
|
|
89
|
+
<code>LOCAL_POOL_*</code>
|
|
90
|
+
</template>
|
|
91
|
+
<template #harnessVars>
|
|
92
|
+
<code>HARNESS_*</code>
|
|
93
|
+
</template>
|
|
94
|
+
</i18n-t>
|
|
95
|
+
|
|
96
|
+
<!-- Warm container pool -->
|
|
97
|
+
<section class="space-y-3">
|
|
98
|
+
<div>
|
|
99
|
+
<h4 class="text-sm font-semibold text-slate-200">
|
|
100
|
+
{{ t('settings.localMode.pool.heading') }}
|
|
101
|
+
</h4>
|
|
102
|
+
<i18n-t
|
|
103
|
+
keypath="settings.localMode.pool.description"
|
|
104
|
+
tag="p"
|
|
105
|
+
class="text-[11px] text-slate-400"
|
|
106
|
+
scope="global"
|
|
107
|
+
>
|
|
108
|
+
<template #appleContainer>
|
|
109
|
+
<code>container</code>
|
|
110
|
+
</template>
|
|
111
|
+
</i18n-t>
|
|
112
|
+
</div>
|
|
113
|
+
<div class="grid grid-cols-1 gap-3 sm:grid-cols-2">
|
|
114
|
+
<UFormField
|
|
115
|
+
:label="t('settings.localMode.pool.size.label')"
|
|
116
|
+
:help="t('settings.localMode.pool.size.help')"
|
|
117
|
+
>
|
|
118
|
+
<UInput v-model.number="draft.size" type="number" :min="0" size="sm" />
|
|
119
|
+
</UFormField>
|
|
120
|
+
<UFormField
|
|
121
|
+
:label="t('settings.localMode.pool.minWarm.label')"
|
|
122
|
+
:help="t('settings.localMode.pool.minWarm.help')"
|
|
123
|
+
>
|
|
124
|
+
<UInput v-model.number="draft.minWarm" type="number" :min="0" size="sm" />
|
|
125
|
+
</UFormField>
|
|
126
|
+
<UFormField
|
|
127
|
+
:label="t('settings.localMode.pool.max.label')"
|
|
128
|
+
:help="t('settings.localMode.pool.max.help')"
|
|
129
|
+
>
|
|
130
|
+
<UInput
|
|
131
|
+
v-model.number="draft.max"
|
|
132
|
+
type="number"
|
|
133
|
+
:min="0"
|
|
134
|
+
size="sm"
|
|
135
|
+
:placeholder="t('settings.localMode.pool.max.placeholder')"
|
|
136
|
+
/>
|
|
137
|
+
</UFormField>
|
|
138
|
+
<UFormField
|
|
139
|
+
:label="t('settings.localMode.pool.idleTimeout.label')"
|
|
140
|
+
:help="t('settings.localMode.pool.idleTimeout.help')"
|
|
141
|
+
>
|
|
142
|
+
<UInput v-model.number="draft.idleMinutes" type="number" :min="0" size="sm" />
|
|
143
|
+
</UFormField>
|
|
144
|
+
</div>
|
|
145
|
+
</section>
|
|
146
|
+
|
|
147
|
+
<!-- Checkout reuse -->
|
|
148
|
+
<section class="space-y-3 border-t border-slate-800 pt-6">
|
|
149
|
+
<div>
|
|
150
|
+
<h4 class="text-sm font-semibold text-slate-200">
|
|
151
|
+
{{ t('settings.localMode.checkout.heading') }}
|
|
152
|
+
</h4>
|
|
153
|
+
<p class="text-[11px] text-slate-400">
|
|
154
|
+
{{ t('settings.localMode.checkout.description') }}
|
|
155
|
+
</p>
|
|
156
|
+
</div>
|
|
157
|
+
<UFormField
|
|
158
|
+
:label="t('settings.localMode.checkout.workspaceRoot.label')"
|
|
159
|
+
:help="t('settings.localMode.checkout.workspaceRoot.help')"
|
|
160
|
+
>
|
|
161
|
+
<UInput v-model="draft.workspaceRoot" size="sm" placeholder="/workspace" />
|
|
162
|
+
</UFormField>
|
|
163
|
+
<UFormField
|
|
164
|
+
:label="t('settings.localMode.checkout.cleanKeep.label')"
|
|
165
|
+
:help="t('settings.localMode.checkout.cleanKeep.help')"
|
|
166
|
+
>
|
|
167
|
+
<UInput
|
|
168
|
+
v-model="draft.cleanKeep"
|
|
169
|
+
size="sm"
|
|
170
|
+
placeholder="node_modules,.venv,target,.gradle,.pnpm-store"
|
|
171
|
+
/>
|
|
172
|
+
</UFormField>
|
|
173
|
+
</section>
|
|
174
|
+
|
|
175
|
+
<div class="flex justify-end">
|
|
176
|
+
<UButton color="primary" icon="i-lucide-save" :loading="saving" @click="save">
|
|
177
|
+
{{ t('common.save') }}
|
|
178
|
+
</UButton>
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
</template>
|
|
@@ -440,18 +440,31 @@ function fieldHelp(key: string): string | undefined {
|
|
|
440
440
|
</div>
|
|
441
441
|
</div>
|
|
442
442
|
|
|
443
|
-
<!-- MANIFEST-driven provider: the
|
|
444
|
-
|
|
443
|
+
<!-- MANIFEST-driven provider: the raw JSON manifest editor. Collapsed by default — it's
|
|
444
|
+
the advanced path, needed ONLY to integrate a custom API-based scheduler. The common
|
|
445
|
+
backends (local Docker, Cloudflare Containers, Kubernetes) don't need it. -->
|
|
446
|
+
<details
|
|
445
447
|
v-else
|
|
446
|
-
|
|
447
|
-
:
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
448
|
+
class="rounded-lg border border-slate-700 bg-slate-900/40 p-3"
|
|
449
|
+
:open="!!connection"
|
|
450
|
+
>
|
|
451
|
+
<summary class="cursor-pointer text-sm font-medium text-slate-200">
|
|
452
|
+
{{ t('settings.providerConnection.advancedManifest.summary') }}
|
|
453
|
+
</summary>
|
|
454
|
+
<p class="mt-2 mb-3 text-[11px] text-slate-400">
|
|
455
|
+
{{ t('settings.providerConnection.advancedManifest.intro') }}
|
|
456
|
+
</p>
|
|
457
|
+
<ProviderManifestEditor
|
|
458
|
+
:kind="kind"
|
|
459
|
+
:saved-manifest="descriptor.savedManifest"
|
|
460
|
+
:connected="!!connection"
|
|
461
|
+
:supports-test="descriptor.supportsTest"
|
|
462
|
+
:testing="testing"
|
|
463
|
+
:busy="busy"
|
|
464
|
+
:test-result="testResult"
|
|
465
|
+
@test="testManifest"
|
|
466
|
+
@save="saveManifest"
|
|
467
|
+
/>
|
|
468
|
+
</details>
|
|
456
469
|
</div>
|
|
457
470
|
</template>
|
package/app/pages/index.vue
CHANGED
|
@@ -79,9 +79,6 @@ const ModelConfigurationPanel = defineAsyncComponent(
|
|
|
79
79
|
const LocalModelEndpointsPanel = defineAsyncComponent(
|
|
80
80
|
() => import('~/components/settings/LocalModelEndpointsPanel.vue'),
|
|
81
81
|
)
|
|
82
|
-
const LocalModeSettingsPanel = defineAsyncComponent(
|
|
83
|
-
() => import('~/components/settings/LocalModeSettingsPanel.vue'),
|
|
84
|
-
)
|
|
85
82
|
const SandboxPanel = defineAsyncComponent(() => import('~/components/sandbox/SandboxPanel.vue'))
|
|
86
83
|
const UserSecretsSection = defineAsyncComponent(
|
|
87
84
|
() => import('~/components/settings/UserSecretsSection.vue'),
|
|
@@ -287,7 +284,6 @@ watch(
|
|
|
287
284
|
<InfrastructureWindow v-if="ui.infrastructureOpen" />
|
|
288
285
|
<ModelConfigurationPanel v-if="ui.modelConfigOpen" />
|
|
289
286
|
<LocalModelEndpointsPanel v-if="ui.localModelsOpen" />
|
|
290
|
-
<LocalModeSettingsPanel v-if="ui.localModeSettingsOpen" />
|
|
291
287
|
<SandboxPanel v-if="ui.sandboxOpen" />
|
|
292
288
|
<UserSecretsSection v-if="ui.userSecretsOpen" />
|
|
293
289
|
<OpenRouterCatalogPanel v-if="ui.openRouterOpen" />
|
package/app/stores/auth.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { LocalModeConfig } from '@cat-factory/contracts'
|
|
1
|
+
import type { InfrastructureCapabilities, LocalModeConfig } from '@cat-factory/contracts'
|
|
2
2
|
import { defineStore } from 'pinia'
|
|
3
3
|
import { computed, ref } from 'vue'
|
|
4
4
|
import type { AuthUser } from '~/types/domain'
|
|
@@ -31,6 +31,13 @@ export const useAuthStore = defineStore(
|
|
|
31
31
|
* setup banner). Null on every other facade.
|
|
32
32
|
*/
|
|
33
33
|
const localMode = ref<LocalModeConfig | null>(null)
|
|
34
|
+
/**
|
|
35
|
+
* The deployment's infrastructure execution backends (which agent-container runtime + test
|
|
36
|
+
* environment options exist, and the deployment default active one). Drives the
|
|
37
|
+
* Infrastructure window's backend selector. Null until the auth handshake resolves / on a
|
|
38
|
+
* facade that doesn't report it.
|
|
39
|
+
*/
|
|
40
|
+
const infrastructure = ref<InfrastructureCapabilities | null>(null)
|
|
34
41
|
/**
|
|
35
42
|
* Local mode only: the source-control provider the user last chose to sign in with
|
|
36
43
|
* (its PAT lives server-side in env — this is just the non-secret choice). Persisted, so
|
|
@@ -72,6 +79,7 @@ export const useAuthStore = defineStore(
|
|
|
72
79
|
required.value = config.enabled
|
|
73
80
|
if (config.providers) providers.value = config.providers
|
|
74
81
|
localMode.value = config.localMode ?? null
|
|
82
|
+
infrastructure.value = config.infrastructure ?? null
|
|
75
83
|
} catch {
|
|
76
84
|
// Backend unreachable — let the board's own error UI handle it.
|
|
77
85
|
required.value = false
|
|
@@ -222,6 +230,7 @@ export const useAuthStore = defineStore(
|
|
|
222
230
|
required,
|
|
223
231
|
providers,
|
|
224
232
|
localMode,
|
|
233
|
+
infrastructure,
|
|
225
234
|
autoLoginProvider,
|
|
226
235
|
ready,
|
|
227
236
|
isAuthenticated,
|
package/app/stores/ui.ts
CHANGED
|
@@ -125,11 +125,12 @@ export const useUiStore = defineStore('ui', () => {
|
|
|
125
125
|
// today, pluggable). NB: distinct from `observabilityInstanceId` below, which is the
|
|
126
126
|
// LLM per-call observability panel.
|
|
127
127
|
const observabilityConnectionOpen = ref(false)
|
|
128
|
-
// The single tabbed Infrastructure window
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
// selects the
|
|
128
|
+
// The single tabbed Infrastructure window — a TOP-LEVEL navbar destination (no longer
|
|
129
|
+
// reached via the Integrations hub). Two topical tabs: "Agent containers" (the execution
|
|
130
|
+
// backend + self-hosted runner pool, plus the local-mode warm pool/checkout) and "Test
|
|
131
|
+
// environments" (the ephemeral-environment provider). `infrastructureOpen` is the modal
|
|
132
|
+
// flag; `infrastructureTab` selects the tab. `openInfrastructure()` is the navbar entry;
|
|
133
|
+
// `openProviderConnection(kind)` remains for deep-links (a banner's "Configure…" button).
|
|
133
134
|
const infrastructureOpen = ref(false)
|
|
134
135
|
const infrastructureTab = ref<'environment' | 'runner-pool'>('runner-pool')
|
|
135
136
|
const modelConfigOpen = ref(false)
|
|
@@ -140,9 +141,6 @@ export const useUiStore = defineStore('ui', () => {
|
|
|
140
141
|
const vendorCredentialsTab = ref('pool')
|
|
141
142
|
// Per-user settings panel: the signed-in user's own-machine local model runners.
|
|
142
143
|
const localModelsOpen = ref(false)
|
|
143
|
-
// Local-mode-only settings panel: the warm-container pool sizing + per-repo checkout reuse
|
|
144
|
-
// (a per-deployment singleton that replaced the LOCAL_POOL_* / HARNESS_* env vars).
|
|
145
|
-
const localModeSettingsOpen = ref(false)
|
|
146
144
|
// The Sandbox (parallel prompt/model testing) surface — an opt-in, on-demand window.
|
|
147
145
|
const sandboxOpen = ref(false)
|
|
148
146
|
const userSecretsOpen = ref(false)
|
|
@@ -479,6 +477,13 @@ export const useUiStore = defineStore('ui', () => {
|
|
|
479
477
|
function closeObservabilityConnection() {
|
|
480
478
|
observabilityConnectionOpen.value = false
|
|
481
479
|
}
|
|
480
|
+
// Top-level navbar entry into the Infrastructure window. No hub-return marker (it isn't
|
|
481
|
+
// reached from the Integrations hub), so the window shows no "Back to Integrations" control.
|
|
482
|
+
function openInfrastructure(tab: 'environment' | 'runner-pool' = 'runner-pool') {
|
|
483
|
+
resetHubReturn()
|
|
484
|
+
infrastructureTab.value = tab
|
|
485
|
+
infrastructureOpen.value = true
|
|
486
|
+
}
|
|
482
487
|
function openProviderConnection(kind: 'environment' | 'runner-pool') {
|
|
483
488
|
resetHubReturn()
|
|
484
489
|
infrastructureTab.value = kind
|
|
@@ -511,13 +516,6 @@ export const useUiStore = defineStore('ui', () => {
|
|
|
511
516
|
function closeLocalModels() {
|
|
512
517
|
localModelsOpen.value = false
|
|
513
518
|
}
|
|
514
|
-
function openLocalModeSettings() {
|
|
515
|
-
resetHubReturn()
|
|
516
|
-
localModeSettingsOpen.value = true
|
|
517
|
-
}
|
|
518
|
-
function closeLocalModeSettings() {
|
|
519
|
-
localModeSettingsOpen.value = false
|
|
520
|
-
}
|
|
521
519
|
function openSandbox() {
|
|
522
520
|
sandboxOpen.value = true
|
|
523
521
|
}
|
|
@@ -669,11 +667,11 @@ export const useUiStore = defineStore('ui', () => {
|
|
|
669
667
|
observabilityConnectionOpen,
|
|
670
668
|
infrastructureOpen,
|
|
671
669
|
infrastructureTab,
|
|
670
|
+
openInfrastructure,
|
|
672
671
|
modelConfigOpen,
|
|
673
672
|
vendorCredentialsOpen,
|
|
674
673
|
vendorCredentialsTab,
|
|
675
674
|
localModelsOpen,
|
|
676
|
-
localModeSettingsOpen,
|
|
677
675
|
sandboxOpen,
|
|
678
676
|
userSecretsOpen,
|
|
679
677
|
openRouterOpen,
|
|
@@ -754,8 +752,6 @@ export const useUiStore = defineStore('ui', () => {
|
|
|
754
752
|
closeVendorCredentials,
|
|
755
753
|
openLocalModels,
|
|
756
754
|
closeLocalModels,
|
|
757
|
-
openLocalModeSettings,
|
|
758
|
-
closeLocalModeSettings,
|
|
759
755
|
openSandbox,
|
|
760
756
|
closeSandbox,
|
|
761
757
|
openUserSecrets,
|
package/i18n/locales/en.json
CHANGED
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"addFromRepo": "Add from existing repo",
|
|
34
34
|
"bootstrapRepo": "Bootstrap repo",
|
|
35
35
|
"integrations": "Integrations",
|
|
36
|
+
"infrastructure": "Infrastructure",
|
|
36
37
|
"sandbox": "Sandbox",
|
|
37
38
|
"@sandbox": {
|
|
38
39
|
"description": "Named feature area (a screen for trying prompt versions / models against graded fixtures). Fine to localize descriptively per locale - unlike nav.kaizen, this one is NOT kept verbatim."
|
|
@@ -1150,7 +1151,6 @@
|
|
|
1150
1151
|
"documents": "Documents",
|
|
1151
1152
|
"taskTrackers": "Task trackers",
|
|
1152
1153
|
"observability": "Observability",
|
|
1153
|
-
"infrastructure": "Infrastructure",
|
|
1154
1154
|
"personal": "Personal (only you)"
|
|
1155
1155
|
},
|
|
1156
1156
|
"items": {
|
|
@@ -1188,16 +1188,6 @@
|
|
|
1188
1188
|
"label": "Post-release health",
|
|
1189
1189
|
"description": "Watch monitors and SLOs after a release ships (Datadog)."
|
|
1190
1190
|
},
|
|
1191
|
-
"infrastructure": {
|
|
1192
|
-
"label": "Infrastructure",
|
|
1193
|
-
"description": "Self-hosted runner pool for container agents and ephemeral test environments.",
|
|
1194
|
-
"agents": "Agents: {state}",
|
|
1195
|
-
"envs": "Envs: {state}"
|
|
1196
|
-
},
|
|
1197
|
-
"localMode": {
|
|
1198
|
-
"label": "Local mode",
|
|
1199
|
-
"description": "Warm container pool plus per-repo checkout reuse for the local runner."
|
|
1200
|
-
},
|
|
1201
1191
|
"githubPat": {
|
|
1202
1192
|
"label": "My GitHub token",
|
|
1203
1193
|
"description": "A personal access token used for runs you start (pushes, PRs, CI, merge)."
|
|
@@ -1259,12 +1249,28 @@
|
|
|
1259
1249
|
"fragments": "Context fragments"
|
|
1260
1250
|
}
|
|
1261
1251
|
},
|
|
1252
|
+
"infrastructure": {
|
|
1253
|
+
"active": "Active: {backend}",
|
|
1254
|
+
"registerHint": "Register a runner pool below to enable this.",
|
|
1255
|
+
"updateFailed": "Could not update the execution backend",
|
|
1256
|
+
"executionBackend": {
|
|
1257
|
+
"label": "Where agents run",
|
|
1258
|
+
"local-docker": "Local Docker (host)",
|
|
1259
|
+
"cloudflare-containers": "Cloudflare Containers (built-in)",
|
|
1260
|
+
"runner-pool": "Self-hosted runner pool"
|
|
1261
|
+
},
|
|
1262
|
+
"testEnvBackend": {
|
|
1263
|
+
"label": "Where test environments run",
|
|
1264
|
+
"local-compose": "In-container docker-compose",
|
|
1265
|
+
"environment-provider": "Environment provider"
|
|
1266
|
+
}
|
|
1267
|
+
},
|
|
1262
1268
|
"providerConnection": {
|
|
1263
1269
|
"fallbackTitle": "Provider",
|
|
1264
1270
|
"windowTitle": "Infrastructure",
|
|
1265
1271
|
"noneAvailable": "No infrastructure providers are enabled on this deployment.",
|
|
1266
1272
|
"tabs": {
|
|
1267
|
-
"
|
|
1273
|
+
"agentContainers": "Agent containers",
|
|
1268
1274
|
"testEnvironments": "Test environments"
|
|
1269
1275
|
},
|
|
1270
1276
|
"kind": {
|
|
@@ -1348,16 +1354,9 @@
|
|
|
1348
1354
|
"reenterSecrets": "Re-enter every secret to save. Stored secrets are write-only and aren't shown.",
|
|
1349
1355
|
"starterHint": "This is a starter example. Edit it to match your provider's API."
|
|
1350
1356
|
},
|
|
1351
|
-
"
|
|
1352
|
-
"
|
|
1353
|
-
"intro": "
|
|
1354
|
-
"agentsToggle": "Run container agents on the runner pool",
|
|
1355
|
-
"agentsHint": "Dispatch every container agent (coder, tester, merger, bootstrap, …) to this workspace's self-hosted runner pool instead of host Docker.",
|
|
1356
|
-
"registerPoolPrompt": "{link} first to enable this.",
|
|
1357
|
-
"registerPoolLink": "Register a runner pool",
|
|
1358
|
-
"envToggle": "Provision Tester environments via the provider",
|
|
1359
|
-
"envHint": "Stand the Tester's preview environment up through the environment provider configured below instead of in-container docker-compose. Connect a provider first to enable this.",
|
|
1360
|
-
"updateFailed": "Could not update delegation"
|
|
1357
|
+
"advancedManifest": {
|
|
1358
|
+
"summary": "Advanced: custom API-based scheduler",
|
|
1359
|
+
"intro": "Only needed to integrate a custom API-based scheduler. The common backends (local Docker, Cloudflare Containers and Kubernetes) don't need this; describe your own scheduler's HTTP API here only if you run one."
|
|
1361
1360
|
},
|
|
1362
1361
|
"viewLogs": "View logs",
|
|
1363
1362
|
"hideLogs": "Hide logs",
|
package/i18n/locales/es.json
CHANGED
|
@@ -34,7 +34,8 @@
|
|
|
34
34
|
"configuration": "Configuración",
|
|
35
35
|
"workspaceSettings": "Ajustes del espacio de trabajo",
|
|
36
36
|
"modelConfiguration": "Configuración del modelo",
|
|
37
|
-
"accountSettings": "Ajustes de la cuenta"
|
|
37
|
+
"accountSettings": "Ajustes de la cuenta",
|
|
38
|
+
"infrastructure": "Infraestructura"
|
|
38
39
|
},
|
|
39
40
|
"board": {
|
|
40
41
|
"toolbar": {
|
|
@@ -1111,7 +1112,6 @@
|
|
|
1111
1112
|
"documents": "Documentos",
|
|
1112
1113
|
"taskTrackers": "Rastreadores de tareas",
|
|
1113
1114
|
"observability": "Observabilidad",
|
|
1114
|
-
"infrastructure": "Infraestructura",
|
|
1115
1115
|
"personal": "Personal (solo tú)"
|
|
1116
1116
|
},
|
|
1117
1117
|
"items": {
|
|
@@ -1149,16 +1149,6 @@
|
|
|
1149
1149
|
"label": "Salud posterior al lanzamiento",
|
|
1150
1150
|
"description": "Vigila los monitores y SLO después de publicar una versión (Datadog)."
|
|
1151
1151
|
},
|
|
1152
|
-
"infrastructure": {
|
|
1153
|
-
"label": "Infraestructura",
|
|
1154
|
-
"description": "Grupo de ejecutores autoalojado para los agentes de contenedor y entornos de prueba efímeros.",
|
|
1155
|
-
"agents": "Agentes: {state}",
|
|
1156
|
-
"envs": "Entornos: {state}"
|
|
1157
|
-
},
|
|
1158
|
-
"localMode": {
|
|
1159
|
-
"label": "Modo local",
|
|
1160
|
-
"description": "Grupo de contenedores en caliente y reutilización de checkout por repositorio para el ejecutor local."
|
|
1161
|
-
},
|
|
1162
1152
|
"githubPat": {
|
|
1163
1153
|
"label": "Mi token de GitHub",
|
|
1164
1154
|
"description": "Un token de acceso personal usado para las ejecuciones que inicias (pushes, PR, CI, fusión)."
|
|
@@ -1225,8 +1215,8 @@
|
|
|
1225
1215
|
"windowTitle": "Infraestructura",
|
|
1226
1216
|
"noneAvailable": "No hay proveedores de infraestructura habilitados en este despliegue.",
|
|
1227
1217
|
"tabs": {
|
|
1228
|
-
"
|
|
1229
|
-
"
|
|
1218
|
+
"testEnvironments": "Entornos de prueba",
|
|
1219
|
+
"agentContainers": "Agentes de contenedor"
|
|
1230
1220
|
},
|
|
1231
1221
|
"kind": {
|
|
1232
1222
|
"environment": {
|
|
@@ -1250,17 +1240,6 @@
|
|
|
1250
1240
|
"reenterSecrets": "Vuelve a introducir cada secreto para guardar: los secretos almacenados son de solo escritura y no se muestran.",
|
|
1251
1241
|
"starterHint": "Este es un ejemplo inicial. Edítalo para que coincida con la API de tu proveedor."
|
|
1252
1242
|
},
|
|
1253
|
-
"delegation": {
|
|
1254
|
-
"title": "Delegación local",
|
|
1255
|
-
"intro": "De forma predeterminada, esta máquina ejecuta todo localmente: los agentes de contenedor en Docker del host y la infraestructura del Tester mediante docker-compose dentro del contenedor. Activa las opciones de abajo para delegar cualquiera de estas tareas en un servicio externo. Solo se aplica en modo local.",
|
|
1256
|
-
"agentsToggle": "Ejecutar los agentes de contenedor en el grupo de ejecutores",
|
|
1257
|
-
"agentsHint": "Envía cada agente de contenedor (codificador, tester, fusionador, bootstrap, …) al grupo de ejecutores autoalojado de este espacio de trabajo en lugar de a Docker del host.",
|
|
1258
|
-
"registerPoolPrompt": "{link} primero para habilitar esto.",
|
|
1259
|
-
"registerPoolLink": "Registra un grupo de ejecutores",
|
|
1260
|
-
"envToggle": "Aprovisionar los entornos del Tester mediante el proveedor",
|
|
1261
|
-
"envHint": "Levanta el entorno de vista previa del Tester a través del proveedor de entornos configurado abajo en lugar de docker-compose dentro del contenedor. Conecta un proveedor primero para habilitar esto.",
|
|
1262
|
-
"updateFailed": "No se pudo actualizar la delegación"
|
|
1263
|
-
},
|
|
1264
1243
|
"viewLogs": "Ver registros",
|
|
1265
1244
|
"hideLogs": "Ocultar registros",
|
|
1266
1245
|
"connectedAt": "Conectado · {baseUrl}",
|
|
@@ -1343,6 +1322,10 @@
|
|
|
1343
1322
|
"caCertPem": "Certificado CA del clúster (PEM)",
|
|
1344
1323
|
"caCertPemHelp": "Pega el bundle CA del clúster para que el certificado TLS del apiserver se verifique. Omítelo solo para una CA de confianza pública.",
|
|
1345
1324
|
"harnessPort": "Puerto del harness"
|
|
1325
|
+
},
|
|
1326
|
+
"advancedManifest": {
|
|
1327
|
+
"summary": "Avanzado: planificador personalizado basado en API",
|
|
1328
|
+
"intro": "Solo es necesario para integrar un planificador personalizado basado en API. Los backends habituales (Docker local, Cloudflare Containers y Kubernetes) no lo necesitan; describe aquí la API HTTP de tu propio planificador solo si usas uno."
|
|
1346
1329
|
}
|
|
1347
1330
|
},
|
|
1348
1331
|
"serviceFragmentDefaults": {
|
|
@@ -1693,6 +1676,22 @@
|
|
|
1693
1676
|
"removed": "Runner eliminado",
|
|
1694
1677
|
"removeFailed": "No se pudo eliminar el runner"
|
|
1695
1678
|
}
|
|
1679
|
+
},
|
|
1680
|
+
"infrastructure": {
|
|
1681
|
+
"active": "Activo: {backend}",
|
|
1682
|
+
"registerHint": "Registra un pool de ejecutores abajo para habilitarlo.",
|
|
1683
|
+
"updateFailed": "No se pudo actualizar el backend de ejecución",
|
|
1684
|
+
"executionBackend": {
|
|
1685
|
+
"label": "Dónde se ejecutan los agentes",
|
|
1686
|
+
"local-docker": "Docker local (host)",
|
|
1687
|
+
"cloudflare-containers": "Cloudflare Containers (integrado)",
|
|
1688
|
+
"runner-pool": "Pool de ejecutores autoalojado"
|
|
1689
|
+
},
|
|
1690
|
+
"testEnvBackend": {
|
|
1691
|
+
"label": "Dónde se ejecutan los entornos de prueba",
|
|
1692
|
+
"local-compose": "docker-compose en contenedor",
|
|
1693
|
+
"environment-provider": "Proveedor de entornos"
|
|
1694
|
+
}
|
|
1696
1695
|
}
|
|
1697
1696
|
},
|
|
1698
1697
|
"providers": {
|
package/i18n/locales/fr.json
CHANGED
|
@@ -34,7 +34,8 @@
|
|
|
34
34
|
"configuration": "Configuration",
|
|
35
35
|
"workspaceSettings": "Paramètres de l’espace de travail",
|
|
36
36
|
"modelConfiguration": "Configuration du modèle",
|
|
37
|
-
"accountSettings": "Paramètres du compte"
|
|
37
|
+
"accountSettings": "Paramètres du compte",
|
|
38
|
+
"infrastructure": "Infrastructure"
|
|
38
39
|
},
|
|
39
40
|
"board": {
|
|
40
41
|
"toolbar": {
|
|
@@ -1111,7 +1112,6 @@
|
|
|
1111
1112
|
"documents": "Documents",
|
|
1112
1113
|
"taskTrackers": "Outils de suivi des tâches",
|
|
1113
1114
|
"observability": "Observabilité",
|
|
1114
|
-
"infrastructure": "Infrastructure",
|
|
1115
1115
|
"personal": "Personnel (vous uniquement)"
|
|
1116
1116
|
},
|
|
1117
1117
|
"items": {
|
|
@@ -1149,16 +1149,6 @@
|
|
|
1149
1149
|
"label": "Santé après publication",
|
|
1150
1150
|
"description": "Surveillez les moniteurs et les SLO après la publication d'une version (Datadog)."
|
|
1151
1151
|
},
|
|
1152
|
-
"infrastructure": {
|
|
1153
|
-
"label": "Infrastructure",
|
|
1154
|
-
"description": "Pool d'exécuteurs auto-hébergé pour les agents de conteneur et environnements de test éphémères.",
|
|
1155
|
-
"agents": "Agents : {state}",
|
|
1156
|
-
"envs": "Environnements : {state}"
|
|
1157
|
-
},
|
|
1158
|
-
"localMode": {
|
|
1159
|
-
"label": "Mode local",
|
|
1160
|
-
"description": "Pool de conteneurs à chaud et réutilisation du checkout par dépôt pour l'exécuteur local."
|
|
1161
|
-
},
|
|
1162
1152
|
"githubPat": {
|
|
1163
1153
|
"label": "Mon jeton GitHub",
|
|
1164
1154
|
"description": "Un jeton d'accès personnel utilisé pour les exécutions que vous lancez (pushes, PR, CI, fusion)."
|
|
@@ -1225,8 +1215,8 @@
|
|
|
1225
1215
|
"windowTitle": "Infrastructure",
|
|
1226
1216
|
"noneAvailable": "Aucun fournisseur d'infrastructure n'est activé sur ce déploiement.",
|
|
1227
1217
|
"tabs": {
|
|
1228
|
-
"
|
|
1229
|
-
"
|
|
1218
|
+
"testEnvironments": "Environnements de test",
|
|
1219
|
+
"agentContainers": "Agents de conteneur"
|
|
1230
1220
|
},
|
|
1231
1221
|
"kind": {
|
|
1232
1222
|
"environment": {
|
|
@@ -1250,17 +1240,6 @@
|
|
|
1250
1240
|
"reenterSecrets": "Saisissez à nouveau chaque secret pour enregistrer : les secrets stockés sont en écriture seule et ne sont pas affichés.",
|
|
1251
1241
|
"starterHint": "Ceci est un exemple de départ. Modifiez-le pour qu'il corresponde à l'API de votre fournisseur."
|
|
1252
1242
|
},
|
|
1253
|
-
"delegation": {
|
|
1254
|
-
"title": "Délégation locale",
|
|
1255
|
-
"intro": "Par défaut, cette machine exécute tout en local : les agents de conteneur sur le Docker de l'hôte, l'infrastructure du Tester via docker-compose dans le conteneur. Activez les options ci-dessous pour déléguer l'une ou l'autre de ces tâches à un service externe. S'applique uniquement en mode local.",
|
|
1256
|
-
"agentsToggle": "Exécuter les agents de conteneur sur le pool d'exécuteurs",
|
|
1257
|
-
"agentsHint": "Envoyez chaque agent de conteneur (codeur, tester, fusionneur, bootstrap, …) au pool d'exécuteurs auto-hébergé de cet espace de travail plutôt qu'au Docker de l'hôte.",
|
|
1258
|
-
"registerPoolPrompt": "{link} d'abord pour activer cette option.",
|
|
1259
|
-
"registerPoolLink": "Enregistrez un pool d'exécuteurs",
|
|
1260
|
-
"envToggle": "Provisionner les environnements du Tester via le fournisseur",
|
|
1261
|
-
"envHint": "Montez l'environnement d'aperçu du Tester via le fournisseur d'environnements configuré ci-dessous plutôt que via docker-compose dans le conteneur. Connectez d'abord un fournisseur pour activer cette option.",
|
|
1262
|
-
"updateFailed": "Impossible de mettre à jour la délégation"
|
|
1263
|
-
},
|
|
1264
1243
|
"viewLogs": "Voir les journaux",
|
|
1265
1244
|
"hideLogs": "Masquer les journaux",
|
|
1266
1245
|
"connectedAt": "Connecté · {baseUrl}",
|
|
@@ -1343,6 +1322,10 @@
|
|
|
1343
1322
|
"caCertPem": "Certificat CA du cluster (PEM)",
|
|
1344
1323
|
"caCertPemHelp": "Collez le bundle CA du cluster pour que le certificat TLS de l'apiserver soit vérifié. À omettre uniquement pour une CA publiquement approuvée.",
|
|
1345
1324
|
"harnessPort": "Port du harness"
|
|
1325
|
+
},
|
|
1326
|
+
"advancedManifest": {
|
|
1327
|
+
"summary": "Avancé : planificateur personnalisé basé sur une API",
|
|
1328
|
+
"intro": "Nécessaire uniquement pour intégrer un planificateur personnalisé basé sur une API. Les backends courants (Docker local, Cloudflare Containers et Kubernetes) n'en ont pas besoin ; décrivez ici l'API HTTP de votre propre planificateur uniquement si vous en utilisez un."
|
|
1346
1329
|
}
|
|
1347
1330
|
},
|
|
1348
1331
|
"serviceFragmentDefaults": {
|
|
@@ -1693,6 +1676,22 @@
|
|
|
1693
1676
|
"removed": "Runner supprimé",
|
|
1694
1677
|
"removeFailed": "Impossible de supprimer le runner"
|
|
1695
1678
|
}
|
|
1679
|
+
},
|
|
1680
|
+
"infrastructure": {
|
|
1681
|
+
"active": "Actif : {backend}",
|
|
1682
|
+
"registerHint": "Enregistrez un pool d'exécuteurs ci-dessous pour l'activer.",
|
|
1683
|
+
"updateFailed": "Impossible de mettre à jour le backend d'exécution",
|
|
1684
|
+
"executionBackend": {
|
|
1685
|
+
"label": "Où s'exécutent les agents",
|
|
1686
|
+
"local-docker": "Docker local (hôte)",
|
|
1687
|
+
"cloudflare-containers": "Cloudflare Containers (intégré)",
|
|
1688
|
+
"runner-pool": "Pool d'exécuteurs auto-hébergé"
|
|
1689
|
+
},
|
|
1690
|
+
"testEnvBackend": {
|
|
1691
|
+
"label": "Où s'exécutent les environnements de test",
|
|
1692
|
+
"local-compose": "docker-compose dans le conteneur",
|
|
1693
|
+
"environment-provider": "Fournisseur d'environnements"
|
|
1694
|
+
}
|
|
1696
1695
|
}
|
|
1697
1696
|
},
|
|
1698
1697
|
"providers": {
|