@cat-factory/app 0.94.0 → 0.95.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/github/AddServiceFromRepoModal.vue +26 -35
- package/app/components/github/RepoSearchEmpty.vue +18 -0
- package/app/components/panels/inspector/DocReferenceRepos.vue +144 -0
- package/app/components/panels/inspector/TaskRunSettings.vue +3 -0
- package/app/composables/useRepoSearch.ts +66 -0
- package/app/stores/github.ts +13 -0
- package/app/types/domain.ts +1 -0
- package/i18n/locales/en.json +6 -0
- package/i18n/locales/es.json +6 -0
- package/i18n/locales/fr.json +6 -0
- package/i18n/locales/he.json +6 -0
- package/i18n/locales/ja.json +6 -0
- package/i18n/locales/pl.json +6 -0
- package/i18n/locales/tr.json +6 -0
- package/i18n/locales/uk.json +6 -0
- package/package.json +2 -2
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
// pinned to a subdirectory. When the selected repo is a monorepo, the user
|
|
11
11
|
// browses its tree and picks the service's directory before adding (and may add
|
|
12
12
|
// more than one, a subset of the repo's services).
|
|
13
|
-
import { refDebounced } from '@vueuse/core'
|
|
14
13
|
import type { FrameRepoType, GitHubAvailableRepo } from '~/types/domain'
|
|
15
14
|
import GitHubConnect from '~/components/github/GitHubConnect.vue'
|
|
15
|
+
import RepoSearchEmpty from '~/components/github/RepoSearchEmpty.vue'
|
|
16
16
|
import RepoTreeBrowser from '~/components/github/RepoTreeBrowser.vue'
|
|
17
17
|
import ServiceTestConfig from '~/components/panels/inspector/ServiceTestConfig.vue'
|
|
18
18
|
import ServiceFragments from '~/components/panels/inspector/ServiceFragments.vue'
|
|
@@ -89,33 +89,27 @@ function toRepoItem(r: GitHubAvailableRepo) {
|
|
|
89
89
|
return { label: `${r.owner}/${r.name}${suffix}`, value: r.githubId, disabled: onBoard }
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
//
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
92
|
+
// Server-side, debounced, min-length-gated repo search (a wide App install / PAT can expose
|
|
93
|
+
// hundreds of repos, too many to prefetch and filter in the browser). Shared with the doc-task
|
|
94
|
+
// reference-repo picker via `useRepoSearch`; `repoResults` is this picker's own result list, so
|
|
95
|
+
// the two never clobber each other. Nothing is fetched on open — the field prompts for more
|
|
96
|
+
// characters below the gate; granting the App access needs no manual refresh (the next search
|
|
97
|
+
// hits GitHub live).
|
|
98
|
+
const {
|
|
99
|
+
search: repoSearch,
|
|
100
|
+
query: repoQueryRaw,
|
|
101
|
+
belowMinChars,
|
|
102
|
+
results: repoResults,
|
|
103
|
+
loading: repoLoading,
|
|
104
|
+
reset: resetRepoSearch,
|
|
105
|
+
} = useRepoSearch()
|
|
106
|
+
|
|
107
|
+
const repoItems = computed(() => repoResults.value.map(toRepoItem))
|
|
107
108
|
|
|
108
109
|
// The selected repo, captured when picked (below). The loaded list is volatile — a later
|
|
109
|
-
// search replaces it — so the selection can't be derived from
|
|
110
|
+
// search replaces it — so the selection can't be derived from the results after the fact.
|
|
110
111
|
const selectedRepo = ref<GitHubAvailableRepo | undefined>(undefined)
|
|
111
112
|
|
|
112
|
-
// Fetch matches server-side as the debounced query changes; below the gate clear the list
|
|
113
|
-
// so stale matches don't linger (the hint shows instead). Granting the App access needs no
|
|
114
|
-
// manual refresh — the next search hits GitHub live, with no cached list to invalidate.
|
|
115
|
-
watch(repoQueryRaw, (q) => {
|
|
116
|
-
void github.loadAvailableRepos(q.length >= MIN_SEARCH_LEN ? q : '')
|
|
117
|
-
})
|
|
118
|
-
|
|
119
113
|
// The server already filtered, so the matches ARE the loaded repos (empty below the gate).
|
|
120
114
|
const queryMatches = computed(() => (belowMinChars.value ? [] : repoItems.value))
|
|
121
115
|
|
|
@@ -148,7 +142,7 @@ function toggleMonorepo(value: boolean) {
|
|
|
148
142
|
watch(selectedRepoId, (id) => {
|
|
149
143
|
if (id === undefined) selectedRepo.value = undefined
|
|
150
144
|
else {
|
|
151
|
-
const found =
|
|
145
|
+
const found = repoResults.value.find((r) => r.githubId === id)
|
|
152
146
|
if (found) selectedRepo.value = found
|
|
153
147
|
}
|
|
154
148
|
isMonorepo.value = selectedRepo.value?.isMonorepo === true
|
|
@@ -161,7 +155,7 @@ function resetSelection() {
|
|
|
161
155
|
selectedDirectory.value = undefined
|
|
162
156
|
isMonorepo.value = false
|
|
163
157
|
configuredBlockId.value = undefined
|
|
164
|
-
|
|
158
|
+
resetRepoSearch()
|
|
165
159
|
selectedType.value = 'service'
|
|
166
160
|
}
|
|
167
161
|
|
|
@@ -296,7 +290,7 @@ function done() {
|
|
|
296
290
|
:items="repoMenuItems"
|
|
297
291
|
:ignore-filter="true"
|
|
298
292
|
value-key="value"
|
|
299
|
-
:loading="
|
|
293
|
+
:loading="repoLoading"
|
|
300
294
|
icon="i-lucide-search"
|
|
301
295
|
:placeholder="t('github.addService.searchPlaceholder')"
|
|
302
296
|
class="w-full"
|
|
@@ -312,14 +306,11 @@ function done() {
|
|
|
312
306
|
/>
|
|
313
307
|
</template>
|
|
314
308
|
<template #empty>
|
|
315
|
-
<
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
<span v-else-if="!github.loadingAvailable">{{
|
|
321
|
-
t('github.addService.noMatches', { query: repoQueryRaw })
|
|
322
|
-
}}</span>
|
|
309
|
+
<RepoSearchEmpty
|
|
310
|
+
:below-min-chars="belowMinChars"
|
|
311
|
+
:loading="repoLoading"
|
|
312
|
+
:query="repoQueryRaw"
|
|
313
|
+
/>
|
|
323
314
|
</template>
|
|
324
315
|
</UInputMenu>
|
|
325
316
|
</div>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
// The empty-state body shared by the GitHub repo pickers (the add-service modal and the doc-task
|
|
3
|
+
// reference-repo picker), both driven by `useRepoSearch`: below the min-length gate it prompts for
|
|
4
|
+
// more characters; otherwise (once a search has settled) it reports no matches. Kept as one
|
|
5
|
+
// component so the two pickers can't drift on the empty-state copy or behaviour.
|
|
6
|
+
import { REPO_SEARCH_MIN_LEN } from '~/composables/useRepoSearch'
|
|
7
|
+
|
|
8
|
+
defineProps<{ belowMinChars: boolean; loading: boolean; query: string }>()
|
|
9
|
+
|
|
10
|
+
const { t } = useI18n()
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<span v-if="belowMinChars">
|
|
15
|
+
{{ t('github.addService.searchMinChars', { min: REPO_SEARCH_MIN_LEN }, REPO_SEARCH_MIN_LEN) }}
|
|
16
|
+
</span>
|
|
17
|
+
<span v-else-if="!loading">{{ t('github.addService.noMatches', { query }) }}</span>
|
|
18
|
+
</template>
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
// Reference repositories for a document-authoring task. The doc-writer agent clones each attached
|
|
3
|
+
// repo READ-ONLY as a sibling checkout it may read (to reuse existing solutions as a reference)
|
|
4
|
+
// while drafting — it never writes to them. Any repo the workspace's GitHub App (or the signed-in
|
|
5
|
+
// user's PAT) can reach may be attached, so this reuses the SAME server-side, debounced repo
|
|
6
|
+
// search as the add-service picker (`useRepoSearch`), not a filter over the synced projection.
|
|
7
|
+
import type { Block, GitHubAvailableRepo, ReferenceRepo } from '~/types/domain'
|
|
8
|
+
import RepoSearchEmpty from '~/components/github/RepoSearchEmpty.vue'
|
|
9
|
+
|
|
10
|
+
const props = defineProps<{ block: Block }>()
|
|
11
|
+
|
|
12
|
+
const { t } = useI18n()
|
|
13
|
+
const github = useGitHubStore()
|
|
14
|
+
const board = useBoardStore()
|
|
15
|
+
|
|
16
|
+
const {
|
|
17
|
+
search: repoSearch,
|
|
18
|
+
query: repoQuery,
|
|
19
|
+
belowMinChars,
|
|
20
|
+
results: repoResults,
|
|
21
|
+
loading: repoLoading,
|
|
22
|
+
reset: resetRepoSearch,
|
|
23
|
+
} = useRepoSearch()
|
|
24
|
+
|
|
25
|
+
const attached = computed<ReferenceRepo[]>(() => props.block.referenceRepos ?? [])
|
|
26
|
+
// Keyed by the provider-neutral repo id. The search results are `GitHubAvailableRepo`s (whose id
|
|
27
|
+
// field is `githubId`), so a menu item's `githubId` is compared against this set of `repoId`s —
|
|
28
|
+
// the same numeric id space on every provider.
|
|
29
|
+
const attachedIds = computed(() => new Set(attached.value.map((r) => r.repoId)))
|
|
30
|
+
|
|
31
|
+
// Menu items: the searched repos, an already-attached one disabled so it can't be added twice.
|
|
32
|
+
const repoItems = computed(() =>
|
|
33
|
+
belowMinChars.value
|
|
34
|
+
? []
|
|
35
|
+
: repoResults.value.map((r) => ({
|
|
36
|
+
label: `${r.owner}/${r.name}${r.personal ? t('github.addService.repoLabel.personal') : ''}`,
|
|
37
|
+
value: r.githubId,
|
|
38
|
+
disabled: attachedIds.value.has(r.githubId),
|
|
39
|
+
})),
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
// The picked repo id; watched to attach then clear (the combobox has no "add" affordance of its
|
|
43
|
+
// own, so selecting a repo IS the attach action).
|
|
44
|
+
const pickedId = ref<number | undefined>(undefined)
|
|
45
|
+
|
|
46
|
+
watch(pickedId, (id) => {
|
|
47
|
+
if (id === undefined) return
|
|
48
|
+
const repo = repoResults.value.find((r) => r.githubId === id)
|
|
49
|
+
pickedId.value = undefined
|
|
50
|
+
if (!repo || attachedIds.value.has(id)) return
|
|
51
|
+
attach(repo)
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
function toReference(repo: GitHubAvailableRepo): ReferenceRepo {
|
|
55
|
+
return {
|
|
56
|
+
repoId: repo.githubId,
|
|
57
|
+
owner: repo.owner,
|
|
58
|
+
name: repo.name,
|
|
59
|
+
// A repo with no reported default branch is rare; fall back to `main` so the clone has a ref.
|
|
60
|
+
defaultBranch: repo.defaultBranch ?? 'main',
|
|
61
|
+
// A repo the workspace connection reaches carries that connection; a PAT-only (`personal`) repo
|
|
62
|
+
// has none, so the run clones it with the initiator's own token instead.
|
|
63
|
+
...(repo.personal || !github.connection
|
|
64
|
+
? {}
|
|
65
|
+
: { connectionId: github.connection.installationId }),
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function attach(repo: GitHubAvailableRepo) {
|
|
70
|
+
board.updateBlock(props.block.id, {
|
|
71
|
+
referenceRepos: [...attached.value, toReference(repo)],
|
|
72
|
+
})
|
|
73
|
+
resetRepoSearch()
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function detach(repoId: number) {
|
|
77
|
+
board.updateBlock(props.block.id, {
|
|
78
|
+
referenceRepos: attached.value.filter((r) => r.repoId !== repoId),
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
</script>
|
|
82
|
+
|
|
83
|
+
<template>
|
|
84
|
+
<div data-testid="doc-reference-repos">
|
|
85
|
+
<div class="mb-1 flex items-center justify-between">
|
|
86
|
+
<span class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
|
|
87
|
+
{{ t('inspector.referenceRepos.title') }}
|
|
88
|
+
</span>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<!-- Attached reference repos: chips with a remove control. -->
|
|
92
|
+
<div v-if="attached.length" class="mb-1.5 flex flex-wrap gap-1">
|
|
93
|
+
<UBadge
|
|
94
|
+
v-for="r in attached"
|
|
95
|
+
:key="r.repoId"
|
|
96
|
+
size="sm"
|
|
97
|
+
variant="soft"
|
|
98
|
+
color="neutral"
|
|
99
|
+
data-testid="reference-repo-chip"
|
|
100
|
+
>
|
|
101
|
+
{{ r.owner }}/{{ r.name }}
|
|
102
|
+
<UButton
|
|
103
|
+
color="neutral"
|
|
104
|
+
variant="link"
|
|
105
|
+
size="xs"
|
|
106
|
+
icon="i-lucide-x"
|
|
107
|
+
:aria-label="t('inspector.referenceRepos.remove', { repo: `${r.owner}/${r.name}` })"
|
|
108
|
+
data-testid="reference-repo-remove"
|
|
109
|
+
@click="detach(r.repoId)"
|
|
110
|
+
/>
|
|
111
|
+
</UBadge>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<!-- The picker: only usable once the workspace's GitHub App is connected. -->
|
|
115
|
+
<UInputMenu
|
|
116
|
+
v-if="github.connected"
|
|
117
|
+
v-model="pickedId"
|
|
118
|
+
v-model:search-term="repoSearch"
|
|
119
|
+
:items="repoItems"
|
|
120
|
+
:ignore-filter="true"
|
|
121
|
+
value-key="value"
|
|
122
|
+
:loading="repoLoading"
|
|
123
|
+
icon="i-lucide-search"
|
|
124
|
+
:placeholder="t('github.addService.searchPlaceholder')"
|
|
125
|
+
class="w-full"
|
|
126
|
+
data-testid="reference-repo-search"
|
|
127
|
+
>
|
|
128
|
+
<template #empty>
|
|
129
|
+
<RepoSearchEmpty
|
|
130
|
+
:below-min-chars="belowMinChars"
|
|
131
|
+
:loading="repoLoading"
|
|
132
|
+
:query="repoQuery"
|
|
133
|
+
/>
|
|
134
|
+
</template>
|
|
135
|
+
</UInputMenu>
|
|
136
|
+
<div v-else class="text-[11px] text-slate-500">
|
|
137
|
+
{{ t('inspector.referenceRepos.connectFirst') }}
|
|
138
|
+
</div>
|
|
139
|
+
|
|
140
|
+
<div class="mt-1 text-[11px] text-slate-500">
|
|
141
|
+
{{ t('inspector.referenceRepos.hint') }}
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
</template>
|
|
@@ -480,6 +480,9 @@ const technicalLabel = computed(() => {
|
|
|
480
480
|
</div>
|
|
481
481
|
</div>
|
|
482
482
|
|
|
483
|
+
<!-- reference repositories: read-only repos the doc-writer reads while drafting (doc tasks) -->
|
|
484
|
+
<DocReferenceRepos v-if="block.taskType === 'document'" :block="block" />
|
|
485
|
+
|
|
483
486
|
<!-- issue-tracker writeback overrides -->
|
|
484
487
|
<div>
|
|
485
488
|
<div class="mb-1 flex items-center justify-between">
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { computed, ref, watch } from 'vue'
|
|
2
|
+
import { refDebounced } from '@vueuse/core'
|
|
3
|
+
import type { GitHubAvailableRepo } from '~/types/domain'
|
|
4
|
+
|
|
5
|
+
/** Minimum characters before a search fires — a wide install has too many repos to prefetch. */
|
|
6
|
+
export const REPO_SEARCH_MIN_LEN = 3
|
|
7
|
+
|
|
8
|
+
/** How the picker searches: a debounced, min-length-gated, server-side repo search. */
|
|
9
|
+
export type RepoFetcher = (query: string) => Promise<GitHubAvailableRepo[]>
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Shared repo-lookup behaviour for the GitHub repo pickers (the add-service modal and the
|
|
13
|
+
* doc-task reference-repo picker). A wide App install / PAT can expose hundreds of repos, so the
|
|
14
|
+
* pickers search SERVER-SIDE rather than prefetching and filtering in the browser: once the user
|
|
15
|
+
* types at least {@link REPO_SEARCH_MIN_LEN} characters the (debounced) query is sent to the
|
|
16
|
+
* backend, which returns only the matches. Below the gate the list stays empty and the caller
|
|
17
|
+
* shows a "type N chars" hint.
|
|
18
|
+
*
|
|
19
|
+
* The fetcher defaults to the github store's NON-mutating `searchAvailableRepos`, so each picker
|
|
20
|
+
* keeps its OWN result list — two pickers never clobber each other through the shared
|
|
21
|
+
* `availableRepos` singleton. A stale-response guard drops an out-of-order fetch so fast typing
|
|
22
|
+
* can't leave older matches showing.
|
|
23
|
+
*/
|
|
24
|
+
export function useRepoSearch(fetcher?: RepoFetcher) {
|
|
25
|
+
const github = useGitHubStore()
|
|
26
|
+
const doFetch: RepoFetcher = fetcher ?? ((q) => github.searchAvailableRepos(q))
|
|
27
|
+
|
|
28
|
+
const search = ref('')
|
|
29
|
+
const debounced = refDebounced(search, 250)
|
|
30
|
+
// Trimmed for the min-length gate; the backend matches case-insensitively.
|
|
31
|
+
const query = computed(() => debounced.value.trim())
|
|
32
|
+
const belowMinChars = computed(() => query.value.length < REPO_SEARCH_MIN_LEN)
|
|
33
|
+
|
|
34
|
+
const results = ref<GitHubAvailableRepo[]>([])
|
|
35
|
+
const loading = ref(false)
|
|
36
|
+
// Monotonic token so a slow earlier fetch can't overwrite a faster later one.
|
|
37
|
+
let seq = 0
|
|
38
|
+
|
|
39
|
+
watch(query, async (q) => {
|
|
40
|
+
if (q.length < REPO_SEARCH_MIN_LEN) {
|
|
41
|
+
results.value = []
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
const mine = ++seq
|
|
45
|
+
loading.value = true
|
|
46
|
+
try {
|
|
47
|
+
const found = await doFetch(q)
|
|
48
|
+
if (mine === seq) results.value = found
|
|
49
|
+
} finally {
|
|
50
|
+
if (mine === seq) loading.value = false
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
/** Clear the search term and results (e.g. after a pick, or when the host closes). */
|
|
55
|
+
function reset() {
|
|
56
|
+
search.value = ''
|
|
57
|
+
results.value = []
|
|
58
|
+
// Bump the token so an in-flight fetch's result/finally is ignored — and clear `loading`
|
|
59
|
+
// ourselves, since that same in-flight `finally` will now skip its `mine === seq` guard and
|
|
60
|
+
// would otherwise leave the spinner stuck on until the next search completes.
|
|
61
|
+
seq++
|
|
62
|
+
loading.value = false
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return { search, query, belowMinChars, results, loading, reset }
|
|
66
|
+
}
|
package/app/stores/github.ts
CHANGED
|
@@ -157,6 +157,18 @@ export const useGitHubStore = defineStore('github', () => {
|
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
159
|
|
|
160
|
+
/**
|
|
161
|
+
* Search the installation/PAT-accessible repos server-side WITHOUT touching the shared
|
|
162
|
+
* `availableRepos`/`loadingAvailable` singleton — it returns the matches to the caller instead.
|
|
163
|
+
* This is the reusable form behind {@link useRepoSearch}: two independent pickers (the
|
|
164
|
+
* add-service modal and the doc-task reference-repo picker) can search concurrently without
|
|
165
|
+
* clobbering each other's results. A blank/short `q` (or no connection) returns `[]`.
|
|
166
|
+
*/
|
|
167
|
+
async function searchAvailableRepos(q: string): Promise<GitHubAvailableRepo[]> {
|
|
168
|
+
if (!connected.value || q.trim() === '') return []
|
|
169
|
+
return api.listGitHubAvailableRepos(workspace.requireId(), q)
|
|
170
|
+
}
|
|
171
|
+
|
|
160
172
|
/** Set the exact set of repos this workspace links, then refresh projections. */
|
|
161
173
|
async function setLinkedRepos(repoGithubIds: number[]) {
|
|
162
174
|
savingRepos.value = true
|
|
@@ -318,6 +330,7 @@ export const useGitHubStore = defineStore('github', () => {
|
|
|
318
330
|
load,
|
|
319
331
|
ensureLoaded,
|
|
320
332
|
loadAvailableRepos,
|
|
333
|
+
searchAvailableRepos,
|
|
321
334
|
setLinkedRepos,
|
|
322
335
|
loadRepoTree,
|
|
323
336
|
loadBranches,
|
package/app/types/domain.ts
CHANGED
package/i18n/locales/en.json
CHANGED
|
@@ -876,6 +876,12 @@
|
|
|
876
876
|
"involvedServicesHint": "Connected services directly involved in this task: each spins up as an ephemeral environment alongside this task's own service, and the coding agent may change their repositories too.",
|
|
877
877
|
"involvedServicesEmpty": "No connected services. Connect services on the service frame to select them here.",
|
|
878
878
|
"involvedServiceStale": "No longer connected to this task's service; it is dropped on the next change."
|
|
879
|
+
},
|
|
880
|
+
"referenceRepos": {
|
|
881
|
+
"title": "Reference repositories",
|
|
882
|
+
"remove": "Remove {repo}",
|
|
883
|
+
"connectFirst": "Connect GitHub to attach reference repositories.",
|
|
884
|
+
"hint": "The document writer clones these read-only to reuse existing solutions as a reference while drafting. It never changes them."
|
|
879
885
|
}
|
|
880
886
|
},
|
|
881
887
|
"panels": {
|
package/i18n/locales/es.json
CHANGED
|
@@ -833,6 +833,12 @@
|
|
|
833
833
|
"involvedServicesHint": "Servicios conectados directamente involucrados en esta tarea: cada uno se levanta como un entorno efímero junto al servicio propio de la tarea, y el agente de código puede modificar también sus repositorios.",
|
|
834
834
|
"involvedServicesEmpty": "No hay servicios conectados. Conecta servicios en el marco del servicio para seleccionarlos aquí.",
|
|
835
835
|
"involvedServiceStale": "Ya no está conectado al servicio de esta tarea; se eliminará con el próximo cambio."
|
|
836
|
+
},
|
|
837
|
+
"referenceRepos": {
|
|
838
|
+
"title": "Repositorios de referencia",
|
|
839
|
+
"remove": "Quitar {repo}",
|
|
840
|
+
"connectFirst": "Conecta GitHub para adjuntar repositorios de referencia.",
|
|
841
|
+
"hint": "El escritor de documentos los clona en modo de solo lectura para reutilizar soluciones existentes como referencia al redactar. Nunca los modifica."
|
|
836
842
|
}
|
|
837
843
|
},
|
|
838
844
|
"panels": {
|
package/i18n/locales/fr.json
CHANGED
|
@@ -833,6 +833,12 @@
|
|
|
833
833
|
"involvedServicesHint": "Services connectés directement impliqués dans cette tâche : chacun démarre comme environnement éphémère aux côtés du service propre de la tâche, et l'agent de code peut aussi modifier leurs dépôts.",
|
|
834
834
|
"involvedServicesEmpty": "Aucun service connecté. Connectez des services sur le cadre du service pour les sélectionner ici.",
|
|
835
835
|
"involvedServiceStale": "N'est plus connecté au service de cette tâche ; il sera retiré au prochain changement."
|
|
836
|
+
},
|
|
837
|
+
"referenceRepos": {
|
|
838
|
+
"title": "Dépôts de référence",
|
|
839
|
+
"remove": "Retirer {repo}",
|
|
840
|
+
"connectFirst": "Connectez GitHub pour joindre des dépôts de référence.",
|
|
841
|
+
"hint": "Le rédacteur de documents les clone en lecture seule pour réutiliser des solutions existantes comme référence lors de la rédaction. Il ne les modifie jamais."
|
|
836
842
|
}
|
|
837
843
|
},
|
|
838
844
|
"panels": {
|
package/i18n/locales/he.json
CHANGED
|
@@ -833,6 +833,12 @@
|
|
|
833
833
|
"involvedServicesHint": "שירותים מחוברים המעורבים ישירות במשימה זו: כל אחד מהם מוקם כסביבה זמנית לצד השירות של המשימה, וסוכן הקוד עשוי לשנות גם את המאגרים שלהם.",
|
|
834
834
|
"involvedServicesEmpty": "אין שירותים מחוברים. חברו שירותים במסגרת השירות כדי לבחור אותם כאן.",
|
|
835
835
|
"involvedServiceStale": "כבר לא מחובר לשירות של משימה זו; הוא יוסר בשינוי הבא."
|
|
836
|
+
},
|
|
837
|
+
"referenceRepos": {
|
|
838
|
+
"title": "Reference repositories",
|
|
839
|
+
"remove": "Remove {repo}",
|
|
840
|
+
"connectFirst": "Connect GitHub to attach reference repositories.",
|
|
841
|
+
"hint": "The document writer clones these read-only to reuse existing solutions as a reference while drafting. It never changes them."
|
|
836
842
|
}
|
|
837
843
|
},
|
|
838
844
|
"panels": {
|
package/i18n/locales/ja.json
CHANGED
|
@@ -833,6 +833,12 @@
|
|
|
833
833
|
"involvedServicesHint": "このタスクに直接関与する接続済みサービス。各サービスはタスク自身のサービスと並んで一時的な環境として起動され、コーディングエージェントがそのリポジトリを変更することもあります。",
|
|
834
834
|
"involvedServicesEmpty": "接続済みのサービスはありません。ここで選択するには、サービスフレームでサービスを接続してください。",
|
|
835
835
|
"involvedServiceStale": "このタスクのサービスとの接続が解除されています。次回の変更時に削除されます。"
|
|
836
|
+
},
|
|
837
|
+
"referenceRepos": {
|
|
838
|
+
"title": "Reference repositories",
|
|
839
|
+
"remove": "Remove {repo}",
|
|
840
|
+
"connectFirst": "Connect GitHub to attach reference repositories.",
|
|
841
|
+
"hint": "The document writer clones these read-only to reuse existing solutions as a reference while drafting. It never changes them."
|
|
836
842
|
}
|
|
837
843
|
},
|
|
838
844
|
"panels": {
|
package/i18n/locales/pl.json
CHANGED
|
@@ -833,6 +833,12 @@
|
|
|
833
833
|
"involvedServicesHint": "Połączone usługi bezpośrednio zaangażowane w to zadanie: każda z nich uruchamiana jest jako środowisko tymczasowe obok własnej usługi zadania, a agent kodujący może też zmieniać ich repozytoria.",
|
|
834
834
|
"involvedServicesEmpty": "Brak połączonych usług. Połącz usługi na ramce usługi, aby móc je tutaj wybrać.",
|
|
835
835
|
"involvedServiceStale": "Nie jest już połączona z usługą tego zadania; zostanie usunięta przy następnej zmianie."
|
|
836
|
+
},
|
|
837
|
+
"referenceRepos": {
|
|
838
|
+
"title": "Reference repositories",
|
|
839
|
+
"remove": "Remove {repo}",
|
|
840
|
+
"connectFirst": "Connect GitHub to attach reference repositories.",
|
|
841
|
+
"hint": "The document writer clones these read-only to reuse existing solutions as a reference while drafting. It never changes them."
|
|
836
842
|
}
|
|
837
843
|
},
|
|
838
844
|
"panels": {
|
package/i18n/locales/tr.json
CHANGED
|
@@ -833,6 +833,12 @@
|
|
|
833
833
|
"involvedServicesHint": "Bu göreve doğrudan dahil olan bağlı servisler: her biri görevin kendi servisiyle birlikte geçici bir ortam olarak ayağa kaldırılır ve kodlama ajanı onların depolarında da değişiklik yapabilir.",
|
|
834
834
|
"involvedServicesEmpty": "Bağlı servis yok. Burada seçebilmek için servis çerçevesinde servisleri bağlayın.",
|
|
835
835
|
"involvedServiceStale": "Artık bu görevin servisine bağlı değil; bir sonraki değişiklikte kaldırılacak."
|
|
836
|
+
},
|
|
837
|
+
"referenceRepos": {
|
|
838
|
+
"title": "Reference repositories",
|
|
839
|
+
"remove": "Remove {repo}",
|
|
840
|
+
"connectFirst": "Connect GitHub to attach reference repositories.",
|
|
841
|
+
"hint": "The document writer clones these read-only to reuse existing solutions as a reference while drafting. It never changes them."
|
|
836
842
|
}
|
|
837
843
|
},
|
|
838
844
|
"panels": {
|
package/i18n/locales/uk.json
CHANGED
|
@@ -833,6 +833,12 @@
|
|
|
833
833
|
"involvedServicesHint": "З'єднані сервіси, безпосередньо залучені до цього завдання: кожен розгортається як тимчасове середовище поряд із власним сервісом завдання, і агент кодування може змінювати також їхні репозиторії.",
|
|
834
834
|
"involvedServicesEmpty": "Немає з'єднаних сервісів. З'єднайте сервіси на рамці сервісу, щоб вибрати їх тут.",
|
|
835
835
|
"involvedServiceStale": "Більше не з'єднаний із сервісом цього завдання; буде видалений під час наступної зміни."
|
|
836
|
+
},
|
|
837
|
+
"referenceRepos": {
|
|
838
|
+
"title": "Reference repositories",
|
|
839
|
+
"remove": "Remove {repo}",
|
|
840
|
+
"connectFirst": "Connect GitHub to attach reference repositories.",
|
|
841
|
+
"hint": "The document writer clones these read-only to reuse existing solutions as a reference while drafting. It never changes them."
|
|
836
842
|
}
|
|
837
843
|
},
|
|
838
844
|
"panels": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.95.0",
|
|
4
4
|
"description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"valibot": "^1.4.2",
|
|
35
35
|
"vue": "3.5.39",
|
|
36
36
|
"wretch": "^3.0.9",
|
|
37
|
-
"@cat-factory/contracts": "0.
|
|
37
|
+
"@cat-factory/contracts": "0.104.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@toad-contracts/testing": "0.3.2",
|