@phantom-pm/feedback-hub 2.0.0-alpha.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.
@@ -0,0 +1,12 @@
1
+ import { Collector, FeedbackItem, FeedbackSource } from './types.js';
2
+ export declare class SlackCollector implements Collector {
3
+ private config;
4
+ type: 'slack';
5
+ constructor(config: FeedbackSource['config']);
6
+ validateConfig(): boolean;
7
+ collect(): Promise<FeedbackItem[]>;
8
+ }
9
+ export declare class FeedbackCollectorFactory {
10
+ static create(source: FeedbackSource): Collector;
11
+ }
12
+ //# sourceMappingURL=collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../src/collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAErE,qBAAa,cAAe,YAAW,SAAS;IAGhC,OAAO,CAAC,MAAM;IAF1B,IAAI,EAAE,OAAO,CAAW;gBAEJ,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC;IAEpD,cAAc,IAAI,OAAO;IAInB,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;CAwB3C;AAED,qBAAa,wBAAwB;IACjC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS;CAQnD"}
@@ -0,0 +1,44 @@
1
+ export class SlackCollector {
2
+ config;
3
+ type = 'slack';
4
+ constructor(config) {
5
+ this.config = config;
6
+ }
7
+ validateConfig() {
8
+ return !!this.config.channel_id; // Minimal validation
9
+ }
10
+ async collect() {
11
+ // TODO: Implement real Slack API client
12
+ // For now, return mock data
13
+ console.log(`Collecting feedback from Slack channel: ${this.config.channel_id}`);
14
+ return [
15
+ {
16
+ id: `slack_${Date.now()}_1`,
17
+ source: 'slack',
18
+ content: "I wish I could export this report to PDF directly.",
19
+ author: "@jane_doe",
20
+ timestamp: new Date().toISOString(),
21
+ metadata: { channel: this.config.channel_id }
22
+ },
23
+ {
24
+ id: `slack_${Date.now()}_2`,
25
+ source: 'slack',
26
+ content: "The dark mode contrast is a bit too low on the dashboard.",
27
+ author: "@dev_dave",
28
+ timestamp: new Date().toISOString(),
29
+ metadata: { channel: this.config.channel_id }
30
+ }
31
+ ];
32
+ }
33
+ }
34
+ export class FeedbackCollectorFactory {
35
+ static create(source) {
36
+ switch (source.type) {
37
+ case 'slack':
38
+ return new SlackCollector(source.config);
39
+ default:
40
+ throw new Error(`Unsupported collector type: ${source.type}`);
41
+ }
42
+ }
43
+ }
44
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../src/collector.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IAGH;IAFpB,IAAI,GAAY,OAAO,CAAC;IAExB,YAAoB,MAAgC;QAAhC,WAAM,GAAN,MAAM,CAA0B;IAAI,CAAC;IAEzD,cAAc;QACV,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB;IAC1D,CAAC;IAED,KAAK,CAAC,OAAO;QACT,wCAAwC;QACxC,4BAA4B;QAC5B,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAEjF,OAAO;YACH;gBACI,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI;gBAC3B,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,oDAAoD;gBAC7D,MAAM,EAAE,WAAW;gBACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;aAChD;YACD;gBACI,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI;gBAC3B,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,2DAA2D;gBACpE,MAAM,EAAE,WAAW;gBACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;aAChD;SACJ,CAAC;IACN,CAAC;CACJ;AAED,MAAM,OAAO,wBAAwB;IACjC,MAAM,CAAC,MAAM,CAAC,MAAsB;QAChC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,OAAO;gBACR,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7C;gBACI,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,5 @@
1
+ export * from './types.js';
2
+ export * from './collector.js';
3
+ export * from './storage.js';
4
+ export declare function runFeedbackHub(args: Record<string, any>): Promise<any>;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAO7B,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAwC5E"}
package/dist/index.js ADDED
@@ -0,0 +1,46 @@
1
+ import { FeedbackCollectorFactory } from './collector.js';
2
+ import { FeedbackStorage } from './storage.js';
3
+ export * from './types.js';
4
+ export * from './collector.js';
5
+ export * from './storage.js';
6
+ // Configuration for active collectors (could come from config file/DB)
7
+ const ACTIVE_SOURCES = [
8
+ { type: 'slack', config: { channel_id: 'C123456' } }
9
+ ];
10
+ export async function runFeedbackHub(args) {
11
+ const command = args._?.[0] || 'sync';
12
+ if (command === 'sync') {
13
+ console.log('Syncing feedback from all sources...');
14
+ const storage = new FeedbackStorage();
15
+ let totalCollected = 0;
16
+ for (const source of ACTIVE_SOURCES) {
17
+ try {
18
+ const collector = FeedbackCollectorFactory.create(source);
19
+ const items = await collector.collect();
20
+ storage.saveFeedback(items);
21
+ totalCollected += items.length;
22
+ console.log(` - ${source.type}: Collected ${items.length} items`);
23
+ }
24
+ catch (err) {
25
+ console.error(` - ${source.type}: Failed to collect - ${err.message}`);
26
+ }
27
+ }
28
+ return {
29
+ success: true,
30
+ message: `Sync complete. ${totalCollected} new items processed.`,
31
+ stats: { totalCollected }
32
+ };
33
+ }
34
+ if (command === 'themes') {
35
+ const storage = new FeedbackStorage();
36
+ // TODO: Implement AI theme extraction here (Processor)
37
+ // For now, return stored themes (mock or empty)
38
+ const themes = storage.getAllThemes();
39
+ return {
40
+ success: true,
41
+ themes
42
+ };
43
+ }
44
+ throw new Error(`Unknown command: ${command}`);
45
+ }
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAE7B,uEAAuE;AACvE,MAAM,cAAc,GAAqB;IACrC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE;CACvD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAyB;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAEtC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YAClC,IAAI,CAAC;gBACD,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC1D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;gBACxC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC5B,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,eAAe,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;YACvE,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,IAAI,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5E,CAAC;QACL,CAAC;QAED,OAAO;YACH,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,kBAAkB,cAAc,uBAAuB;YAChE,KAAK,EAAE,EAAE,cAAc,EAAE;SAC5B,CAAC;IACN,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,uDAAuD;QACvD,gDAAgD;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QACtC,OAAO;YACH,OAAO,EAAE,IAAI;YACb,MAAM;SACT,CAAC;IACN,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { FeedbackItem, FeedbackTheme } from './types.js';
2
+ export declare class FeedbackStorage {
3
+ private db;
4
+ constructor(dbPath?: string);
5
+ private init;
6
+ saveFeedback(items: FeedbackItem[]): void;
7
+ saveThemes(themes: FeedbackTheme[]): void;
8
+ getAllFeedback(): FeedbackItem[];
9
+ getAllThemes(): FeedbackTheme[];
10
+ }
11
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzD,qBAAa,eAAe;IACxB,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,GAAE,MAAqB;IAKzC,OAAO,CAAC,IAAI;IAyBZ,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI;IAsBzC,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAuBzC,cAAc,IAAI,YAAY,EAAE;IAYhC,YAAY,IAAI,aAAa,EAAE;CAYlC"}
@@ -0,0 +1,80 @@
1
+ import Database from 'better-sqlite3';
2
+ export class FeedbackStorage {
3
+ db;
4
+ constructor(dbPath = 'phantom.db') {
5
+ this.db = new Database(dbPath);
6
+ this.init();
7
+ }
8
+ init() {
9
+ this.db.exec(`
10
+ CREATE TABLE IF NOT EXISTS feedback_items (
11
+ id TEXT PRIMARY KEY,
12
+ source TEXT NOT NULL,
13
+ content TEXT NOT NULL,
14
+ author TEXT,
15
+ timestamp TEXT,
16
+ metadata TEXT,
17
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP
18
+ );
19
+
20
+ CREATE TABLE IF NOT EXISTS feedback_themes (
21
+ id TEXT PRIMARY KEY,
22
+ name TEXT NOT NULL,
23
+ description TEXT,
24
+ sentiment REAL,
25
+ frequency INTEGER,
26
+ sources TEXT, -- JSON array
27
+ related_feedback_ids TEXT, -- JSON array
28
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP
29
+ );
30
+ `);
31
+ }
32
+ saveFeedback(items) {
33
+ const stmt = this.db.prepare(`
34
+ INSERT OR IGNORE INTO feedback_items (id, source, content, author, timestamp, metadata)
35
+ VALUES (?, ?, ?, ?, ?, ?)
36
+ `);
37
+ const tx = this.db.transaction((items) => {
38
+ for (const item of items) {
39
+ stmt.run(item.id, item.source, item.content, item.author, item.timestamp, JSON.stringify(item.metadata || {}));
40
+ }
41
+ });
42
+ tx(items);
43
+ }
44
+ saveThemes(themes) {
45
+ const stmt = this.db.prepare(`
46
+ INSERT OR REPLACE INTO feedback_themes (id, name, description, sentiment, frequency, sources, related_feedback_ids)
47
+ VALUES (?, ?, ?, ?, ?, ?, ?)
48
+ `);
49
+ const tx = this.db.transaction((themes) => {
50
+ for (const theme of themes) {
51
+ stmt.run(theme.id, theme.name, theme.description, theme.sentiment, theme.frequency, JSON.stringify(theme.sources), JSON.stringify(theme.related_feedback_ids));
52
+ }
53
+ });
54
+ tx(themes);
55
+ }
56
+ getAllFeedback() {
57
+ const rows = this.db.prepare('SELECT * FROM feedback_items ORDER BY timestamp DESC').all();
58
+ return rows.map(row => ({
59
+ id: row.id,
60
+ source: row.source,
61
+ content: row.content,
62
+ author: row.author,
63
+ timestamp: row.timestamp,
64
+ metadata: JSON.parse(row.metadata)
65
+ }));
66
+ }
67
+ getAllThemes() {
68
+ const rows = this.db.prepare('SELECT * FROM feedback_themes ORDER BY frequency DESC').all();
69
+ return rows.map(row => ({
70
+ id: row.id,
71
+ name: row.name,
72
+ description: row.description,
73
+ sentiment: row.sentiment,
74
+ frequency: row.frequency,
75
+ sources: JSON.parse(row.sources),
76
+ related_feedback_ids: JSON.parse(row.related_feedback_ids)
77
+ }));
78
+ }
79
+ }
80
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export type FeedbackSourceType = 'slack' | 'intercom' | 'zendesk' | 'linear' | 'github' | 'email';
2
+ export interface FeedbackSource {
3
+ type: FeedbackSourceType;
4
+ config: {
5
+ api_key?: string;
6
+ webhook_url?: string;
7
+ channel_id?: string;
8
+ [key: string]: any;
9
+ };
10
+ }
11
+ export interface FeedbackItem {
12
+ id: string;
13
+ source: FeedbackSourceType;
14
+ content: string;
15
+ author?: string;
16
+ timestamp: string;
17
+ metadata?: Record<string, any>;
18
+ embedding?: number[];
19
+ }
20
+ export interface FeedbackTheme {
21
+ id: string;
22
+ name: string;
23
+ description: string;
24
+ sentiment: number;
25
+ frequency: number;
26
+ sources: Array<{
27
+ source: string;
28
+ count: number;
29
+ }>;
30
+ related_feedback_ids: string[];
31
+ }
32
+ export interface Collector {
33
+ type: FeedbackSourceType;
34
+ collect(): Promise<FeedbackItem[]>;
35
+ validateConfig(): boolean;
36
+ }
37
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAElG,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE;QACJ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACtB,CAAC;CACL;AAED,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,KAAK,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,cAAc,IAAI,OAAO,CAAC;CAC7B"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@phantom-pm/feedback-hub",
3
+ "version": "2.0.0-alpha.2",
4
+ "description": "Feedback Hub module for Phantom - Aggregates feedback from multiple sources",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist/**/*"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsx watch src/index.ts",
14
+ "test": "tsx test/index.test.ts",
15
+ "lint": "eslint src --ext .ts"
16
+ },
17
+ "dependencies": {
18
+ "@phantom-pm/core": "2.0.0-alpha.2",
19
+ "better-sqlite3": "^11.1.0",
20
+ "discord.js": "14.25.1",
21
+ "zod": "^3.23.8"
22
+ },
23
+ "devDependencies": {
24
+ "@types/better-sqlite3": "^7.6.11",
25
+ "@types/node": "^20.14.0",
26
+ "tsx": "^4.16.0",
27
+ "typescript": "^5.5.0"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ }
32
+ }