diff --git a/.gitignore b/.gitignore index a9132c68..56fef6cc 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ packages/server/objectstack.config.js # Vercel .vercel/ +*.tgz +package/ diff --git a/README.md b/README.md index df4ddbf9..44f7fdf5 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) ![Objects](https://img.shields.io/badge/Objects-~148-brightgreen) ![Tests](https://img.shields.io/badge/Tests-3799%20passing-brightgreen) -![Spec](https://img.shields.io/badge/%40objectstack%2Fspec-v3.0.8-blue) +![Spec](https://img.shields.io/badge/%40objectstack%2Fspec-v3.0.11-blue) -> A world-class Customer Relationship Management system built on @objectstack/spec v3.0.8 protocol with Salesforce-level functionality and Apple/Linear-level UX. +> A world-class Customer Relationship Management system built on @objectstack/spec v3.0.11 protocol with Salesforce-level functionality and Apple/Linear-level UX. ## ⚡ Quick Start in 60 Seconds @@ -31,7 +31,7 @@ pnpm test # Vitest — expect 3,799+ tests passing ## 🌟 Overview -HotCRM is a **comprehensive, AI-native enterprise CRM** covering the complete Lead-to-Cash lifecycle. Built on @objectstack/spec v3.0.8: +HotCRM is a **comprehensive, AI-native enterprise CRM** covering the complete Lead-to-Cash lifecycle. Built on @objectstack/spec v3.0.11: - **~148 Business Objects** across 13 packages: Sales, Marketing, Revenue, Service, HR, AI, Analytics, Integration, Community, Real Estate, Healthcare, Financial Services, Education - **Metadata-Driven**: All objects defined in TypeScript (`.object.ts`) — the single source of truth diff --git a/ROADMAP.md b/ROADMAP.md index 0fe205f5..61fa1e8e 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,7 +1,7 @@ # HotCRM Development Roadmap > Comprehensive development plan for HotCRM — the world's first AI-Native CRM. -> Protocol: @objectstack/spec v3.0.8 | Last Updated: February 2026 +> Protocol: @objectstack/spec v3.0.11 | Last Updated: February 2026 ## Strategic Direction @@ -22,7 +22,7 @@ | Metric | Value | |--------|-------| -| Protocol Version | @objectstack/spec v3.0.8 | +| Protocol Version | @objectstack/spec v3.0.11 | | Business Objects | ~148 across 13 packages | | Business Packages | 13 (6 core clouds + AI + Analytics + Integration + Community + 4 verticals) | | Hook Files | 121+ across 13 packages | @@ -211,6 +211,7 @@ These items were deferred during Phase 13 and have been completed: | Date | From | To | Breaking Changes | Tests | |------|------|----|-----------------|-------| +| 2026-02-26 | v3.0.8 | v3.0.11 | ViewFilterRule format changed from array tuples to objects `{ field, operator, value }` (34 view files updated) | 3817 ✅ | | 2026-02-26 | v3.0.8 | v3.0.8 | None (Phase 15: Added EventTypeDefinitionSchema validation to all 9 events.ts files; 100% metadata schema compliance) | 3817 ✅ | | 2026-02-25 | v3.0.8 | v3.0.8 | None (Phase 15: Fixed tsconfig.json path aliases for node16 ESM module resolution — changed directory paths to explicit index.ts files) | 3813 ✅ | | 2026-02-21 | v3.0.8 | v3.0.8 | None (Phase 15 continued: Structured pino logging across 154 files, CacheManager test isolation, db.ts deprecation annotations, emoji removal from logs) | 3813 ✅ | diff --git a/content/docs/index.mdx b/content/docs/index.mdx index b183b980..8b9f3d29 100644 --- a/content/docs/index.mdx +++ b/content/docs/index.mdx @@ -84,7 +84,7 @@ Explore the six business clouds that power every stage of the customer lifecycle | Metric | Value | |--------|-------| -| **Protocol Version** | @objectstack/spec v3.0.8 | +| **Protocol Version** | @objectstack/spec v3.0.11 | | **Business Packages** | 13 (6 core clouds + AI + Analytics + Integration + Community + 4 verticals) | | **Business Objects** | ~148 across 13 packages | | **Server-Side Hooks** | 121+ hooks enforcing business logic | diff --git a/content/docs/roadmap.mdx b/content/docs/roadmap.mdx index fc423ff0..94336f34 100644 --- a/content/docs/roadmap.mdx +++ b/content/docs/roadmap.mdx @@ -7,7 +7,7 @@ description: Strategic direction and completed development milestones for HotCRM HotCRM has completed **16 development phases** (1–14 including 10.5, 10.6, 12A-D, and 12E), establishing a full-featured, production-ready **13-package CRM** with **~148 business objects**, AI agent workflows, enterprise security, full UI metadata, Salesforce feature parity (~95%), 4 vertical industry solutions, Activity Feed/Chatter system, Interface Builder, and comprehensive developer tooling. -> **Protocol Version**: @objectstack/spec v3.0.8 | **Tests**: 3,799 passing (192 files) | **Spec Schema Adoption**: ~95 / ~95 (~100%) | **Last Updated**: February 21, 2027 +> **Protocol Version**: @objectstack/spec v3.0.11 | **Tests**: 3,799 passing (192 files) | **Spec Schema Adoption**: ~95 / ~95 (~100%) | **Last Updated**: February 21, 2027 --- @@ -16,7 +16,7 @@ HotCRM has completed **16 development phases** (1–14 including 10.5, 10.6, 12A ``` 2025 ████████████████████████████████ Phases 1-9: Foundation → AI → Quality → Test → Integration → Schema → v3.0 → UI → DX 2026 Q1-Q4 ████████████████████████████████ Phases 10-12D: Salesforce Parity → Deep Metadata → Forms & Pages → Ecosystem → Verticals ✅ COMPLETE -2027 Q1-Q3 ████████████████████████████████ Phase 13: Module Optimization & Seed Data → Phase 14: v3.0.8 Feed & Interface Builder ✅ COMPLETE +2027 Q1-Q3 ████████████████████████████████ Phase 13: Module Optimization & Seed Data → Phase 14: v3.0.11 Feed & Interface Builder ✅ COMPLETE 2027+ ████████████████████████████████ Phase 12E: Advanced AI & Enterprise Features ✅ COMPLETE ``` @@ -43,7 +43,7 @@ HotCRM has completed **16 development phases** (1–14 including 10.5, 10.6, 12A | **11** | Ecosystem & Connectivity | +3 packages (Analytics, Integration, Community); 10 connectors; iPaaS layer | | **12A-D** | Vertical Solutions | +4 verticals (Real Estate, Healthcare, Financial Services, Education); 28 objects | | **13** | Module Optimization & Seed Data | 39 seed files, 13/13 plugins registered, metadata equalization, 13 state machines | -| **14** | v3.0.8 Feed & Interface Builder | Activity feed/Chatter across 6 clouds, interface builder, dashboard headers/filters, Feed API, ~100% schema adoption | +| **14** | v3.0.11 Feed & Interface Builder | Activity feed/Chatter across 6 clouds, interface builder, dashboard headers/filters, Feed API, ~100% schema adoption | | **12E** | Advanced AI & Enterprise | Computer vision, voice AI, anomaly detection, multi-tenancy, SOC 2, marketplace | --- @@ -52,7 +52,7 @@ HotCRM has completed **16 development phases** (1–14 including 10.5, 10.6, 12A | Metric | Value | |--------|-------| -| Protocol Version | @objectstack/spec v3.0.8 | +| Protocol Version | @objectstack/spec v3.0.11 | | Business Objects | ~148 across 13 packages | | Business Packages | 13 (6 core + AI + Analytics + Integration + Community + 4 verticals) | | Hook Files | 121+ across 13 packages | diff --git a/package.json b/package.json index 265ec082..769cb41f 100644 --- a/package.json +++ b/package.json @@ -59,13 +59,13 @@ "@changesets/cli": "^2.29.8", "@hono/node-server": "^1.19.9", "@object-ui/console": "^3.0.3", - "@objectstack/cli": "^3.0.9", - "@objectstack/driver-memory": "^3.0.8", - "@objectstack/objectql": "^3.0.8", - "@objectstack/plugin-hono-server": "^3.0.8", - "@objectstack/runtime": "^3.0.8", - "@objectstack/spec": "^3.0.8", - "@objectstack/studio": "^3.0.8", + "@objectstack/cli": "^3.0.11", + "@objectstack/driver-memory": "^3.0.11", + "@objectstack/objectql": "^3.0.11", + "@objectstack/plugin-hono-server": "^3.0.11", + "@objectstack/runtime": "^3.0.11", + "@objectstack/spec": "^3.0.11", + "@objectstack/studio": "^3.0.11", "@types/node": "^25.2.3", "@typescript-eslint/eslint-plugin": "^7.18.0", "@typescript-eslint/parser": "^7.18.0", diff --git a/packages/ai/package.json b/packages/ai/package.json index 42561eda..0f1a215f 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -34,12 +34,12 @@ ], "author": "HotCRM Team", "dependencies": { - "@objectstack/spec": "^3.0.8", + "@objectstack/spec": "^3.0.11", "axios": "^1.13.5", "zod": "^4.3.6" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/analytics/package.json b/packages/analytics/package.json index 7cfe40a1..36d5a65a 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -36,11 +36,11 @@ "author": "HotCRM Team", "dependencies": { "@hotcrm/ai": "workspace:*", - "@objectstack/spec": "^3.0.8", + "@objectstack/spec": "^3.0.11", "zod": "^4.3.6" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/analytics/src/kpi.view.ts b/packages/analytics/src/kpi.view.ts index fc39902f..4789abb8 100644 --- a/packages/analytics/src/kpi.view.ts +++ b/packages/analytics/src/kpi.view.ts @@ -38,7 +38,7 @@ export const KPIsAtRiskView = { type: 'grid' as const, name: 'kpis_at_risk', label: 'At Risk', - filter: [['trend', '=', 'declining']], + filter: [{ field: 'trend', operator: '=', value: 'declining' }], columns: [ { field: 'name', width: 200, link: true }, { field: 'current_value', width: 120, align: 'right' as const }, @@ -60,7 +60,7 @@ export const KPIsOnTrackView = { type: 'grid' as const, name: 'kpis_on_track', label: 'On Track', - filter: [['trend', '=', 'improving']], + filter: [{ field: 'trend', operator: '=', value: 'improving' }], columns: [ { field: 'name', width: 200, link: true }, { field: 'metric_type', width: 120 }, @@ -79,7 +79,7 @@ export const MyKPIsView = { type: 'grid' as const, name: 'my_kpis', label: 'My KPIs', - filter: [['owner_id', '=', '${currentUser.id}']], + filter: [{ field: 'owner_id', operator: '=', value: '${currentUser.id}' }], columns: [ { field: 'name', width: 200, link: true }, { field: 'metric_type', width: 120 }, diff --git a/packages/analytics/src/report.view.ts b/packages/analytics/src/report.view.ts index 36d3818b..3dc19d91 100644 --- a/packages/analytics/src/report.view.ts +++ b/packages/analytics/src/report.view.ts @@ -33,7 +33,7 @@ export const MyReportsView = { type: 'grid' as const, name: 'my_reports', label: 'My Reports', - filter: [['owner_id', '=', '${currentUser.id}']], + filter: [{ field: 'owner_id', operator: '=', value: '${currentUser.id}' }], columns: [ { field: 'name', width: 250, link: true }, { field: 'report_type', width: 120 }, @@ -51,7 +51,7 @@ export const PublicReportsView = { type: 'grid' as const, name: 'public_reports', label: 'Public Reports', - filter: [['is_public', '=', true]], + filter: [{ field: 'is_public', operator: '=', value: true }], columns: [ { field: 'name', width: 250, link: true }, { field: 'report_type', width: 120 }, @@ -69,7 +69,7 @@ export const RecentReportsView = { type: 'grid' as const, name: 'recent_reports', label: 'Recently Run', - filter: [['last_run_at', '>=', 'LAST_30_DAYS']], + filter: [{ field: 'last_run_at', operator: '>=', value: 'LAST_30_DAYS' }], columns: [ { field: 'name', width: 250, link: true }, { field: 'report_type', width: 120 }, diff --git a/packages/community/package.json b/packages/community/package.json index 2919a6d4..6a24d9ce 100644 --- a/packages/community/package.json +++ b/packages/community/package.json @@ -35,11 +35,11 @@ ], "author": "HotCRM Team", "dependencies": { - "@objectstack/spec": "^3.0.8", + "@objectstack/spec": "^3.0.11", "zod": "^4.3.6" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/community/src/idea.view.ts b/packages/community/src/idea.view.ts index 06fa0201..81303fe2 100644 --- a/packages/community/src/idea.view.ts +++ b/packages/community/src/idea.view.ts @@ -50,7 +50,7 @@ export const PlannedIdeasView = { type: 'grid' as const, name: 'planned_ideas', label: 'Planned', - filter: [['status', '=', 'planned']], + filter: [{ field: 'status', operator: '=', value: 'planned' }], columns: [ { field: 'title', width: 300, link: true }, { field: 'category', width: 120 }, @@ -68,7 +68,7 @@ export const NewSubmissionsView = { type: 'grid' as const, name: 'new_submissions', label: 'New Submissions', - filter: [['status', '=', 'submitted']], + filter: [{ field: 'status', operator: '=', value: 'submitted' }], columns: [ { field: 'title', width: 300, link: true }, { field: 'category', width: 120 }, @@ -86,7 +86,7 @@ export const ReleasedIdeasView = { type: 'grid' as const, name: 'released_ideas', label: 'Released', - filter: [['status', '=', 'released']], + filter: [{ field: 'status', operator: '=', value: 'released' }], columns: [ { field: 'title', width: 300, link: true }, { field: 'category', width: 120 }, diff --git a/packages/community/src/topic.view.ts b/packages/community/src/topic.view.ts index 60fe2454..692d6929 100644 --- a/packages/community/src/topic.view.ts +++ b/packages/community/src/topic.view.ts @@ -33,7 +33,7 @@ export const OpenTopicsView = { type: 'grid' as const, name: 'open_topics', label: 'Open Topics', - filter: [['status', '=', 'open']], + filter: [{ field: 'status', operator: '=', value: 'open' }], columns: [ { field: 'title', width: 300, link: true }, { field: 'category_id', width: 150 }, @@ -51,7 +51,7 @@ export const PinnedTopicsView = { type: 'grid' as const, name: 'pinned_topics', label: 'Pinned Topics', - filter: [['is_pinned', '=', true]], + filter: [{ field: 'is_pinned', operator: '=', value: true }], columns: [ { field: 'title', width: 300, link: true }, { field: 'category_id', width: 150 }, @@ -68,7 +68,7 @@ export const UnansweredTopicsView = { type: 'grid' as const, name: 'unanswered_topics', label: 'Unanswered', - filter: [['reply_count', '=', 0]], + filter: [{ field: 'reply_count', operator: '=', value: 0 }], columns: [ { field: 'title', width: 300, link: true }, { field: 'category_id', width: 150 }, diff --git a/packages/core/package.json b/packages/core/package.json index 39ae93be..4fc0442a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -15,7 +15,7 @@ "build": "tsc" }, "dependencies": { - "@objectstack/spec": "^3.0.8", + "@objectstack/spec": "^3.0.11", "zod": "^4.3.6" } } diff --git a/packages/crm/package.json b/packages/crm/package.json index 0788ebf0..8b99b2bc 100644 --- a/packages/crm/package.json +++ b/packages/crm/package.json @@ -40,11 +40,11 @@ "author": "HotCRM Team", "dependencies": { "@hotcrm/ai": "workspace:*", - "@objectstack/spec": "^3.0.8", + "@objectstack/spec": "^3.0.11", "zod": "^4.3.6" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/crm/src/account.view.ts b/packages/crm/src/account.view.ts index 57674a91..221f7176 100644 --- a/packages/crm/src/account.view.ts +++ b/packages/crm/src/account.view.ts @@ -34,7 +34,7 @@ export const MyAccountsView = { type: 'grid' as const, name: 'my_accounts', label: 'My Accounts', - filter: [['owner', '=', '${currentUser.id}']], + filter: [{ field: 'owner', operator: '=', value: '${currentUser.id}' }], columns: [ { field: 'name', width: 250, link: true }, { field: 'type', width: 120 }, @@ -53,8 +53,8 @@ export const EnterpriseAccountsView = { name: 'enterprise_accounts', label: 'Enterprise Accounts', filter: [ - ['annual_revenue', '>', 10000000], - ['type', '=', 'customer'] + { field: 'annual_revenue', operator: '>', value: 10000000 }, + { field: 'type', operator: '=', value: 'customer' } ], columns: [ { field: 'name', width: 250, link: true }, @@ -74,7 +74,7 @@ export const RecentlyCreatedView = { type: 'grid' as const, name: 'recently_created_accounts', label: 'Recently Created', - filter: [['created_date', '>=', 'LAST_30_DAYS']], + filter: [{ field: 'created_date', operator: '>=', value: 'LAST_30_DAYS' }], columns: [ { field: 'name', width: 250, link: true }, { field: 'type', width: 120 }, @@ -93,8 +93,8 @@ export const HotAccountsView = { name: 'hot_accounts', label: 'Hot Accounts', filter: [ - ['rating', '=', 'Hot'], - ['type', 'IN', ['customer', 'prospect']] + { field: 'rating', operator: '=', value: 'Hot' }, + { field: 'type', operator: 'IN', value: ['customer', 'prospect'] } ], columns: [ { field: 'name', width: 250, link: true }, @@ -117,8 +117,8 @@ export const NeedAttentionView = { name: 'accounts_need_attention', label: 'Needs Attention', filter: [ - ['last_activity_date', '<', 'LAST_60_DAYS'], - ['type', '=', 'customer'] + { field: 'last_activity_date', operator: '<', value: 'LAST_60_DAYS' }, + { field: 'type', operator: '=', value: 'customer' } ], columns: [ { field: 'name', width: 250, link: true }, diff --git a/packages/crm/src/contact.view.ts b/packages/crm/src/contact.view.ts index 5baf4efb..bfd092e5 100644 --- a/packages/crm/src/contact.view.ts +++ b/packages/crm/src/contact.view.ts @@ -31,7 +31,7 @@ export const MyContactsView = { type: 'grid' as const, name: 'my_contacts', label: 'My Contacts', - filter: [['owner', '=', '${currentUser.id}']], + filter: [{ field: 'owner', operator: '=', value: '${currentUser.id}' }], columns: [ { field: 'first_name', width: 150, link: true }, { field: 'last_name', width: 150, link: true }, @@ -49,7 +49,7 @@ export const DecisionMakersView = { type: 'grid' as const, name: 'decision_makers', label: 'Decision Makers', - filter: [['is_decision_maker', '=', true]], + filter: [{ field: 'is_decision_maker', operator: '=', value: true }], columns: [ { field: 'first_name', width: 150, link: true }, { field: 'last_name', width: 150, link: true }, @@ -71,7 +71,7 @@ export const RecentContactsView = { type: 'grid' as const, name: 'recent_contacts', label: 'Recent Contacts', - filter: [['last_contact_date', '>=', 'LAST_30_DAYS']], + filter: [{ field: 'last_contact_date', operator: '>=', value: 'LAST_30_DAYS' }], columns: [ { field: 'first_name', width: 150, link: true }, { field: 'last_name', width: 150, link: true }, diff --git a/packages/crm/src/crm.view_enhanced.ts b/packages/crm/src/crm.view_enhanced.ts index 2dbc2d83..b0200f3c 100644 --- a/packages/crm/src/crm.view_enhanced.ts +++ b/packages/crm/src/crm.view_enhanced.ts @@ -8,24 +8,24 @@ import { ViewTabSchema, SharingConfigSchema, AppearanceConfigSchema, AddRecordCo // --- Opportunity View Tabs --- export const OpportunityViewTabs = [ - { name: 'pipeline', label: 'Pipeline', pinned: false, isDefault: true, visible: true, filter: [['stage', '!=', 'closed_won'], ['stage', '!=', 'closed_lost']] }, - { name: 'won', label: 'Won', pinned: false, isDefault: false, visible: true, filter: [['stage', '=', 'closed_won']] }, - { name: 'lost', label: 'Lost', pinned: false, isDefault: false, visible: true, filter: [['stage', '=', 'closed_lost']] }, + { name: 'pipeline', label: 'Pipeline', pinned: false, isDefault: true, visible: true, filter: [{ field: 'stage', operator: '!=', value: 'closed_won' }, { field: 'stage', operator: '!=', value: 'closed_lost' }] }, + { name: 'won', label: 'Won', pinned: false, isDefault: false, visible: true, filter: [{ field: 'stage', operator: '=', value: 'closed_won' }] }, + { name: 'lost', label: 'Lost', pinned: false, isDefault: false, visible: true, filter: [{ field: 'stage', operator: '=', value: 'closed_lost' }] }, { name: 'all', label: 'All', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; // --- Account View Tabs --- export const AccountViewTabs = [ - { name: 'active', label: 'Active Accounts', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'active']] }, - { name: 'inactive', label: 'Inactive', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'inactive']] }, - { name: 'my_accounts', label: 'My Accounts', pinned: false, isDefault: false, visible: true, filter: [['owner', '=', '${currentUser.id}']] } + { name: 'active', label: 'Active Accounts', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'active' }] }, + { name: 'inactive', label: 'Inactive', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'inactive' }] }, + { name: 'my_accounts', label: 'My Accounts', pinned: false, isDefault: false, visible: true, filter: [{ field: 'owner', operator: '=', value: '${currentUser.id}' }] } ] satisfies ViewTab[]; // --- Contact View Tabs --- export const ContactViewTabs = [ { name: 'all', label: 'All Contacts', pinned: false, isDefault: true, visible: true, filter: [] }, - { name: 'decision_makers', label: 'Decision Makers', pinned: false, isDefault: false, visible: true, filter: [['is_decision_maker', '=', 'true']] }, - { name: 'recent', label: 'Recently Contacted', pinned: false, isDefault: false, visible: true, filter: [['last_contact_date', '>=', 'LAST_30_DAYS']] } + { name: 'decision_makers', label: 'Decision Makers', pinned: false, isDefault: false, visible: true, filter: [{ field: 'is_decision_maker', operator: '=', value: 'true' }] }, + { name: 'recent', label: 'Recently Contacted', pinned: false, isDefault: false, visible: true, filter: [{ field: 'last_contact_date', operator: '>=', value: 'LAST_30_DAYS' }] } ] satisfies ViewTab[]; // --- Shared Configs --- diff --git a/packages/crm/src/lead.view.ts b/packages/crm/src/lead.view.ts index 601f41ba..b5215a8f 100644 --- a/packages/crm/src/lead.view.ts +++ b/packages/crm/src/lead.view.ts @@ -32,7 +32,7 @@ export const MyLeadsView = { type: 'grid' as const, name: 'my_leads', label: 'My Leads', - filter: [['owner_id', '=', '${currentUser.id}']], + filter: [{ field: 'owner_id', operator: '=', value: '${currentUser.id}' }], columns: [ { field: 'first_name', width: 150, link: true }, { field: 'last_name', width: 150, link: true }, @@ -51,7 +51,7 @@ export const HotLeadsView = { type: 'grid' as const, name: 'hot_leads', label: 'Hot Leads', - filter: [['rating', '=', 'hot']], + filter: [{ field: 'rating', operator: '=', value: 'hot' }], columns: [ { field: 'first_name', width: 150, link: true }, { field: 'last_name', width: 150, link: true }, @@ -73,7 +73,7 @@ export const OpenLeadsView = { type: 'grid' as const, name: 'open_leads', label: 'Open Leads', - filter: [['status', 'IN', ['new', 'contacted']]], + filter: [{ field: 'status', operator: 'IN', value: ['new', 'contacted'] }], columns: [ { field: 'first_name', width: 150, link: true }, { field: 'last_name', width: 150, link: true }, @@ -92,7 +92,7 @@ export const QualifiedLeadsView = { type: 'grid' as const, name: 'qualified_leads', label: 'Qualified Leads', - filter: [['status', '=', 'qualified']], + filter: [{ field: 'status', operator: '=', value: 'qualified' }], columns: [ { field: 'first_name', width: 150, link: true }, { field: 'last_name', width: 150, link: true }, @@ -111,7 +111,7 @@ export const PublicPoolView = { type: 'grid' as const, name: 'public_pool', label: 'Public Pool', - filter: [['is_in_public_pool', '=', true]], + filter: [{ field: 'is_in_public_pool', operator: '=', value: true }], columns: [ { field: 'first_name', width: 150, link: true }, { field: 'last_name', width: 150, link: true }, diff --git a/packages/crm/src/opportunity.view.ts b/packages/crm/src/opportunity.view.ts index bb7f09e3..6f3c7b4b 100644 --- a/packages/crm/src/opportunity.view.ts +++ b/packages/crm/src/opportunity.view.ts @@ -31,7 +31,7 @@ export const MyOpportunitiesView = { type: 'grid' as const, name: 'my_opportunities', label: 'My Opportunities', - filter: [['owner_id', '=', '${currentUser.id}']], + filter: [{ field: 'owner_id', operator: '=', value: '${currentUser.id}' }], columns: [ { field: 'name', width: 250, link: true }, { field: 'account_id', width: 200 }, @@ -49,7 +49,7 @@ export const OpenPipelineView = { type: 'grid' as const, name: 'open_pipeline', label: 'Open Pipeline', - filter: [['stage', 'NOT IN', ['closed_won', 'closed_lost']]], + filter: [{ field: 'stage', operator: 'NOT IN', value: ['closed_won', 'closed_lost'] }], columns: [ { field: 'name', width: 250, link: true }, { field: 'account_id', width: 200 }, @@ -69,8 +69,8 @@ export const ClosingThisMonthView = { name: 'closing_this_month', label: 'Closing This Month', filter: [ - ['close_date', '>=', 'THIS_MONTH'], - ['stage', 'NOT IN', ['closed_won', 'closed_lost']] + { field: 'close_date', operator: '>=', value: 'THIS_MONTH' }, + { field: 'stage', operator: 'NOT IN', value: ['closed_won', 'closed_lost'] } ], columns: [ { field: 'name', width: 250, link: true }, @@ -92,7 +92,7 @@ export const HighValueDealsView = { type: 'grid' as const, name: 'high_value_deals', label: 'High Value Deals', - filter: [['amount', '>', 100000]], + filter: [{ field: 'amount', operator: '>', value: 100000 }], columns: [ { field: 'name', width: 250, link: true }, { field: 'account_id', width: 200 }, @@ -114,7 +114,7 @@ export const LostDealsView = { type: 'grid' as const, name: 'lost_deals', label: 'Lost Deals', - filter: [['stage', '=', 'closed_lost']], + filter: [{ field: 'stage', operator: '=', value: 'closed_lost' }], columns: [ { field: 'name', width: 250, link: true }, { field: 'account_id', width: 200 }, diff --git a/packages/education/package.json b/packages/education/package.json index a9631f4c..3b753c67 100644 --- a/packages/education/package.json +++ b/packages/education/package.json @@ -35,11 +35,11 @@ ], "author": "HotCRM Team", "dependencies": { - "@objectstack/spec": "^3.0.8", + "@objectstack/spec": "^3.0.11", "zod": "^4.3.6" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/education/src/application_form.view.ts b/packages/education/src/application_form.view.ts index 4e733a00..86f7f28a 100644 --- a/packages/education/src/application_form.view.ts +++ b/packages/education/src/application_form.view.ts @@ -32,7 +32,7 @@ export const PendingReviewView = { type: 'grid' as const, name: 'pending_review', label: 'Pending Review', - filter: [['status', '=', 'submitted']], + filter: [{ field: 'status', operator: '=', value: 'submitted' }], columns: [ { field: 'applicant_name', width: 180, link: true }, { field: 'program', width: 150 }, @@ -49,7 +49,7 @@ export const AcceptedApplicationsView = { type: 'grid' as const, name: 'accepted_applications', label: 'Accepted', - filter: [['status', '=', 'accepted']], + filter: [{ field: 'status', operator: '=', value: 'accepted' }], columns: [ { field: 'applicant_name', width: 180, link: true }, { field: 'program', width: 150 }, @@ -66,7 +66,7 @@ export const RejectedApplicationsView = { type: 'grid' as const, name: 'rejected_applications', label: 'Rejected', - filter: [['status', '=', 'rejected']], + filter: [{ field: 'status', operator: '=', value: 'rejected' }], columns: [ { field: 'applicant_name', width: 180, link: true }, { field: 'program', width: 150 }, diff --git a/packages/education/src/course.view.ts b/packages/education/src/course.view.ts index 2f3e6697..5494ce35 100644 --- a/packages/education/src/course.view.ts +++ b/packages/education/src/course.view.ts @@ -32,7 +32,7 @@ export const ActiveCoursesView = { type: 'grid' as const, name: 'active_courses', label: 'Active Courses', - filter: [['status', '=', 'active']], + filter: [{ field: 'status', operator: '=', value: 'active' }], columns: [ { field: 'course_code', width: 120, link: true }, { field: 'name', width: 200, link: true }, diff --git a/packages/education/src/student.view.ts b/packages/education/src/student.view.ts index 034ca276..e3ae3178 100644 --- a/packages/education/src/student.view.ts +++ b/packages/education/src/student.view.ts @@ -32,7 +32,7 @@ export const ActiveStudentsView = { type: 'grid' as const, name: 'active_students', label: 'Active Students', - filter: [['enrollment_status', '=', 'enrolled']], + filter: [{ field: 'enrollment_status', operator: '=', value: 'enrolled' }], columns: [ { field: 'name', width: 180, link: true }, { field: 'student_id_number', width: 120 }, @@ -51,7 +51,7 @@ export const GraduatedStudentsView = { type: 'grid' as const, name: 'graduated_students', label: 'Graduated Students', - filter: [['enrollment_status', '=', 'graduated']], + filter: [{ field: 'enrollment_status', operator: '=', value: 'graduated' }], columns: [ { field: 'name', width: 180, link: true }, { field: 'student_id_number', width: 120 }, @@ -69,7 +69,7 @@ export const OnProbationView = { type: 'grid' as const, name: 'on_probation', label: 'On Probation', - filter: [['gpa', '<', '2.0']], + filter: [{ field: 'gpa', operator: '<', value: '2.0' }], columns: [ { field: 'name', width: 180, link: true }, { field: 'student_id_number', width: 120 }, diff --git a/packages/finance/package.json b/packages/finance/package.json index 5271c6ab..6a3c20ac 100644 --- a/packages/finance/package.json +++ b/packages/finance/package.json @@ -38,10 +38,10 @@ ], "author": "HotCRM Team", "dependencies": { - "@objectstack/spec": "^3.0.8" + "@objectstack/spec": "^3.0.11" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/finance/src/contract.view.ts b/packages/finance/src/contract.view.ts index e7360170..6f4d303a 100644 --- a/packages/finance/src/contract.view.ts +++ b/packages/finance/src/contract.view.ts @@ -31,7 +31,7 @@ export const ActiveContractsView = { type: 'grid' as const, name: 'active_contracts', label: 'Active Contracts', - filter: [['status', '=', 'activated']], + filter: [{ field: 'status', operator: '=', value: 'activated' }], columns: [ { field: 'contract_number', width: 150, link: true }, { field: 'account', width: 200 }, @@ -50,8 +50,8 @@ export const ExpiringContractsView = { name: 'expiring_contracts', label: 'Expiring Contracts', filter: [ - ['end_date', '<=', 'NEXT_90_DAYS'], - ['status', '=', 'activated'] + { field: 'end_date', operator: '<=', value: 'NEXT_90_DAYS' }, + { field: 'status', operator: '=', value: 'activated' } ], columns: [ { field: 'contract_number', width: 150, link: true }, @@ -72,7 +72,7 @@ export const DraftContractsView = { type: 'grid' as const, name: 'draft_contracts', label: 'Draft Contracts', - filter: [['status', '=', 'draft']], + filter: [{ field: 'status', operator: '=', value: 'draft' }], columns: [ { field: 'contract_number', width: 150, link: true }, { field: 'account', width: 200 }, diff --git a/packages/finance/src/finance.view_enhanced.ts b/packages/finance/src/finance.view_enhanced.ts index 04becc41..831115a0 100644 --- a/packages/finance/src/finance.view_enhanced.ts +++ b/packages/finance/src/finance.view_enhanced.ts @@ -8,23 +8,23 @@ import { ViewTabSchema, SharingConfigSchema, AppearanceConfigSchema, AddRecordCo // --- Invoice View Tabs --- export const InvoiceViewTabs = [ - { name: 'pending', label: 'Pending', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'pending']] }, - { name: 'paid', label: 'Paid', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'paid']] }, - { name: 'overdue', label: 'Overdue', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'overdue']] }, + { name: 'pending', label: 'Pending', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'pending' }] }, + { name: 'paid', label: 'Paid', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'paid' }] }, + { name: 'overdue', label: 'Overdue', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'overdue' }] }, { name: 'all', label: 'All Invoices', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; // --- Contract View Tabs --- export const ContractViewTabs = [ - { name: 'active', label: 'Active', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'activated']] }, - { name: 'expired', label: 'Expired', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'expired']] }, - { name: 'draft', label: 'Draft', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'draft']] } + { name: 'active', label: 'Active', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'activated' }] }, + { name: 'expired', label: 'Expired', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'expired' }] }, + { name: 'draft', label: 'Draft', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'draft' }] } ] satisfies ViewTab[]; // --- Payment View Tabs --- export const PaymentViewTabs = [ - { name: 'completed', label: 'Completed', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'completed']] }, - { name: 'pending', label: 'Pending', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'pending']] }, + { name: 'completed', label: 'Completed', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'completed' }] }, + { name: 'pending', label: 'Pending', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'pending' }] }, { name: 'all', label: 'All Payments', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; diff --git a/packages/financial-services/package.json b/packages/financial-services/package.json index 4354cb6a..23d12f9e 100644 --- a/packages/financial-services/package.json +++ b/packages/financial-services/package.json @@ -35,11 +35,11 @@ ], "author": "HotCRM Team", "dependencies": { - "@objectstack/spec": "^3.0.8", + "@objectstack/spec": "^3.0.11", "zod": "^4.3.6" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/financial-services/src/kyc.view.ts b/packages/financial-services/src/kyc.view.ts index df3d77a6..6de51d66 100644 --- a/packages/financial-services/src/kyc.view.ts +++ b/packages/financial-services/src/kyc.view.ts @@ -34,7 +34,7 @@ export const PendingVerificationView = { type: 'grid' as const, name: 'pending_kyc', label: 'Pending Verification', - filter: [['status', '=', 'pending']], + filter: [{ field: 'status', operator: '=', value: 'pending' }], columns: [ { field: 'wealth_account', width: 200, link: true }, { field: 'risk_rating', width: 120 }, @@ -55,7 +55,7 @@ export const ExpiredKycView = { type: 'grid' as const, name: 'expired_kyc', label: 'Expired', - filter: [['status', '=', 'expired']], + filter: [{ field: 'status', operator: '=', value: 'expired' }], columns: [ { field: 'wealth_account', width: 200, link: true }, { field: 'expiry_date', width: 140 }, @@ -76,7 +76,7 @@ export const HighRiskKycView = { type: 'grid' as const, name: 'high_risk_kyc', label: 'High Risk', - filter: [['risk_rating', '=', 'high']], + filter: [{ field: 'risk_rating', operator: '=', value: 'high' }], columns: [ { field: 'wealth_account', width: 200, link: true }, { field: 'status', width: 120 }, diff --git a/packages/financial-services/src/portfolio.view.ts b/packages/financial-services/src/portfolio.view.ts index 8286b8c7..9a940826 100644 --- a/packages/financial-services/src/portfolio.view.ts +++ b/packages/financial-services/src/portfolio.view.ts @@ -52,7 +52,7 @@ export const TopPerformersView = { type: 'grid' as const, name: 'top_performing_portfolios', label: 'Top Performers', - filter: [['performance_ytd', '>', 0]], + filter: [{ field: 'performance_ytd', operator: '>', value: 0 }], columns: [ { field: 'name', width: 200, link: true }, { field: 'wealth_account', width: 180 }, diff --git a/packages/financial-services/src/wealth_account.view.ts b/packages/financial-services/src/wealth_account.view.ts index b67a617d..c463c5ba 100644 --- a/packages/financial-services/src/wealth_account.view.ts +++ b/packages/financial-services/src/wealth_account.view.ts @@ -35,7 +35,7 @@ export const ActiveAccountsView = { type: 'grid' as const, name: 'active_wealth_accounts', label: 'Active Accounts', - filter: [['status', '=', 'active']], + filter: [{ field: 'status', operator: '=', value: 'active' }], columns: [ { field: 'client_name', width: 200, link: true }, { field: 'account_number', width: 140 }, diff --git a/packages/healthcare/package.json b/packages/healthcare/package.json index 43fbd263..4acf1718 100644 --- a/packages/healthcare/package.json +++ b/packages/healthcare/package.json @@ -35,11 +35,11 @@ ], "author": "HotCRM Team", "dependencies": { - "@objectstack/spec": "^3.0.8", + "@objectstack/spec": "^3.0.11", "zod": "^4.3.6" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/healthcare/src/appointment.view.ts b/packages/healthcare/src/appointment.view.ts index 63a10c7e..60754e60 100644 --- a/packages/healthcare/src/appointment.view.ts +++ b/packages/healthcare/src/appointment.view.ts @@ -31,7 +31,7 @@ export const TodaysAppointmentsView = { type: 'grid' as const, name: 'todays_appointments', label: "Today's Appointments", - filter: [['appointment_date', '=', 'TODAY']], + filter: [{ field: 'appointment_date', operator: '=', value: 'TODAY' }], columns: [ { field: 'patient', width: 180, link: true }, { field: 'appointment_time', width: 100 }, @@ -53,7 +53,7 @@ export const UpcomingAppointmentsView = { type: 'grid' as const, name: 'upcoming_appointments', label: 'Upcoming Appointments', - filter: [['appointment_date', '>', 'TODAY']], + filter: [{ field: 'appointment_date', operator: '>', value: 'TODAY' }], columns: [ { field: 'patient', width: 180, link: true }, { field: 'appointment_date', width: 130 }, @@ -71,7 +71,7 @@ export const CancelledAppointmentsView = { type: 'grid' as const, name: 'cancelled_appointments', label: 'Cancelled Appointments', - filter: [['status', '=', 'cancelled']], + filter: [{ field: 'status', operator: '=', value: 'cancelled' }], columns: [ { field: 'patient', width: 180, link: true }, { field: 'appointment_date', width: 130 }, diff --git a/packages/healthcare/src/patient.view.ts b/packages/healthcare/src/patient.view.ts index c6998022..09770b22 100644 --- a/packages/healthcare/src/patient.view.ts +++ b/packages/healthcare/src/patient.view.ts @@ -32,7 +32,7 @@ export const ActivePatientsView = { type: 'grid' as const, name: 'active_patients', label: 'Active Patients', - filter: [['status', '=', 'active']], + filter: [{ field: 'status', operator: '=', value: 'active' }], columns: [ { field: 'first_name', width: 150, link: true }, { field: 'last_name', width: 150, link: true }, @@ -50,7 +50,7 @@ export const MyPatientsView = { type: 'grid' as const, name: 'my_patients', label: 'My Patients', - filter: [['primary_physician', '=', '${currentUser.id}']], + filter: [{ field: 'primary_physician', operator: '=', value: '${currentUser.id}' }], columns: [ { field: 'first_name', width: 150, link: true }, { field: 'last_name', width: 150, link: true }, @@ -68,7 +68,7 @@ export const DischargedPatientsView = { type: 'grid' as const, name: 'discharged_patients', label: 'Discharged Patients', - filter: [['status', '=', 'discharged']], + filter: [{ field: 'status', operator: '=', value: 'discharged' }], columns: [ { field: 'first_name', width: 150, link: true }, { field: 'last_name', width: 150, link: true }, diff --git a/packages/healthcare/src/referral.view.ts b/packages/healthcare/src/referral.view.ts index 49954f82..3c20879f 100644 --- a/packages/healthcare/src/referral.view.ts +++ b/packages/healthcare/src/referral.view.ts @@ -31,7 +31,7 @@ export const PendingReferralsView = { type: 'grid' as const, name: 'pending_referrals', label: 'Pending Referrals', - filter: [['status', '=', 'pending']], + filter: [{ field: 'status', operator: '=', value: 'pending' }], columns: [ { field: 'patient', width: 180, link: true }, { field: 'referring_provider', width: 150 }, @@ -53,7 +53,7 @@ export const CompletedReferralsView = { type: 'grid' as const, name: 'completed_referrals', label: 'Completed Referrals', - filter: [['status', '=', 'completed']], + filter: [{ field: 'status', operator: '=', value: 'completed' }], columns: [ { field: 'patient', width: 180, link: true }, { field: 'referred_to_provider', width: 150 }, @@ -70,7 +70,7 @@ export const UrgentReferralsView = { type: 'grid' as const, name: 'urgent_referrals', label: 'Urgent Referrals', - filter: [['urgency', '=', 'urgent']], + filter: [{ field: 'urgency', operator: '=', value: 'urgent' }], columns: [ { field: 'patient', width: 180, link: true }, { field: 'referring_provider', width: 150 }, diff --git a/packages/hr/package.json b/packages/hr/package.json index e4c678cd..73272848 100644 --- a/packages/hr/package.json +++ b/packages/hr/package.json @@ -40,10 +40,10 @@ ], "author": "HotCRM Team", "dependencies": { - "@objectstack/spec": "^3.0.8" + "@objectstack/spec": "^3.0.11" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/hr/src/employee.view.ts b/packages/hr/src/employee.view.ts index 2c852cba..11302f85 100644 --- a/packages/hr/src/employee.view.ts +++ b/packages/hr/src/employee.view.ts @@ -31,7 +31,7 @@ export const ActiveEmployeesView = { type: 'grid' as const, name: 'active_employees', label: 'Active Employees', - filter: [['employment_status', '=', 'active']], + filter: [{ field: 'employment_status', operator: '=', value: 'active' }], columns: [ { field: 'employee_number', width: 130, link: true }, { field: 'full_name', width: 200, link: true }, @@ -69,7 +69,7 @@ export const RecentHiresView = { type: 'grid' as const, name: 'recent_hires', label: 'Recent Hires', - filter: [['hire_date', '>=', 'LAST_90_DAYS']], + filter: [{ field: 'hire_date', operator: '>=', value: 'LAST_90_DAYS' }], columns: [ { field: 'employee_number', width: 130, link: true }, { field: 'full_name', width: 200, link: true }, @@ -87,7 +87,7 @@ export const OnLeaveView = { type: 'grid' as const, name: 'on_leave', label: 'On Leave', - filter: [['employment_status', '=', 'on_leave']], + filter: [{ field: 'employment_status', operator: '=', value: 'on_leave' }], columns: [ { field: 'employee_number', width: 130, link: true }, { field: 'full_name', width: 200, link: true }, diff --git a/packages/hr/src/hr.view_enhanced.ts b/packages/hr/src/hr.view_enhanced.ts index 55e9d74a..b3ed57e0 100644 --- a/packages/hr/src/hr.view_enhanced.ts +++ b/packages/hr/src/hr.view_enhanced.ts @@ -8,23 +8,23 @@ import { ViewTabSchema, SharingConfigSchema, AppearanceConfigSchema, AddRecordCo // --- Employee View Tabs --- export const EmployeeViewTabs = [ - { name: 'active', label: 'Active', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'active']] }, - { name: 'on_leave', label: 'On Leave', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'on_leave']] }, + { name: 'active', label: 'Active', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'active' }] }, + { name: 'on_leave', label: 'On Leave', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'on_leave' }] }, { name: 'all', label: 'All Employees', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; // --- Application View Tabs --- export const ApplicationViewTabs = [ - { name: 'new', label: 'New', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'new']] }, - { name: 'in_review', label: 'In Review', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'in_review']] }, - { name: 'hired', label: 'Hired', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'hired']] }, + { name: 'new', label: 'New', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'new' }] }, + { name: 'in_review', label: 'In Review', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'in_review' }] }, + { name: 'hired', label: 'Hired', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'hired' }] }, { name: 'all', label: 'All Applications', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; // --- Time Off View Tabs --- export const TimeOffViewTabs = [ - { name: 'pending', label: 'Pending Approval', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'pending']] }, - { name: 'approved', label: 'Approved', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'approved']] }, + { name: 'pending', label: 'Pending Approval', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'pending' }] }, + { name: 'approved', label: 'Approved', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'approved' }] }, { name: 'all', label: 'All Requests', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; diff --git a/packages/integration/package.json b/packages/integration/package.json index 4759265d..532e4b99 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -36,11 +36,11 @@ "author": "HotCRM Team", "dependencies": { "@hotcrm/ai": "workspace:*", - "@objectstack/spec": "^3.0.8", + "@objectstack/spec": "^3.0.11", "zod": "^4.3.6" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/integration/src/connector.view.ts b/packages/integration/src/connector.view.ts index 6caa2aab..62d6470a 100644 --- a/packages/integration/src/connector.view.ts +++ b/packages/integration/src/connector.view.ts @@ -34,7 +34,7 @@ export const ActiveConnectorsView = { type: 'grid' as const, name: 'active_connectors', label: 'Active Connectors', - filter: [['status', '=', 'active']], + filter: [{ field: 'status', operator: '=', value: 'active' }], columns: [ { field: 'name', width: 200, link: true }, { field: 'provider', width: 150 }, @@ -55,7 +55,7 @@ export const ErrorConnectorsView = { type: 'grid' as const, name: 'error_connectors', label: 'Connectors with Errors', - filter: [['status', '=', 'error']], + filter: [{ field: 'status', operator: '=', value: 'error' }], columns: [ { field: 'name', width: 200, link: true }, { field: 'provider', width: 150 }, diff --git a/packages/marketing/package.json b/packages/marketing/package.json index 6e09b189..a76b85ca 100644 --- a/packages/marketing/package.json +++ b/packages/marketing/package.json @@ -43,10 +43,10 @@ ], "author": "HotCRM Team", "dependencies": { - "@objectstack/spec": "^3.0.8" + "@objectstack/spec": "^3.0.11" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/marketing/src/campaign.view.ts b/packages/marketing/src/campaign.view.ts index d1d2c58a..215e6a00 100644 --- a/packages/marketing/src/campaign.view.ts +++ b/packages/marketing/src/campaign.view.ts @@ -32,7 +32,7 @@ export const ActiveCampaignsView = { type: 'grid' as const, name: 'active_campaigns', label: 'Active Campaigns', - filter: [['status', '=', 'in_progress']], + filter: [{ field: 'status', operator: '=', value: 'in_progress' }], columns: [ { field: 'name', width: 250, link: true }, { field: 'type', width: 130 }, @@ -51,7 +51,7 @@ export const PlannedCampaignsView = { type: 'grid' as const, name: 'planned_campaigns', label: 'Planned Campaigns', - filter: [['status', '=', 'planned']], + filter: [{ field: 'status', operator: '=', value: 'planned' }], columns: [ { field: 'name', width: 250, link: true }, { field: 'type', width: 130 }, @@ -69,7 +69,7 @@ export const CompletedCampaignsView = { type: 'grid' as const, name: 'completed_campaigns', label: 'Completed Campaigns', - filter: [['status', '=', 'completed']], + filter: [{ field: 'status', operator: '=', value: 'completed' }], columns: [ { field: 'name', width: 250, link: true }, { field: 'type', width: 130 }, diff --git a/packages/marketing/src/marketing.view_enhanced.ts b/packages/marketing/src/marketing.view_enhanced.ts index 013fee02..149000b2 100644 --- a/packages/marketing/src/marketing.view_enhanced.ts +++ b/packages/marketing/src/marketing.view_enhanced.ts @@ -8,24 +8,24 @@ import { ViewTabSchema, SharingConfigSchema, AppearanceConfigSchema, AddRecordCo // --- Campaign View Tabs --- export const CampaignViewTabs = [ - { name: 'active', label: 'Active', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'active']] }, - { name: 'planned', label: 'Planned', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'planned']] }, - { name: 'completed', label: 'Completed', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'completed']] }, + { name: 'active', label: 'Active', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'active' }] }, + { name: 'planned', label: 'Planned', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'planned' }] }, + { name: 'completed', label: 'Completed', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'completed' }] }, { name: 'all', label: 'All Campaigns', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; // --- Lead View Tabs --- export const LeadViewTabs = [ - { name: 'new', label: 'New Leads', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'new']] }, - { name: 'qualified', label: 'Qualified', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'qualified']] }, - { name: 'converted', label: 'Converted', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'converted']] }, + { name: 'new', label: 'New Leads', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'new' }] }, + { name: 'qualified', label: 'Qualified', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'qualified' }] }, + { name: 'converted', label: 'Converted', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'converted' }] }, { name: 'all', label: 'All Leads', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; // --- Email Template View Tabs --- export const EmailTemplateViewTabs = [ - { name: 'active', label: 'Active', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'active']] }, - { name: 'draft', label: 'Draft', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'draft']] }, + { name: 'active', label: 'Active', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'active' }] }, + { name: 'draft', label: 'Draft', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'draft' }] }, { name: 'all', label: 'All Templates', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; diff --git a/packages/products/package.json b/packages/products/package.json index 37625fa9..0485ec94 100644 --- a/packages/products/package.json +++ b/packages/products/package.json @@ -38,10 +38,10 @@ ], "author": "HotCRM Team", "dependencies": { - "@objectstack/spec": "^3.0.8" + "@objectstack/spec": "^3.0.11" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/products/src/product.view.ts b/packages/products/src/product.view.ts index a3dea6f0..32b7f2bc 100644 --- a/packages/products/src/product.view.ts +++ b/packages/products/src/product.view.ts @@ -30,7 +30,7 @@ export const ActiveProductsView = { type: 'grid' as const, name: 'active_products', label: 'Active Products', - filter: [['is_active', '=', true]], + filter: [{ field: 'is_active', operator: '=', value: true }], columns: [ { field: 'name', width: 250, link: true }, { field: 'product_code', width: 130 }, @@ -47,7 +47,7 @@ export const InactiveProductsView = { type: 'grid' as const, name: 'inactive_products', label: 'Inactive Products', - filter: [['is_active', '=', false]], + filter: [{ field: 'is_active', operator: '=', value: false }], columns: [ { field: 'name', width: 250, link: true }, { field: 'product_code', width: 130 }, diff --git a/packages/products/src/products.view_enhanced.ts b/packages/products/src/products.view_enhanced.ts index 38c1ab16..e72b1fee 100644 --- a/packages/products/src/products.view_enhanced.ts +++ b/packages/products/src/products.view_enhanced.ts @@ -8,24 +8,24 @@ import { ViewTabSchema, SharingConfigSchema, AppearanceConfigSchema, AddRecordCo // --- Product View Tabs --- export const ProductViewTabs = [ - { name: 'active', label: 'Active', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'active']] }, - { name: 'retired', label: 'Retired', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'retired']] }, - { name: 'draft', label: 'Draft', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'draft']] }, + { name: 'active', label: 'Active', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'active' }] }, + { name: 'retired', label: 'Retired', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'retired' }] }, + { name: 'draft', label: 'Draft', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'draft' }] }, { name: 'all', label: 'All Products', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; // --- Order View Tabs --- export const OrderViewTabs = [ - { name: 'pending', label: 'Pending', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'pending']] }, - { name: 'shipped', label: 'Shipped', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'shipped']] }, - { name: 'delivered', label: 'Delivered', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'delivered']] }, + { name: 'pending', label: 'Pending', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'pending' }] }, + { name: 'shipped', label: 'Shipped', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'shipped' }] }, + { name: 'delivered', label: 'Delivered', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'delivered' }] }, { name: 'all', label: 'All Orders', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; // --- Quote View Tabs --- export const QuoteViewTabs = [ - { name: 'draft', label: 'Draft', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'draft']] }, - { name: 'approved', label: 'Approved', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'approved']] }, + { name: 'draft', label: 'Draft', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'draft' }] }, + { name: 'approved', label: 'Approved', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'approved' }] }, { name: 'all', label: 'All Quotes', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; diff --git a/packages/products/src/quote.view.ts b/packages/products/src/quote.view.ts index 8692f289..1b40fc7c 100644 --- a/packages/products/src/quote.view.ts +++ b/packages/products/src/quote.view.ts @@ -31,7 +31,7 @@ export const DraftQuotesView = { type: 'grid' as const, name: 'draft_quotes', label: 'Draft Quotes', - filter: [['status', '=', 'draft']], + filter: [{ field: 'status', operator: '=', value: 'draft' }], columns: [ { field: 'quote_number', width: 130, link: true }, { field: 'name', width: 250, link: true }, @@ -48,7 +48,7 @@ export const PendingApprovalView = { type: 'grid' as const, name: 'pending_approval', label: 'Pending Approval', - filter: [['approval_status', '=', 'pending']], + filter: [{ field: 'approval_status', operator: '=', value: 'pending' }], columns: [ { field: 'quote_number', width: 130, link: true }, { field: 'name', width: 250, link: true }, @@ -70,7 +70,7 @@ export const AcceptedQuotesView = { type: 'grid' as const, name: 'accepted_quotes', label: 'Accepted Quotes', - filter: [['status', '=', 'accepted']], + filter: [{ field: 'status', operator: '=', value: 'accepted' }], columns: [ { field: 'quote_number', width: 130, link: true }, { field: 'name', width: 250, link: true }, @@ -88,7 +88,7 @@ export const ExpiredQuotesView = { type: 'grid' as const, name: 'expired_quotes', label: 'Expired Quotes', - filter: [['status', '=', 'expired']], + filter: [{ field: 'status', operator: '=', value: 'expired' }], columns: [ { field: 'quote_number', width: 130, link: true }, { field: 'name', width: 250, link: true }, diff --git a/packages/real-estate/package.json b/packages/real-estate/package.json index 02ff9ec8..33ca4610 100644 --- a/packages/real-estate/package.json +++ b/packages/real-estate/package.json @@ -35,11 +35,11 @@ ], "author": "HotCRM Team", "dependencies": { - "@objectstack/spec": "^3.0.8", + "@objectstack/spec": "^3.0.11", "zod": "^4.3.6" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/real-estate/src/listing.view.ts b/packages/real-estate/src/listing.view.ts index 762b151e..981651be 100644 --- a/packages/real-estate/src/listing.view.ts +++ b/packages/real-estate/src/listing.view.ts @@ -31,7 +31,7 @@ export const ActiveListingsView = { type: 'grid' as const, name: 'active_listings', label: 'Active Listings', - filter: [['status', '=', 'active']], + filter: [{ field: 'status', operator: '=', value: 'active' }], columns: [ { field: 'property_id', width: 200, link: true }, { field: 'list_price', width: 130, sortable: true, align: 'right' as const }, @@ -52,7 +52,7 @@ export const PendingListingsView = { type: 'grid' as const, name: 'pending_listings', label: 'Pending Listings', - filter: [['status', '=', 'pending']], + filter: [{ field: 'status', operator: '=', value: 'pending' }], columns: [ { field: 'property_id', width: 200, link: true }, { field: 'list_price', width: 130, align: 'right' as const }, @@ -69,7 +69,7 @@ export const SoldListingsView = { type: 'grid' as const, name: 'sold_listings', label: 'Sold Listings', - filter: [['status', '=', 'sold']], + filter: [{ field: 'status', operator: '=', value: 'sold' }], columns: [ { field: 'property_id', width: 200, link: true }, { field: 'list_price', width: 130, align: 'right' as const }, diff --git a/packages/real-estate/src/real_estate_offer.view.ts b/packages/real-estate/src/real_estate_offer.view.ts index f56812cf..1c85ca5b 100644 --- a/packages/real-estate/src/real_estate_offer.view.ts +++ b/packages/real-estate/src/real_estate_offer.view.ts @@ -31,7 +31,7 @@ export const PendingOffersView = { type: 'grid' as const, name: 'pending_offers', label: 'Pending Offers', - filter: [['status', '=', 'submitted']], + filter: [{ field: 'status', operator: '=', value: 'submitted' }], columns: [ { field: 'listing_id', width: 200, link: true }, { field: 'buyer_id', width: 160 }, @@ -52,7 +52,7 @@ export const AcceptedOffersView = { type: 'grid' as const, name: 'accepted_offers', label: 'Accepted Offers', - filter: [['status', '=', 'accepted']], + filter: [{ field: 'status', operator: '=', value: 'accepted' }], columns: [ { field: 'listing_id', width: 200, link: true }, { field: 'buyer_id', width: 160 }, @@ -69,7 +69,7 @@ export const RejectedOffersView = { type: 'grid' as const, name: 'rejected_offers', label: 'Rejected Offers', - filter: [['status', '=', 'rejected']], + filter: [{ field: 'status', operator: '=', value: 'rejected' }], columns: [ { field: 'listing_id', width: 200, link: true }, { field: 'buyer_id', width: 160 }, diff --git a/packages/real-estate/src/showing.view.ts b/packages/real-estate/src/showing.view.ts index 501dea93..c94944b0 100644 --- a/packages/real-estate/src/showing.view.ts +++ b/packages/real-estate/src/showing.view.ts @@ -30,7 +30,7 @@ export const TodayShowingsView = { type: 'grid' as const, name: 'today_showings', label: 'Today', - filter: [['scheduled_date', '=', 'TODAY()']], + filter: [{ field: 'scheduled_date', operator: '=', value: 'TODAY()' }], columns: [ { field: 'listing_id', width: 200, link: true }, { field: 'scheduled_date', width: 160, sortable: true }, @@ -47,7 +47,7 @@ export const UpcomingShowingsView = { type: 'grid' as const, name: 'upcoming_showings', label: 'Upcoming', - filter: [['scheduled_date', '>', 'TODAY()']], + filter: [{ field: 'scheduled_date', operator: '>', value: 'TODAY()' }], columns: [ { field: 'listing_id', width: 200, link: true }, { field: 'scheduled_date', width: 160, sortable: true }, @@ -64,7 +64,7 @@ export const CompletedShowingsView = { type: 'grid' as const, name: 'completed_showings', label: 'Completed', - filter: [['follow_up_status', '=', 'completed']], + filter: [{ field: 'follow_up_status', operator: '=', value: 'completed' }], columns: [ { field: 'listing_id', width: 200, link: true }, { field: 'scheduled_date', width: 160, sortable: true }, diff --git a/packages/server/package.json b/packages/server/package.json index 3a9f2af5..8c88431c 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -14,13 +14,13 @@ "compile": "objectstack compile" }, "dependencies": { - "@objectstack/cli": "^3.0.9", - "@objectstack/core": "^3.0.8", - "@objectstack/metadata": "^3.0.8", - "@objectstack/objectql": "^3.0.8", - "@objectstack/plugin-hono-server": "^3.0.8", - "@objectstack/runtime": "^3.0.8", - "@objectstack/spec": "^3.0.8", + "@objectstack/cli": "^3.0.11", + "@objectstack/core": "^3.0.11", + "@objectstack/metadata": "^3.0.11", + "@objectstack/objectql": "^3.0.11", + "@objectstack/plugin-hono-server": "^3.0.11", + "@objectstack/runtime": "^3.0.11", + "@objectstack/spec": "^3.0.11", "pino": "^10.3.1" }, "devDependencies": { diff --git a/packages/support/package.json b/packages/support/package.json index 879541cc..1014271d 100644 --- a/packages/support/package.json +++ b/packages/support/package.json @@ -38,10 +38,10 @@ ], "author": "HotCRM Team", "dependencies": { - "@objectstack/spec": "^3.0.8" + "@objectstack/spec": "^3.0.11" }, "devDependencies": { - "@objectstack/cli": "^3.0.9", + "@objectstack/cli": "^3.0.11", "typescript": "^5.9.3" } } diff --git a/packages/support/src/case.view.ts b/packages/support/src/case.view.ts index 734fbbe1..df36a876 100644 --- a/packages/support/src/case.view.ts +++ b/packages/support/src/case.view.ts @@ -31,7 +31,7 @@ export const MyCasesView = { type: 'grid' as const, name: 'my_cases', label: 'My Cases', - filter: [['owner_id', '=', '${currentUser.id}']], + filter: [{ field: 'owner_id', operator: '=', value: '${currentUser.id}' }], columns: [ { field: 'case_number', width: 130, link: true }, { field: 'subject', width: 280, link: true }, @@ -49,7 +49,7 @@ export const OpenCasesView = { type: 'grid' as const, name: 'open_cases', label: 'Open Cases', - filter: [['status', 'NOT IN', ['resolved', 'closed']]], + filter: [{ field: 'status', operator: 'NOT IN', value: ['resolved', 'closed'] }], columns: [ { field: 'case_number', width: 130, link: true }, { field: 'subject', width: 280, link: true }, @@ -68,7 +68,7 @@ export const HighPriorityCasesView = { type: 'grid' as const, name: 'high_priority_cases', label: 'High Priority', - filter: [['priority', 'IN', ['high', 'critical']]], + filter: [{ field: 'priority', operator: 'IN', value: ['high', 'critical'] }], columns: [ { field: 'case_number', width: 130, link: true }, { field: 'subject', width: 280, link: true }, @@ -90,7 +90,7 @@ export const EscalatedCasesView = { type: 'grid' as const, name: 'escalated_cases', label: 'Escalated Cases', - filter: [['is_escalated', '=', true]], + filter: [{ field: 'is_escalated', operator: '=', value: true }], columns: [ { field: 'case_number', width: 130, link: true }, { field: 'subject', width: 280, link: true }, @@ -112,7 +112,7 @@ export const SLAAtRiskView = { type: 'grid' as const, name: 'sla_at_risk', label: 'SLA At Risk', - filter: [['is_sla_violated', '=', true]], + filter: [{ field: 'is_sla_violated', operator: '=', value: true }], columns: [ { field: 'case_number', width: 130, link: true }, { field: 'subject', width: 280, link: true }, diff --git a/packages/support/src/knowledge_article.view.ts b/packages/support/src/knowledge_article.view.ts index 0c8e22c9..631553d0 100644 --- a/packages/support/src/knowledge_article.view.ts +++ b/packages/support/src/knowledge_article.view.ts @@ -31,7 +31,7 @@ export const PublishedArticlesView = { type: 'grid' as const, name: 'published_articles', label: 'Published Articles', - filter: [['status', '=', 'published']], + filter: [{ field: 'status', operator: '=', value: 'published' }], columns: [ { field: 'title', width: 300, link: true }, { field: 'article_number', width: 130 }, @@ -49,7 +49,7 @@ export const DraftArticlesView = { type: 'grid' as const, name: 'draft_articles', label: 'Draft Articles', - filter: [['status', '=', 'draft']], + filter: [{ field: 'status', operator: '=', value: 'draft' }], columns: [ { field: 'title', width: 300, link: true }, { field: 'article_number', width: 130 }, @@ -66,7 +66,7 @@ export const InternalArticlesView = { type: 'grid' as const, name: 'internal_articles', label: 'Internal Articles', - filter: [['is_internal', '=', true]], + filter: [{ field: 'is_internal', operator: '=', value: true }], columns: [ { field: 'title', width: 300, link: true }, { field: 'article_number', width: 130 }, @@ -84,7 +84,7 @@ export const PopularArticlesView = { type: 'grid' as const, name: 'popular_articles', label: 'Popular Articles', - filter: [['view_count', '>', 100]], + filter: [{ field: 'view_count', operator: '>', value: 100 }], columns: [ { field: 'title', width: 300, link: true }, { field: 'article_number', width: 130 }, diff --git a/packages/support/src/support.view_enhanced.ts b/packages/support/src/support.view_enhanced.ts index a10f6153..3768a5c7 100644 --- a/packages/support/src/support.view_enhanced.ts +++ b/packages/support/src/support.view_enhanced.ts @@ -8,23 +8,23 @@ import { ViewTabSchema, SharingConfigSchema, AppearanceConfigSchema, AddRecordCo // --- Case View Tabs --- export const CaseViewTabs = [ - { name: 'open', label: 'Open', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'open']] }, - { name: 'escalated', label: 'Escalated', pinned: false, isDefault: false, visible: true, filter: [['is_escalated', '=', 'true']] }, - { name: 'resolved', label: 'Resolved', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'resolved']] }, + { name: 'open', label: 'Open', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'open' }] }, + { name: 'escalated', label: 'Escalated', pinned: false, isDefault: false, visible: true, filter: [{ field: 'is_escalated', operator: '=', value: 'true' }] }, + { name: 'resolved', label: 'Resolved', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'resolved' }] }, { name: 'all', label: 'All Cases', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; // --- Knowledge Base View Tabs --- export const KnowledgeArticleViewTabs = [ - { name: 'published', label: 'Published', pinned: false, isDefault: true, visible: true, filter: [['status', '=', 'published']] }, - { name: 'draft', label: 'Draft', pinned: false, isDefault: false, visible: true, filter: [['status', '=', 'draft']] }, + { name: 'published', label: 'Published', pinned: false, isDefault: true, visible: true, filter: [{ field: 'status', operator: '=', value: 'published' }] }, + { name: 'draft', label: 'Draft', pinned: false, isDefault: false, visible: true, filter: [{ field: 'status', operator: '=', value: 'draft' }] }, { name: 'all', label: 'All Articles', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; // --- Queue View Tabs --- export const QueueViewTabs = [ - { name: 'unassigned', label: 'Unassigned', pinned: false, isDefault: true, visible: true, filter: [['owner', '=', '']] }, - { name: 'my_queue', label: 'My Queue', pinned: false, isDefault: false, visible: true, filter: [['owner', '=', '${currentUser.id}']] }, + { name: 'unassigned', label: 'Unassigned', pinned: false, isDefault: true, visible: true, filter: [{ field: 'owner', operator: '=', value: '' }] }, + { name: 'my_queue', label: 'My Queue', pinned: false, isDefault: false, visible: true, filter: [{ field: 'owner', operator: '=', value: '${currentUser.id}' }] }, { name: 'all', label: 'All Queues', pinned: false, isDefault: false, visible: true, filter: [] } ] satisfies ViewTab[]; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ad0f72e..a779ddcb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,26 +28,26 @@ importers: specifier: ^3.0.3 version: 3.0.3 '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) '@objectstack/driver-memory': - specifier: ^3.0.8 - version: 3.0.8(pino@10.3.1) + specifier: ^3.0.11 + version: 3.0.11 '@objectstack/objectql': - specifier: ^3.0.8 - version: 3.0.8(pino@10.3.1) + specifier: ^3.0.11 + version: 3.0.11 '@objectstack/plugin-hono-server': - specifier: ^3.0.8 - version: 3.0.8(pino@10.3.1) + specifier: ^3.0.11 + version: 3.0.11 '@objectstack/runtime': - specifier: ^3.0.8 - version: 3.0.8(pino@10.3.1) + specifier: ^3.0.11 + version: 3.0.11 '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 '@objectstack/studio': - specifier: ^3.0.8 - version: 3.0.8(@types/node@25.2.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(pino@10.3.1)(typescript@5.9.3) + specifier: ^3.0.11 + version: 3.0.11(@types/node@25.2.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(typescript@5.9.3) '@types/node': specifier: ^25.2.3 version: 25.2.3 @@ -131,8 +131,8 @@ importers: packages/ai: dependencies: '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 axios: specifier: ^1.13.5 version: 1.13.5 @@ -141,8 +141,8 @@ importers: version: 4.3.6 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -153,15 +153,15 @@ importers: specifier: workspace:* version: link:../ai '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 zod: specifier: ^4.3.6 version: 4.3.6 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -169,15 +169,15 @@ importers: packages/community: dependencies: '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 zod: specifier: ^4.3.6 version: 4.3.6 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -185,8 +185,8 @@ importers: packages/core: dependencies: '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 zod: specifier: ^4.3.6 version: 4.3.6 @@ -197,15 +197,15 @@ importers: specifier: workspace:* version: link:../ai '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 zod: specifier: ^4.3.6 version: 4.3.6 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -213,15 +213,15 @@ importers: packages/education: dependencies: '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 zod: specifier: ^4.3.6 version: 4.3.6 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -229,12 +229,12 @@ importers: packages/finance: dependencies: '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -242,15 +242,15 @@ importers: packages/financial-services: dependencies: '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 zod: specifier: ^4.3.6 version: 4.3.6 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -258,15 +258,15 @@ importers: packages/healthcare: dependencies: '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 zod: specifier: ^4.3.6 version: 4.3.6 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -274,12 +274,12 @@ importers: packages/hr: dependencies: '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -290,15 +290,15 @@ importers: specifier: workspace:* version: link:../ai '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 zod: specifier: ^4.3.6 version: 4.3.6 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -306,12 +306,12 @@ importers: packages/marketing: dependencies: '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -319,12 +319,12 @@ importers: packages/products: dependencies: '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -332,15 +332,15 @@ importers: packages/real-estate: dependencies: '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 zod: specifier: ^4.3.6 version: 4.3.6 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -348,12 +348,12 @@ importers: packages/support: dependencies: '@objectstack/spec': - specifier: ^3.0.8 - version: 3.0.8 + specifier: ^3.0.11 + version: 3.0.11 devDependencies: '@objectstack/cli': - specifier: ^3.0.9 - version: 3.0.9(esbuild@0.27.3) + specifier: ^3.0.11 + version: 3.0.11(esbuild@0.27.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -1094,83 +1094,53 @@ packages: '@object-ui/console@3.0.3': resolution: {integrity: sha512-gExQoxjbl0ur2LMs8XIcyjkDvTol6V/pKXa0l/1KECNLNgUaHC9yYFkqnNgTSAAGwxvyucVVALe0jvyzH/CkRQ==} - '@objectstack/cli@3.0.9': - resolution: {integrity: sha512-2SOAQhP3TTKKv5/H6qCMOMhj8DVhhwJlWkBnXBajeJtVJOyB6e/5G04FlyWpz/yce/MfPKFN+DV2Lg5tI6atKA==} + '@objectstack/cli@3.0.11': + resolution: {integrity: sha512-JXLPc/mU0ARMQCkeA7E0F0og680kDoChlYGk0eUt2D67CLZ5n7D0zqqTtMUigrYecBD0Z/4kn5bktxNhzq11Pg==} hasBin: true - '@objectstack/client-react@3.0.8': - resolution: {integrity: sha512-xFbIt2QETfNmuRTfd7UM+oBHsK4HQSQdapTNHyqMF0blFN1R3hMNg6pLZeXn2+Ui9/J+3mOykiXt71OkpYfHlA==} + '@objectstack/client-react@3.0.11': + resolution: {integrity: sha512-S0j5DQfWqn/rkdltTU+DsUmjx80VbNAhMMgCIx+7aEGCMsinuYdm072RacwYGaWXWok8DGP8GaKtsFP//OCPxg==} peerDependencies: react: '>=18.0.0' - '@objectstack/client@3.0.8': - resolution: {integrity: sha512-b2b9uBoU569Bo4rpfip5a7jwC9CxMqRJ6RUYvzUB89F5EJow0rSVc+3poXdKnIdob2dcIc86tbgYZhGP5mII/A==} + '@objectstack/client@3.0.11': + resolution: {integrity: sha512-B1q7yZtU7Dp4womCrALur/u6LiNoGe8Js2jT87aerbyzWy9waNJV/gq0e//CpBbTv2C931jAzIAqBv86PnRfew==} - '@objectstack/core@3.0.8': - resolution: {integrity: sha512-Jthd5l9uapkPEBZx7oeiaH/mZk3moqqwTf+9u/Y4Tyq22CUaoM7PTM/lhFeKnmhsOfBbrSAVB9VLBR9JNPGs/w==} - peerDependencies: - pino: ^8.0.0 - peerDependenciesMeta: - pino: - optional: true - - '@objectstack/core@3.0.9': - resolution: {integrity: sha512-d4pE3NdCYZpXJrDspvaDxCbrmlyjqBZG+KVWOunMEEySjThBTtCIrmDeAHNPxysI/p9DY7iwrh2pJ1dzWHTKKw==} - - '@objectstack/driver-memory@3.0.8': - resolution: {integrity: sha512-jLcyKVOORoETKlczPapiHxQAb91VUnnNZ2dp87XOh3oMnGRCz1aw0IbgOf4adgUu2GO1GZ57EUAmFsLXekJ18w==} + '@objectstack/core@3.0.11': + resolution: {integrity: sha512-nWwMz8kI3ZFvHVlfKJkKwUil68SW+ONEUkOwnQra/ccGX9sEIxf+gH96JOLEctXh3hAv7YHaLZURmVlnsGFbYA==} - '@objectstack/driver-memory@3.0.9': - resolution: {integrity: sha512-KN7JqDK1RpCjPXW0jF6NVCQU/n/dbFNZkBc3c38I7KqBg7XKRG3NEigGwRQGMB7YiWZ29iJ8rCnKK6yGqzeIQA==} + '@objectstack/driver-memory@3.0.11': + resolution: {integrity: sha512-fMSHsQjj/bMZ1suXzatGcSzkT1yCANSuDEifpzMLaR2c4yUfbKiMeCWC1o5qYUhA+5jHFo4j8A4WvExuryLYlw==} - '@objectstack/metadata@3.0.8': - resolution: {integrity: sha512-QfbxcjkVxV4LICffdUir52v4YsfG5aQriK2CTA4TeMer75tMTfhbpK6JLRHMAOINJcC1r71IfrGCOjGWICCE1Q==} + '@objectstack/metadata@3.0.11': + resolution: {integrity: sha512-rZea8op1au3qWXAzs9MJrnmEOeqUnubmrKQqH1S6ZkvtQkkB/MWjTzRNQCDlFZv5loLbZ7gH+RGjvS3UEWe9Ew==} - '@objectstack/objectql@3.0.8': - resolution: {integrity: sha512-RTNQ0hdrlyS7glvSJ73a83eCZZUE5i8s6u5AY3mSR0b32+sNNxw0nueX5qnuVTfABjyzOE5RCzISUQg3+89b2w==} + '@objectstack/objectql@3.0.11': + resolution: {integrity: sha512-S47oUmgzTSBZUWkpFgaf2W/RkZT15eE4SmlXSf5eUhK6EMPaEVDWL0PTNl8iss7FLUnYn8VT/eLWMC8xQrU1qw==} - '@objectstack/objectql@3.0.9': - resolution: {integrity: sha512-vwZhzN8ufkcLWDBGC1V6/1twLb1PkNH5uM206jzshAlx+iwUD3smyNtNMBmyYEPLX57vQMyibMtdcw9IrJWXGQ==} + '@objectstack/plugin-hono-server@3.0.11': + resolution: {integrity: sha512-yGafN+3uyge7qibZf9dVjp8c9kiXcAI/DKTB+jPueGotDqlhSOVSv1lQ7VrcP1t8RqKPAnZBkC80u/Lxssaueg==} - '@objectstack/plugin-hono-server@3.0.8': - resolution: {integrity: sha512-bhSPCs4wWlKmA2d+q73meBZhEmmyZJqMswTMxYoxGvgQWG+d2uYhnxXkYLM1g6/jVE5EBg6Pd6F45B2bFMTkOg==} - - '@objectstack/plugin-hono-server@3.0.9': - resolution: {integrity: sha512-cc6HC766Ik2tU7NE9HELO+beZWGrL9ISrSb73OJ/gwp1UMXnxlEwJ3wL/syTDw69muRbp8pGFJfkaZ+vbEM4DA==} - - '@objectstack/plugin-msw@3.0.8': - resolution: {integrity: sha512-HbxpM16J5fTvSGZ8Ctr4RQ61s2o6GvEgul7tyVZux72UQsRLSoYcZ9zf+ucoAwKJn73Qyfyypv0q4xv5ISM6HA==} + '@objectstack/plugin-msw@3.0.11': + resolution: {integrity: sha512-+ueRY/7nL6RjrQW6VUttlXNEeBoliAA+mGbVSBe4rGLGujgb7k8hGM7qmpzuCgW0H/rECQ1parsZZXgwLcT41A==} peerDependencies: - '@objectstack/runtime': 3.0.8 - - '@objectstack/rest@3.0.8': - resolution: {integrity: sha512-OQZkSxyH0k0fukdl4ajzpUGn3D7bajObvMTo57ypWa4uVzPkN4wWRA4c7B0Njt3HaJVyws5oN4mCA5GWSNfgTg==} + '@objectstack/runtime': 3.0.11 - '@objectstack/rest@3.0.9': - resolution: {integrity: sha512-lPc1AiCURpsO+YE+sNtDwpNZHmSPuLwjXJQz5y0aYF8OfXK6uS8Bzl10n52dnPK+d1l7U4ibx+CtP3r7Z3woRw==} + '@objectstack/rest@3.0.11': + resolution: {integrity: sha512-pZlvEk39YwWTOdrhA8Qt9O3MUSom/qwaxIB4mX4ZIFhekBtN6HZRjw3Pbs/LPIo4kOGF2bt3JXX5PjDbNT/UUA==} - '@objectstack/runtime@3.0.8': - resolution: {integrity: sha512-nfzWtU048zBa4r6RqaHYQ7jswYPSifn/QoEo6DsrN91fh/78QZ5kevs1N1+/5XGI7X3YBU8QET/Nok6WNhpZiA==} - - '@objectstack/runtime@3.0.9': - resolution: {integrity: sha512-ERwLo0ilhLYe8Zn31I+lvCnFFxzup4jWDc5UR/YiWfXVafO+v+USJiubKfOK+2pJDzKb2hr3ud5aTRJ22diVNA==} - - '@objectstack/spec@3.0.8': - resolution: {integrity: sha512-67GiqVfBXrMWRel6G+oXc6yyUmUmaC5BXR0C9hNWCgIlxl/0NE2TZ/tweOHPTuZ+F9GvMxg6eKg/cYFgy0ER/A==} - engines: {node: '>=18.0.0'} + '@objectstack/runtime@3.0.11': + resolution: {integrity: sha512-yZwpswHvw1OKvnSOU1FA4qT4cHjaOUn4ekNcOkhaWrvTkheaXIZ3wsPdgN4hxqg34SWtpd4mk1Zv7ZArZemacg==} - '@objectstack/spec@3.0.9': - resolution: {integrity: sha512-VQKm4omZIYOqVQKUpCj1Ef3cpGXX88lqAN8hpY1BgKnuP9pqJk7KvwHie7iSajIm2R5x/U+kZegSqQsSC8iQKw==} + '@objectstack/spec@3.0.11': + resolution: {integrity: sha512-UsVs3tgZ9aELdE1tkfYmxod5BIqKpswgkbTtC78+7ANaUn22jh7uuprIf31Oljsps69DFlw2CU8sJx96CTL4YQ==} engines: {node: '>=18.0.0'} - '@objectstack/studio@3.0.8': - resolution: {integrity: sha512-tB6+R2CpFLt6t2GOnD5/q6QpTqB9fPsUWFLvAhcqD5L7PDFf62cwBQFyYM2zpA2vC6qnvqFboUKMubcopuccrA==} + '@objectstack/studio@3.0.11': + resolution: {integrity: sha512-pWJ+jpkNI62NrCRH/X0RhXUR0DXtm0MXzt0uCa1SdfFNvV+EO9zU63miytMZlKJF9fA6/osny7sBhn0gy99SJw==} - '@objectstack/types@3.0.8': - resolution: {integrity: sha512-Tl59ctVgVespaIK81QpNAS7JXFRsuniVeP3NygbnvWj3Jnn59Q9TKBGSxD8InVF7r37byIO3WTcx61qZktaZCA==} - - '@objectstack/types@3.0.9': - resolution: {integrity: sha512-iw/v9/hN/kkru87+OsV+tOvq5/4zHNpv2kW+z4C/Bq0GC9eAA0jdUsMX/O6OqF9Y00p3Mb9oEDvMbJDkYLr7VA==} + '@objectstack/types@3.0.11': + resolution: {integrity: sha512-UhNBSnMvOU0qjjyQPPR9ZYiKF6sym5qq78Bli5O1xsTL0kSR55cGVYGxtPcMLTBIeDC8rT384+Oxcvee903KTQ==} '@oclif/core@4.8.1': resolution: {integrity: sha512-07mq0vKCWNsB85ZHeBMlTAiO0KLFqHyAeRK3bD2K8CI1tX3tiwkWw1lZQZkiw8MUBrhxdROhMkYMY4Q0l7JHqA==} @@ -2878,8 +2848,8 @@ packages: resolution: {integrity: sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ==} engines: {node: '>=16.9.0'} - hono@4.12.1: - resolution: {integrity: sha512-hi9afu8g0lfJVLolxElAZGANCTTl6bewIdsRNhaywfP9K8BPf++F2z6OLrYGIinUwpRKzbZHMhPwvc0ZEpAwGw==} + hono@4.12.3: + resolution: {integrity: sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==} engines: {node: '>=16.9.0'} html-escaper@2.0.2: @@ -3164,8 +3134,8 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - lucide-react@0.574.0: - resolution: {integrity: sha512-dJ8xb5juiZVIbdSn3HTyHsjjIwUwZ4FNwV0RtYDScOyySOeie1oXZTymST6YPJ4Qwt3Po8g4quhYl4OxtACiuQ==} + lucide-react@0.575.0: + resolution: {integrity: sha512-VuXgKZrk0uiDlWjGGXmKV6MSk9Yy4l10qgVvzGn2AWBx1Ylt0iBexKOAoA6I7JO3m+M9oeovJd3yYENfkUbOeg==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3706,8 +3676,8 @@ packages: '@types/react': optional: true - react-resizable-panels@4.6.4: - resolution: {integrity: sha512-E7Szs1xyaMZ7xOI2gG4TECNz4r/gmpV1AsXyZRnER6OQnfFf9uclFmrHHZR3h/iF8vQS+nQ1LKyZv9bzwGxPSg==} + react-resizable-panels@4.6.5: + resolution: {integrity: sha512-pmQP6qv9KmsesNMvWVNvVfVJAwYSOWWbAOAtrPR8Cre20+j1NWIlyft0btjtDQE+OepXmI6g3VPrCXQY0oD7+Q==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -3969,8 +3939,8 @@ packages: tailwind-merge@3.4.0: resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} - tailwind-merge@3.4.1: - resolution: {integrity: sha512-2OA0rFqWOkITEAOFWSBSApYkDeH9t2B3XSJuI4YztKBzK3mX0737A2qtxDZ7xkw9Zfh0bWl+r34sF3HXV+Ig7Q==} + tailwind-merge@3.5.0: + resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} tailwindcss@4.1.18: resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} @@ -4655,9 +4625,9 @@ snapshots: dependencies: hono: 4.11.9 - '@hono/node-server@1.19.9(hono@4.12.1)': + '@hono/node-server@1.19.9(hono@4.12.3)': dependencies: - hono: 4.12.1 + hono: 4.12.3 '@humanwhocodes/config-array@0.13.0': dependencies: @@ -4923,15 +4893,15 @@ snapshots: '@object-ui/console@3.0.3': {} - '@objectstack/cli@3.0.9(esbuild@0.27.3)': + '@objectstack/cli@3.0.11(esbuild@0.27.3)': dependencies: - '@objectstack/core': 3.0.9 - '@objectstack/driver-memory': 3.0.9 - '@objectstack/objectql': 3.0.9 - '@objectstack/plugin-hono-server': 3.0.9 - '@objectstack/rest': 3.0.9 - '@objectstack/runtime': 3.0.9 - '@objectstack/spec': 3.0.9 + '@objectstack/core': 3.0.11 + '@objectstack/driver-memory': 3.0.11 + '@objectstack/objectql': 3.0.11 + '@objectstack/plugin-hono-server': 3.0.11 + '@objectstack/rest': 3.0.11 + '@objectstack/runtime': 3.0.11 + '@objectstack/spec': 3.0.11 '@oclif/core': 4.8.1 bundle-require: 5.1.0(esbuild@0.27.3) chalk: 5.6.2 @@ -4940,156 +4910,94 @@ snapshots: transitivePeerDependencies: - esbuild - '@objectstack/client-react@3.0.8(pino@10.3.1)(react@19.2.4)': + '@objectstack/client-react@3.0.11(react@19.2.4)': dependencies: - '@objectstack/client': 3.0.8(pino@10.3.1) - '@objectstack/core': 3.0.8(pino@10.3.1) - '@objectstack/spec': 3.0.8 + '@objectstack/client': 3.0.11 + '@objectstack/core': 3.0.11 + '@objectstack/spec': 3.0.11 react: 19.2.4 - transitivePeerDependencies: - - pino - '@objectstack/client@3.0.8(pino@10.3.1)': + '@objectstack/client@3.0.11': dependencies: - '@objectstack/core': 3.0.8(pino@10.3.1) - '@objectstack/spec': 3.0.8 - transitivePeerDependencies: - - pino + '@objectstack/core': 3.0.11 + '@objectstack/spec': 3.0.11 - '@objectstack/core@3.0.8(pino@10.3.1)': + '@objectstack/core@3.0.11': dependencies: - '@objectstack/spec': 3.0.8 - pino-pretty: 13.1.3 - zod: 4.3.6 - optionalDependencies: - pino: 10.3.1 - - '@objectstack/core@3.0.9': - dependencies: - '@objectstack/spec': 3.0.9 + '@objectstack/spec': 3.0.11 pino: 10.3.1 pino-pretty: 13.1.3 zod: 4.3.6 - '@objectstack/driver-memory@3.0.8(pino@10.3.1)': - dependencies: - '@objectstack/core': 3.0.8(pino@10.3.1) - '@objectstack/spec': 3.0.8 - mingo: 7.2.0 - transitivePeerDependencies: - - pino - - '@objectstack/driver-memory@3.0.9': + '@objectstack/driver-memory@3.0.11': dependencies: - '@objectstack/core': 3.0.9 - '@objectstack/spec': 3.0.9 + '@objectstack/core': 3.0.11 + '@objectstack/spec': 3.0.11 mingo: 7.2.0 - '@objectstack/metadata@3.0.8(pino@10.3.1)': + '@objectstack/metadata@3.0.11': dependencies: - '@objectstack/core': 3.0.8(pino@10.3.1) - '@objectstack/spec': 3.0.8 - '@objectstack/types': 3.0.8 + '@objectstack/core': 3.0.11 + '@objectstack/spec': 3.0.11 + '@objectstack/types': 3.0.11 chokidar: 5.0.0 glob: 13.0.6 js-yaml: 4.1.1 zod: 4.3.6 - transitivePeerDependencies: - - pino - - '@objectstack/objectql@3.0.8(pino@10.3.1)': - dependencies: - '@objectstack/core': 3.0.8(pino@10.3.1) - '@objectstack/spec': 3.0.8 - '@objectstack/types': 3.0.8 - transitivePeerDependencies: - - pino - '@objectstack/objectql@3.0.9': + '@objectstack/objectql@3.0.11': dependencies: - '@objectstack/core': 3.0.9 - '@objectstack/spec': 3.0.9 - '@objectstack/types': 3.0.9 + '@objectstack/core': 3.0.11 + '@objectstack/spec': 3.0.11 + '@objectstack/types': 3.0.11 - '@objectstack/plugin-hono-server@3.0.8(pino@10.3.1)': + '@objectstack/plugin-hono-server@3.0.11': dependencies: - '@hono/node-server': 1.19.9(hono@4.11.9) - '@objectstack/core': 3.0.8(pino@10.3.1) - '@objectstack/spec': 3.0.8 - hono: 4.11.9 - transitivePeerDependencies: - - pino - - '@objectstack/plugin-hono-server@3.0.9': - dependencies: - '@hono/node-server': 1.19.9(hono@4.12.1) - '@objectstack/core': 3.0.9 - '@objectstack/spec': 3.0.9 - hono: 4.12.1 + '@hono/node-server': 1.19.9(hono@4.12.3) + '@objectstack/core': 3.0.11 + '@objectstack/spec': 3.0.11 + hono: 4.12.3 - '@objectstack/plugin-msw@3.0.8(@objectstack/runtime@3.0.8(pino@10.3.1))(@types/node@25.2.3)(pino@10.3.1)(typescript@5.9.3)': + '@objectstack/plugin-msw@3.0.11(@objectstack/runtime@3.0.11)(@types/node@25.2.3)(typescript@5.9.3)': dependencies: - '@objectstack/core': 3.0.8(pino@10.3.1) - '@objectstack/objectql': 3.0.8(pino@10.3.1) - '@objectstack/runtime': 3.0.8(pino@10.3.1) - '@objectstack/spec': 3.0.8 - '@objectstack/types': 3.0.8 + '@objectstack/core': 3.0.11 + '@objectstack/objectql': 3.0.11 + '@objectstack/runtime': 3.0.11 + '@objectstack/spec': 3.0.11 + '@objectstack/types': 3.0.11 msw: 2.12.10(@types/node@25.2.3)(typescript@5.9.3) transitivePeerDependencies: - '@types/node' - - pino - typescript - '@objectstack/rest@3.0.8(pino@10.3.1)': + '@objectstack/rest@3.0.11': dependencies: - '@objectstack/core': 3.0.8(pino@10.3.1) - '@objectstack/spec': 3.0.8 + '@objectstack/core': 3.0.11 + '@objectstack/spec': 3.0.11 zod: 4.3.6 - transitivePeerDependencies: - - pino - '@objectstack/rest@3.0.9': + '@objectstack/runtime@3.0.11': dependencies: - '@objectstack/core': 3.0.9 - '@objectstack/spec': 3.0.9 + '@objectstack/core': 3.0.11 + '@objectstack/rest': 3.0.11 + '@objectstack/spec': 3.0.11 + '@objectstack/types': 3.0.11 zod: 4.3.6 - '@objectstack/runtime@3.0.8(pino@10.3.1)': + '@objectstack/spec@3.0.11': dependencies: - '@objectstack/core': 3.0.8(pino@10.3.1) - '@objectstack/rest': 3.0.8(pino@10.3.1) - '@objectstack/spec': 3.0.8 - '@objectstack/types': 3.0.8 zod: 4.3.6 - transitivePeerDependencies: - - pino - '@objectstack/runtime@3.0.9': + '@objectstack/studio@3.0.11(@types/node@25.2.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(typescript@5.9.3)': dependencies: - '@objectstack/core': 3.0.9 - '@objectstack/rest': 3.0.9 - '@objectstack/spec': 3.0.9 - '@objectstack/types': 3.0.9 - zod: 4.3.6 - - '@objectstack/spec@3.0.8': - dependencies: - zod: 4.3.6 - - '@objectstack/spec@3.0.9': - dependencies: - zod: 4.3.6 - - '@objectstack/studio@3.0.8(@types/node@25.2.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(pino@10.3.1)(typescript@5.9.3)': - dependencies: - '@objectstack/client': 3.0.8(pino@10.3.1) - '@objectstack/client-react': 3.0.8(pino@10.3.1)(react@19.2.4) - '@objectstack/driver-memory': 3.0.8(pino@10.3.1) - '@objectstack/metadata': 3.0.8(pino@10.3.1) - '@objectstack/objectql': 3.0.8(pino@10.3.1) - '@objectstack/plugin-msw': 3.0.8(@objectstack/runtime@3.0.8(pino@10.3.1))(@types/node@25.2.3)(pino@10.3.1)(typescript@5.9.3) - '@objectstack/runtime': 3.0.8(pino@10.3.1) - '@objectstack/spec': 3.0.8 + '@objectstack/client': 3.0.11 + '@objectstack/client-react': 3.0.11(react@19.2.4) + '@objectstack/driver-memory': 3.0.11 + '@objectstack/metadata': 3.0.11 + '@objectstack/objectql': 3.0.11 + '@objectstack/plugin-msw': 3.0.11(@objectstack/runtime@3.0.11)(@types/node@25.2.3)(typescript@5.9.3) + '@objectstack/runtime': 3.0.11 + '@objectstack/spec': 3.0.11 '@radix-ui/react-avatar': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -5107,25 +5015,20 @@ snapshots: '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) class-variance-authority: 0.7.1 clsx: 2.1.1 - lucide-react: 0.574.0(react@19.2.4) + lucide-react: 0.575.0(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-resizable-panels: 4.6.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - tailwind-merge: 3.4.1 + react-resizable-panels: 4.6.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + tailwind-merge: 3.5.0 transitivePeerDependencies: - '@types/node' - '@types/react' - '@types/react-dom' - - pino - typescript - '@objectstack/types@3.0.8': - dependencies: - '@objectstack/spec': 3.0.8 - - '@objectstack/types@3.0.9': + '@objectstack/types@3.0.11': dependencies: - '@objectstack/spec': 3.0.9 + '@objectstack/spec': 3.0.11 '@oclif/core@4.8.1': dependencies: @@ -6945,7 +6848,7 @@ snapshots: hono@4.11.9: {} - hono@4.12.1: {} + hono@4.12.3: {} html-escaper@2.0.2: {} @@ -7167,7 +7070,7 @@ snapshots: dependencies: react: 19.2.4 - lucide-react@0.574.0(react@19.2.4): + lucide-react@0.575.0(react@19.2.4): dependencies: react: 19.2.4 @@ -7977,7 +7880,7 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 - react-resizable-panels@4.6.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + react-resizable-panels@4.6.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -8305,7 +8208,7 @@ snapshots: tailwind-merge@3.4.0: {} - tailwind-merge@3.4.1: {} + tailwind-merge@3.5.0: {} tailwindcss@4.1.18: {}