* feat(mcp): kontoplan account tools + verifikat notes exposure Two gaps reported by an MCP-driven user: no account management in the API, and verifikat notes invisible to agents (they exist in the product but MCP could neither read nor write them). - add staged gnubok_create_account / gnubok_update_account (BAS 2026 prefill for catalog numbers; rename/VAT-default/SRU/activate via update; both LOW risk reference data) - add staged gnubok_set_voucher_note (notes-only annotation, legal on posted entries per the 20260608120000 trigger carve-out) and return entry_notes from gnubok_query_journal - new pending_operations types create_account / update_account / set_voucher_note (CHECK migration + validate companion, applied to staging) - tools/list payload ceiling 54K -> 56K (documented; wire contract, descriptions trimmed first) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(skatteverket): unstick BankID connect flow and stale connection views - respond to the OAuth callback immediately and run the post-connect refresh after the response (next/server after()): users no longer stare at Skatteverket's consumed consent page for up to 40s - open the consent flow in a full tab instead of a 600x750 popup that hid the approve button below the fold - disable connect buttons while the OAuth tab is open (parallel flows overwrote oauth_state + the PKCE verifier) and recover via a closed-tab watcher plus a delayed status refetch - persist MISSING_SCOPE token health from the post-connect sync and show an actionable "approve all permissions" notice - refetch connection state on tab visibility (settings connect panel, enable-banking panel, /skattekonto) so a connect completed in another tab or after a mobile app-switch shows up without a manual reload; fix /skattekonto never clearing its not-connected state Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(article-form): add article number field with validation to ArticleForm * feat(account): enforce account type consistency with BAS class and add validation --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
22 lines
993 B
TypeScript
22 lines
993 B
TypeScript
import { z } from 'zod'
|
|
|
|
// Commit-boundary re-validation for the staged set_voucher_note operation
|
|
// (gnubok_set_voucher_note). Notes are annotation metadata alongside the
|
|
// verifikat, not räkenskapsinformation: the journal_entries immutability
|
|
// trigger (migration 20260608120000) allows a notes-only UPDATE on committed
|
|
// entries and rejects anything that touches a bookkeeping field, so this
|
|
// schema only has to bound the shape. Max length matches the dashboard
|
|
// PATCH route (app/api/bookkeeping/journal-entries/[id]/notes/route.ts).
|
|
|
|
export const SetVoucherNoteParamsSchema = z.object({
|
|
journal_entry_id: z.string().uuid(),
|
|
// null clears the note; empty/whitespace-only strings are normalised to
|
|
// null so the column never stores visually-empty annotations.
|
|
notes: z.preprocess(
|
|
(v) => (typeof v === 'string' && v.trim() === '' ? null : v),
|
|
z.string().max(2000).nullable(),
|
|
),
|
|
})
|
|
|
|
export type SetVoucherNoteParams = z.infer<typeof SetVoucherNoteParamsSchema>
|