@prismatic-io/lux 0.0.2-preview.11 → 0.0.2-preview.13

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.
@@ -24,8 +24,10 @@ export declare const PersonaAnswererConfigSchema: z.ZodObject<{
24
24
  }, z.core.$strict>;
25
25
  export type PersonaAnswererConfig = z.infer<typeof PersonaAnswererConfigSchema>;
26
26
  declare const buildSystemPrompt: (ctx: AnswererContext, sentinel: string, override?: string) => string;
27
+ declare const responseInstruction: (interrupt: Interrupt) => string;
28
+ declare const buildAnswerPrompt: (ctx: AnswererContext, interrupt: Interrupt, sentinel: string) => string;
27
29
  declare const newFenceSentinel: () => string;
28
- declare const interruptDisplay: (interrupt: Interrupt, sentinel: string) => string;
30
+ declare const interruptDisplay: (interrupt: Interrupt, sentinel: string, includeDirective?: boolean) => string;
29
31
  /**
30
32
  * Prior turns, rendered as plain text so a one-shot CLI call still has
31
33
  * the conversation context the persona needs to stay consistent.
@@ -37,5 +39,5 @@ declare const parseApprovalResponse: (text: string) => {
37
39
  };
38
40
  declare const cleanAskResponse: (text: string) => string;
39
41
  export declare const personaAnswerer: AnswererPlugin<PersonaAnswererConfig>;
40
- export { buildSystemPrompt, cleanAskResponse, historyAsText, interruptDisplay, newFenceSentinel, parseApprovalResponse, };
42
+ export { buildAnswerPrompt, buildSystemPrompt, cleanAskResponse, historyAsText, interruptDisplay, newFenceSentinel, parseApprovalResponse, responseInstruction, };
41
43
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/answerers/persona/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,eAAe,EAEpB,KAAK,cAAc,EAInB,KAAK,SAAS,EAOf,MAAM,qBAAqB,CAAC;AAG7B;;;GAGG;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;kBAe7B,CAAC;AAEZ,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,QAAA,MAAM,iBAAiB,QAAS,eAAe,YAAY,MAAM,aAAa,MAAM,KAAG,MA+BtF,CAAC;AAMF,QAAA,MAAM,gBAAgB,QAAO,MAAsC,CAAC;AAqDpE,QAAA,MAAM,gBAAgB,cAAe,SAAS,YAAY,MAAM,KAAG,MAuBlE,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,aAAa,QAAS,eAAe,YAAY,MAAM,KAAG,MA+B/D,CAAC;AAEF,QAAA,MAAM,qBAAqB,SACnB,MAAM,KACX;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAelD,CAAC;AAEF,QAAA,MAAM,gBAAgB,SAAU,MAAM,KAAG,MASxC,CAAC;AAwGF,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,qBAAqB,CAIjE,CAAC;AAGF,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,GACtB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/answerers/persona/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,eAAe,EAEpB,KAAK,cAAc,EAInB,KAAK,SAAS,EAOf,MAAM,qBAAqB,CAAC;AAG7B;;;GAGG;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;kBAe7B,CAAC;AAEZ,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,QAAA,MAAM,iBAAiB,QAAS,eAAe,YAAY,MAAM,aAAa,MAAM,KAAG,MAyBtF,CAAC;AAEF,QAAA,MAAM,mBAAmB,cAAe,SAAS,KAAG,MAWnD,CAAC;AAEF,QAAA,MAAM,iBAAiB,QAAS,eAAe,aAAa,SAAS,YAAY,MAAM,KAAG,MAK9B,CAAC;AAM7D,QAAA,MAAM,gBAAgB,QAAO,MAAsC,CAAC;AAyDpE,QAAA,MAAM,gBAAgB,cACT,SAAS,YACV,MAAM,iCAEf,MA0BF,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,aAAa,QAAS,eAAe,YAAY,MAAM,KAAG,MA+B/D,CAAC;AAEF,QAAA,MAAM,qBAAqB,SACnB,MAAM,KACX;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAKlD,CAAC;AAEF,QAAA,MAAM,gBAAgB,SAAU,MAAM,KAAG,MASxC,CAAC;AAwGF,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,qBAAqB,CAIjE,CAAC;AAGF,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,GACpB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { z } from "zod";
3
3
  import { addUsage, ConversationTurnResponseSchema, emptyUsage, isConversationTurnInterrupt, ModelCliProviderSchema, ReasoningEffortSchema, runTextModel, tryParseJson, } from "../../core/index.js";
4
- import { ApproveReplySchema, approveAnswer } from "../shared.js";
4
+ import { approveAnswer } from "../shared.js";
5
5
  /**
6
6
  * Persona answerer: plays the user through a configured local Claude Code or
7
7
  * Codex CLI. No vendor SDK is coupled to the answerer.
@@ -46,15 +46,22 @@ Rules:
46
46
  - Include every persona constraint about each resource or operation the agent
47
47
  mentions, including constraints its question omitted.
48
48
  - Only invent a plausible answer when neither the persona nor task supplies it.
49
- - For approve/deny prompts, output JSON: {"approved": true|false, "reason": "..."}.
50
- - When the agent completed a conversation turn, decide whether the task needs
51
- another user reply. Output {"action":"stop"} if the task is complete, blocked
52
- on real user-side work outside the chat, or the persona would naturally end
53
- the conversation. Never pretend external work happened. Otherwise output
54
- {"action":"reply","text":"<the persona's brief reply>"}.
55
- - For free-text questions, output the answer text directly. No JSON, no
56
- markdown, no quotation marks.`;
49
+ - Follow the response format requested after the agent's fenced output. Do not
50
+ combine formats or append a conversation decision.`;
57
51
  };
52
+ const responseInstruction = (interrupt) => {
53
+ if (interrupt.kind === "ask") {
54
+ return "Answer the free-text question directly. Output only the answer, without a follow-up question or appended conversation decision.";
55
+ }
56
+ if (interrupt.kind === "approve") {
57
+ return 'Decide whether the persona approves this exact request. Output only JSON: {"approved":true|false,"reason":"..."}.';
58
+ }
59
+ if (isConversationTurnInterrupt(interrupt)) {
60
+ return 'Decide whether the task needs another user reply. Output only {"action":"stop"} if it is complete, blocked on real user-side work outside the chat, or the persona would naturally end the conversation. Never pretend external work happened. Otherwise output only {"action":"reply","text":"<the persona\'s brief reply>"}.';
61
+ }
62
+ return "Follow the response format requested by the custom prompt. Do not append a conversation decision.";
63
+ };
64
+ const buildAnswerPrompt = (ctx, interrupt, sentinel) => `${historyAsText(ctx, sentinel)}${interruptDisplay(interrupt, sentinel, false)}\n\nResponse format:\n${responseInstruction(interrupt)}`;
58
65
  // Agent-authored text is fenced so an interrupt that smuggles instructions
59
66
  // reads as quoted data, not as part of this prompt (see the system rules).
60
67
  // The sentinel is random per answer so agent text that embeds a literal
@@ -69,6 +76,10 @@ const AskContextQuestionSchema = z.looseObject({
69
76
  multiSelect: z.boolean().optional().catch(undefined),
70
77
  });
71
78
  const AskContextSchema = z.looseObject({ questions: z.array(z.unknown()) });
79
+ const PersonaApprovalResponseSchema = z.strictObject({
80
+ approved: z.boolean(),
81
+ reason: z.string().optional(),
82
+ });
72
83
  /**
73
84
  * The claude-code driver forwards the raw AskUserQuestion questions through
74
85
  * interrupt.context precisely so answerers can see the options; render them
@@ -104,7 +115,7 @@ const MAX_RENDERED_CHARS = 2_000;
104
115
  const clampRendered = (rendered) => rendered.length > MAX_RENDERED_CHARS
105
116
  ? `${rendered.slice(0, MAX_RENDERED_CHARS)}… [truncated]`
106
117
  : rendered;
107
- const interruptDisplay = (interrupt, sentinel) => {
118
+ const interruptDisplay = (interrupt, sentinel, includeDirective = true) => {
108
119
  if (interrupt.kind === "ask") {
109
120
  return `The agent asks:\n${fenceAgentText(clampRendered(`${interrupt.question}${renderAskOptions(interrupt.context)}`), sentinel)}`;
110
121
  }
@@ -112,7 +123,10 @@ const interruptDisplay = (interrupt, sentinel) => {
112
123
  return `The agent requests approval for:\n${fenceAgentText(clampRendered(interrupt.request), sentinel)}`;
113
124
  }
114
125
  if (isConversationTurnInterrupt(interrupt)) {
115
- return `The agent completed its current turn with this message:\n${fenceAgentText(clampRendered(interrupt.payload.message), sentinel)}\n\nDecide whether to stop or send one more user reply.`;
126
+ const display = `The agent completed its current turn with this message:\n${fenceAgentText(clampRendered(interrupt.payload.message), sentinel)}`;
127
+ return includeDirective
128
+ ? `${display}\n\nDecide whether to stop or send one more user reply.`
129
+ : display;
116
130
  }
117
131
  return `The agent sent a custom prompt:\n${fenceAgentText(clampRendered(JSON.stringify(interrupt.payload, null, 2)), sentinel)}`;
118
132
  };
@@ -131,7 +145,7 @@ const historyAsText = (ctx, sentinel) => {
131
145
  // Prior answers are fenced like agent text: the persona wrote them, but
132
146
  // in reply to agent-authored prompts, so they can carry smuggled text.
133
147
  for (const entry of recent) {
134
- lines.push(interruptDisplay(entry.interrupt, sentinel));
148
+ lines.push(interruptDisplay(entry.interrupt, sentinel, false));
135
149
  if (entry.answer.kind === "ask") {
136
150
  lines.push(`You answered: ${fenceAgentText(clampRendered(entry.answer.text), sentinel)}`);
137
151
  }
@@ -146,19 +160,9 @@ const historyAsText = (ctx, sentinel) => {
146
160
  };
147
161
  const parseApprovalResponse = (text) => {
148
162
  const trimmed = text.trim();
149
- const parsed = ApproveReplySchema.safeParse(tryParseJson(trimmed));
163
+ const parsed = PersonaApprovalResponseSchema.safeParse(tryParseJson(trimmed));
150
164
  if (parsed.success)
151
165
  return parsed.data;
152
- // Text fallback fails closed: an unclear reply ("I can't answer that")
153
- // must not authorize the action it was asked about, and a refusal that
154
- // quotes an approval word must not either — deny wins over approve.
155
- const low = trimmed.toLowerCase();
156
- if (/\b(no|not|deny|denied|reject|rejected|refuse|can't|cannot|don't)\b/.test(low)) {
157
- return { approved: false, reason: trimmed };
158
- }
159
- if (/\b(yes|yep|yeah|approve|approved|ok|okay|sure|go ahead|proceed|lgtm)\b/.test(low)) {
160
- return { approved: true, reason: trimmed };
161
- }
162
166
  return { approved: false, reason: trimmed };
163
167
  };
164
168
  const cleanAskResponse = (text) => {
@@ -201,7 +205,7 @@ class PersonaAnswererImpl {
201
205
  // The per-interrupt ctx supersedes the prepared one (its history is
202
206
  // current); preparedCtx survives only as the prepare() guard above.
203
207
  const system = buildSystemPrompt(ctx, sentinel, this.config.systemPromptOverride);
204
- const prompt = `${historyAsText(ctx, sentinel)}${interruptDisplay(interrupt, sentinel)}`;
208
+ const prompt = buildAnswerPrompt(ctx, interrupt, sentinel);
205
209
  const attemptId = await ctx.recordModelAttemptStart?.("answerer");
206
210
  let response;
207
211
  try {
@@ -276,5 +280,5 @@ export const personaAnswerer = {
276
280
  create: (config) => new PersonaAnswererImpl(config),
277
281
  };
278
282
  // Internal exports for testing
279
- export { buildSystemPrompt, cleanAskResponse, historyAsText, interruptDisplay, newFenceSentinel, parseApprovalResponse, };
283
+ export { buildAnswerPrompt, buildSystemPrompt, cleanAskResponse, historyAsText, interruptDisplay, newFenceSentinel, parseApprovalResponse, responseInstruction, };
280
284
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/answerers/persona/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/answerers/persona/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prismatic-io/lux",
3
- "version": "0.0.2-preview.11",
3
+ "version": "0.0.2-preview.13",
4
4
  "description": "Coding-agent evaluation and improvement with deterministic assertions, optional LLM judges, and first-class human-in-the-loop runs.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/prismatic-io/lux",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: lux-answerer
3
- version: 0.0.2-preview.11
3
+ version: 0.0.2-preview.13
4
4
  description: Play the persona for a running Lux orchestrator that uses the claude-code answerer. Read structured events on stdout, decide answers from persona + context, write JSON to its answer channel.
5
5
  user-invocable: false
6
6
  allowed-tools: Bash, Read
@@ -17,7 +17,7 @@ import {
17
17
  type TokenUsage,
18
18
  tryParseJson,
19
19
  } from "../../core/index.js";
20
- import { ApproveReplySchema, approveAnswer } from "../shared.js";
20
+ import { approveAnswer } from "../shared.js";
21
21
 
22
22
  /**
23
23
  * Persona answerer: plays the user through a configured local Claude Code or
@@ -66,16 +66,30 @@ Rules:
66
66
  - Include every persona constraint about each resource or operation the agent
67
67
  mentions, including constraints its question omitted.
68
68
  - Only invent a plausible answer when neither the persona nor task supplies it.
69
- - For approve/deny prompts, output JSON: {"approved": true|false, "reason": "..."}.
70
- - When the agent completed a conversation turn, decide whether the task needs
71
- another user reply. Output {"action":"stop"} if the task is complete, blocked
72
- on real user-side work outside the chat, or the persona would naturally end
73
- the conversation. Never pretend external work happened. Otherwise output
74
- {"action":"reply","text":"<the persona's brief reply>"}.
75
- - For free-text questions, output the answer text directly. No JSON, no
76
- markdown, no quotation marks.`;
69
+ - Follow the response format requested after the agent's fenced output. Do not
70
+ combine formats or append a conversation decision.`;
77
71
  };
78
72
 
73
+ const responseInstruction = (interrupt: Interrupt): string => {
74
+ if (interrupt.kind === "ask") {
75
+ return "Answer the free-text question directly. Output only the answer, without a follow-up question or appended conversation decision.";
76
+ }
77
+ if (interrupt.kind === "approve") {
78
+ return 'Decide whether the persona approves this exact request. Output only JSON: {"approved":true|false,"reason":"..."}.';
79
+ }
80
+ if (isConversationTurnInterrupt(interrupt)) {
81
+ return 'Decide whether the task needs another user reply. Output only {"action":"stop"} if it is complete, blocked on real user-side work outside the chat, or the persona would naturally end the conversation. Never pretend external work happened. Otherwise output only {"action":"reply","text":"<the persona\'s brief reply>"}.';
82
+ }
83
+ return "Follow the response format requested by the custom prompt. Do not append a conversation decision.";
84
+ };
85
+
86
+ const buildAnswerPrompt = (ctx: AnswererContext, interrupt: Interrupt, sentinel: string): string =>
87
+ `${historyAsText(ctx, sentinel)}${interruptDisplay(
88
+ interrupt,
89
+ sentinel,
90
+ false,
91
+ )}\n\nResponse format:\n${responseInstruction(interrupt)}`;
92
+
79
93
  // Agent-authored text is fenced so an interrupt that smuggles instructions
80
94
  // reads as quoted data, not as part of this prompt (see the system rules).
81
95
  // The sentinel is random per answer so agent text that embeds a literal
@@ -93,6 +107,10 @@ const AskContextQuestionSchema = z.looseObject({
93
107
  multiSelect: z.boolean().optional().catch(undefined),
94
108
  });
95
109
  const AskContextSchema = z.looseObject({ questions: z.array(z.unknown()) });
110
+ const PersonaApprovalResponseSchema = z.strictObject({
111
+ approved: z.boolean(),
112
+ reason: z.string().optional(),
113
+ });
96
114
 
97
115
  /**
98
116
  * The claude-code driver forwards the raw AskUserQuestion questions through
@@ -133,7 +151,11 @@ const clampRendered = (rendered: string): string =>
133
151
  ? `${rendered.slice(0, MAX_RENDERED_CHARS)}… [truncated]`
134
152
  : rendered;
135
153
 
136
- const interruptDisplay = (interrupt: Interrupt, sentinel: string): string => {
154
+ const interruptDisplay = (
155
+ interrupt: Interrupt,
156
+ sentinel: string,
157
+ includeDirective = true,
158
+ ): string => {
137
159
  if (interrupt.kind === "ask") {
138
160
  return `The agent asks:\n${fenceAgentText(
139
161
  clampRendered(`${interrupt.question}${renderAskOptions(interrupt.context)}`),
@@ -147,10 +169,13 @@ const interruptDisplay = (interrupt: Interrupt, sentinel: string): string => {
147
169
  )}`;
148
170
  }
149
171
  if (isConversationTurnInterrupt(interrupt)) {
150
- return `The agent completed its current turn with this message:\n${fenceAgentText(
172
+ const display = `The agent completed its current turn with this message:\n${fenceAgentText(
151
173
  clampRendered(interrupt.payload.message),
152
174
  sentinel,
153
- )}\n\nDecide whether to stop or send one more user reply.`;
175
+ )}`;
176
+ return includeDirective
177
+ ? `${display}\n\nDecide whether to stop or send one more user reply.`
178
+ : display;
154
179
  }
155
180
  return `The agent sent a custom prompt:\n${fenceAgentText(
156
181
  clampRendered(JSON.stringify(interrupt.payload, null, 2)),
@@ -171,7 +196,7 @@ const historyAsText = (ctx: AnswererContext, sentinel: string): string => {
171
196
  // Prior answers are fenced like agent text: the persona wrote them, but
172
197
  // in reply to agent-authored prompts, so they can carry smuggled text.
173
198
  for (const entry of recent) {
174
- lines.push(interruptDisplay(entry.interrupt, sentinel));
199
+ lines.push(interruptDisplay(entry.interrupt, sentinel, false));
175
200
  if (entry.answer.kind === "ask") {
176
201
  lines.push(`You answered: ${fenceAgentText(clampRendered(entry.answer.text), sentinel)}`);
177
202
  } else if (entry.answer.kind === "approve") {
@@ -199,18 +224,8 @@ const parseApprovalResponse = (
199
224
  text: string,
200
225
  ): { approved: boolean; reason?: string | undefined } => {
201
226
  const trimmed = text.trim();
202
- const parsed = ApproveReplySchema.safeParse(tryParseJson(trimmed));
227
+ const parsed = PersonaApprovalResponseSchema.safeParse(tryParseJson(trimmed));
203
228
  if (parsed.success) return parsed.data;
204
- // Text fallback fails closed: an unclear reply ("I can't answer that")
205
- // must not authorize the action it was asked about, and a refusal that
206
- // quotes an approval word must not either — deny wins over approve.
207
- const low = trimmed.toLowerCase();
208
- if (/\b(no|not|deny|denied|reject|rejected|refuse|can't|cannot|don't)\b/.test(low)) {
209
- return { approved: false, reason: trimmed };
210
- }
211
- if (/\b(yes|yep|yeah|approve|approved|ok|okay|sure|go ahead|proceed|lgtm)\b/.test(low)) {
212
- return { approved: true, reason: trimmed };
213
- }
214
229
  return { approved: false, reason: trimmed };
215
230
  };
216
231
 
@@ -259,7 +274,7 @@ class PersonaAnswererImpl implements Answerer {
259
274
  // The per-interrupt ctx supersedes the prepared one (its history is
260
275
  // current); preparedCtx survives only as the prepare() guard above.
261
276
  const system = buildSystemPrompt(ctx, sentinel, this.config.systemPromptOverride);
262
- const prompt = `${historyAsText(ctx, sentinel)}${interruptDisplay(interrupt, sentinel)}`;
277
+ const prompt = buildAnswerPrompt(ctx, interrupt, sentinel);
263
278
  const attemptId = await ctx.recordModelAttemptStart?.("answerer");
264
279
  let response: Awaited<ReturnType<typeof runTextModel>>;
265
280
  try {
@@ -335,10 +350,12 @@ export const personaAnswerer: AnswererPlugin<PersonaAnswererConfig> = {
335
350
 
336
351
  // Internal exports for testing
337
352
  export {
353
+ buildAnswerPrompt,
338
354
  buildSystemPrompt,
339
355
  cleanAskResponse,
340
356
  historyAsText,
341
357
  interruptDisplay,
342
358
  newFenceSentinel,
343
359
  parseApprovalResponse,
360
+ responseInstruction,
344
361
  };