@martin0309205/prism 0.1.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.
Files changed (51) hide show
  1. package/README.md +87 -0
  2. package/assets/systemd/prism@.service +21 -0
  3. package/dist/artifacts.d.ts +9 -0
  4. package/dist/artifacts.js +77 -0
  5. package/dist/artifacts.js.map +1 -0
  6. package/dist/cli/commands/daemon.d.ts +2 -0
  7. package/dist/cli/commands/daemon.js +90 -0
  8. package/dist/cli/commands/daemon.js.map +1 -0
  9. package/dist/cli/commands/doctor.d.ts +2 -0
  10. package/dist/cli/commands/doctor.js +69 -0
  11. package/dist/cli/commands/doctor.js.map +1 -0
  12. package/dist/cli/commands/generate.d.ts +2 -0
  13. package/dist/cli/commands/generate.js +89 -0
  14. package/dist/cli/commands/generate.js.map +1 -0
  15. package/dist/cli/commands/onboard.d.ts +2 -0
  16. package/dist/cli/commands/onboard.js +131 -0
  17. package/dist/cli/commands/onboard.js.map +1 -0
  18. package/dist/cli/commands/serve.d.ts +2 -0
  19. package/dist/cli/commands/serve.js +51 -0
  20. package/dist/cli/commands/serve.js.map +1 -0
  21. package/dist/cli/commands/update.d.ts +2 -0
  22. package/dist/cli/commands/update.js +38 -0
  23. package/dist/cli/commands/update.js.map +1 -0
  24. package/dist/cli/index.d.ts +2 -0
  25. package/dist/cli/index.js +29 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/config.d.ts +34 -0
  28. package/dist/config.js +88 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/daemon.d.ts +16 -0
  31. package/dist/daemon.js +72 -0
  32. package/dist/daemon.js.map +1 -0
  33. package/dist/index.d.ts +4 -0
  34. package/dist/index.js +3 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/instances.d.ts +2 -0
  37. package/dist/instances.js +16 -0
  38. package/dist/instances.js.map +1 -0
  39. package/dist/logger.d.ts +9 -0
  40. package/dist/logger.js +23 -0
  41. package/dist/logger.js.map +1 -0
  42. package/dist/runner.d.ts +19 -0
  43. package/dist/runner.js +89 -0
  44. package/dist/runner.js.map +1 -0
  45. package/dist/surfaces/http.d.ts +12 -0
  46. package/dist/surfaces/http.js +96 -0
  47. package/dist/surfaces/http.js.map +1 -0
  48. package/dist/surfaces/slack.d.ts +9 -0
  49. package/dist/surfaces/slack.js +123 -0
  50. package/dist/surfaces/slack.js.map +1 -0
  51. package/package.json +51 -0
@@ -0,0 +1,96 @@
1
+ import Fastify from 'fastify';
2
+ import fastifyStatic from '@fastify/static';
3
+ import { ulid } from 'ulid';
4
+ import { existsSync, mkdirSync } from 'node:fs';
5
+ import { generate } from '../runner.js';
6
+ import { artifactsRoot, mimeTypeFor, persistArtifacts, pruneArtifacts } from '../artifacts.js';
7
+ export async function createHttpServer(opts) {
8
+ const { config, env, logger } = opts;
9
+ const apiKey = opts.api_key ?? env.PRISM_HTTP_API_KEY ?? process.env.PRISM_HTTP_API_KEY;
10
+ if (!apiKey) {
11
+ logger.warn('PRISM_HTTP_API_KEY not set — HTTP server will reject all requests');
12
+ }
13
+ const app = Fastify({ logger: false, bodyLimit: 1 * 1024 * 1024 });
14
+ const root = artifactsRoot(config.instance, config.artifacts.dir);
15
+ mkdirSync(root, { recursive: true });
16
+ await app.register(fastifyStatic, {
17
+ root,
18
+ prefix: '/artifacts/',
19
+ decorateReply: false,
20
+ serve: true,
21
+ setHeaders: (res, path) => {
22
+ res.setHeader('Content-Type', mimeTypeFor(path));
23
+ res.setHeader('Cache-Control', 'private, max-age=300');
24
+ },
25
+ });
26
+ app.get('/healthz', async () => ({ ok: true, instance: config.instance }));
27
+ app.post('/api/generate', async (req, reply) => {
28
+ if (!apiKey) {
29
+ return reply.code(503).send({ error: 'server not configured: PRISM_HTTP_API_KEY missing' });
30
+ }
31
+ const auth = req.headers.authorization ?? '';
32
+ if (!auth.startsWith('Bearer ') || auth.slice(7) !== apiKey) {
33
+ return reply.code(401).send({ error: 'unauthorized' });
34
+ }
35
+ const body = (req.body ?? {});
36
+ const brief = (body.brief ?? '').trim();
37
+ if (!brief)
38
+ return reply.code(400).send({ error: 'brief is required' });
39
+ const jobId = `gen_${ulid()}`;
40
+ logger.info('http.generate.start', { jobId, briefLen: brief.length });
41
+ try {
42
+ const result = await generate({
43
+ brief,
44
+ timeout_ms: body.timeout_ms ?? config.claude.timeout_ms,
45
+ claude_bin: config.claude.bin,
46
+ env,
47
+ });
48
+ const persisted = persistArtifacts(config.instance, jobId, result.files, config.artifacts.dir);
49
+ const base = opts.public_base_url ?? `http://${config.surfaces.http.bind}:${config.surfaces.http.port}`;
50
+ const expiresAt = new Date(Date.now() + config.artifacts.retention_days * 24 * 60 * 60 * 1000).toISOString();
51
+ try {
52
+ pruneArtifacts(config.instance, config.artifacts.retention_days, config.artifacts.dir);
53
+ }
54
+ catch { /* best-effort */ }
55
+ logger.info('http.generate.done', {
56
+ jobId,
57
+ files: persisted.length,
58
+ durationMs: result.duration_ms,
59
+ timedOut: result.timed_out,
60
+ exitCode: result.exit_code,
61
+ });
62
+ return {
63
+ id: jobId,
64
+ text: result.text,
65
+ files: persisted.map((p) => ({
66
+ filename: p.filename,
67
+ url: `${base}/artifacts/${jobId}/${encodeURIComponent(p.filename)}`,
68
+ size_bytes: p.size_bytes,
69
+ mime_type: mimeTypeFor(p.filename),
70
+ })),
71
+ expires_at: expiresAt,
72
+ took_ms: result.duration_ms,
73
+ exit_code: result.exit_code,
74
+ timed_out: result.timed_out,
75
+ };
76
+ }
77
+ catch (err) {
78
+ logger.error('http.generate.error', { jobId, err: err.message });
79
+ return reply.code(500).send({ error: err.message });
80
+ }
81
+ });
82
+ return app;
83
+ }
84
+ export async function startHttpServer(opts) {
85
+ const app = await createHttpServer(opts);
86
+ const root = artifactsRoot(opts.config.instance, opts.config.artifacts.dir);
87
+ if (!existsSync(root))
88
+ mkdirSync(root, { recursive: true });
89
+ await app.listen({ host: opts.config.surfaces.http.bind, port: opts.config.surfaces.http.port });
90
+ opts.logger.info('http.listening', {
91
+ bind: opts.config.surfaces.http.bind,
92
+ port: opts.config.surfaces.http.port,
93
+ });
94
+ return app;
95
+ }
96
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/surfaces/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import bolt from '@slack/bolt';
2
+ import type { PrismConfig } from '../config.js';
3
+ import type { Logger } from '../logger.js';
4
+ export interface SlackServerOptions {
5
+ config: PrismConfig;
6
+ env: Record<string, string>;
7
+ logger: Logger;
8
+ }
9
+ export declare function startSlackServer(opts: SlackServerOptions): Promise<bolt.App>;
@@ -0,0 +1,123 @@
1
+ import bolt from '@slack/bolt';
2
+ import { readFileSync, statSync } from 'node:fs';
3
+ import { basename } from 'node:path';
4
+ import { generate } from '../runner.js';
5
+ const { App } = bolt;
6
+ export async function startSlackServer(opts) {
7
+ const { config, env, logger } = opts;
8
+ const botToken = env.SLACK_BOT_TOKEN ?? process.env.SLACK_BOT_TOKEN;
9
+ const appToken = env.SLACK_APP_TOKEN ?? process.env.SLACK_APP_TOKEN;
10
+ if (!botToken || !appToken) {
11
+ throw new Error('SLACK_BOT_TOKEN and SLACK_APP_TOKEN are required for the Slack surface');
12
+ }
13
+ const app = new App({
14
+ token: botToken,
15
+ appToken,
16
+ socketMode: true,
17
+ logLevel: bolt.LogLevel.WARN,
18
+ });
19
+ const inflight = new Map();
20
+ const allowlist = new Set(config.surfaces.slack.allowlist_channels ?? []);
21
+ const authResp = await app.client.auth.test({ token: botToken });
22
+ const botUserId = authResp.user_id;
23
+ logger.info('slack.boot', { bot_user_id: botUserId, team: authResp.team });
24
+ app.event('app_mention', async ({ event, client, say }) => {
25
+ const channel = event.channel;
26
+ const ts = event.ts;
27
+ const threadTs = event.thread_ts ?? ts;
28
+ const user = event.user ?? 'unknown';
29
+ const dedupKey = `${channel}:${ts}`;
30
+ if (allowlist.size > 0 && !allowlist.has(channel)) {
31
+ logger.warn('slack.mention.denied', { channel, ts });
32
+ return;
33
+ }
34
+ if (inflight.has(dedupKey)) {
35
+ logger.debug('slack.mention.dedup', { dedupKey });
36
+ return;
37
+ }
38
+ const brief = stripMention(event.text ?? '', botUserId).trim();
39
+ if (!brief) {
40
+ await say({ thread_ts: threadTs, text: 'Donne-moi un brief — ex: `@prism fais un PDF récap du meeting Endemol`' });
41
+ return;
42
+ }
43
+ const work = (async () => {
44
+ logger.info('slack.mention.start', { channel, ts, user, briefLen: brief.length });
45
+ const reaction = client.reactions.add({ channel, timestamp: ts, name: 'hourglass_flowing_sand' }).catch(() => undefined);
46
+ try {
47
+ const result = await generate({
48
+ brief,
49
+ timeout_ms: config.claude.timeout_ms,
50
+ claude_bin: config.claude.bin,
51
+ env,
52
+ });
53
+ const text = result.text || (result.files.length > 0 ? '' : '_(aucune sortie)_');
54
+ if (result.files.length === 0) {
55
+ await say({ thread_ts: threadTs, text: text || '_(rien à livrer)_' });
56
+ }
57
+ else {
58
+ await uploadFilesToThread({
59
+ client,
60
+ channel,
61
+ threadTs,
62
+ files: result.files,
63
+ comment: text,
64
+ logger,
65
+ });
66
+ }
67
+ await reaction;
68
+ await client.reactions.remove({ channel, timestamp: ts, name: 'hourglass_flowing_sand' }).catch(() => undefined);
69
+ await client.reactions.add({ channel, timestamp: ts, name: 'white_check_mark' }).catch(() => undefined);
70
+ logger.info('slack.mention.done', {
71
+ channel,
72
+ ts,
73
+ files: result.files.length,
74
+ durationMs: result.duration_ms,
75
+ exitCode: result.exit_code,
76
+ timedOut: result.timed_out,
77
+ });
78
+ }
79
+ catch (err) {
80
+ logger.error('slack.mention.error', { channel, ts, err: err.message });
81
+ await say({ thread_ts: threadTs, text: `❌ erreur: ${err.message}` }).catch(() => undefined);
82
+ await client.reactions.remove({ channel, timestamp: ts, name: 'hourglass_flowing_sand' }).catch(() => undefined);
83
+ await client.reactions.add({ channel, timestamp: ts, name: 'x' }).catch(() => undefined);
84
+ }
85
+ finally {
86
+ inflight.delete(dedupKey);
87
+ }
88
+ })();
89
+ inflight.set(dedupKey, work);
90
+ await work;
91
+ });
92
+ await app.start();
93
+ logger.info('slack.listening');
94
+ return app;
95
+ }
96
+ function stripMention(text, botUserId) {
97
+ if (!botUserId)
98
+ return text;
99
+ return text.replace(new RegExp(`<@${botUserId}>`, 'g'), '').trim();
100
+ }
101
+ async function uploadFilesToThread({ client, channel, threadTs, files, comment, logger }) {
102
+ const file_uploads = files.map((path) => ({
103
+ file: readFileSync(path),
104
+ filename: basename(path),
105
+ title: basename(path),
106
+ }));
107
+ const total = files.reduce((sum, p) => {
108
+ try {
109
+ return sum + statSync(p).size;
110
+ }
111
+ catch {
112
+ return sum;
113
+ }
114
+ }, 0);
115
+ logger.debug('slack.upload', { channel, threadTs, count: files.length, total_bytes: total });
116
+ await client.filesUploadV2({
117
+ channel_id: channel,
118
+ thread_ts: threadTs,
119
+ initial_comment: comment || undefined,
120
+ file_uploads,
121
+ });
122
+ }
123
+ //# sourceMappingURL=slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/surfaces/slack.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@martin0309205/prism",
3
+ "version": "0.1.0",
4
+ "description": "Thin connector around Claude Code: Slack/HTTP/CLI surfaces that spawn `claude -p` and ship back the files Claude creates.",
5
+ "type": "module",
6
+ "bin": {
7
+ "prism": "./dist/cli/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "exports": {
11
+ ".": "./dist/index.js",
12
+ "./runner": "./dist/runner.js"
13
+ },
14
+ "files": [
15
+ "dist/",
16
+ "assets/",
17
+ "README.md",
18
+ "LICENSE"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.json",
22
+ "dev": "tsc -w -p tsconfig.json",
23
+ "start": "node dist/cli/index.js",
24
+ "clean": "rimraf dist",
25
+ "prepublishOnly": "npm run clean && npm run build",
26
+ "release": "node scripts/release.mjs"
27
+ },
28
+ "dependencies": {
29
+ "@slack/bolt": "^3.22.0",
30
+ "commander": "^12.1.0",
31
+ "fastify": "^4.28.1",
32
+ "@fastify/static": "^7.0.4",
33
+ "prompts": "^2.4.2",
34
+ "yaml": "^2.5.1",
35
+ "ulid": "^2.3.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^22.7.4",
39
+ "@types/prompts": "^2.4.9",
40
+ "rimraf": "^6.0.1",
41
+ "typescript": "^5.6.2"
42
+ },
43
+ "engines": {
44
+ "node": ">=20"
45
+ },
46
+ "license": "UNLICENSED",
47
+ "private": false,
48
+ "publishConfig": {
49
+ "access": "public"
50
+ }
51
+ }