@cat-factory/app 0.300.1 → 0.301.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.
Files changed (41) hide show
  1. package/README.md +21 -0
  2. package/app/components/assistant/AssistantModal.logic.spec.ts +129 -1
  3. package/app/components/assistant/AssistantModal.logic.ts +83 -1
  4. package/app/components/assistant/AssistantModal.vue +124 -17
  5. package/app/components/board/AddTaskModal.vue +1 -2
  6. package/app/components/board/CreateInitiativeModal.vue +2 -3
  7. package/app/components/board/RecurringPipelineModal.vue +1 -2
  8. package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
  9. package/app/components/documents/StartFromDesignModal.vue +1 -2
  10. package/app/components/layout/CommandBar.vue +1 -2
  11. package/app/components/panels/inspector/ServiceTestingContext.logic.spec.ts +38 -0
  12. package/app/components/panels/inspector/ServiceTestingContext.logic.ts +37 -0
  13. package/app/components/panels/inspector/ServiceTestingContext.vue +141 -0
  14. package/app/components/pipeline/PipelineBuilder.vue +6 -6
  15. package/app/components/providers/PersonalCredentialModal.vue +3 -3
  16. package/app/components/tasks/BugHuntModal.vue +1 -2
  17. package/app/components/tasks/TaskImportModal.vue +5 -7
  18. package/app/components/tasks/TaskSourceConnectModal.vue +2 -2
  19. package/app/composables/api/assistant.ts +5 -3
  20. package/app/composables/useArtifactBlobs.ts +2 -1
  21. package/app/composables/useModalOpen.spec.ts +51 -0
  22. package/app/composables/useModalOpen.ts +31 -0
  23. package/app/modular/panels/inspector.logic.spec.ts +3 -0
  24. package/app/modular/panels/inspector.logic.ts +5 -0
  25. package/app/modular/panels/inspector.ts +2 -0
  26. package/app/stores/assistant.spec.ts +183 -0
  27. package/app/stores/assistant.ts +83 -7
  28. package/app/types/domain.ts +4 -0
  29. package/app/types/load-state.ts +18 -0
  30. package/app/utils/catalog.ts +21 -0
  31. package/i18n/locales/de.json +14 -0
  32. package/i18n/locales/en.json +23 -0
  33. package/i18n/locales/es.json +14 -0
  34. package/i18n/locales/fr.json +14 -0
  35. package/i18n/locales/he.json +14 -0
  36. package/i18n/locales/it.json +14 -0
  37. package/i18n/locales/ja.json +14 -0
  38. package/i18n/locales/pl.json +14 -0
  39. package/i18n/locales/tr.json +14 -0
  40. package/i18n/locales/uk.json +14 -0
  41. package/package.json +2 -2
@@ -1,8 +1,20 @@
1
1
  import { defineStore } from 'pinia'
2
2
  import { computed, ref } from 'vue'
3
3
  import type { AssistantAnswer, AssistantCapability, AssistantTurn } from '~/types/domain'
4
+ import type { LoadState } from '~/types/load-state'
4
5
  import { useWorkspaceStore } from '~/stores/workspace'
5
6
 
7
+ /**
8
+ * How long the capability read waits before it counts as failed.
9
+ *
10
+ * The shared client sets no timeout, so a connection that is accepted and never answered (a proxy
11
+ * holding it open, a wedged worker) leaves the GET pending for ever. Without a deadline that is a
12
+ * modal whose read never settles: no answer, no failure, and therefore no retry either, since the
13
+ * retry lives in what a FAILED read puts on screen. The read itself is a tiny in-memory answer on
14
+ * the backend, so anything past a few seconds is already a connection that is not coming back.
15
+ */
16
+ const CAPABILITY_DEADLINE_MS = 10_000
17
+
6
18
  /**
7
19
  * In-app assistant state: what this deployment's assistant can do, and the last turn's outcome.
8
20
  *
@@ -11,25 +23,78 @@ import { useWorkspaceStore } from '~/stores/workspace'
11
23
  * live stream like any other, so the frame or task shows up without this store touching the board).
12
24
  * Keeping a transcript would be a second, staler record of changes the board already carries.
13
25
  *
14
- * Failures are NOT held here: every refusal a turn can raise is a `DomainError` the shared error
15
- * funnel (`usePipelineErrorToast`) already renders translated, copyable and with its request id.
16
- * The three OUTCOMES are the ones this store keeps, because they are answers rather than errors.
26
+ * Failures of a TURN are not held here: every refusal a turn can raise is a `DomainError` the
27
+ * shared error funnel (`usePipelineErrorToast`) already renders translated, copyable and with its
28
+ * request id. The three OUTCOMES are the ones this store keeps, because they are answers rather
29
+ * than errors. A failed capability READ is the exception, and it is state rather than a throw: see
30
+ * `loadCapability`.
17
31
  */
18
32
  export const useAssistantStore = defineStore('assistant', () => {
19
33
  const api = useApi()
20
34
  const workspace = useWorkspaceStore()
21
35
 
22
36
  const capability = ref<AssistantCapability | null>(null)
37
+ const capabilityRead = ref<LoadState>('idle')
23
38
  const turn = ref<AssistantTurn | null>(null)
24
39
  const running = ref(false)
25
40
 
26
- /** Whether a model is wired at all; unknown (not yet read) reads as unavailable. */
41
+ /**
42
+ * How many reads have STARTED. Compared before every write, so two overlapping reads settle in
43
+ * the order they were ISSUED rather than the order they answer: a slow success that lands after
44
+ * the fast failure that superseded it would otherwise re-offer the box on the older answer.
45
+ */
46
+ let reads = 0
47
+
48
+ /** Whether a model is wired at all. Only meaningful once `capabilityRead` says `ready`. */
27
49
  const available = computed(() => capability.value?.available === true)
28
50
  const actions = computed(() => capability.value?.actions ?? [])
29
51
 
30
- /** Read what the assistant can do here. Idempotent: re-reading replaces the answer. */
52
+ /**
53
+ * Read what the assistant can do here. Idempotent: re-reading replaces the answer.
54
+ *
55
+ * A re-read KEEPS the answer it already has while it is in flight, so the surface stays on the
56
+ * fact it can already state instead of dropping back to a spinner every time the modal is
57
+ * re-opened. Only a failure clears it, because a deployment's model may have gone away with
58
+ * whatever took the endpoint down.
59
+ *
60
+ * The failure is recorded, not thrown. It is reported in place: `error` is what puts the
61
+ * explanation and the retry button on screen, and toasting it as well would stack a second,
62
+ * non-dismissing copy of the same sentence over the panel that already says it, once per retry.
63
+ */
31
64
  async function loadCapability(): Promise<void> {
32
- capability.value = await api.getAssistantCapability(workspace.requireId())
65
+ const read = ++reads
66
+ capabilityRead.value = 'loading'
67
+ try {
68
+ const answer = await withDeadline((signal) =>
69
+ api.getAssistantCapability(workspace.requireId(), signal),
70
+ )
71
+ if (read !== reads) return
72
+ capability.value = answer
73
+ capabilityRead.value = 'ready'
74
+ } catch {
75
+ if (read !== reads) return
76
+ capability.value = null
77
+ capabilityRead.value = 'error'
78
+ }
79
+ }
80
+
81
+ /** Read under {@link CAPABILITY_DEADLINE_MS}, ABORTING the request when it expires. */
82
+ async function withDeadline(
83
+ send: (signal: AbortSignal) => Promise<AssistantCapability>,
84
+ ): Promise<AssistantCapability> {
85
+ const controller = new AbortController()
86
+ let timer: ReturnType<typeof setTimeout> | undefined
87
+ try {
88
+ return await new Promise<AssistantCapability>((resolve, reject) => {
89
+ timer = setTimeout(() => {
90
+ controller.abort()
91
+ reject(new Error(`Assistant capability read timed out after ${CAPABILITY_DEADLINE_MS}ms`))
92
+ }, CAPABILITY_DEADLINE_MS)
93
+ send(controller.signal).then(resolve, reject)
94
+ })
95
+ } finally {
96
+ clearTimeout(timer)
97
+ }
33
98
  }
34
99
 
35
100
  /**
@@ -65,5 +130,16 @@ export const useAssistantStore = defineStore('assistant', () => {
65
130
  turn.value = null
66
131
  }
67
132
 
68
- return { capability, turn, running, available, actions, loadCapability, run, answer, reset }
133
+ return {
134
+ capability,
135
+ capabilityRead,
136
+ turn,
137
+ running,
138
+ available,
139
+ actions,
140
+ loadCapability,
141
+ run,
142
+ answer,
143
+ reset,
144
+ }
69
145
  })
@@ -125,6 +125,10 @@ import type { AgentCategory, AgentKind, AgentTier, PipelinePurpose } from '@cat-
125
125
  // single source of truth lives in the contracts package.
126
126
  export { DOC_KINDS, DOC_KIND_FIELDS } from '@cat-factory/contracts'
127
127
 
128
+ // The assistant's prompt cap is a runtime value too: the box states the limit and refuses a
129
+ // submission over it, and the wire schema holds the same number.
130
+ export { ASSISTANT_PROMPT_MAX } from '@cat-factory/contracts'
131
+
128
132
  /** A draggable agent definition shown in the agent palette. Frontend-only. */
129
133
  export interface AgentArchetype {
130
134
  kind: AgentKind
@@ -0,0 +1,18 @@
1
+ /**
2
+ * How far a read has got: the SPA's one vocabulary for load progress.
3
+ *
4
+ * Four states rather than a nullable value, because an absent value is not a single fact. "Nobody
5
+ * asked", "the read is in flight" and "the read failed" need three different answers on screen and
6
+ * only the middle one is temporary; collapsed into one `null` they all render as whatever the
7
+ * surface shows for "no data", which is usually the empty state and is wrong for two of them.
8
+ *
9
+ * A REFRESH is deliberately not a fifth member. A read that already has an answer keeps it, so a
10
+ * surface asking "what do I show" reads the value it holds and a surface asking "is something in
11
+ * flight" reads `loading`; a re-read that downgraded the surface to `loading` would replace a
12
+ * usable panel with a spinner for a fact it can already state.
13
+ *
14
+ * A status carrying a member this does not have keeps its own type (`NotificationSettingsStatus`
15
+ * distinguishes "the deployment does not offer this" from a failure, which is a fifth fact rather
16
+ * than a renaming of one of these four).
17
+ */
18
+ export type LoadState = 'idle' | 'loading' | 'ready' | 'error'
@@ -862,6 +862,24 @@ export const SYSTEM_AGENT_META: Record<string, AgentArchetype> = {
862
862
  description:
863
863
  'Grades each completed agent step (smooth vs chaotic) after a run and recommends prompt/model improvements.',
864
864
  },
865
+ // The in-app assistant routes ONE typed sentence to one action from a closed catalog. Not a
866
+ // pipeline step (it declares no `category`, so it is never in the palette), but it runs an LLM
867
+ // on every request, so it needs display metadata here and a per-workspace model in Model
868
+ // Configuration. Without an entry it inherits the preset's base model like any unnamed kind,
869
+ // which is the right default; what it lacked was the row an operator pins a different one on,
870
+ // and a label anywhere a spend rollup names the kind that spent it.
871
+ assistant: {
872
+ kind: 'assistant',
873
+ // Intermediate, not advanced like `kaizen`: the assistant is a surface a person OPENS and
874
+ // spends on deliberately, several times a day, where Kaizen grades in the background on its
875
+ // own schedule. A kind whose cost someone can feel should not sit two levels down.
876
+ tier: 'intermediate',
877
+ label: 'Assistant',
878
+ icon: 'i-lucide-sparkles',
879
+ color: '#38bdf8',
880
+ description:
881
+ 'Routes a typed request to one action the platform performs on the board (declare a dependency, add a service from a repository, file a task from a tracker issue).',
882
+ },
865
883
  // A polling gate (no model of its own) that watches the released PR's observability
866
884
  // signals after merge and escalates to the on-call agent on a regression. NOT in any
867
885
  // default pipeline and NOT a standing palette archetype — the palette surfaces it
@@ -913,6 +931,9 @@ export const MODEL_CONFIGURABLE_SYSTEM_KINDS: AgentArchetype[] = [
913
931
  // The PR-review Challenge Investigator — pinnable to its own (stronger) model, separately
914
932
  // from the reviewer that produced the findings.
915
933
  'challenge-investigator',
934
+ // The in-app assistant: one inline model call per typed request, on the workspace's preset
935
+ // like every other kind, and pinnable away from it here.
936
+ 'assistant',
916
937
  ].map((kind) => SYSTEM_AGENT_META[kind]!),
917
938
  // Companions run LLMs but aren't palette-addable (they're producer toggles), so include
918
939
  // them here to keep their per-workspace default model pinnable in the Model Defaults panel.
@@ -1596,6 +1596,16 @@
1596
1596
  "configNoun": "die sensiblen Test-Anmeldedaten",
1597
1597
  "duplicateKey": "Jeder Variablenname muss eindeutig sein."
1598
1598
  },
1599
+ "testingContext": {
1600
+ "title": "Testkontext",
1601
+ "sectionHint": "Freitext dazu, wie dieser Service getestet wird: welche Abläufe wichtig sind, welche Testkonten es gibt und wie man sich damit anmeldet, was die eingespielten Daten bedeuten, was unangetastet bleiben soll. Jeder Tester-Lauf für diesen Service bekommt diesen Text wörtlich, der Probelauf der Umgebung ebenso.",
1602
+ "notSecret": "Dieser Text geht unverändert in den Prompt des Testers. Echte Geheimnisse gehören nicht hierher: Trage sie oben unter „Test-Anmeldedaten“ ein und verweise hier nur über den Variablennamen darauf.",
1603
+ "placeholder": "z. B. als $DEMO_USER anmelden; der eingespielte Mandant ist Acme mit drei Projekten; den Abrechnungsablauf nie ausführen, er belastet eine echte Karte.",
1604
+ "length": "{count} von {max} Zeichen",
1605
+ "save": "Testkontext speichern",
1606
+ "revert": "Änderungen verwerfen",
1607
+ "savedToast": "Testkontext gespeichert"
1608
+ },
1599
1609
  "testConfig": {
1600
1610
  "title": "Testinfrastruktur",
1601
1611
  "hint": "Wie eine Testumgebung für diesen Service aufgesetzt wird, wenn eine Pipeline ihn ausführen muss: keine Infrastruktur, eine Docker-Compose-Datei, Kubernetes-Manifeste oder ein benutzerdefinierter Manifesttyp.",
@@ -4520,9 +4530,13 @@
4520
4530
  "title": "Assistent",
4521
4531
  "intro": "Beschreiben Sie, was erledigt werden soll, und der Assistent führt es auf dem Board aus: eine Abhängigkeit zwischen zwei Services erklären, einen Service über eine Repository-URL hinzufügen oder eine Aufgabe aus einem Tracker-Ticket anlegen.",
4522
4532
  "unavailable": "Für diese Installation ist kein Modell konfiguriert, daher kann der Assistent keine Anfrage lesen. Richten Sie einen Modellanbieter ein, um ihn zu aktivieren.",
4533
+ "reading": "Es wird geprüft, was der Assistent hier tun kann…",
4534
+ "unreadable": "Es konnte nicht geprüft werden, was der Assistent hier tun kann, daher ist das Anfragefeld vorerst ausgeblendet. Versuche es in einem Moment erneut.",
4535
+ "noActions": "Für den Assistenten dieser Installation sind keine Aktionen konfiguriert, daher kann er nichts ausführen. Konfigurieren Sie seine Aktionen, um ihn zu aktivieren.",
4523
4536
  "placeholder": "z. B. der Checkout-Service hängt vom Payments-Service ab",
4524
4537
  "submit": "Ausführen",
4525
4538
  "submitHint": "Strg+Enter, auf dem Mac Cmd+Enter",
4539
+ "tooLong": "Diese Anfrage hat {length} Zeichen, der Assistent liest höchstens {limit}. Kürze sie und starte erneut.",
4526
4540
  "examplesTitle": "Das können Sie fragen",
4527
4541
  "showOnBoard": "Auf dem Board zeigen",
4528
4542
  "declined": "Keine Aktion des Assistenten passt zu dieser Anfrage. Er kann eine Abhängigkeit zwischen zwei Services erklären, einen Service über eine Repository-URL hinzufügen oder eine Aufgabe aus einem Tracker-Ticket anlegen.",
@@ -1147,6 +1147,22 @@
1147
1147
  "configNoun": "the sensitive test credentials",
1148
1148
  "duplicateKey": "Each variable name must be unique."
1149
1149
  },
1150
+ "testingContext": {
1151
+ "title": "Testing context",
1152
+ "@title": {
1153
+ "description": "Section header for the freeform notes a team writes about how their service should be tested. 'Context' here means background information for whoever tests it, not a programming context object."
1154
+ },
1155
+ "sectionHint": "Freeform notes about how this service is tested: which flows matter, which test accounts exist and how to sign in as one, what the seeded data means, what to leave alone. Every tester run for this service is handed this text word for word, and so is the environment dry run.",
1156
+ "notSecret": "This text goes straight into the tester's prompt, so keep real secrets out of it. Put a secret in Test credentials above and refer to it here by its variable name.",
1157
+ "placeholder": "e.g. sign in as $DEMO_USER; the seeded tenant is Acme with three projects; never run the billing flow, it charges a real card.",
1158
+ "length": "{count} of {max} characters",
1159
+ "@length": {
1160
+ "description": "Character counter under a long text box. {count} is how many characters are typed so far, {max} the limit."
1161
+ },
1162
+ "save": "Save testing context",
1163
+ "revert": "Discard changes",
1164
+ "savedToast": "Testing context saved"
1165
+ },
1150
1166
  "testConfig": {
1151
1167
  "title": "Test infrastructure",
1152
1168
  "hint": "How a test environment is stood up for this service when a pipeline needs to run it: no infrastructure, a Docker Compose file, Kubernetes manifests, or a custom manifest type.",
@@ -5216,9 +5232,16 @@
5216
5232
  "title": "Assistant",
5217
5233
  "intro": "Describe what you want done and the assistant performs it on the board: declare a dependency between two services, add a service from a repository URL, or file a task from a tracker issue.",
5218
5234
  "unavailable": "No model is configured on this deployment, so the assistant cannot read a request. Configure a model provider to enable it.",
5235
+ "reading": "Checking what the assistant can do here…",
5236
+ "unreadable": "Could not check what the assistant can do here, so the request box is hidden for now. Try again in a moment.",
5237
+ "noActions": "This deployment's assistant has no actions configured, so there is nothing it can perform. Configure its actions to enable it.",
5238
+ "@noActions": {
5239
+ "description": "Shown in place of the request box when the deployment wired a model but registered no ACTIONS for the assistant to choose from: the operations it can perform on the board, not buttons in the interface. Distinct from the no-model case above."
5240
+ },
5219
5241
  "placeholder": "e.g. the checkout service depends on the payments service",
5220
5242
  "submit": "Run",
5221
5243
  "submitHint": "Ctrl+Enter, or Cmd+Enter on a Mac",
5244
+ "tooLong": "That request is {length} characters and the assistant reads up to {limit}. Shorten it and run again.",
5222
5245
  "examplesTitle": "What you can ask",
5223
5246
  "showOnBoard": "Show on board",
5224
5247
  "declined": "None of the assistant's actions match that request. It can declare a dependency between two services, add a service from a repository URL, or file a task from a tracker issue.",
@@ -1051,6 +1051,16 @@
1051
1051
  "configNoun": "las credenciales de prueba sensibles",
1052
1052
  "duplicateKey": "Cada nombre de variable debe ser único."
1053
1053
  },
1054
+ "testingContext": {
1055
+ "title": "Contexto de pruebas",
1056
+ "sectionHint": "Notas libres sobre cómo se prueba este servicio: qué flujos importan, qué cuentas de prueba existen y cómo iniciar sesión con ellas, qué significan los datos precargados y qué no hay que tocar. Cada ejecución del Tester para este servicio recibe este texto tal cual, igual que la prueba en seco del entorno.",
1057
+ "notSecret": "Este texto se envía tal cual al prompt del Tester, así que no pongas secretos reales aquí. Guárdalos arriba, en «Credenciales de prueba», y menciónalos aquí solo por el nombre de la variable.",
1058
+ "placeholder": "p. ej. inicia sesión como $DEMO_USER; el inquilino precargado es Acme con tres proyectos; nunca ejecutes el flujo de facturación, cobra a una tarjeta real.",
1059
+ "length": "{count} de {max} caracteres",
1060
+ "save": "Guardar contexto de pruebas",
1061
+ "revert": "Descartar cambios",
1062
+ "savedToast": "Contexto de pruebas guardado"
1063
+ },
1054
1064
  "testConfig": {
1055
1065
  "title": "Infraestructura de pruebas",
1056
1066
  "hint": "Cómo se levanta un entorno de prueba para este servicio cuando un pipeline necesita ejecutarlo: sin infraestructura, un archivo de Docker Compose, manifiestos de Kubernetes o un tipo de manifiesto personalizado.",
@@ -5031,9 +5041,13 @@
5031
5041
  "title": "Asistente",
5032
5042
  "intro": "Describe lo que quieres hacer y el asistente lo ejecuta en el tablero: declarar una dependencia entre dos servicios, añadir un servicio a partir de la URL de un repositorio o crear una tarea desde una incidencia del rastreador.",
5033
5043
  "unavailable": "Este despliegue no tiene ningún modelo configurado, así que el asistente no puede leer una petición. Configura un proveedor de modelos para habilitarlo.",
5044
+ "reading": "Comprobando qué puede hacer el asistente aquí…",
5045
+ "unreadable": "No se pudo comprobar qué puede hacer el asistente aquí, así que por ahora el cuadro de solicitud está oculto. Vuelve a intentarlo en un momento.",
5046
+ "noActions": "El asistente de este despliegue no tiene ninguna acción configurada, así que no puede realizar nada. Configura sus acciones para habilitarlo.",
5034
5047
  "placeholder": "p. ej. el servicio de checkout depende del servicio de pagos",
5035
5048
  "submit": "Ejecutar",
5036
5049
  "submitHint": "Ctrl+Intro, o Cmd+Intro en un Mac",
5050
+ "tooLong": "Esa solicitud tiene {length} caracteres y el asistente lee hasta {limit}. Acórtala y vuelve a ejecutarla.",
5037
5051
  "examplesTitle": "Qué puedes pedir",
5038
5052
  "showOnBoard": "Ver en el tablero",
5039
5053
  "declined": "Ninguna acción del asistente encaja con esa petición. Puede declarar una dependencia entre dos servicios, añadir un servicio a partir de la URL de un repositorio o crear una tarea desde una incidencia del rastreador.",
@@ -1051,6 +1051,16 @@
1051
1051
  "configNoun": "les identifiants de test sensibles",
1052
1052
  "duplicateKey": "Chaque nom de variable doit être unique."
1053
1053
  },
1054
+ "testingContext": {
1055
+ "title": "Contexte de test",
1056
+ "sectionHint": "Notes libres sur la façon de tester ce service : quels parcours comptent, quels comptes de test existent et comment s'y connecter, ce que signifient les données préchargées, ce qu'il ne faut pas toucher. Chaque exécution du testeur pour ce service reçoit ce texte mot pour mot, tout comme l'essai à blanc de l'environnement.",
1057
+ "notSecret": "Ce texte part tel quel dans l'invite du testeur : n'y mettez pas de véritables secrets. Saisissez-les au-dessus, dans « Identifiants de test », et n'y faites référence ici que par le nom de la variable.",
1058
+ "placeholder": "ex. connectez-vous en tant que $DEMO_USER ; le locataire préchargé est Acme avec trois projets ; ne lancez jamais le parcours de facturation, il débite une vraie carte.",
1059
+ "length": "{count} sur {max} caractères",
1060
+ "save": "Enregistrer le contexte de test",
1061
+ "revert": "Annuler les modifications",
1062
+ "savedToast": "Contexte de test enregistré"
1063
+ },
1054
1064
  "testConfig": {
1055
1065
  "title": "Infrastructure de test",
1056
1066
  "hint": "Comment un environnement de test est mis en place pour ce service quand un pipeline doit l'exécuter : sans infrastructure, un fichier Docker Compose, des manifestes Kubernetes ou un type de manifeste personnalisé.",
@@ -5031,9 +5041,13 @@
5031
5041
  "title": "Assistant",
5032
5042
  "intro": "Décrivez ce que vous voulez faire et l'assistant l'exécute sur le tableau : déclarer une dépendance entre deux services, ajouter un service à partir de l'URL d'un dépôt, ou créer une tâche à partir d'un ticket.",
5033
5043
  "unavailable": "Aucun modèle n'est configuré sur ce déploiement, l'assistant ne peut donc pas lire une demande. Configurez un fournisseur de modèles pour l'activer.",
5044
+ "reading": "Vérification de ce que l'assistant peut faire ici…",
5045
+ "unreadable": "Impossible de vérifier ce que l'assistant peut faire ici, le champ de demande est donc masqué pour l'instant. Réessayez dans un instant.",
5046
+ "noActions": "Aucune action n'est configurée pour l'assistant de ce déploiement, il ne peut donc rien exécuter. Configurez ses actions pour l'activer.",
5034
5047
  "placeholder": "ex. le service checkout dépend du service paiements",
5035
5048
  "submit": "Exécuter",
5036
5049
  "submitHint": "Ctrl+Entrée, ou Cmd+Entrée sur un Mac",
5050
+ "tooLong": "Cette demande fait {length} caractères et l'assistant en lit {limit} au maximum. Raccourcissez-la puis relancez.",
5037
5051
  "examplesTitle": "Ce que vous pouvez demander",
5038
5052
  "showOnBoard": "Afficher sur le tableau",
5039
5053
  "declined": "Aucune action de l'assistant ne correspond à cette demande. Il peut déclarer une dépendance entre deux services, ajouter un service à partir de l'URL d'un dépôt, ou créer une tâche à partir d'un ticket.",
@@ -1051,6 +1051,16 @@
1051
1051
  "configNoun": "פרטי הגישה הרגישים לבדיקה",
1052
1052
  "duplicateKey": "כל שם משתנה חייב להיות ייחודי."
1053
1053
  },
1054
+ "testingContext": {
1055
+ "title": "הקשר לבדיקות",
1056
+ "sectionHint": "טקסט חופשי על אופן הבדיקה של השירות הזה: אילו תהליכים חשובים, אילו חשבונות בדיקה קיימים וכיצד מתחברים איתם, מה המשמעות של הנתונים שנטענו ובמה אסור לגעת. כל הרצת בודק עבור השירות הזה מקבלת את הטקסט הזה מילה במילה, וכך גם הרצת היבש של הסביבה.",
1057
+ "notSecret": "הטקסט הזה נכנס כמו שהוא לפרומפט של הבודק, ולכן אין לכתוב בו סודות אמיתיים. שמרו אותם למעלה, תחת «פרטי גישה לבדיקה», והזכירו אותם כאן רק בשם המשתנה.",
1058
+ "placeholder": "לדוגמה: התחברו כ-$DEMO_USER; הדייר שנטען הוא Acme עם שלושה פרויקטים; לעולם אל תריצו את תהליך החיוב, הוא מחייב כרטיס אמיתי.",
1059
+ "length": "{count} מתוך {max} תווים",
1060
+ "save": "שמירת ההקשר לבדיקות",
1061
+ "revert": "ביטול השינויים",
1062
+ "savedToast": "ההקשר לבדיקות נשמר"
1063
+ },
1054
1064
  "testConfig": {
1055
1065
  "title": "תשתית בדיקות",
1056
1066
  "hint": "כיצד מוקמת סביבת בדיקה לשירות זה כאשר פייפליין צריך להריץ אותו: ללא תשתית, קובץ Docker Compose, מניפסטים של Kubernetes או סוג מניפסט מותאם אישית.",
@@ -5031,9 +5041,13 @@
5031
5041
  "title": "עוזר",
5032
5042
  "intro": "תארו מה צריך לקרות והעוזר יבצע זאת על הלוח: להצהיר על תלות בין שני שירותים, להוסיף שירות מכתובת מאגר או לפתוח משימה מתקלה במעקב.",
5033
5043
  "unavailable": "לא הוגדר מודל בפריסה הזו, לכן העוזר אינו יכול לקרוא בקשה. הגדירו ספק מודלים כדי להפעיל אותו.",
5044
+ "reading": "בודקים מה העוזר יכול לעשות כאן…",
5045
+ "unreadable": "לא הצלחנו לבדוק מה העוזר יכול לעשות כאן, ולכן שדה הבקשה מוסתר בשלב זה. נסו שוב בעוד רגע.",
5046
+ "noActions": "לא הוגדרו פעולות לעוזר בפריסה הזו, ולכן אין לו מה לבצע. הגדירו את הפעולות שלו כדי להפעיל אותו.",
5034
5047
  "placeholder": "למשל: שירות ה-checkout תלוי בשירות התשלומים",
5035
5048
  "submit": "הרץ",
5036
5049
  "submitHint": "Ctrl+Enter, וב-Mac Cmd+Enter",
5050
+ "tooLong": "הבקשה הזאת באורך {length} תווים, והעוזר קורא עד {limit}. קצרו אותה והפעילו שוב.",
5037
5051
  "examplesTitle": "מה אפשר לבקש",
5038
5052
  "showOnBoard": "הצג על הלוח",
5039
5053
  "declined": "אף פעולה של העוזר אינה מתאימה לבקשה הזו. הוא יכול להצהיר על תלות בין שני שירותים, להוסיף שירות מכתובת מאגר או לפתוח משימה מתקלה במעקב.",
@@ -1596,6 +1596,16 @@
1596
1596
  "configNoun": "le credenziali di test sensibili",
1597
1597
  "duplicateKey": "Ogni nome di variabile deve essere univoco."
1598
1598
  },
1599
+ "testingContext": {
1600
+ "title": "Contesto di test",
1601
+ "sectionHint": "Note libere su come si testa questo servizio: quali flussi contano, quali account di prova esistono e come accedervi, che cosa significano i dati precaricati, che cosa non va toccato. Ogni esecuzione del Tester per questo servizio riceve questo testo alla lettera, così come la prova a vuoto dell'ambiente.",
1602
+ "notSecret": "Questo testo finisce così com'è nel prompt del Tester, quindi non inserirci segreti veri. Mettili sopra, in «Credenziali di test», e qui richiamali solo con il nome della variabile.",
1603
+ "placeholder": "es. accedi come $DEMO_USER; il tenant precaricato è Acme con tre progetti; non eseguire mai il flusso di fatturazione, addebita una carta vera.",
1604
+ "length": "{count} di {max} caratteri",
1605
+ "save": "Salva il contesto di test",
1606
+ "revert": "Annulla le modifiche",
1607
+ "savedToast": "Contesto di test salvato"
1608
+ },
1599
1609
  "testConfig": {
1600
1610
  "title": "Infrastruttura di test",
1601
1611
  "hint": "Come viene predisposto un ambiente di test per questo servizio quando una pipeline deve eseguirlo: nessuna infrastruttura, un file Docker Compose, manifest Kubernetes, o un tipo di manifest personalizzato.",
@@ -4520,9 +4530,13 @@
4520
4530
  "title": "Assistente",
4521
4531
  "intro": "Descrivi cosa vuoi fare e l'assistente lo esegue sulla bacheca: dichiarare una dipendenza fra due servizi, aggiungere un servizio dall'URL di un repository o creare un'attività da una segnalazione del tracker.",
4522
4532
  "unavailable": "Questo deployment non ha un modello configurato, quindi l'assistente non può leggere una richiesta. Configura un provider di modelli per abilitarlo.",
4533
+ "reading": "Verifica di ciò che l'assistente può fare qui…",
4534
+ "unreadable": "Non è stato possibile verificare ciò che l'assistente può fare qui, quindi per ora il campo della richiesta è nascosto. Riprova tra un momento.",
4535
+ "noActions": "L'assistente di questo deployment non ha azioni configurate, quindi non può eseguire nulla. Configura le sue azioni per abilitarlo.",
4523
4536
  "placeholder": "es. il servizio checkout dipende dal servizio pagamenti",
4524
4537
  "submit": "Esegui",
4525
4538
  "submitHint": "Ctrl+Invio, oppure Cmd+Invio su Mac",
4539
+ "tooLong": "Questa richiesta ha {length} caratteri e l'assistente ne legge al massimo {limit}. Accorciala ed esegui di nuovo.",
4526
4540
  "examplesTitle": "Cosa puoi chiedere",
4527
4541
  "showOnBoard": "Mostra sulla bacheca",
4528
4542
  "declined": "Nessuna azione dell'assistente corrisponde a questa richiesta. Può dichiarare una dipendenza fra due servizi, aggiungere un servizio dall'URL di un repository o creare un'attività da una segnalazione del tracker.",
@@ -1051,6 +1051,16 @@
1051
1051
  "configNoun": "機密のテスト用認証情報",
1052
1052
  "duplicateKey": "変数名はそれぞれ一意である必要があります。"
1053
1053
  },
1054
+ "testingContext": {
1055
+ "title": "テストの前提情報",
1056
+ "sectionHint": "このサービスをどうテストするかについての自由記述です。重要なフロー、用意されているテストアカウントとそのログイン方法、投入済みデータの意味、触れてはいけない箇所などを書きます。このサービスのテスターは毎回この文章をそのまま渡され、環境のドライランでも同じ文章が使われます。",
1057
+ "notSecret": "この文章はそのままテスターのプロンプトに入ります。本物の秘密情報は書かないでください。秘密情報は上の「テスト用認証情報」に登録し、ここでは変数名だけで参照してください。",
1058
+ "placeholder": "例: $DEMO_USER でログインする。投入済みのテナントは Acme で、プロジェクトが 3 件ある。課金フローは実際のカードに請求されるので絶対に実行しない。",
1059
+ "length": "{max} 文字中 {count} 文字",
1060
+ "save": "前提情報を保存",
1061
+ "revert": "変更を破棄",
1062
+ "savedToast": "テストの前提情報を保存しました"
1063
+ },
1054
1064
  "testConfig": {
1055
1065
  "title": "テストインフラ",
1056
1066
  "hint": "パイプラインがこのサービスを実行する必要があるときに、テスト環境をどう立ち上げるか: インフラなし、Docker Compose ファイル、Kubernetes マニフェスト、またはカスタムマニフェストタイプ。",
@@ -5031,9 +5041,13 @@
5031
5041
  "title": "アシスタント",
5032
5042
  "intro": "やりたいことを書くと、アシスタントがボード上で実行します。サービス間の依存関係の宣言、リポジトリ URL からのサービス追加、トラッカーのイシューからのタスク作成ができます。",
5033
5043
  "unavailable": "このデプロイメントにはモデルが設定されていないため、アシスタントは依頼を読み取れません。モデルプロバイダーを設定して有効にしてください。",
5044
+ "reading": "ここでアシスタントに何ができるかを確認しています…",
5045
+ "unreadable": "ここでアシスタントに何ができるかを確認できなかったため、入力欄はいまは表示されません。少し待ってからもう一度お試しください。",
5046
+ "noActions": "このデプロイメントのアシスタントにはアクションが設定されていないため、実行できる操作がありません。アクションを設定して有効にしてください。",
5034
5047
  "placeholder": "例: checkout サービスは payments サービスに依存している",
5035
5048
  "submit": "実行",
5036
5049
  "submitHint": "Ctrl+Enter、Mac では Cmd+Enter",
5050
+ "tooLong": "このリクエストは {length} 文字ですが、アシスタントが読めるのは {limit} 文字までです。短くしてから実行してください。",
5037
5051
  "examplesTitle": "依頼できること",
5038
5052
  "showOnBoard": "ボードで表示",
5039
5053
  "declined": "この依頼に合う操作はありません。アシスタントができるのは、2 つのサービス間の依存関係の宣言、リポジトリ URL からのサービス追加、トラッカーのイシューからのタスク作成です。",
@@ -1051,6 +1051,16 @@
1051
1051
  "configNoun": "wrażliwe poświadczenia testowe",
1052
1052
  "duplicateKey": "Każda nazwa zmiennej musi być unikalna."
1053
1053
  },
1054
+ "testingContext": {
1055
+ "title": "Kontekst testowania",
1056
+ "sectionHint": "Dowolne notatki o tym, jak testuje się tę usługę: które przepływy są ważne, jakie konta testowe istnieją i jak się na nie zalogować, co oznaczają wgrane dane i czego nie ruszać. Każde uruchomienie Testera dla tej usługi dostaje ten tekst dosłownie, tak samo jak próbne uruchomienie środowiska.",
1057
+ "notSecret": "Ten tekst trafia wprost do promptu Testera, więc nie wpisuj tu prawdziwych sekretów. Zapisz je wyżej, w „Poświadczeniach testowych”, i odwołuj się do nich tutaj tylko przez nazwę zmiennej.",
1058
+ "placeholder": "np. zaloguj się jako $DEMO_USER; wgrany najemca to Acme z trzema projektami; nigdy nie uruchamiaj przepływu płatności, obciąża prawdziwą kartę.",
1059
+ "length": "{count} z {max} znaków",
1060
+ "save": "Zapisz kontekst testowania",
1061
+ "revert": "Odrzuć zmiany",
1062
+ "savedToast": "Zapisano kontekst testowania"
1063
+ },
1054
1064
  "testConfig": {
1055
1065
  "title": "Infrastruktura testowa",
1056
1066
  "hint": "Jak stawiane jest środowisko testowe dla tej usługi, gdy potok musi ją uruchomić: bez infrastruktury, plik Docker Compose, manifesty Kubernetes lub niestandardowy typ manifestu.",
@@ -5031,9 +5041,13 @@
5031
5041
  "title": "Asystent",
5032
5042
  "intro": "Opisz, co ma zostać zrobione, a asystent wykona to na tablicy: zadeklaruje zależność między dwiema usługami, doda usługę z adresu repozytorium albo utworzy zadanie ze zgłoszenia w trackerze.",
5033
5043
  "unavailable": "W tym wdrożeniu nie skonfigurowano żadnego modelu, więc asystent nie może odczytać prośby. Skonfiguruj dostawcę modeli, aby go włączyć.",
5044
+ "reading": "Sprawdzamy, co asystent może tu zrobić…",
5045
+ "unreadable": "Nie udało się sprawdzić, co asystent może tu zrobić, więc pole żądania jest na razie ukryte. Spróbuj ponownie za chwilę.",
5046
+ "noActions": "Asystent w tym wdrożeniu nie ma skonfigurowanych żadnych akcji, więc nie może nic wykonać. Skonfiguruj jego akcje, aby go włączyć.",
5034
5047
  "placeholder": "np. usługa checkout zależy od usługi płatności",
5035
5048
  "submit": "Uruchom",
5036
5049
  "submitHint": "Ctrl+Enter, na Macu Cmd+Enter",
5050
+ "tooLong": "To żądanie ma {length} znaków, a asystent czyta najwyżej {limit}. Skróć je i uruchom ponownie.",
5037
5051
  "examplesTitle": "O co możesz poprosić",
5038
5052
  "showOnBoard": "Pokaż na tablicy",
5039
5053
  "declined": "Żadne działanie asystenta nie pasuje do tej prośby. Może zadeklarować zależność między dwiema usługami, dodać usługę z adresu repozytorium albo utworzyć zadanie ze zgłoszenia w trackerze.",
@@ -1051,6 +1051,16 @@
1051
1051
  "configNoun": "hassas test kimlik bilgileri",
1052
1052
  "duplicateKey": "Her değişken adı benzersiz olmalıdır."
1053
1053
  },
1054
+ "testingContext": {
1055
+ "title": "Test bağlamı",
1056
+ "sectionHint": "Bu servisin nasıl test edildiğine dair serbest notlar: hangi akışlar önemli, hangi test hesapları var ve bunlarla nasıl oturum açılır, yüklü veriler ne anlama geliyor, neye dokunulmamalı. Bu servis için her Test Edici çalışması bu metni harfi harfine alır; ortamın deneme çalışması da öyle.",
1057
+ "notSecret": "Bu metin doğrudan Test Edici'nin istemine girer, bu yüzden gerçek sırları buraya yazmayın. Onları yukarıdaki «Test kimlik bilgileri» bölümüne kaydedin ve burada yalnızca değişken adıyla anın.",
1058
+ "placeholder": "ör. $DEMO_USER olarak oturum açın; yüklü kiracı üç projeli Acme'dir; faturalama akışını asla çalıştırmayın, gerçek bir kartı borçlandırır.",
1059
+ "length": "{count} / {max} karakter",
1060
+ "save": "Test bağlamını kaydet",
1061
+ "revert": "Değişiklikleri geri al",
1062
+ "savedToast": "Test bağlamı kaydedildi"
1063
+ },
1054
1064
  "testConfig": {
1055
1065
  "title": "Test altyapısı",
1056
1066
  "hint": "Bir pipeline bu servisi çalıştırmak istediğinde test ortamının nasıl kurulacağı: altyapısız, bir Docker Compose dosyası, Kubernetes manifestoları veya özel bir manifest türü.",
@@ -5031,9 +5041,13 @@
5031
5041
  "title": "Asistan",
5032
5042
  "intro": "Ne yapılmasını istediğinizi yazın, asistan bunu panoda gerçekleştirsin: iki servis arasında bağımlılık tanımlamak, bir depo adresinden servis eklemek ya da bir izleyici kaydından görev oluşturmak.",
5033
5043
  "unavailable": "Bu kurulumda yapılandırılmış bir model yok, bu yüzden asistan isteği okuyamıyor. Etkinleştirmek için bir model sağlayıcısı yapılandırın.",
5044
+ "reading": "Asistanın burada neler yapabileceği denetleniyor…",
5045
+ "unreadable": "Asistanın burada neler yapabileceği denetlenemedi, bu yüzden istek alanı şimdilik gizli. Birazdan yeniden deneyin.",
5046
+ "noActions": "Bu kurulumdaki asistan için yapılandırılmış bir eylem yok, bu yüzden hiçbir şey gerçekleştiremiyor. Etkinleştirmek için eylemlerini yapılandırın.",
5034
5047
  "placeholder": "örn. checkout servisi ödemeler servisine bağlıdır",
5035
5048
  "submit": "Çalıştır",
5036
5049
  "submitHint": "Ctrl+Enter, Mac'te Cmd+Enter",
5050
+ "tooLong": "Bu istek {length} karakter, asistan ise en fazla {limit} karakter okuyor. Kısaltıp yeniden çalıştırın.",
5037
5051
  "examplesTitle": "Neler isteyebilirsiniz",
5038
5052
  "showOnBoard": "Panoda göster",
5039
5053
  "declined": "Asistanın hiçbir eylemi bu istekle eşleşmiyor. İki servis arasında bağımlılık tanımlayabilir, bir depo adresinden servis ekleyebilir ya da bir izleyici kaydından görev oluşturabilir.",
@@ -1051,6 +1051,16 @@
1051
1051
  "configNoun": "конфіденційні тестові облікові дані",
1052
1052
  "duplicateKey": "Кожна назва змінної має бути унікальною."
1053
1053
  },
1054
+ "testingContext": {
1055
+ "title": "Контекст тестування",
1056
+ "sectionHint": "Довільні нотатки про те, як тестують цю службу: які сценарії важливі, які тестові облікові записи існують і як під ними увійти, що означають наповнені дані та чого не чіпати. Кожен запуск Тестувальника для цієї служби отримує цей текст дослівно, так само як і пробний запуск середовища.",
1057
+ "notSecret": "Цей текст потрапляє просто в підказку Тестувальника, тож не пишіть тут справжніх секретів. Зберігайте їх вище, у «Тестових облікових даних», а тут посилайтеся лише на назву змінної.",
1058
+ "placeholder": "напр. увійдіть як $DEMO_USER; наповнений орендар: Acme з трьома проєктами; ніколи не запускайте сценарій оплати, він списує кошти зі справжньої картки.",
1059
+ "length": "{count} з {max} символів",
1060
+ "save": "Зберегти контекст тестування",
1061
+ "revert": "Скасувати зміни",
1062
+ "savedToast": "Контекст тестування збережено"
1063
+ },
1054
1064
  "testConfig": {
1055
1065
  "title": "Тестова інфраструктура",
1056
1066
  "hint": "Як розгортається тестове середовище для цього сервісу, коли конвеєру потрібно його запустити: без інфраструктури, файл Docker Compose, маніфести Kubernetes або власний тип маніфесту.",
@@ -5031,9 +5041,13 @@
5031
5041
  "title": "Асистент",
5032
5042
  "intro": "Опишіть, що потрібно зробити, і асистент виконає це на дошці: оголосить залежність між двома сервісами, додасть сервіс за адресою репозиторію або створить завдання з тікета трекера.",
5033
5043
  "unavailable": "У цьому розгортанні не налаштовано жодної моделі, тому асистент не може прочитати запит. Налаштуйте постачальника моделей, щоб увімкнути його.",
5044
+ "reading": "Перевіряємо, що асистент може зробити тут…",
5045
+ "unreadable": "Не вдалося перевірити, що асистент може зробити тут, тож поле запиту поки приховано. Спробуйте ще раз за мить.",
5046
+ "noActions": "Для асистента в цьому розгортанні не налаштовано жодної дії, тому він не може нічого виконати. Налаштуйте його дії, щоб увімкнути його.",
5034
5047
  "placeholder": "напр. сервіс checkout залежить від сервісу платежів",
5035
5048
  "submit": "Виконати",
5036
5049
  "submitHint": "Ctrl+Enter, на Mac Cmd+Enter",
5050
+ "tooLong": "Цей запит містить {length} символів, а асистент читає щонайбільше {limit}. Скоротіть його та запустіть знову.",
5037
5051
  "examplesTitle": "Про що можна попросити",
5038
5052
  "showOnBoard": "Показати на дошці",
5039
5053
  "declined": "Жодна дія асистента не відповідає цьому запиту. Він може оголосити залежність між двома сервісами, додати сервіс за адресою репозиторію або створити завдання з тікета трекера.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.300.1",
3
+ "version": "0.301.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",
@@ -18,7 +18,7 @@
18
18
  "access": "public"
19
19
  },
20
20
  "dependencies": {
21
- "@cat-factory/contracts": "0.351.0",
21
+ "@cat-factory/contracts": "0.352.0",
22
22
  "@modular-frontend/core": "0.6.0",
23
23
  "@modular-vue/core": "^1.5.0",
24
24
  "@modular-vue/journeys": "^1.4.0",