v1.8.0
·
1094 commits
to master
since this release
New & Changed
- updt(web): register directory-sync manual subcategory (#839)
- feat(web): es manual directory-sync subcategory label (#839)
- feat(web): en manual directory-sync subcategory label (#839)
- feat(web): es directory settings messages (#839)
- feat(web): en directory settings messages (#839)
- updt(web): mount directory editor on Settings → Instance (#839)
- feat(web): AD/LDAP directory settings editor + Sync now (#839)
- feat(web): directory PENDING review tray (#839)
- feat(web): directory form-glue unit tests (#839)
- feat(web): pure directory form-to-wire glue (#839)
- feat(web): directory-connection query + mutation hooks (#839)
- feat(web): directory-connection API data-access (#839)
- updt(api): document DIRECTORY_SECRET_KEY + sweeper interval env (#839)
- updt(api): register DirectoryModule (#839)
- updt(api): stamp AD directory-source provenance in users.create (#839)
- feat(api): DirectoryModule wiring (#839)
- feat(api): directory controller (GET/PUT connection, POST sync) (#839)
- feat(api): directory-sync setInterval sweeper (#839)
- feat(api): directory reconcile engine + hard-invariant tests (#839)
- feat(api): DirectoryConnection singleton config store (write-only secret) (#839)
- feat(api): read-only ldapts client + objectGUID/filter-escape helpers (#839)
- feat(api): directory bind-password AES-256-GCM crypto (own key axis) (#839)
- feat(api): directory subsystem wiring constants + GUID/env helpers (#839)
- feat(prisma): additive directory_ldap_source migration (#839)
- updt(prisma): User AD-directory-source fields + DirectoryConnection singleton (#839)
- feat(shared): DirectoryConnection schema validation tests (#839)
- feat(shared): export directory-connection schemas from barrel (#839)
- feat(shared): DirectoryConnection config + sync-result schemas (#839)
- feat(web): es email-preference label for the acknowledgement notification (#1029)
- feat(web): en email-preference label for the acknowledgement notification (#1029)
- feat(web): es strings for receive stock + acknowledge receipt (#1029)
- feat(web): en strings for receive stock + acknowledge receipt (#1029)
- feat(web): catalogue asset_assignment.acknowledged in the bell TYPE_META (#1029)
- feat(web): render the ACKNOWLEDGED asset-history event (#1029)
- feat(web): acknowledged state + self-service acknowledge on the owners panel (#1029)
- feat(web): Acknowledge receipt dialog (self-service, 409-graceful) (ADR-0089 Part B, #1029)
- feat(web): surface Receive stock in the inventory header (#1029)
- feat(web): Receive stock dialog with partial-success result (ADR-0089 Part A, #1029)
- feat(web): useAcknowledgeAssignment mutation hook (#1029)
- feat(web): acknowledgeAssetAssignment endpoint (#1029)
- feat(web): useReceiveAssets mutation hook (#1029)
- feat(web): receiveAssets endpoint for bulk receiving (#1029)
- feat(web): flag serial-matched rows as updates in the dry-run preview (#1061)
- feat(web): add date-format + update-existing import labels (es) (#1060/#1061)
- feat(web): add date-format + update-existing import labels (en) (#1060/#1061)
- feat(web): per-column date-format picker in the import mapping step (#1060)
- feat(shared): include the acknowledged verb in the RecentActivityAction allowlist test (#1029)
- feat(web): add updated / re-import timeline labels (en+es, #1061)
- feat(web): wire the UPDATED asset-history event into the timeline (#1061)
- feat(api): update matched live asset on serial re-import + P2002 fallback (#1061)
- feat(api): emit use-existing for serial-matched live assets in dry-run (#1061)
- feat(api): stamp re-import provenance + UPDATED marker in AssetsService.update (#1061)
- feat(api): add UPDATED value to AssetHistoryEventType enum + migration (#1061)
- feat(shared): add UPDATED to AssetHistoryEventTypeSchema (#1061)
- feat(shared): add DateFieldMapping + mapping.dates to ImportMappingSchema (#1060)
- feat(shared): read per-column date format in coerceRow, export DATE_FIELDS (#1060)
- feat(shared): parse dates strictly per explicit format + detectDateFormat (#1060)
- feat(api): assert the acknowledgement type is in the email allowlist (#1029)
- feat(api): make asset_assignment.acknowledged email opt-out-able (#1029)
- feat(api): acknowledge() tests (flip-once, 409 paths, skip-nudge, 403) (#1029)
- feat(api): wire NotificationsModule into AssetAssignmentsModule for the ack nudge (#1029)
- feat(api): POST /asset-assignments/:id/acknowledge (self-service, human-only) (#1029)
- feat(api): self-scoped set-once acknowledge() + post-commit assigner nudge (ADR-0089 Part B, #1029)
- feat(api): AcknowledgeAssignmentDto (#1029)
- feat(api): receiveBatch tests (per-unit tx, partial success, model 400) (#1029)
- feat(api): POST /assets/batch/receive endpoint (asset:write, partial-success envelope) (#1029)
- feat(api): AssetsService.receiveBatch loops create() per unit for bulk receiving (ADR-0089 Part A, #1029)
- feat(api): additive migration for AssetAssignment acknowledgement + ACKNOWLEDGED enum value (ADR-0089 Part B, #1029)
- feat(shared): assert the acknowledgement notification type is catalogued (#1029)
- feat(shared): add the targeted asset_assignment.acknowledged notification type (#1029)
- feat(shared): AcknowledgeAssignment payload + acknowledgement read fields on AssetAssignment (#1029)
- feat(shared): allow the acknowledged activity verb in RECENT_ACTIVITY_ACTIONS (#1029)
- feat(shared): add ACKNOWLEDGED to AssetHistoryEventType (ADR-0089 Part B, #1029)
- feat(shared): export the asset-receive schemas from the barrel (#1029)
- feat(shared): tests for the ReceiveAssets schema (quantity bounds + serials refinement) (#1029)
- feat(shared): ReceiveAssets + ReceiveAssetsResult contracts for bulk receiving (ADR-0089 Part A, #1029)
- feat(web): add the duplicate-IP warning copy (es) (#847)
- feat(web): add the duplicate-IP warning copy (en) (#847)
- feat(web): let the duplicate-IP peers re-select their node in the panel (#847)
- feat(web): warn on the drill-in when another live node shares this IP (#847)
- feat(api): test the ipConflict signal on getNodeDetail (#847)
- feat(api): surface the soft duplicate-IP conflict on the node drill-in (#847)
- feat(shared): test IpAddressSchema + primaryIpv4 validate-or-drop (#847)
- feat(shared): validate the InfraNode IP as an IPv4/IPv6 value-object (#847)
- feat(web): es label for the node Reported facts section (#1081)
- feat(web): en label for the node Reported facts section (#1081)
- feat(web): render read-only Reported facts on AGENT nodes (reuse Assets inventory projection) (#1081)
- feat(web): poll the topology canvas for fresh node facts (#1081)
- feat(web): poll the servers table for fresh liveness/IP (#1081)
- feat(web): poll the pending review tray for fresh discoveries (#1081)
- feat(web): export INFRA_LIVE_POLL_MS for the live node surfaces (#1081)
- feat(api): promote report IP→node (MANUAL-guarded) + serial→Asset + linked-Asset specs sync (#1081)
- feat(api): migration for infra_node ipAddressSource (default AGENT) (#1081)
- feat(api): add InfraNodeIpSource enum + ipAddressSource column on InfraNode (#1081)
- feat(shared): add ipAddressSource + primaryIpv4/sanitizeSerial fact-promotion mappers (#1081)
- feat(web): i18n for license/seat tracking labels (en+es) (#949)
- feat(web): License & seats panel with over-allocation warning on application detail (#949)
- feat(web): license usage cell (used/purchased + over-alloc warning + renewal) on Access list (#949)
- feat(web): license inputs (seats, cost per seat, renewal) on application form (#949)
- feat(api): derive Application.seatsUsed (distinct active-grant users) in findOne + findPage (#949)
- feat(shared): license/seat fields on Application schema; derived read-only seatsUsed (#949)
- feat(api): add license/seat columns to Application (seatsPurchased, costPerSeat, renewalDate) (#949)
- feat(web): i18n for local directory onboarding (en+es) (#1072)
- feat(web): branch the directory-provision panel to the local onboarding flow (#1072)
- feat(web): local onboarding button with one-time temp-password reveal (#1072)
- feat(web): add useProvisionLocalUserAccount mutation (#1072)
- feat(web): add provisionLocalUserAccount endpoint (#1072)
- feat(api): test provisionLocalAccount onboarding, role-unchanged and reject paths (#1072)
- feat(api): add POST /users/:id/provision-local-account (#1072)
- feat(api): provisionLocalAccount onboards a directory person with a temp password (#1072)
- feat(api): expose canProvisionLocalAccounts in /config/status (#1072)
- feat(shared): add canProvisionLocalAccounts to ConfigStatus (#1072)
- updt: add vault-access caution to the SA revoke dialog copy (en+es) (#1066)
- feat(web): add sku i18n strings for import mapping (es) (#1064)
- feat(web): add sku i18n strings for import mapping (en) (#1064)
- feat(web): add sku mapping UI for created AssetModels (#1064)
- feat(import): cover AssetModel sku from modelConfig in commit spec (#1064)
- feat(import): carry sku into created AssetModel (#1064)
- feat(import): add sku UI target + header aliases for model (#1064)
- feat(import): add sku column/const to ModelConfigSchema (#1064)
- feat(web): test errorStateKind for 401/403/500/network (#1045)
- feat(web): add errorStateKind pure classifier for 401/403/retry (#1045)
- feat(web): es strings for the ragged-rows warning (#1062)
- feat(web): en strings for the ragged-rows warning (#1062)
- feat(web): warn on ragged-width rows in the import map step (#1062)
- feat(shared): add raggedRowCount to ImportDetectedShapeSchema (#1062)
- feat(web): add email-preference labels for the expiry nudges (en+es) (#1070)
- feat(web): render the two proactive expiry notification types in the bell (#1070)
- feat(api): register the ExpiryNotificationsSweeper (#1070)
- feat(api): test the expiry sweeper emits, dedupes and stays opt-out-able (#1070)
- feat(api): add daily look-ahead sweeper emitting proactive expiry nudges (#1070)
- feat(api): default warranty/grant expiry nudges to warning severity (#1070)
- feat(api): extend the email allowlist spec to the eleven emailed types (#1070)
- feat(api): make the two proactive expiry nudges emailable/opt-out-able (#1070)
- feat(shared): retarget the notification entityType reject test off the now-valid 'asset' (#1070)
- feat(shared): add warranty_expiring + access_grant_expiring notification types (#1070)
- feat(web): label access_request.decided in email-preference toggles, en+es (#1071)
- feat(web): render the access_request.decided bell type (#1071)
- feat(api): extend email allowlist test for access_request.decided (#1071)
- feat(api): test the access_request.decided emission on approve/deny (#1071)
- feat(api): notify the requester when their access request is decided (#1071)
- feat(api): route access_request.decided to email, opt-out-able (#1071)
- feat(shared): add access_request.decided targeted notification type (#1071)
Fixes
- fix(api): directory reconcile — graceful ok:false on config throw + preserve emailConflict (#839)
- fix(shared): iso date branch is date-only + rejects impossible/TZ-drifting dates (#1060)
- fix(import): strip BOM before decode so a bad byte can't leak »¿ (#1059)
- fix(import): case-insensitive Location preview to match the commit engine (#1063)
- fix(import): case-insensitive find-or-create for Location/AssetModel/Category (#1063)
- fix(web): add cancel labels to es settings i18n (#1065)
- fix(web): add cancel labels to en settings i18n (#1065)
- fix(web): add Cancel button on a pending 'requested' update (#1065)
- fix(web): add useCancelUpdate mutation hook (#1065)
- fix(web): add cancelUpdate endpoint (#1065)
- fix(api): cover update cancel — terminal, unblocks enqueue, guards in-flight (#1065)
- fix(api): expose POST /instance/update/cancel (#1065)
- fix(api): add cancel for a stuck 'requested' update run (#1065)
- fix(infra): note existing sessions need re-login after --reconfigure (#1046)
- fix(web): suppress forbidden panel flash on a 401 before redirect (#1045)
- fix(workflow-engine): stop collapsing every rotate/delete error to 404 (#1069)
- fix(workflow-engine): throw NotFoundException on rotate/softDelete miss (#1069)
- fix(import): surface raggedRowCount on DetectedShape (#1062)
- fix(import): thread raggedRowCount into the detected shape (#1062)
- fix(import): count ragged-width rows in parseCsv (#1062)
- fix(workflow-engine): enqueue-then-clear retry so a broker-down retry preserves the failed step (#1068)
- fix(articles): exclude soft-deleted sources from backlinks (#1067)
- fix(infra): exclude soft-deleted child nodes from node detail (#1067)
- fix(secret-manager): exclude revoked SAs from vault member list (#1067)
- fix(import): transcode CP-1252/Latin-1 CSV instead of silent mojibake (#1059)
Full changelog: v1.7.0...v1.8.0