@cat-factory/app 0.256.2 → 0.257.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 (48) hide show
  1. package/README.md +4 -0
  2. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +284 -0
  3. package/app/components/binaryOutput/BinaryOutputReport.vue +33 -0
  4. package/app/components/board/nodes/BlockNode.vue +3 -7
  5. package/app/components/board/nodes/InitiativeCard.vue +1 -1
  6. package/app/components/focus/BlockFocusView.vue +1 -1
  7. package/app/components/forkDecision/ForkDecisionWindow.vue +3 -1
  8. package/app/components/outcome/OutcomeSummaryWindow.vue +1 -2
  9. package/app/components/panels/AgentStepDetail.vue +42 -20
  10. package/app/components/panels/InspectorPanel.vue +6 -11
  11. package/app/components/panels/ResultWindowShell.logic.spec.ts +4 -0
  12. package/app/components/panels/inspector/TaskExecution.vue +34 -34
  13. package/app/components/pipeline/BinaryOutputStepPicker.logic.spec.ts +90 -1
  14. package/app/components/pipeline/BinaryOutputStepPicker.logic.ts +92 -1
  15. package/app/components/pipeline/BinaryOutputStepPicker.vue +354 -1
  16. package/app/components/pipeline/PipelineProgress.vue +48 -10
  17. package/app/components/settings/KubernetesEngineForm.vue +98 -46
  18. package/app/components/spec/ServiceSpecWindow.vue +5 -4
  19. package/app/composables/api/binaryCandidates.ts +36 -0
  20. package/app/composables/useApi.ts +2 -0
  21. package/app/docs/architecture.md +1 -1
  22. package/app/modular/panels/inspector.ts +3 -3
  23. package/app/modular/result-views.ts +4 -0
  24. package/app/stores/binaryCandidates.ts +89 -0
  25. package/app/stores/board/placement.ts +32 -8
  26. package/app/stores/ui/resultViews.ts +8 -6
  27. package/app/stores/ui/runStepOpeners.ts +23 -1
  28. package/app/types/execution.ts +5 -0
  29. package/app/utils/badge.ts +14 -0
  30. package/app/utils/binaryCandidates.spec.ts +110 -0
  31. package/app/utils/binaryCandidates.ts +126 -0
  32. package/app/utils/binaryOutput.ts +48 -2
  33. package/app/utils/catalog.ts +2 -1
  34. package/app/utils/initiative.ts +1 -4
  35. package/app/utils/pipelineRender.spec.ts +46 -1
  36. package/app/utils/pipelineRender.ts +70 -2
  37. package/i18n/locales/de.json +78 -2
  38. package/i18n/locales/en.json +78 -2
  39. package/i18n/locales/es.json +78 -2
  40. package/i18n/locales/fr.json +78 -2
  41. package/i18n/locales/he.json +78 -2
  42. package/i18n/locales/it.json +78 -2
  43. package/i18n/locales/ja.json +78 -2
  44. package/i18n/locales/pl.json +78 -2
  45. package/i18n/locales/tr.json +78 -2
  46. package/i18n/locales/uk.json +78 -2
  47. package/i18n/plural-forms.spec.ts +15 -0
  48. package/package.json +2 -2
@@ -43,9 +43,24 @@ const catalogs = new Map(
43
43
  [SOURCE_LOCALE, ...LOCALES].map((locale) => [locale, loadCatalog(locale)] as const),
44
44
  )
45
45
 
46
+ /**
47
+ * A pipe written as vue-i18n LITERAL INTERPOLATION (`{'|'}`) is a character the message renders,
48
+ * not a form separator: the compiler parses such a message as a plain Message rather than a
49
+ * Plural. So it is stripped before the split, or a message that legitimately shows a pipe (the
50
+ * reference-image field describes a `role|location|service` line) is measured as forms it does
51
+ * not have.
52
+ *
53
+ * Getting this wrong is not merely a false positive. Counting the escaped pipes made a two-pipe
54
+ * message read as three forms, which is a LEGAL count for every locale here, so the sibling key
55
+ * that happened to carry one pipe failed while the more visible one passed silently. A guard that
56
+ * mis-measures does not fail honestly; it fails somewhere else.
57
+ */
58
+ const LITERAL_INTERPOLATION = /\{\s*'(?:[^'\\]|\\.)*'\s*\}/g
59
+
46
60
  /** Pipe-separated plural entries only; a message with no pipe never reaches a selector. */
47
61
  function pluralEntries(locale: string): [string, string[]][] {
48
62
  return [...catalogs.get(locale)!]
63
+ .map(([key, value]) => [key, value.replace(LITERAL_INTERPOLATION, '')] as const)
49
64
  .filter(([, value]) => value.includes('|'))
50
65
  .map(([key, value]) => [key, value.split('|')])
51
66
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.256.2",
3
+ "version": "0.257.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",
@@ -40,7 +40,7 @@
40
40
  "valibot": "^1.4.2",
41
41
  "vue": "3.5.41",
42
42
  "wretch": "^3.0.9",
43
- "@cat-factory/contracts": "0.283.1"
43
+ "@cat-factory/contracts": "0.285.0"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@toad-contracts/testing": "0.3.2",