@happyvertical/smrt-support 0.39.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/AGENTS.md +270 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/dist/__smrt-register__.d.ts +2 -0
  5. package/dist/__smrt-register__.d.ts.map +1 -0
  6. package/dist/index.d.ts +5 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +4358 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/manifest.json +6770 -0
  11. package/dist/models/index.d.ts +17 -0
  12. package/dist/models/index.d.ts.map +1 -0
  13. package/dist/models/service-time-entry.d.ts +75 -0
  14. package/dist/models/service-time-entry.d.ts.map +1 -0
  15. package/dist/models/support-ai-run.d.ts +45 -0
  16. package/dist/models/support-ai-run.d.ts.map +1 -0
  17. package/dist/models/support-case-event.d.ts +25 -0
  18. package/dist/models/support-case-event.d.ts.map +1 -0
  19. package/dist/models/support-case.d.ts +125 -0
  20. package/dist/models/support-case.d.ts.map +1 -0
  21. package/dist/models/support-channel-binding.d.ts +47 -0
  22. package/dist/models/support-channel-binding.d.ts.map +1 -0
  23. package/dist/models/support-compensation-plan.d.ts +42 -0
  24. package/dist/models/support-compensation-plan.d.ts.map +1 -0
  25. package/dist/models/support-interaction.d.ts +49 -0
  26. package/dist/models/support-interaction.d.ts.map +1 -0
  27. package/dist/models/support-plan.d.ts +92 -0
  28. package/dist/models/support-plan.d.ts.map +1 -0
  29. package/dist/models/support-policy.d.ts +84 -0
  30. package/dist/models/support-policy.d.ts.map +1 -0
  31. package/dist/models/support-service-target.d.ts +90 -0
  32. package/dist/models/support-service-target.d.ts.map +1 -0
  33. package/dist/models/support-settlement.d.ts +58 -0
  34. package/dist/models/support-settlement.d.ts.map +1 -0
  35. package/dist/models/support-specialist.d.ts +71 -0
  36. package/dist/models/support-specialist.d.ts.map +1 -0
  37. package/dist/models/support-work-link.d.ts +31 -0
  38. package/dist/models/support-work-link.d.ts.map +1 -0
  39. package/dist/permissions.d.ts +32 -0
  40. package/dist/permissions.d.ts.map +1 -0
  41. package/dist/services/coverage-calendar.d.ts +53 -0
  42. package/dist/services/coverage-calendar.d.ts.map +1 -0
  43. package/dist/services/human-handoff-service.d.ts +113 -0
  44. package/dist/services/human-handoff-service.d.ts.map +1 -0
  45. package/dist/services/index.d.ts +15 -0
  46. package/dist/services/index.d.ts.map +1 -0
  47. package/dist/services/keyed-mutex.d.ts +22 -0
  48. package/dist/services/keyed-mutex.d.ts.map +1 -0
  49. package/dist/services/service-target-engine.d.ts +133 -0
  50. package/dist/services/service-target-engine.d.ts.map +1 -0
  51. package/dist/services/service-time-entry-service.d.ts +73 -0
  52. package/dist/services/service-time-entry-service.d.ts.map +1 -0
  53. package/dist/services/support-ai-workflow.d.ts +178 -0
  54. package/dist/services/support-ai-workflow.d.ts.map +1 -0
  55. package/dist/services/support-case-service.d.ts +162 -0
  56. package/dist/services/support-case-service.d.ts.map +1 -0
  57. package/dist/services/support-intake-service.d.ts +106 -0
  58. package/dist/services/support-intake-service.d.ts.map +1 -0
  59. package/dist/services/support-plan-admin-service.d.ts +45 -0
  60. package/dist/services/support-plan-admin-service.d.ts.map +1 -0
  61. package/dist/services/support-routing-service.d.ts +117 -0
  62. package/dist/services/support-routing-service.d.ts.map +1 -0
  63. package/dist/services/time-entry-approval-service.d.ts +162 -0
  64. package/dist/services/time-entry-approval-service.d.ts.map +1 -0
  65. package/dist/smrt-knowledge.json +4242 -0
  66. package/dist/svelte/components/CaseDetail.svelte +277 -0
  67. package/dist/svelte/components/CaseDetail.svelte.d.ts +10 -0
  68. package/dist/svelte/components/CaseDetail.svelte.d.ts.map +1 -0
  69. package/dist/svelte/components/CaseQueue.svelte +148 -0
  70. package/dist/svelte/components/CaseQueue.svelte.d.ts +12 -0
  71. package/dist/svelte/components/CaseQueue.svelte.d.ts.map +1 -0
  72. package/dist/svelte/components/RoutingRationale.svelte +131 -0
  73. package/dist/svelte/components/RoutingRationale.svelte.d.ts +11 -0
  74. package/dist/svelte/components/RoutingRationale.svelte.d.ts.map +1 -0
  75. package/dist/svelte/components/TargetList.svelte +127 -0
  76. package/dist/svelte/components/TargetList.svelte.d.ts +9 -0
  77. package/dist/svelte/components/TargetList.svelte.d.ts.map +1 -0
  78. package/dist/svelte/components/TimeEntryApprovalQueue.svelte +226 -0
  79. package/dist/svelte/components/TimeEntryApprovalQueue.svelte.d.ts +11 -0
  80. package/dist/svelte/components/TimeEntryApprovalQueue.svelte.d.ts.map +1 -0
  81. package/dist/svelte/components/__tests__/CaseDetail.test.js +86 -0
  82. package/dist/svelte/components/__tests__/CaseQueue.test.js +67 -0
  83. package/dist/svelte/components/__tests__/RoutingRationale.test.js +69 -0
  84. package/dist/svelte/components/__tests__/TargetList.test.js +84 -0
  85. package/dist/svelte/components/__tests__/TimeEntryApprovalQueue.test.js +105 -0
  86. package/dist/svelte/index.d.ts +25 -0
  87. package/dist/svelte/index.d.ts.map +1 -0
  88. package/dist/svelte/index.js +18 -0
  89. package/dist/svelte/types.d.ts +129 -0
  90. package/dist/svelte/types.d.ts.map +1 -0
  91. package/dist/svelte/types.js +182 -0
  92. package/dist/types.d.ts +130 -0
  93. package/dist/types.d.ts.map +1 -0
  94. package/dist/types.js +109 -0
  95. package/dist/types.js.map +1 -0
  96. package/package.json +86 -0
package/dist/types.js ADDED
@@ -0,0 +1,109 @@
1
+ //#region src/types.ts
2
+ var SUPPORT_CASE_STATUS_TRANSITIONS = {
3
+ new: [
4
+ "triaged",
5
+ "assigned",
6
+ "in_progress",
7
+ "waiting_on_client",
8
+ "escalated",
9
+ "resolved",
10
+ "closed"
11
+ ],
12
+ triaged: [
13
+ "assigned",
14
+ "in_progress",
15
+ "waiting_on_client",
16
+ "escalated",
17
+ "resolved",
18
+ "closed"
19
+ ],
20
+ assigned: [
21
+ "triaged",
22
+ "in_progress",
23
+ "waiting_on_client",
24
+ "escalated",
25
+ "resolved",
26
+ "closed"
27
+ ],
28
+ in_progress: [
29
+ "assigned",
30
+ "waiting_on_client",
31
+ "escalated",
32
+ "resolved",
33
+ "closed"
34
+ ],
35
+ waiting_on_client: [
36
+ "assigned",
37
+ "in_progress",
38
+ "escalated",
39
+ "resolved",
40
+ "closed"
41
+ ],
42
+ escalated: [
43
+ "assigned",
44
+ "in_progress",
45
+ "waiting_on_client",
46
+ "resolved",
47
+ "closed"
48
+ ],
49
+ resolved: [
50
+ "closed",
51
+ "in_progress",
52
+ "triaged"
53
+ ],
54
+ closed: ["triaged", "in_progress"]
55
+ };
56
+ var OPEN_SUPPORT_CASE_STATUSES = [
57
+ "new",
58
+ "triaged",
59
+ "assigned",
60
+ "in_progress",
61
+ "waiting_on_client",
62
+ "escalated"
63
+ ];
64
+ var SERVICE_TIME_ENTRY_STATUS_TRANSITIONS = {
65
+ draft: ["submitted", "rejected"],
66
+ submitted: [
67
+ "approved",
68
+ "rejected",
69
+ "draft"
70
+ ],
71
+ approved: ["corrected"],
72
+ rejected: ["draft", "submitted"],
73
+ corrected: []
74
+ };
75
+ var DEFAULT_SEVERITY_DEFINITIONS = {
76
+ sev1: {
77
+ label: "Critical",
78
+ description: "Service down or unusable"
79
+ },
80
+ sev2: {
81
+ label: "Major",
82
+ description: "Significant degradation"
83
+ },
84
+ sev3: {
85
+ label: "Minor",
86
+ description: "Limited impact"
87
+ },
88
+ sev4: {
89
+ label: "Question",
90
+ description: "Question or request"
91
+ }
92
+ };
93
+ function parseJsonField(raw, fallback) {
94
+ if (!raw) return fallback;
95
+ if (typeof raw !== "string") return raw;
96
+ try {
97
+ return JSON.parse(raw) ?? fallback;
98
+ } catch {
99
+ return fallback;
100
+ }
101
+ }
102
+ function parseStringArrayField(raw) {
103
+ const parsed = parseJsonField(raw, []);
104
+ return Array.isArray(parsed) ? parsed.filter((value) => typeof value === "string") : [];
105
+ }
106
+ //#endregion
107
+ export { DEFAULT_SEVERITY_DEFINITIONS, OPEN_SUPPORT_CASE_STATUSES, SERVICE_TIME_ENTRY_STATUS_TRANSITIONS, SUPPORT_CASE_STATUS_TRANSITIONS, parseJsonField, parseStringArrayField };
108
+
109
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["/**\n * Shared types, enums, and lifecycle maps for `@happyvertical/smrt-support`.\n *\n * Domain language follows the HappyVertical support glossary: a **Support\n * Case** is the canonical record of a client support request; **Support\n * Interactions** are channel transports attached to it; **Service Targets**\n * are operational clocks (not contractual SLAs); a **Managed Support Plan**\n * carries the client-facing terms while a **Support Compensation Plan**\n * carries the provider-facing terms — the two are never merged.\n */\n\n/** Support Case lifecycle states (FR-29b). */\nexport type SupportCaseStatus =\n | 'new'\n | 'triaged'\n | 'assigned'\n | 'in_progress'\n | 'waiting_on_client'\n | 'escalated'\n | 'resolved'\n | 'closed';\n\n/**\n * Legal Support Case status transitions, enforced at save time by\n * {@link SupportCase} (S5 guarded-lifecycle idiom — raw mass-assignment on a\n * generated route cannot skip states). Reopening (`resolved`/`closed` back to\n * an active state) is legal here; the reopen bookkeeping (count, history\n * event) is layered by `SupportCaseService.reopen()`.\n */\nexport const SUPPORT_CASE_STATUS_TRANSITIONS: Record<\n SupportCaseStatus,\n SupportCaseStatus[]\n> = {\n new: [\n 'triaged',\n 'assigned',\n 'in_progress',\n 'waiting_on_client',\n 'escalated',\n 'resolved',\n 'closed',\n ],\n triaged: [\n 'assigned',\n 'in_progress',\n 'waiting_on_client',\n 'escalated',\n 'resolved',\n 'closed',\n ],\n assigned: [\n 'triaged',\n 'in_progress',\n 'waiting_on_client',\n 'escalated',\n 'resolved',\n 'closed',\n ],\n in_progress: [\n 'assigned',\n 'waiting_on_client',\n 'escalated',\n 'resolved',\n 'closed',\n ],\n waiting_on_client: [\n 'assigned',\n 'in_progress',\n 'escalated',\n 'resolved',\n 'closed',\n ],\n escalated: [\n 'assigned',\n 'in_progress',\n 'waiting_on_client',\n 'resolved',\n 'closed',\n ],\n resolved: ['closed', 'in_progress', 'triaged'],\n closed: ['triaged', 'in_progress'],\n};\n\n/** Case statuses considered \"open\" for create-or-join intake dedup. */\nexport const OPEN_SUPPORT_CASE_STATUSES: SupportCaseStatus[] = [\n 'new',\n 'triaged',\n 'assigned',\n 'in_progress',\n 'waiting_on_client',\n 'escalated',\n];\n\n/** Client-facing priority (ordering/urgency inside a queue). */\nexport type SupportCasePriority = 'low' | 'normal' | 'high' | 'urgent';\n\n/** Transport kind a Support Interaction arrived through. */\nexport type SupportChannelKind =\n | 'chat'\n | 'email'\n | 'phone'\n | 'voice'\n | 'web'\n | 'api';\n\n/** Direction of a Support Interaction relative to the Client. */\nexport type SupportInteractionDirection = 'inbound' | 'outbound' | 'internal';\n\n/** Who performed an interaction or case event. */\nexport type SupportActorKind = 'client' | 'specialist' | 'agent' | 'system';\n\n/** Append-only case audit event types. */\nexport type SupportCaseEventType =\n | 'created'\n | 'interaction'\n | 'transition'\n | 'assignment'\n | 'ai_run'\n | 'handoff'\n | 'human_requested'\n | 'escalation'\n | 'target_scheduled'\n | 'target_satisfied'\n | 'target_breached'\n | 'target_paused'\n | 'target_resumed'\n | 'work_linked'\n | 'reopened'\n | 'plan_applied'\n | 'time_recorded'\n | 'note';\n\n/** What kind of transport container a channel binding points at. */\nexport type SupportBindingKind = 'chat_room' | 'email_account';\n\n/** Operational Work Item link kinds carried by a {@link SupportWorkLink}. */\nexport type SupportWorkLinkKind = 'support_work_item' | 'development_work_item';\n\n/** Service Target clock types (FR-30/FR-31). */\nexport type ServiceTargetType =\n | 'acknowledgement'\n | 'response'\n | 'update'\n | 'resolution';\n\n/** Service Target clock states. */\nexport type ServiceTargetStatus =\n | 'pending'\n | 'paused'\n | 'satisfied'\n | 'breached'\n | 'cancelled';\n\n/** Why a case was escalated. */\nexport type SupportEscalationReason =\n | 'target_breach'\n | 'target_risk'\n | 'manual'\n | 'ai_trigger';\n\n/** AI support workflow phases (FR-28a). */\nexport type SupportAiRunPhase =\n | 'acknowledge'\n | 'classify'\n | 'answer'\n | 'troubleshoot'\n | 'resolve';\n\n/** Terminal outcome of one AI workflow phase run. */\nexport type SupportAiRunOutcome =\n | 'completed'\n | 'skipped'\n | 'failed'\n | 'handed_off';\n\n/** What triggered a Human Handoff (FR-28b). */\nexport type HumanHandoffTrigger =\n | 'client_request'\n | 'low_confidence'\n | 'high_severity'\n | 'sensitive'\n | 'failed_resolution'\n | 'target_risk'\n | 'policy'\n | 'manual';\n\n/** Service Time Entry lifecycle (FR-36). */\nexport type ServiceTimeEntryStatus =\n | 'draft'\n | 'submitted'\n | 'approved'\n | 'rejected'\n | 'corrected';\n\n/**\n * Legal Service Time Entry status transitions. `approved → corrected` is the\n * only exit from `approved` and is reachable exclusively through the explicit\n * correction path (the approved snapshot itself stays frozen).\n */\nexport const SERVICE_TIME_ENTRY_STATUS_TRANSITIONS: Record<\n ServiceTimeEntryStatus,\n ServiceTimeEntryStatus[]\n> = {\n draft: ['submitted', 'rejected'],\n submitted: ['approved', 'rejected', 'draft'],\n approved: ['corrected'],\n rejected: ['draft', 'submitted'],\n corrected: [],\n};\n\n/** How a Service Time Entry was produced (FR-40). */\nexport type ServiceTimeEntrySource = 'timer' | 'manual' | 'import' | 'agent';\n\n/** Who/what delivered the work behind a Service Time Entry. */\nexport type SupportParticipantKind = 'human' | 'agent';\n\n/** Which approval path accepted a Service Time Entry (FR-36). */\nexport type TimeEntryApprovalPath =\n | 'automatic'\n | 'operator'\n | 'client'\n | 'threshold';\n\n/** Derived commercial snapshot lifecycle (charges and compensation). */\nexport type SupportSettlementStatus =\n | 'pending'\n | 'final'\n | 'corrected'\n | 'voided';\n\n/** Support Specialist availability window kinds. */\nexport type SupportAvailabilityKind = 'weekly' | 'on_call' | 'time_off';\n\n/** Support Specialist activation state. */\nexport type SupportSpecialistStatus = 'active' | 'inactive';\n\n/** Project Support Qualification levels. */\nexport type SupportQualificationLevel = 'trainee' | 'qualified' | 'expert';\n\n/** A weekly coverage window in a plan's coverage calendar. */\nexport interface CoverageWindow {\n /** 0 = Sunday … 6 = Saturday (JS `Date#getDay` convention). */\n weekday: number;\n /** Minutes from midnight, inclusive start. */\n startMinute: number;\n /** Minutes from midnight, exclusive end. */\n endMinute: number;\n}\n\n/** Per-severity Service Target minutes; `null` disables that clock. */\nexport interface ServiceTargetMinutes {\n acknowledgementMinutes: number | null;\n responseMinutes: number | null;\n updateMinutes: number | null;\n resolutionMinutes: number | null;\n}\n\n/** One step of a plan's escalation policy, applied in `level` order. */\nexport interface EscalationStep {\n level: number;\n action: 'notify' | 'reassign';\n /** Profile ids to notify (recorded on the escalation; delivery is app-side). */\n notifyProfileIds?: string[];\n /** Minutes after the previous step before this one fires (0 = immediately). */\n delayMinutes?: number;\n}\n\n/** A severity definition entry in a plan (key → labels). */\nexport interface SeverityDefinition {\n label: string;\n description?: string;\n}\n\n/**\n * Default severity vocabulary used when a plan doesn't define its own.\n * `sev1` is the most severe.\n */\nexport const DEFAULT_SEVERITY_DEFINITIONS: Record<string, SeverityDefinition> =\n {\n sev1: { label: 'Critical', description: 'Service down or unusable' },\n sev2: { label: 'Major', description: 'Significant degradation' },\n sev3: { label: 'Minor', description: 'Limited impact' },\n sev4: { label: 'Question', description: 'Question or request' },\n };\n\n/** Time-entry approval policy carried by a Managed Support Plan (FR-36). */\nexport interface TimeApprovalPolicy {\n /** Base path when no threshold applies. */\n mode: 'automatic' | 'operator' | 'client';\n /** Entries longer than this require review even under `automatic`. */\n thresholdMinutes?: number;\n /** Entries pricing above this amount require review even under `automatic`. */\n thresholdAmount?: number;\n}\n\n/** One piece of work evidence attached to a Service Time Entry. */\nexport interface TimeEntryEvidence {\n kind: string;\n ref: string;\n label?: string;\n}\n\n/**\n * Parse a JSON value stored as text, returning the fallback on malformed\n * input (never throws — stored JSON may predate schema changes). Accepts an\n * already-parsed value (e.g. a `type: 'json'` column that hydrated as an\n * object) and hands it back unchanged.\n */\nexport function parseJsonField<T>(raw: unknown, fallback: T): T {\n if (!raw) {\n return fallback;\n }\n // Text columns hydrate as strings; a non-string here means the caller\n // already holds a parsed value — hand it back rather than throwing.\n if (typeof raw !== 'string') {\n return raw as T;\n }\n try {\n const parsed = JSON.parse(raw);\n return (parsed ?? fallback) as T;\n } catch {\n return fallback;\n }\n}\n\n/** Parse a JSON array-of-strings field, tolerating malformed input. */\nexport function parseStringArrayField(\n raw: string | null | undefined,\n): string[] {\n const parsed = parseJsonField<unknown>(raw, []);\n return Array.isArray(parsed)\n ? parsed.filter((value): value is string => typeof value === 'string')\n : [];\n}\n"],"mappings":";AA6BO,IAAM,kCAGT;CACF,KAAK;EACH;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;CACF;CACA,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;CACF;CACA,aAAa;EACX;EACA;EACA;EACA;EACA;CACF;CACA,mBAAmB;EACjB;EACA;EACA;EACA;EACA;CACF;CACA,WAAW;EACT;EACA;EACA;EACA;EACA;CACF;CACA,UAAU;EAAC;EAAU;EAAe;CAAS;CAC7C,QAAQ,CAAC,WAAW,aAAa;AACnC;AAGO,IAAM,6BAAkD;CAC7D;CACA;CACA;CACA;CACA;CACA;AACF;AA4GO,IAAM,wCAGT;CACF,OAAO,CAAC,aAAa,UAAU;CAC/B,WAAW;EAAC;EAAY;EAAY;CAAO;CAC3C,UAAU,CAAC,WAAW;CACtB,UAAU,CAAC,SAAS,WAAW;CAC/B,WAAW,CAAC;AACd;AAqEO,IAAM,+BACX;CACE,MAAM;EAAE,OAAO;EAAY,aAAa;CAA2B;CACnE,MAAM;EAAE,OAAO;EAAS,aAAa;CAA0B;CAC/D,MAAM;EAAE,OAAO;EAAS,aAAa;CAAiB;CACtD,MAAM;EAAE,OAAO;EAAY,aAAa;CAAsB;AAChE;AAyBK,SAAS,eAAkB,KAAc,UAAgB;CAC9D,IAAI,CAAC,KACH,OAAO;CAIT,IAAI,OAAO,QAAQ,UACjB,OAAO;CAET,IAAI;EAEF,OADe,KAAK,MAAM,GAClB,KAAU;CACpB,QAAQ;EACN,OAAO;CACT;AACF;AAGO,SAAS,sBACd,KACU;CACV,MAAM,SAAS,eAAwB,KAAK,CAAC,CAAC;CAC9C,OAAO,MAAM,QAAQ,MAAM,IACvB,OAAO,QAAQ,UAA2B,OAAO,UAAU,QAAQ,IACnE,CAAC;AACP"}
package/package.json ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "@happyvertical/smrt-support",
3
+ "version": "0.39.2",
4
+ "description": "AI-first Support Cases: channel-neutral intake, lifecycle, routing, service targets, and service time for the SMRT framework",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "smrtRawPrimitives": "strict",
9
+ "files": [
10
+ "dist",
11
+ "CLAUDE.md",
12
+ "AGENTS.md"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js"
18
+ },
19
+ "./svelte": {
20
+ "types": "./dist/svelte/index.d.ts",
21
+ "svelte": "./dist/svelte/index.js",
22
+ "import": "./dist/svelte/index.js"
23
+ },
24
+ "./manifest": "./dist/manifest.json",
25
+ "./manifest.json": "./dist/manifest.json"
26
+ },
27
+ "dependencies": {
28
+ "@happyvertical/logger": "^0.78.0",
29
+ "@happyvertical/sql": "^0.78.0",
30
+ "@happyvertical/smrt-core": "0.39.2",
31
+ "@happyvertical/smrt-jobs": "0.39.2",
32
+ "@happyvertical/smrt-chat": "0.39.2",
33
+ "@happyvertical/smrt-ui": "0.39.2",
34
+ "@happyvertical/smrt-tenancy": "0.39.2",
35
+ "@happyvertical/smrt-messages": "0.39.2",
36
+ "@happyvertical/smrt-users": "0.39.2"
37
+ },
38
+ "peerDependencies": {
39
+ "svelte": "^5.56.4"
40
+ },
41
+ "peerDependenciesMeta": {
42
+ "svelte": {
43
+ "optional": true
44
+ }
45
+ },
46
+ "devDependencies": {
47
+ "@sveltejs/package": "^2.5.8",
48
+ "@sveltejs/vite-plugin-svelte": "^7.1.2",
49
+ "@types/node": "24.13.2",
50
+ "svelte": "^5.56.4",
51
+ "svelte-check": "^4.7.1",
52
+ "typescript": "^5.9.3",
53
+ "vite": "^8.1.3",
54
+ "vitest": "^4.1.9",
55
+ "@happyvertical/smrt-vitest": "0.39.2"
56
+ },
57
+ "keywords": [
58
+ "smrt",
59
+ "support",
60
+ "tickets",
61
+ "service-desk",
62
+ "sla",
63
+ "multi-tenant"
64
+ ],
65
+ "author": "HappyVertical",
66
+ "license": "MIT",
67
+ "publishConfig": {
68
+ "registry": "https://registry.npmjs.org",
69
+ "access": "public"
70
+ },
71
+ "repository": {
72
+ "type": "git",
73
+ "url": "https://github.com/happyvertical/smrt.git",
74
+ "directory": "packages/support"
75
+ },
76
+ "scripts": {
77
+ "build": "vite build --mode library && svelte-package -i src/svelte -o dist/svelte --tsconfig tsconfig.svelte.json",
78
+ "build:watch": "vite build --mode library --watch",
79
+ "clean": "rm -rf dist",
80
+ "dev": "vite dev",
81
+ "test": "vitest run",
82
+ "test:watch": "vitest",
83
+ "typecheck": "tsc --noEmit -p tsconfig.json && node ../../scripts/svelte-check-a11y.mjs --tsconfig ./tsconfig.svelte.json",
84
+ "verify:pack": "node ../../scripts/verify-package-types-exports.js ."
85
+ }
86
+ }