@martin0309205/prism 0.1.8 → 0.2.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.
@@ -10,10 +10,14 @@ Produce the deliverable they asked for, drop it at the root of `cwd`, then reply
10
10
 
11
11
  | Surface | What they see |
12
12
  |---|---|
13
- | **Slack** | Files at cwd root are uploaded to the thread. Your stdout becomes the comment next to the file (Prism converts Markdown to Slack mrkdwn). |
13
+ | **Slack** | Files at cwd root are uploaded to the thread. Your stdout becomes the comment next to the file (Prism converts Markdown to Slack mrkdwn). The user can react with ✅ (validate, archives the deliverable), 🔄 (iterate — Prism re-spawns you with the user's thread feedback + the previous deliverable copied to `_work/_previous/` as a reference), or 🗑️ (trash). |
14
14
  | **HTTP** | JSON response: file URLs + your stdout as `text`. |
15
15
  | **CLI** | Files copied to their `--out` directory. Stdout streamed to terminal. |
16
16
 
17
+ ## When you're spawned for an iteration
18
+
19
+ If your brief starts with `[ITÉRATION du livrable précédent]`, you're being re-run because the user wasn't fully happy. The brief includes the original brief, the user's feedback, and a reference to `_work/_previous/` containing the prior deliverable(s). **Reuse that reference**: for image regenerations via `astry-image-higgsfield`, pass the previous PNG as `--image <id>` to Higgsfield (after `higgsfield upload`), so the new generation stays close to the prior one but applies the feedback. Don't start from scratch — that's what loses the user's work.
20
+
17
21
  ## Output conventions (CRITICAL)
18
22
 
19
23
  - **Final deliverables** at the root of `cwd`: the `.pdf`, the `.png`, the `.docx`, etc. Naming convention: `Astry_<Topic>_<Variant>.<ext>` in PascalCase.
package/dist/jobs.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ export interface SlackJobAnchors {
2
+ channel: string;
3
+ thread_ts: string;
4
+ user_msg_ts: string;
5
+ bot_msg_ts?: string;
6
+ }
7
+ export interface JobFeedback {
8
+ likes: number;
9
+ dislikes: number;
10
+ validated_at?: string;
11
+ trashed_at?: string;
12
+ }
13
+ export interface JobMeta {
14
+ job_id: string;
15
+ surface: 'slack' | 'http' | 'cli';
16
+ brief: string;
17
+ workdir: string;
18
+ files: string[];
19
+ created_at: string;
20
+ duration_ms?: number;
21
+ exit_code?: number;
22
+ timed_out?: boolean;
23
+ text?: string;
24
+ slack?: SlackJobAnchors;
25
+ feedback?: JobFeedback;
26
+ parent_job_id?: string;
27
+ iteration_index?: number;
28
+ }
29
+ export declare function jobsRoot(instance: string): string;
30
+ export declare function jobDir(instance: string, jobId: string): string;
31
+ export declare function archiveRoot(instance: string): string;
32
+ export declare function readJob(instance: string, jobId: string): JobMeta | null;
33
+ export declare function writeJob(instance: string, job: JobMeta): void;
34
+ /** Copies the deliverable files into the job's archive dir; returns archived paths. */
35
+ export declare function persistJobFiles(instance: string, jobId: string, files: string[]): string[];
36
+ /** Linear scan; fine for thousands of jobs. Add an index file if it ever gets slow. */
37
+ export declare function findJobByBotMessage(instance: string, channel: string, bot_msg_ts: string): JobMeta | null;
38
+ export declare function listJobs(instance: string, opts?: {
39
+ limit?: number;
40
+ surface?: JobMeta['surface'];
41
+ }): JobMeta[];
42
+ export declare function moveJobToArchive(instance: string, jobId: string, bucket: 'validated' | 'trash'): string;
43
+ export declare function recordFeedback(instance: string, jobId: string, kind: 'like' | 'dislike' | 'validate' | 'trash'): JobMeta | null;
package/dist/jobs.js ADDED
@@ -0,0 +1,117 @@
1
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync, } from 'node:fs';
2
+ import { basename, join } from 'node:path';
3
+ import { instanceRoot } from './config.js';
4
+ export function jobsRoot(instance) {
5
+ return join(instanceRoot(instance), 'jobs');
6
+ }
7
+ export function jobDir(instance, jobId) {
8
+ return join(jobsRoot(instance), jobId);
9
+ }
10
+ export function archiveRoot(instance) {
11
+ return join(instanceRoot(instance), 'archive');
12
+ }
13
+ export function readJob(instance, jobId) {
14
+ const path = join(jobDir(instance, jobId), 'meta.json');
15
+ if (!existsSync(path))
16
+ return null;
17
+ try {
18
+ return JSON.parse(readFileSync(path, 'utf8'));
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ export function writeJob(instance, job) {
25
+ const dir = jobDir(instance, job.job_id);
26
+ mkdirSync(dir, { recursive: true });
27
+ writeFileSync(join(dir, 'meta.json'), JSON.stringify(job, null, 2));
28
+ }
29
+ /** Copies the deliverable files into the job's archive dir; returns archived paths. */
30
+ export function persistJobFiles(instance, jobId, files) {
31
+ const dir = join(jobDir(instance, jobId), 'files');
32
+ mkdirSync(dir, { recursive: true });
33
+ const archived = [];
34
+ for (const src of files) {
35
+ if (!existsSync(src))
36
+ continue;
37
+ const dst = join(dir, basename(src));
38
+ try {
39
+ copyFileSync(src, dst);
40
+ archived.push(dst);
41
+ }
42
+ catch {
43
+ // ignore individual copy errors
44
+ }
45
+ }
46
+ return archived;
47
+ }
48
+ /** Linear scan; fine for thousands of jobs. Add an index file if it ever gets slow. */
49
+ export function findJobByBotMessage(instance, channel, bot_msg_ts) {
50
+ const root = jobsRoot(instance);
51
+ if (!existsSync(root))
52
+ return null;
53
+ for (const id of readdirSync(root)) {
54
+ const j = readJob(instance, id);
55
+ if (!j?.slack)
56
+ continue;
57
+ if (j.slack.channel === channel && j.slack.bot_msg_ts === bot_msg_ts)
58
+ return j;
59
+ }
60
+ return null;
61
+ }
62
+ export function listJobs(instance, opts = {}) {
63
+ const root = jobsRoot(instance);
64
+ if (!existsSync(root))
65
+ return [];
66
+ const out = [];
67
+ for (const id of readdirSync(root)) {
68
+ const j = readJob(instance, id);
69
+ if (!j)
70
+ continue;
71
+ if (opts.surface && j.surface !== opts.surface)
72
+ continue;
73
+ out.push(j);
74
+ }
75
+ out.sort((a, b) => b.created_at.localeCompare(a.created_at));
76
+ return opts.limit ? out.slice(0, opts.limit) : out;
77
+ }
78
+ export function moveJobToArchive(instance, jobId, bucket) {
79
+ const job = readJob(instance, jobId);
80
+ if (!job)
81
+ throw new Error(`job ${jobId} not found`);
82
+ const dst = join(archiveRoot(instance), bucket, jobId);
83
+ mkdirSync(dst, { recursive: true });
84
+ // Copy the meta + files (don't delete the original — keep history queryable)
85
+ writeFileSync(join(dst, 'meta.json'), JSON.stringify(job, null, 2));
86
+ if (job.files.length > 0) {
87
+ const filesDir = join(dst, 'files');
88
+ mkdirSync(filesDir, { recursive: true });
89
+ for (const f of job.files) {
90
+ if (!existsSync(f))
91
+ continue;
92
+ try {
93
+ copyFileSync(f, join(filesDir, basename(f)));
94
+ }
95
+ catch { /* skip */ }
96
+ }
97
+ }
98
+ return dst;
99
+ }
100
+ export function recordFeedback(instance, jobId, kind) {
101
+ const job = readJob(instance, jobId);
102
+ if (!job)
103
+ return null;
104
+ const fb = job.feedback ?? { likes: 0, dislikes: 0 };
105
+ if (kind === 'like')
106
+ fb.likes += 1;
107
+ else if (kind === 'dislike')
108
+ fb.dislikes += 1;
109
+ else if (kind === 'validate')
110
+ fb.validated_at = new Date().toISOString();
111
+ else if (kind === 'trash')
112
+ fb.trashed_at = new Date().toISOString();
113
+ job.feedback = fb;
114
+ writeJob(instance, job);
115
+ return job;
116
+ }
117
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,14 @@
1
1
  import bolt from '@slack/bolt';
2
2
  import type { PrismConfig } from '../config.js';
3
3
  import type { Logger } from '../logger.js';
4
+ import { readJob } from '../jobs.js';
5
+ export declare const ACTION_EMOJI: {
6
+ readonly validate: "white_check_mark";
7
+ readonly iterate: "arrows_counterclockwise";
8
+ readonly trash: "wastebasket";
9
+ readonly like: "+1";
10
+ readonly dislike: "-1";
11
+ };
4
12
  export interface SlackServerOptions {
5
13
  config: PrismConfig;
6
14
  env: Record<string, string>;
@@ -8,3 +16,4 @@ export interface SlackServerOptions {
8
16
  }
9
17
  export declare function startSlackServer(opts: SlackServerOptions): Promise<bolt.App>;
10
18
  export declare function toSlackMrkdwn(md: string): string;
19
+ export { readJob };
@@ -1,8 +1,19 @@
1
1
  import bolt from '@slack/bolt';
2
- import { readFileSync, statSync } from 'node:fs';
3
- import { basename } from 'node:path';
2
+ import { copyFileSync, mkdirSync, mkdtempSync, readFileSync, statSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { basename, join } from 'node:path';
5
+ import { ulid } from 'ulid';
4
6
  import { generate } from '../runner.js';
7
+ import { findJobByBotMessage, moveJobToArchive, persistJobFiles, readJob, recordFeedback, writeJob, } from '../jobs.js';
5
8
  const { App } = bolt;
9
+ export const ACTION_EMOJI = {
10
+ validate: 'white_check_mark',
11
+ iterate: 'arrows_counterclockwise',
12
+ trash: 'wastebasket',
13
+ like: '+1',
14
+ dislike: '-1',
15
+ };
16
+ const ACTION_EMOJI_VALUES = Object.values(ACTION_EMOJI);
6
17
  export async function startSlackServer(opts) {
7
18
  const { config, env, logger } = opts;
8
19
  const botToken = env.SLACK_BOT_TOKEN ?? process.env.SLACK_BOT_TOKEN;
@@ -37,12 +48,16 @@ export async function startSlackServer(opts) {
37
48
  }
38
49
  const brief = stripMention(event.text ?? '', botUserId).trim();
39
50
  if (!brief) {
40
- await say({ thread_ts: threadTs, text: 'Donne-moi un brief — ex: `@prism fais un PDF récap du meeting Endemol`' });
51
+ await say({
52
+ thread_ts: threadTs,
53
+ text: 'Donne-moi un brief — ex: `@prism fais un PDF récap du meeting Endemol`',
54
+ });
41
55
  return;
42
56
  }
43
57
  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);
58
+ const job_id = `j_${ulid()}`;
59
+ logger.info('slack.mention.start', { jobId: job_id, channel, ts, user, briefLen: brief.length });
60
+ await client.reactions.add({ channel, timestamp: ts, name: 'hourglass_flowing_sand' }).catch(() => undefined);
46
61
  try {
47
62
  const result = await generate({
48
63
  brief,
@@ -50,27 +65,47 @@ export async function startSlackServer(opts) {
50
65
  claude_bin: config.claude.bin,
51
66
  env,
52
67
  });
68
+ // Archive deliverables under jobs/<id>/files/
69
+ const archived = persistJobFiles(config.instance, job_id, result.files);
53
70
  const slackText = result.text ? toSlackMrkdwn(result.text) : '';
54
- if (result.files.length === 0) {
55
- await say({ thread_ts: threadTs, text: slackText || '_(rien à livrer)_' });
71
+ // Post: files first (so they render at top), then the comment that users react on.
72
+ if (result.files.length > 0) {
73
+ await uploadFilesToThread({ client, channel, threadTs, files: result.files, logger });
56
74
  }
57
- else {
58
- await uploadFilesToThread({
59
- client,
60
- channel,
61
- threadTs,
62
- files: result.files,
63
- comment: slackText,
64
- logger,
65
- });
75
+ const reply = await client.chat.postMessage({
76
+ channel,
77
+ thread_ts: threadTs,
78
+ text: slackText || (result.files.length > 0 ? '_(livré)_' : '_(rien à livrer)_'),
79
+ });
80
+ const bot_msg_ts = reply.ts ?? undefined;
81
+ // Persist the job
82
+ const job = {
83
+ job_id,
84
+ surface: 'slack',
85
+ brief,
86
+ workdir: result.workdir,
87
+ files: archived,
88
+ created_at: new Date().toISOString(),
89
+ duration_ms: result.duration_ms,
90
+ exit_code: result.exit_code,
91
+ timed_out: result.timed_out,
92
+ text: result.text,
93
+ slack: { channel, thread_ts: threadTs, user_msg_ts: ts, bot_msg_ts },
94
+ feedback: { likes: 0, dislikes: 0 },
95
+ iteration_index: 0,
96
+ };
97
+ writeJob(config.instance, job);
98
+ // Pre-apply the action "buttons" so the user can just click the same emoji
99
+ if (bot_msg_ts) {
100
+ for (const name of [ACTION_EMOJI.validate, ACTION_EMOJI.iterate, ACTION_EMOJI.trash]) {
101
+ await client.reactions.add({ channel, timestamp: bot_msg_ts, name }).catch(() => undefined);
102
+ }
66
103
  }
67
- await reaction;
68
104
  await client.reactions.remove({ channel, timestamp: ts, name: 'hourglass_flowing_sand' }).catch(() => undefined);
69
105
  await client.reactions.add({ channel, timestamp: ts, name: 'white_check_mark' }).catch(() => undefined);
70
106
  logger.info('slack.mention.done', {
71
- channel,
72
- ts,
73
- files: result.files.length,
107
+ jobId: job_id,
108
+ files: archived.length,
74
109
  durationMs: result.duration_ms,
75
110
  exitCode: result.exit_code,
76
111
  timedOut: result.timed_out,
@@ -89,6 +124,51 @@ export async function startSlackServer(opts) {
89
124
  inflight.set(dedupKey, work);
90
125
  await work;
91
126
  });
127
+ // Reaction-based "action buttons" on bot replies
128
+ app.event('reaction_added', async ({ event, client }) => {
129
+ if (event.user === botUserId)
130
+ return; // don't react to our own pre-applied reactions
131
+ if (event.item.type !== 'message')
132
+ return;
133
+ if (!ACTION_EMOJI_VALUES.includes(event.reaction))
134
+ return;
135
+ const channel = event.item.channel;
136
+ const ts = event.item.ts;
137
+ if (!channel || !ts)
138
+ return;
139
+ const job = findJobByBotMessage(config.instance, channel, ts);
140
+ if (!job) {
141
+ logger.debug('slack.reaction.no_job', { channel, ts, reaction: event.reaction, user: event.user });
142
+ return;
143
+ }
144
+ logger.info('slack.reaction', { jobId: job.job_id, reaction: event.reaction, user: event.user });
145
+ try {
146
+ switch (event.reaction) {
147
+ case ACTION_EMOJI.validate:
148
+ await handleValidate(job, client, config, logger);
149
+ break;
150
+ case ACTION_EMOJI.trash:
151
+ await handleTrash(job, client, config, logger);
152
+ break;
153
+ case ACTION_EMOJI.iterate:
154
+ await handleIterate(job, client, config, env, logger, botUserId);
155
+ break;
156
+ case ACTION_EMOJI.like:
157
+ recordFeedback(config.instance, job.job_id, 'like');
158
+ break;
159
+ case ACTION_EMOJI.dislike:
160
+ recordFeedback(config.instance, job.job_id, 'dislike');
161
+ break;
162
+ }
163
+ }
164
+ catch (err) {
165
+ logger.error('slack.reaction.error', {
166
+ jobId: job.job_id,
167
+ reaction: event.reaction,
168
+ err: err.message,
169
+ });
170
+ }
171
+ });
92
172
  await app.start();
93
173
  logger.info('slack.listening');
94
174
  return app;
@@ -99,31 +179,19 @@ function stripMention(text, botUserId) {
99
179
  return text.replace(new RegExp(`<@${botUserId}>`, 'g'), '').trim();
100
180
  }
101
181
  // Convert standard Markdown (what Claude emits) to Slack mrkdwn.
102
- // Slack's mrkdwn ≠ CommonMark: *bold* (single star), no headers, • for bullets,
103
- // <url|label> for links, ~strike~ uses single ~, no nested formatting.
104
182
  export function toSlackMrkdwn(md) {
105
183
  let out = md;
106
- // Strip code fences but keep their contents — preserves mrkdwn block style
107
- // by replacing ```lang\n...\n``` with ```...``` (Slack supports the latter).
108
184
  out = out.replace(/```[a-zA-Z0-9_-]*\n([\s\S]*?)```/g, '```$1```');
109
- // Headers → bold standalone line
110
185
  out = out.replace(/^[ \t]{0,3}#{1,6}[ \t]+(.+?)[ \t]*#*[ \t]*$/gm, '*$1*');
111
- // Bold: **text** or __text__ → *text*
112
186
  out = out.replace(/\*\*([^\n*]+)\*\*/g, '*$1*');
113
187
  out = out.replace(/__([^\n_]+)__/g, '*$1*');
114
- // Links: [label](url) → <url|label>
115
188
  out = out.replace(/\[([^\]\n]+)\]\(([^)\s]+)\)/g, '<$2|$1>');
116
- // Bullet list markers ( -, *, + at start of line, after optional indent )
117
- // → bullet character. Keep indent for nested feel.
118
189
  out = out.replace(/^([ \t]*)[-*+][ \t]+/gm, '$1• ');
119
- // Numbered lists are fine as-is in Slack.
120
- // Horizontal rules (---, ***, ___) → blank line
121
190
  out = out.replace(/^[ \t]*(?:-[ \t]*-[ \t]*-+|\*[ \t]*\*[ \t]*\*+|_[ \t]*_[ \t]*_+)[ \t]*$/gm, '');
122
- // Collapse 3+ consecutive blank lines to 2 (Slack already collapses, just tidy).
123
191
  out = out.replace(/\n{3,}/g, '\n\n');
124
192
  return out.trim();
125
193
  }
126
- async function uploadFilesToThread({ client, channel, threadTs, files, comment, logger }) {
194
+ async function uploadFilesToThread({ client, channel, threadTs, files, logger }) {
127
195
  const file_uploads = files.map((path) => ({
128
196
  file: readFileSync(path),
129
197
  filename: basename(path),
@@ -141,8 +209,141 @@ async function uploadFilesToThread({ client, channel, threadTs, files, comment,
141
209
  await client.filesUploadV2({
142
210
  channel_id: channel,
143
211
  thread_ts: threadTs,
144
- initial_comment: comment || undefined,
145
212
  file_uploads,
146
213
  });
147
214
  }
215
+ // ------- action handlers -------
216
+ async function handleValidate(job, client, config, logger) {
217
+ if (!job.slack?.bot_msg_ts)
218
+ return;
219
+ recordFeedback(config.instance, job.job_id, 'validate');
220
+ const dst = moveJobToArchive(config.instance, job.job_id, 'validated');
221
+ logger.info('slack.action.validated', { jobId: job.job_id, dst });
222
+ await client.reactions.add({
223
+ channel: job.slack.channel,
224
+ timestamp: job.slack.bot_msg_ts,
225
+ name: 'floppy_disk',
226
+ }).catch(() => undefined);
227
+ }
228
+ async function handleTrash(job, client, config, logger) {
229
+ if (!job.slack?.bot_msg_ts)
230
+ return;
231
+ recordFeedback(config.instance, job.job_id, 'trash');
232
+ const dst = moveJobToArchive(config.instance, job.job_id, 'trash');
233
+ logger.info('slack.action.trashed', { jobId: job.job_id, dst });
234
+ // No extra emoji — the wastebasket reaction itself is the visual confirmation.
235
+ }
236
+ async function handleIterate(job, client, config, env, logger, botUserId) {
237
+ if (!job.slack)
238
+ return;
239
+ const { channel, thread_ts, bot_msg_ts } = job.slack;
240
+ // Fetch thread replies; pull anything posted after this job by a non-bot user.
241
+ const replies = await client.conversations.replies({ channel, ts: thread_ts, limit: 200 });
242
+ const cutoff = new Date(job.created_at).getTime() / 1000;
243
+ const userFeedback = (replies.messages ?? [])
244
+ .filter((m) => m.user && m.user !== botUserId && parseFloat(m.ts ?? '0') > cutoff)
245
+ .map((m) => (m.text ?? '').trim())
246
+ .filter(Boolean)
247
+ .join('\n\n');
248
+ if (!userFeedback) {
249
+ await client.chat.postMessage({
250
+ channel,
251
+ thread_ts,
252
+ text: '🔄 Précise dans ce thread ce que tu veux changer (couleur, mood, format, texte…), puis re-clique sur 🔄.',
253
+ }).catch(() => undefined);
254
+ return;
255
+ }
256
+ // Indicate iteration in progress
257
+ await client.reactions.add({
258
+ channel,
259
+ timestamp: bot_msg_ts,
260
+ name: 'hourglass_flowing_sand',
261
+ }).catch(() => undefined);
262
+ const new_job_id = `j_${ulid()}`;
263
+ const newWorkdir = mkdtempSync(join(tmpdir(), 'prism-'));
264
+ // Copy previous deliverables into _work/_previous so Claude can pick them up
265
+ // as reference images (e.g. for higgsfield re-render). _work/ is ignored by
266
+ // the runner, so they don't get re-shipped.
267
+ const prevDir = join(newWorkdir, '_work', '_previous');
268
+ mkdirSync(prevDir, { recursive: true });
269
+ for (const f of job.files) {
270
+ try {
271
+ copyFileSync(f, join(prevDir, basename(f)));
272
+ }
273
+ catch { /* skip */ }
274
+ }
275
+ const newBrief = [
276
+ '[ITÉRATION du livrable précédent]',
277
+ '',
278
+ `Brief original : ${job.brief}`,
279
+ '',
280
+ 'Feedback à appliquer :',
281
+ userFeedback,
282
+ '',
283
+ `Le livrable précédent est dans \`_work/_previous/\` (${job.files.map((f) => basename(f)).join(', ')}).`,
284
+ 'Quand tu re-render via une skill (astry-image-higgsfield, astry-pdf, astry-linkedin-image), passe-le comme reference image / contexte si pertinent.',
285
+ ].join('\n');
286
+ let newResult;
287
+ try {
288
+ newResult = await generate({
289
+ brief: newBrief,
290
+ workdir: newWorkdir,
291
+ timeout_ms: config.claude.timeout_ms,
292
+ claude_bin: config.claude.bin,
293
+ env,
294
+ });
295
+ }
296
+ catch (err) {
297
+ await client.chat.postMessage({
298
+ channel,
299
+ thread_ts,
300
+ text: `❌ itération échouée: ${err.message}`,
301
+ }).catch(() => undefined);
302
+ return;
303
+ }
304
+ finally {
305
+ await client.reactions.remove({ channel, timestamp: bot_msg_ts, name: 'hourglass_flowing_sand' }).catch(() => undefined);
306
+ }
307
+ const archived = persistJobFiles(config.instance, new_job_id, newResult.files);
308
+ const slackText = newResult.text ? toSlackMrkdwn(newResult.text) : '';
309
+ if (newResult.files.length > 0) {
310
+ await uploadFilesToThread({ client, channel, threadTs: thread_ts, files: newResult.files, logger });
311
+ }
312
+ const reply = await client.chat.postMessage({
313
+ channel,
314
+ thread_ts,
315
+ text: slackText || '_(itération sans texte)_',
316
+ });
317
+ const newBotMsgTs = reply.ts ?? undefined;
318
+ const newJob = {
319
+ job_id: new_job_id,
320
+ surface: 'slack',
321
+ brief: newBrief,
322
+ workdir: newResult.workdir,
323
+ files: archived,
324
+ created_at: new Date().toISOString(),
325
+ duration_ms: newResult.duration_ms,
326
+ exit_code: newResult.exit_code,
327
+ timed_out: newResult.timed_out,
328
+ text: newResult.text,
329
+ slack: { channel, thread_ts, user_msg_ts: job.slack.user_msg_ts, bot_msg_ts: newBotMsgTs },
330
+ feedback: { likes: 0, dislikes: 0 },
331
+ parent_job_id: job.job_id,
332
+ iteration_index: (job.iteration_index ?? 0) + 1,
333
+ };
334
+ writeJob(config.instance, newJob);
335
+ if (newBotMsgTs) {
336
+ for (const name of [ACTION_EMOJI.validate, ACTION_EMOJI.iterate, ACTION_EMOJI.trash]) {
337
+ await client.reactions.add({ channel, timestamp: newBotMsgTs, name }).catch(() => undefined);
338
+ }
339
+ }
340
+ logger.info('slack.action.iterated', {
341
+ parentJobId: job.job_id,
342
+ newJobId: new_job_id,
343
+ files: archived.length,
344
+ iterationIndex: newJob.iteration_index,
345
+ });
346
+ }
347
+ // Re-export readJob for any future CLI reuse
348
+ export { readJob };
148
349
  //# sourceMappingURL=slack.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/surfaces/slack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/surfaces/slack.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@martin0309205/prism",
3
- "version": "0.1.8",
3
+ "version": "0.2.0",
4
4
  "description": "Thin connector around Claude Code: Slack/HTTP/CLI surfaces that spawn `claude -p` and ship back the files Claude creates.",
5
5
  "type": "module",
6
6
  "bin": {