catalist-support-agent 1.0.0
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.
- package/dist/admin-portal.d.ts +43 -0
- package/dist/admin-portal.d.ts.map +1 -0
- package/dist/admin-portal.js +166 -0
- package/dist/admin-portal.js.map +1 -0
- package/dist/analysis/entities.d.ts +73 -0
- package/dist/analysis/entities.d.ts.map +1 -0
- package/dist/analysis/entities.js +378 -0
- package/dist/analysis/entities.js.map +1 -0
- package/dist/analysis/index.d.ts +44 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +243 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/intent.d.ts +49 -0
- package/dist/analysis/intent.d.ts.map +1 -0
- package/dist/analysis/intent.js +320 -0
- package/dist/analysis/intent.js.map +1 -0
- package/dist/analysis/sentiment.d.ts +57 -0
- package/dist/analysis/sentiment.d.ts.map +1 -0
- package/dist/analysis/sentiment.js +351 -0
- package/dist/analysis/sentiment.js.map +1 -0
- package/dist/brand/compliance.d.ts +122 -0
- package/dist/brand/compliance.d.ts.map +1 -0
- package/dist/brand/compliance.js +378 -0
- package/dist/brand/compliance.js.map +1 -0
- package/dist/brand/forbidden-terms.d.ts +99 -0
- package/dist/brand/forbidden-terms.d.ts.map +1 -0
- package/dist/brand/forbidden-terms.js +265 -0
- package/dist/brand/forbidden-terms.js.map +1 -0
- package/dist/brand/index.d.ts +10 -0
- package/dist/brand/index.d.ts.map +1 -0
- package/dist/brand/index.js +12 -0
- package/dist/brand/index.js.map +1 -0
- package/dist/config.d.ts +325 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +492 -0
- package/dist/config.js.map +1 -0
- package/dist/delivery/index.d.ts +84 -0
- package/dist/delivery/index.d.ts.map +1 -0
- package/dist/delivery/index.js +435 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/embeddings/cache.d.ts +96 -0
- package/dist/embeddings/cache.d.ts.map +1 -0
- package/dist/embeddings/cache.js +193 -0
- package/dist/embeddings/cache.js.map +1 -0
- package/dist/embeddings/index.d.ts +152 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +337 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/openai-client.d.ts +67 -0
- package/dist/embeddings/openai-client.d.ts.map +1 -0
- package/dist/embeddings/openai-client.js +190 -0
- package/dist/embeddings/openai-client.js.map +1 -0
- package/dist/errors.d.ts +302 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +508 -0
- package/dist/errors.js.map +1 -0
- package/dist/escalation/index.d.ts +93 -0
- package/dist/escalation/index.d.ts.map +1 -0
- package/dist/escalation/index.js +436 -0
- package/dist/escalation/index.js.map +1 -0
- package/dist/extraction/deduplication.d.ts +97 -0
- package/dist/extraction/deduplication.d.ts.map +1 -0
- package/dist/extraction/deduplication.js +271 -0
- package/dist/extraction/deduplication.js.map +1 -0
- package/dist/extraction/gmail-extractor.d.ts +160 -0
- package/dist/extraction/gmail-extractor.d.ts.map +1 -0
- package/dist/extraction/gmail-extractor.js +396 -0
- package/dist/extraction/gmail-extractor.js.map +1 -0
- package/dist/extraction/gmail-token-manager.d.ts +36 -0
- package/dist/extraction/gmail-token-manager.d.ts.map +1 -0
- package/dist/extraction/gmail-token-manager.js +146 -0
- package/dist/extraction/gmail-token-manager.js.map +1 -0
- package/dist/extraction/index.d.ts +13 -0
- package/dist/extraction/index.d.ts.map +1 -0
- package/dist/extraction/index.js +20 -0
- package/dist/extraction/index.js.map +1 -0
- package/dist/extraction/pii-handler.d.ts +100 -0
- package/dist/extraction/pii-handler.d.ts.map +1 -0
- package/dist/extraction/pii-handler.js +295 -0
- package/dist/extraction/pii-handler.js.map +1 -0
- package/dist/extraction/pipeline.d.ts +94 -0
- package/dist/extraction/pipeline.d.ts.map +1 -0
- package/dist/extraction/pipeline.js +380 -0
- package/dist/extraction/pipeline.js.map +1 -0
- package/dist/extraction/quality-filter.d.ts +99 -0
- package/dist/extraction/quality-filter.d.ts.map +1 -0
- package/dist/extraction/quality-filter.js +370 -0
- package/dist/extraction/quality-filter.js.map +1 -0
- package/dist/extraction/rate-limiter.d.ts +90 -0
- package/dist/extraction/rate-limiter.d.ts.map +1 -0
- package/dist/extraction/rate-limiter.js +242 -0
- package/dist/extraction/rate-limiter.js.map +1 -0
- package/dist/extraction/state-manager.d.ts +126 -0
- package/dist/extraction/state-manager.d.ts.map +1 -0
- package/dist/extraction/state-manager.js +344 -0
- package/dist/extraction/state-manager.js.map +1 -0
- package/dist/generation/index.d.ts +75 -0
- package/dist/generation/index.d.ts.map +1 -0
- package/dist/generation/index.js +641 -0
- package/dist/generation/index.js.map +1 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +233 -0
- package/dist/index.js.map +1 -0
- package/dist/intake/index.d.ts +15 -0
- package/dist/intake/index.d.ts.map +1 -0
- package/dist/intake/index.js +19 -0
- package/dist/intake/index.js.map +1 -0
- package/dist/intake/normalizer.d.ts +163 -0
- package/dist/intake/normalizer.d.ts.map +1 -0
- package/dist/intake/normalizer.js +309 -0
- package/dist/intake/normalizer.js.map +1 -0
- package/dist/intake/postmark.d.ts +72 -0
- package/dist/intake/postmark.d.ts.map +1 -0
- package/dist/intake/postmark.js +276 -0
- package/dist/intake/postmark.js.map +1 -0
- package/dist/intake/slack.d.ts +106 -0
- package/dist/intake/slack.d.ts.map +1 -0
- package/dist/intake/slack.js +378 -0
- package/dist/intake/slack.js.map +1 -0
- package/dist/intake/twilio.d.ts +86 -0
- package/dist/intake/twilio.d.ts.map +1 -0
- package/dist/intake/twilio.js +283 -0
- package/dist/intake/twilio.js.map +1 -0
- package/dist/knowledge/index.d.ts +100 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +516 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/invoice-resolver.d.ts +62 -0
- package/dist/knowledge/invoice-resolver.d.ts.map +1 -0
- package/dist/knowledge/invoice-resolver.js +267 -0
- package/dist/knowledge/invoice-resolver.js.map +1 -0
- package/dist/types.d.ts +535 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +48 -0
- package/dist/types.js.map +1 -0
- package/ga-service-account.json +13 -0
- package/gmail-knowledge-migration.sql +149 -0
- package/nul +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
-- Gmail Knowledge Base Migration (corrected order)
|
|
2
|
+
-- Apply this in Supabase Dashboard -> SQL Editor
|
|
3
|
+
|
|
4
|
+
-- 1. Enable pgvector extension
|
|
5
|
+
CREATE EXTENSION IF NOT EXISTS vector;
|
|
6
|
+
|
|
7
|
+
-- 2. Create enum types
|
|
8
|
+
DO $$ BEGIN
|
|
9
|
+
CREATE TYPE gmail_knowledge_review_status AS ENUM (
|
|
10
|
+
'pending', 'approved', 'rejected', 'needs_revision'
|
|
11
|
+
);
|
|
12
|
+
EXCEPTION WHEN duplicate_object THEN NULL;
|
|
13
|
+
END $$;
|
|
14
|
+
|
|
15
|
+
DO $$ BEGIN
|
|
16
|
+
CREATE TYPE gmail_import_batch_status AS ENUM (
|
|
17
|
+
'pending', 'in_progress', 'completed', 'failed', 'partial'
|
|
18
|
+
);
|
|
19
|
+
EXCEPTION WHEN duplicate_object THEN NULL;
|
|
20
|
+
END $$;
|
|
21
|
+
|
|
22
|
+
-- 3. Create gmail_import_batches FIRST (no FK dependencies)
|
|
23
|
+
CREATE TABLE IF NOT EXISTS gmail_import_batches (
|
|
24
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
25
|
+
email_account TEXT NOT NULL,
|
|
26
|
+
date_range_start TIMESTAMPTZ NOT NULL,
|
|
27
|
+
date_range_end TIMESTAMPTZ NOT NULL,
|
|
28
|
+
status gmail_import_batch_status NOT NULL DEFAULT 'pending',
|
|
29
|
+
total_threads_found INTEGER DEFAULT 0,
|
|
30
|
+
threads_processed INTEGER DEFAULT 0,
|
|
31
|
+
entries_created INTEGER DEFAULT 0,
|
|
32
|
+
entries_skipped INTEGER DEFAULT 0,
|
|
33
|
+
errors_encountered INTEGER DEFAULT 0,
|
|
34
|
+
started_at TIMESTAMPTZ,
|
|
35
|
+
completed_at TIMESTAMPTZ,
|
|
36
|
+
error_log JSONB DEFAULT '[]',
|
|
37
|
+
config_used JSONB DEFAULT '{}',
|
|
38
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
39
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
-- 4. Create gmail_extraction_state
|
|
43
|
+
CREATE TABLE IF NOT EXISTS gmail_extraction_state (
|
|
44
|
+
id SERIAL PRIMARY KEY,
|
|
45
|
+
email_address TEXT NOT NULL UNIQUE,
|
|
46
|
+
last_history_id TEXT,
|
|
47
|
+
last_extracted_at TIMESTAMPTZ,
|
|
48
|
+
total_entries_extracted INTEGER DEFAULT 0,
|
|
49
|
+
last_batch_id UUID REFERENCES gmail_import_batches(id) ON DELETE SET NULL,
|
|
50
|
+
consecutive_errors INTEGER DEFAULT 0,
|
|
51
|
+
last_error TEXT,
|
|
52
|
+
last_error_at TIMESTAMPTZ,
|
|
53
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
54
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
-- 5. Create gmail_knowledge_entries
|
|
58
|
+
CREATE TABLE IF NOT EXISTS gmail_knowledge_entries (
|
|
59
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
60
|
+
gmail_thread_id TEXT NOT NULL,
|
|
61
|
+
gmail_message_id TEXT NOT NULL,
|
|
62
|
+
question_subject TEXT,
|
|
63
|
+
question_text TEXT NOT NULL,
|
|
64
|
+
response_text TEXT NOT NULL,
|
|
65
|
+
customer_email TEXT NOT NULL,
|
|
66
|
+
customer_user_id INTEGER REFERENCES public."User"(id) ON DELETE SET NULL,
|
|
67
|
+
responder_email TEXT NOT NULL,
|
|
68
|
+
intent_category intent_category,
|
|
69
|
+
quality_score DECIMAL(4,3) DEFAULT 0.5,
|
|
70
|
+
review_status gmail_knowledge_review_status NOT NULL DEFAULT 'pending',
|
|
71
|
+
reviewed_by TEXT,
|
|
72
|
+
reviewed_at TIMESTAMPTZ,
|
|
73
|
+
review_notes TEXT,
|
|
74
|
+
embedding vector(1536),
|
|
75
|
+
tsv tsvector GENERATED ALWAYS AS (
|
|
76
|
+
setweight(to_tsvector('english', coalesce(question_subject, '')), 'A') ||
|
|
77
|
+
setweight(to_tsvector('english', coalesce(question_text, '')), 'B') ||
|
|
78
|
+
setweight(to_tsvector('english', coalesce(response_text, '')), 'C')
|
|
79
|
+
) STORED,
|
|
80
|
+
response_time_ms INTEGER,
|
|
81
|
+
resolution_indicator TEXT,
|
|
82
|
+
content_hash TEXT NOT NULL,
|
|
83
|
+
extracted_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
84
|
+
batch_id UUID REFERENCES gmail_import_batches(id) ON DELETE SET NULL,
|
|
85
|
+
pii_redacted BOOLEAN NOT NULL DEFAULT false,
|
|
86
|
+
pii_types_found TEXT[] DEFAULT '{}',
|
|
87
|
+
email_received_at TIMESTAMPTZ NOT NULL,
|
|
88
|
+
email_responded_at TIMESTAMPTZ,
|
|
89
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
90
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
-- 6. Create junction table
|
|
94
|
+
CREATE TABLE IF NOT EXISTS gmail_knowledge_order_links (
|
|
95
|
+
id SERIAL PRIMARY KEY,
|
|
96
|
+
knowledge_entry_id UUID NOT NULL REFERENCES gmail_knowledge_entries(id) ON DELETE CASCADE,
|
|
97
|
+
order_id TEXT,
|
|
98
|
+
invoice_number TEXT,
|
|
99
|
+
reference_type TEXT NOT NULL CHECK (reference_type IN ('order', 'invoice')),
|
|
100
|
+
confidence DECIMAL(4,3) DEFAULT 0.9,
|
|
101
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
102
|
+
CONSTRAINT has_reference CHECK (order_id IS NOT NULL OR invoice_number IS NOT NULL)
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
-- 7. Create indexes
|
|
106
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_gmail_knowledge_message_id ON gmail_knowledge_entries(gmail_message_id);
|
|
107
|
+
CREATE INDEX IF NOT EXISTS idx_gmail_knowledge_content_hash ON gmail_knowledge_entries(content_hash);
|
|
108
|
+
CREATE INDEX IF NOT EXISTS idx_gmail_knowledge_tsv ON gmail_knowledge_entries USING gin(tsv);
|
|
109
|
+
CREATE INDEX IF NOT EXISTS idx_gmail_knowledge_customer_email ON gmail_knowledge_entries(customer_email);
|
|
110
|
+
CREATE INDEX IF NOT EXISTS idx_gmail_knowledge_review_status ON gmail_knowledge_entries(review_status);
|
|
111
|
+
CREATE INDEX IF NOT EXISTS idx_gmail_import_batches_email ON gmail_import_batches(email_account);
|
|
112
|
+
CREATE INDEX IF NOT EXISTS idx_gmail_import_batches_status ON gmail_import_batches(status);
|
|
113
|
+
|
|
114
|
+
-- 8. Enable RLS
|
|
115
|
+
ALTER TABLE gmail_knowledge_entries ENABLE ROW LEVEL SECURITY;
|
|
116
|
+
ALTER TABLE gmail_import_batches ENABLE ROW LEVEL SECURITY;
|
|
117
|
+
ALTER TABLE gmail_knowledge_order_links ENABLE ROW LEVEL SECURITY;
|
|
118
|
+
ALTER TABLE gmail_extraction_state ENABLE ROW LEVEL SECURITY;
|
|
119
|
+
|
|
120
|
+
-- 9. Create RLS policies for service_role
|
|
121
|
+
CREATE POLICY "Service role full access gmail_knowledge_entries" ON gmail_knowledge_entries FOR ALL USING (true);
|
|
122
|
+
CREATE POLICY "Service role full access gmail_import_batches" ON gmail_import_batches FOR ALL USING (true);
|
|
123
|
+
CREATE POLICY "Service role full access gmail_knowledge_order_links" ON gmail_knowledge_order_links FOR ALL USING (true);
|
|
124
|
+
CREATE POLICY "Service role full access gmail_extraction_state" ON gmail_extraction_state FOR ALL USING (true);
|
|
125
|
+
|
|
126
|
+
-- 10. Create stats function
|
|
127
|
+
CREATE OR REPLACE FUNCTION get_gmail_knowledge_stats()
|
|
128
|
+
RETURNS TABLE (
|
|
129
|
+
total_entries BIGINT,
|
|
130
|
+
approved_entries BIGINT,
|
|
131
|
+
pending_entries BIGINT,
|
|
132
|
+
entries_with_embeddings BIGINT
|
|
133
|
+
)
|
|
134
|
+
LANGUAGE plpgsql
|
|
135
|
+
SECURITY DEFINER
|
|
136
|
+
AS $$
|
|
137
|
+
BEGIN
|
|
138
|
+
RETURN QUERY
|
|
139
|
+
SELECT
|
|
140
|
+
COUNT(*)::BIGINT as total_entries,
|
|
141
|
+
COUNT(*) FILTER (WHERE review_status = 'approved')::BIGINT as approved_entries,
|
|
142
|
+
COUNT(*) FILTER (WHERE review_status = 'pending')::BIGINT as pending_entries,
|
|
143
|
+
COUNT(*) FILTER (WHERE embedding IS NOT NULL)::BIGINT as entries_with_embeddings
|
|
144
|
+
FROM gmail_knowledge_entries;
|
|
145
|
+
END;
|
|
146
|
+
$$;
|
|
147
|
+
|
|
148
|
+
GRANT EXECUTE ON FUNCTION get_gmail_knowledge_stats() TO authenticated;
|
|
149
|
+
GRANT EXECUTE ON FUNCTION get_gmail_knowledge_stats() TO service_role;
|
package/nul
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
dir: cannot access 'distindex.js': No such file or directory
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "catalist-support-agent",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "AI Support Agent SDK for autonomous customer support with strict brand compliance",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./admin-portal": {
|
|
14
|
+
"import": "./dist/admin-portal.js",
|
|
15
|
+
"types": "./dist/admin-portal.d.ts"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc && npm run copy-prompts",
|
|
20
|
+
"copy-prompts": "node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/prompts',{recursive:true});fs.readdirSync('src/prompts').forEach(f=>fs.copyFileSync(path.join('src/prompts',f),path.join('dist/prompts',f)))\"",
|
|
21
|
+
"start": "node dist/index.js",
|
|
22
|
+
"dev": "tsx src/index.ts",
|
|
23
|
+
"watch": "tsx watch src/index.ts",
|
|
24
|
+
"lint": "eslint src/**/*.ts",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"test:unit": "vitest run --dir src/__tests__/unit",
|
|
28
|
+
"test:integration": "vitest run --dir src/__tests__/integration",
|
|
29
|
+
"test:coverage": "vitest run --coverage",
|
|
30
|
+
"test:watch": "vitest",
|
|
31
|
+
"test:live": "tsx test/live/runners/run-validation-standalone.ts",
|
|
32
|
+
"test:live:verbose": "tsx test/live/runners/run-validation-standalone.ts --verbose",
|
|
33
|
+
"test:live:full": "tsx test/live/runners/run-live-validation.ts"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@anthropic-ai/claude-agent-sdk": "^0.2.9",
|
|
37
|
+
"@anthropic-ai/sdk": "^0.71.2",
|
|
38
|
+
"@supabase/supabase-js": "^2.90.0",
|
|
39
|
+
"dotenv": "^16.4.5",
|
|
40
|
+
"zod": "^4.3.5"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^20.11.0",
|
|
44
|
+
"@typescript-eslint/eslint-plugin": "^6.19.0",
|
|
45
|
+
"@typescript-eslint/parser": "^6.19.0",
|
|
46
|
+
"@vitest/coverage-v8": "^2.1.0",
|
|
47
|
+
"eslint": "^8.56.0",
|
|
48
|
+
"tsx": "^4.7.0",
|
|
49
|
+
"typescript": "^5.3.3",
|
|
50
|
+
"vitest": "^2.1.0"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=20.0.0"
|
|
54
|
+
}
|
|
55
|
+
}
|