@phantom-pm/feedback-hub 3.2.2 → 4.0.4
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/README.md +32 -0
- package/dist/collector.d.ts.map +1 -1
- package/dist/collector.js +38 -21
- package/dist/collector.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -11
- package/dist/index.js.map +1 -1
- package/dist/storage.d.ts +1 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +14 -0
- package/dist/storage.js.map +1 -1
- package/package.json +12 -2
package/README.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# @phantom-pm/feedback-hub
|
|
2
|
+
|
|
3
|
+
Feedback ingestion and theme-extraction engine for Phantom PM workflows.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @phantom-pm/feedback-hub
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Minimal Usage
|
|
12
|
+
|
|
13
|
+
This package is primarily composed into the Phantom runtime. The stable end-to-end entrypoint is the CLI:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g @phantom-pm/cli
|
|
17
|
+
phantom doctor --json
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Status
|
|
21
|
+
|
|
22
|
+
Published for advanced integrators and monorepo consumers. Feedback provenance and sync behavior surface through Phantom’s dashboard and mission flows; lower-level library APIs may evolve.
|
|
23
|
+
|
|
24
|
+
## Links
|
|
25
|
+
|
|
26
|
+
- Docs: https://sir-ad.github.io/Phantom/
|
|
27
|
+
- Source: https://github.com/sir-ad/Phantom/tree/main/packages/feedback-hub
|
|
28
|
+
- Issues: https://github.com/sir-ad/Phantom/issues
|
|
29
|
+
|
|
30
|
+
## License
|
|
31
|
+
|
|
32
|
+
MIT
|
package/dist/collector.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;CAyD3C;AAED,qBAAa,wBAAwB;IACjC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS;CAQnD"}
|
package/dist/collector.js
CHANGED
|
@@ -5,30 +5,47 @@ export class SlackCollector {
|
|
|
5
5
|
this.config = config;
|
|
6
6
|
}
|
|
7
7
|
validateConfig() {
|
|
8
|
-
return
|
|
8
|
+
return Boolean(this.config.channel_id && (this.config.api_key || this.config.bot_token));
|
|
9
9
|
}
|
|
10
10
|
async collect() {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
11
|
+
const token = this.config.api_key || this.config.bot_token;
|
|
12
|
+
const channel = this.config.channel_id;
|
|
13
|
+
const limit = Number(this.config.limit || 25);
|
|
14
|
+
if (!token || !channel) {
|
|
15
|
+
throw new Error('Slack collector requires channel_id and api_key/bot_token.');
|
|
16
|
+
}
|
|
17
|
+
const params = new URLSearchParams({
|
|
18
|
+
channel,
|
|
19
|
+
limit: String(Number.isFinite(limit) ? Math.max(1, Math.min(limit, 200)) : 25),
|
|
20
|
+
});
|
|
21
|
+
const response = await fetch(`https://slack.com/api/conversations.history?${params.toString()}`, {
|
|
22
|
+
headers: {
|
|
23
|
+
Authorization: `Bearer ${token}`,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
throw new Error(`Slack API request failed with ${response.status}`);
|
|
28
|
+
}
|
|
29
|
+
const payload = await response.json();
|
|
30
|
+
if (!payload.ok) {
|
|
31
|
+
throw new Error(payload.error || 'Slack API returned an unknown error.');
|
|
32
|
+
}
|
|
33
|
+
return (payload.messages || [])
|
|
34
|
+
.filter((message) => message.text && message.subtype !== 'channel_join' && message.subtype !== 'channel_leave')
|
|
35
|
+
.map((message, index) => ({
|
|
36
|
+
id: `slack_${channel}_${message.ts || Date.now()}_${index}`,
|
|
37
|
+
source: 'slack',
|
|
38
|
+
content: message.text.trim(),
|
|
39
|
+
author: message.username || message.user,
|
|
40
|
+
timestamp: message.ts
|
|
41
|
+
? new Date(Math.floor(Number(message.ts.split('.')[0])) * 1000).toISOString()
|
|
42
|
+
: new Date().toISOString(),
|
|
43
|
+
metadata: {
|
|
44
|
+
channel,
|
|
45
|
+
thread_ts: message.thread_ts,
|
|
46
|
+
collectedVia: 'slack-api',
|
|
22
47
|
},
|
|
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
|
-
];
|
|
48
|
+
}));
|
|
32
49
|
}
|
|
33
50
|
}
|
|
34
51
|
export class FeedbackCollectorFactory {
|
package/dist/collector.js.map
CHANGED
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../src/collector.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAiB7B,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAuD5E"}
|
package/dist/index.js
CHANGED
|
@@ -3,42 +3,66 @@ import { FeedbackStorage } from './storage.js';
|
|
|
3
3
|
export * from './types.js';
|
|
4
4
|
export * from './collector.js';
|
|
5
5
|
export * from './storage.js';
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
function getActiveSources() {
|
|
7
|
+
const sources = [];
|
|
8
|
+
if (process.env.PHANTOM_FEEDBACK_SLACK_CHANNEL && (process.env.PHANTOM_FEEDBACK_SLACK_TOKEN || process.env.SLACK_BOT_TOKEN)) {
|
|
9
|
+
sources.push({
|
|
10
|
+
type: 'slack',
|
|
11
|
+
config: {
|
|
12
|
+
channel_id: process.env.PHANTOM_FEEDBACK_SLACK_CHANNEL,
|
|
13
|
+
api_key: process.env.PHANTOM_FEEDBACK_SLACK_TOKEN || process.env.SLACK_BOT_TOKEN,
|
|
14
|
+
limit: process.env.PHANTOM_FEEDBACK_SLACK_LIMIT,
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return sources;
|
|
19
|
+
}
|
|
10
20
|
export async function runFeedbackHub(args) {
|
|
11
21
|
const command = args._?.[0] || 'sync';
|
|
12
22
|
if (command === 'sync') {
|
|
13
|
-
|
|
23
|
+
const activeSources = getActiveSources();
|
|
24
|
+
if (activeSources.length === 0) {
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
message: 'No feedback sources configured. Set PHANTOM_FEEDBACK_SLACK_CHANNEL and PHANTOM_FEEDBACK_SLACK_TOKEN to enable Slack sync.',
|
|
28
|
+
stats: { totalCollected: 0, configuredSources: 0 },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
console.log('Syncing feedback from configured sources...');
|
|
14
32
|
const storage = new FeedbackStorage();
|
|
15
33
|
let totalCollected = 0;
|
|
16
|
-
|
|
34
|
+
const sourceResults = [];
|
|
35
|
+
for (const source of activeSources) {
|
|
17
36
|
try {
|
|
18
37
|
const collector = FeedbackCollectorFactory.create(source);
|
|
38
|
+
if (!collector.validateConfig()) {
|
|
39
|
+
throw new Error('Invalid collector configuration.');
|
|
40
|
+
}
|
|
19
41
|
const items = await collector.collect();
|
|
20
42
|
storage.saveFeedback(items);
|
|
21
43
|
totalCollected += items.length;
|
|
22
44
|
console.log(` - ${source.type}: Collected ${items.length} items`);
|
|
45
|
+
sourceResults.push({ source: source.type, success: true, collected: items.length });
|
|
23
46
|
}
|
|
24
47
|
catch (err) {
|
|
25
48
|
console.error(` - ${source.type}: Failed to collect - ${err.message}`);
|
|
49
|
+
sourceResults.push({ source: source.type, success: false, error: err.message });
|
|
26
50
|
}
|
|
27
51
|
}
|
|
28
52
|
return {
|
|
29
|
-
success:
|
|
53
|
+
success: sourceResults.some((result) => result.success),
|
|
30
54
|
message: `Sync complete. ${totalCollected} new items processed.`,
|
|
31
|
-
stats: { totalCollected }
|
|
55
|
+
stats: { totalCollected, configuredSources: activeSources.length },
|
|
56
|
+
sources: sourceResults,
|
|
32
57
|
};
|
|
33
58
|
}
|
|
34
59
|
if (command === 'themes') {
|
|
35
60
|
const storage = new FeedbackStorage();
|
|
36
|
-
// TODO: Implement AI theme extraction here (Processor)
|
|
37
|
-
// For now, return stored themes (mock or empty)
|
|
38
61
|
const themes = storage.getAllThemes();
|
|
39
62
|
return {
|
|
40
63
|
success: true,
|
|
41
|
-
|
|
64
|
+
derivationMode: 'stored',
|
|
65
|
+
themes,
|
|
42
66
|
};
|
|
43
67
|
}
|
|
44
68
|
throw new Error(`Unknown command: ${command}`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/storage.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare class FeedbackStorage {
|
|
|
5
5
|
private init;
|
|
6
6
|
saveFeedback(items: FeedbackItem[]): void;
|
|
7
7
|
saveThemes(themes: FeedbackTheme[]): void;
|
|
8
|
+
replaceThemes(themes: FeedbackTheme[]): void;
|
|
8
9
|
getAllFeedback(): FeedbackItem[];
|
|
9
10
|
getAllThemes(): FeedbackTheme[];
|
|
10
11
|
}
|
package/dist/storage.d.ts.map
CHANGED
|
@@ -1 +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"}
|
|
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,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAyB5C,cAAc,IAAI,YAAY,EAAE;IAYhC,YAAY,IAAI,aAAa,EAAE;CAYlC"}
|
package/dist/storage.js
CHANGED
|
@@ -53,6 +53,20 @@ export class FeedbackStorage {
|
|
|
53
53
|
});
|
|
54
54
|
tx(themes);
|
|
55
55
|
}
|
|
56
|
+
replaceThemes(themes) {
|
|
57
|
+
const clearStmt = this.db.prepare('DELETE FROM feedback_themes');
|
|
58
|
+
const insertStmt = this.db.prepare(`
|
|
59
|
+
INSERT OR REPLACE INTO feedback_themes (id, name, description, sentiment, frequency, sources, related_feedback_ids)
|
|
60
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
61
|
+
`);
|
|
62
|
+
const tx = this.db.transaction((items) => {
|
|
63
|
+
clearStmt.run();
|
|
64
|
+
for (const theme of items) {
|
|
65
|
+
insertStmt.run(theme.id, theme.name, theme.description, theme.sentiment, theme.frequency, JSON.stringify(theme.sources), JSON.stringify(theme.related_feedback_ids));
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
tx(themes);
|
|
69
|
+
}
|
|
56
70
|
getAllFeedback() {
|
|
57
71
|
const rows = this.db.prepare('SELECT * FROM feedback_items ORDER BY timestamp DESC').all();
|
|
58
72
|
return rows.map(row => ({
|
package/dist/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@phantom-pm/feedback-hub",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.4",
|
|
4
4
|
"description": "Feedback Hub module for Phantom - Aggregates feedback from multiple sources",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"lint": "eslint src --ext .ts"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@phantom-pm/core": "
|
|
18
|
+
"@phantom-pm/core": "4.0.4",
|
|
19
19
|
"better-sqlite3": "^11.1.0",
|
|
20
20
|
"discord.js": "14.25.1",
|
|
21
21
|
"zod": "^3.23.8"
|
|
@@ -28,5 +28,15 @@
|
|
|
28
28
|
},
|
|
29
29
|
"publishConfig": {
|
|
30
30
|
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/sir-ad/Phantom.git",
|
|
36
|
+
"directory": "packages/feedback-hub"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://sir-ad.github.io/Phantom/",
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/sir-ad/Phantom/issues"
|
|
31
41
|
}
|
|
32
42
|
}
|