@cat-factory/app 0.37.1 → 0.37.3

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/app/components/auth/LoginScreen.vue +2 -2
  2. package/app/components/board/nodes/BlockNode.vue +32 -13
  3. package/app/components/bootstrap/BootstrapModal.vue +10 -6
  4. package/app/components/documents/DocumentImportModal.vue +11 -7
  5. package/app/components/github/AddServiceFromRepoModal.vue +9 -5
  6. package/app/components/github/GitHubPanel.vue +8 -4
  7. package/app/components/kaizen/KaizenPanel.vue +7 -3
  8. package/app/components/layout/AccountTeamSettings.vue +2 -3
  9. package/app/components/layout/IntegrationsHub.vue +2 -0
  10. package/app/components/panels/ObservabilityPanel.vue +12 -7
  11. package/app/components/providers/VendorCredentialsModal.vue +10 -6
  12. package/app/components/sandbox/SandboxPanel.vue +30 -19
  13. package/app/components/settings/IssueTrackerPanel.vue +3 -1
  14. package/app/components/settings/LocalModeSettingsPanel.vue +7 -3
  15. package/app/components/settings/LocalModelEndpointsPanel.vue +7 -3
  16. package/app/components/settings/ModelConfigurationPanel.vue +12 -8
  17. package/app/components/settings/ObservabilityConnectionPanel.vue +16 -12
  18. package/app/components/settings/OpenRouterCatalogPanel.vue +14 -9
  19. package/app/components/settings/ProviderConnectionPanel.vue +4 -4
  20. package/app/components/settings/UserSecretsSection.vue +7 -3
  21. package/app/components/settings/WorkspaceSettingsPanel.vue +3 -1
  22. package/app/components/slack/SlackPanel.vue +2 -0
  23. package/app/composables/api/client.ts +11 -1
  24. package/app/composables/api/errors.spec.ts +53 -0
  25. package/app/composables/api/errors.ts +63 -0
  26. package/app/composables/useBlockQueries.ts +31 -9
  27. package/app/composables/usePipelineErrorToast.ts +5 -5
  28. package/app/composables/useSourceIntegration.ts +3 -3
  29. package/app/pages/index.vue +103 -51
  30. package/app/stores/board.spec.ts +30 -0
  31. package/app/stores/board.ts +27 -2
  32. package/app/stores/brainstorm.ts +11 -0
  33. package/app/stores/clarity.ts +11 -0
  34. package/app/stores/consensus.ts +7 -1
  35. package/app/stores/execution.spec.ts +43 -0
  36. package/app/stores/execution.ts +19 -0
  37. package/app/stores/github.ts +17 -0
  38. package/app/stores/personalSubscriptions.ts +2 -1
  39. package/app/stores/requirements.ts +12 -0
  40. package/app/stores/workspace.ts +17 -0
  41. package/package.json +2 -2
@@ -259,6 +259,22 @@ export const useGitHubStore = defineStore('github', () => {
259
259
  return api.commentGitHubIssue(workspace.requireId(), repoGithubId, number, body)
260
260
  }
261
261
 
262
+ /**
263
+ * Drop the per-workspace projection + connection state (called on workspace switch)
264
+ * so the prior workspace's repos/PRs/issues don't linger until the re-probe + reload
265
+ * land. `available` returns to `null` (unknown) so the onboarding gate re-resolves.
266
+ */
267
+ function reset() {
268
+ available.value = null
269
+ connection.value = null
270
+ installations.value = []
271
+ repos.value = []
272
+ availableRepos.value = []
273
+ pulls.value = []
274
+ issues.value = []
275
+ branches.value = {}
276
+ }
277
+
262
278
  return {
263
279
  available,
264
280
  connection,
@@ -300,5 +316,6 @@ export const useGitHubStore = defineStore('github', () => {
300
316
  openPullRequest,
301
317
  mergePullRequest,
302
318
  comment,
319
+ reset,
303
320
  }
304
321
  })
@@ -1,5 +1,6 @@
1
1
  import { defineStore } from 'pinia'
2
2
  import { computed, ref } from 'vue'
3
+ import { apiErrorEnvelope } from '~/composables/api/errors'
3
4
  import type {
4
5
  PersonalSubscriptionStatus,
5
6
  StorePersonalSubscriptionInput,
@@ -45,7 +46,7 @@ export interface PendingCredential {
45
46
  export function parseCredentialError(
46
47
  error: unknown,
47
48
  ): { vendor: SubscriptionVendor; reason: PendingCredential['reason'] } | null {
48
- const data = (error as { data?: { error?: { code?: string; details?: unknown } } })?.data?.error
49
+ const data = apiErrorEnvelope(error)
49
50
  if (data?.code !== 'credential_required') return null
50
51
  const details = data.details as {
51
52
  vendor?: SubscriptionVendor
@@ -97,6 +97,17 @@ export const useRequirementsStore = defineStore('requirements', () => {
97
97
  reviews.value = { ...reviews.value, [review.blockId]: review }
98
98
  }
99
99
 
100
+ /** Drop all cached reviews + in-flight state (called on workspace switch). */
101
+ function reset() {
102
+ available.value = null
103
+ reviews.value = {}
104
+ reviewing.value = new Set()
105
+ incorporating.value = new Set()
106
+ recommending.value = new Set()
107
+ loadingByBlock.value = new Set()
108
+ inFlight.clear()
109
+ }
110
+
100
111
  function withFlag(set: typeof reviewing, key: string, on: boolean) {
101
112
  const next = new Set(set.value)
102
113
  if (on) next.add(key)
@@ -265,6 +276,7 @@ export const useRequirementsStore = defineStore('requirements', () => {
265
276
  acceptRecommendation,
266
277
  rejectRecommendation,
267
278
  reRequestRecommendation,
279
+ reset,
268
280
  // Patch the cache from a live `requirements` stream event.
269
281
  upsert: store,
270
282
  }
@@ -16,6 +16,11 @@ import { useRecurringPipelinesStore } from '~/stores/recurringPipelines'
16
16
  import { useServicesStore } from '~/stores/services'
17
17
  import { useAgentsStore } from '~/stores/agents'
18
18
  import { useTrackerStore } from '~/stores/tracker'
19
+ import { useRequirementsStore } from '~/stores/requirements'
20
+ import { useClarityStore } from '~/stores/clarity'
21
+ import { useBrainstormStore } from '~/stores/brainstorm'
22
+ import { useConsensusStore } from '~/stores/consensus'
23
+ import { useGitHubStore } from '~/stores/github'
19
24
 
20
25
  /**
21
26
  * Owns the active workspace and bootstraps the app against the backend. On load
@@ -58,6 +63,18 @@ export const useWorkspaceStore = defineStore(
58
63
 
59
64
  /** Push a snapshot into the data stores. */
60
65
  function hydrate(snapshot: WorkspaceSnapshot) {
66
+ // A change of active board (or the first load) — drop the per-block caches that are
67
+ // NOT part of the snapshot (reviews, brainstorm/consensus sessions, the GitHub
68
+ // projection) so a switched-to board never shows the previous one's stale state.
69
+ // These are lazily reloaded/re-probed per board, so clearing on a same-board refresh
70
+ // would needlessly wipe an open review window — hence only on an actual id change.
71
+ if (workspaceId.value !== snapshot.workspace.id) {
72
+ useRequirementsStore().reset()
73
+ useClarityStore().reset()
74
+ useBrainstormStore().reset()
75
+ useConsensusStore().reset()
76
+ useGitHubStore().reset()
77
+ }
61
78
  workspaceId.value = snapshot.workspace.id
62
79
  spend.value = snapshot.spend ?? null
63
80
  // Keep the board list in step (e.g. a freshly created board, or a rename).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.37.1",
3
+ "version": "0.37.3",
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",
@@ -32,7 +32,7 @@
32
32
  "pinia-plugin-persistedstate": "^4.7.1",
33
33
  "vue": "^3.5.38",
34
34
  "wretch": "^3.0.9",
35
- "@cat-factory/contracts": "0.35.0"
35
+ "@cat-factory/contracts": "0.36.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@toad-contracts/testing": "0.3.1",