linersh 1.1.3 → 1.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.
Files changed (62) hide show
  1. package/README.md +12 -58
  2. package/bin/liner.js +15 -7
  3. package/package.json +10 -17
  4. package/cli-update-docs/README.md +0 -129
  5. package/cli-update-docs/SKILL.md +0 -294
  6. package/cli-update-docs/curator-notes.md +0 -85
  7. package/cli-update-docs/quality-check-tests.md +0 -435
  8. package/cli-update-docs/source-finding-tactics.md +0 -224
  9. package/cli-update-docs/source-quality-hierarchy.md +0 -209
  10. package/cli-update-docs/synthesis-guidance.md +0 -151
  11. package/dist/agents/artifact-validation.js +0 -567
  12. package/dist/agents/artifact-validation.js.map +0 -1
  13. package/dist/agents/candidate-longlist.js +0 -116
  14. package/dist/agents/candidate-longlist.js.map +0 -1
  15. package/dist/agents/detect.js +0 -169
  16. package/dist/agents/detect.js.map +0 -1
  17. package/dist/agents/evaluation-assembly.js +0 -270
  18. package/dist/agents/evaluation-assembly.js.map +0 -1
  19. package/dist/agents/events.js +0 -8
  20. package/dist/agents/events.js.map +0 -1
  21. package/dist/agents/headless-runner.js +0 -432
  22. package/dist/agents/headless-runner.js.map +0 -1
  23. package/dist/agents/jtbd-clarify.js +0 -169
  24. package/dist/agents/jtbd-clarify.js.map +0 -1
  25. package/dist/agents/models.js +0 -98
  26. package/dist/agents/models.js.map +0 -1
  27. package/dist/agents/parsers.js +0 -316
  28. package/dist/agents/parsers.js.map +0 -1
  29. package/dist/agents/prompts.js +0 -522
  30. package/dist/agents/prompts.js.map +0 -1
  31. package/dist/agents/run-log.js +0 -71
  32. package/dist/agents/run-log.js.map +0 -1
  33. package/dist/agents/runner.js +0 -906
  34. package/dist/agents/runner.js.map +0 -1
  35. package/dist/agents/types.js +0 -2
  36. package/dist/agents/types.js.map +0 -1
  37. package/dist/bin-resolver.js +0 -92
  38. package/dist/bin-resolver.js.map +0 -1
  39. package/dist/config.js +0 -282
  40. package/dist/config.js.map +0 -1
  41. package/dist/editor.js +0 -40
  42. package/dist/editor.js.map +0 -1
  43. package/dist/gates.js +0 -121
  44. package/dist/gates.js.map +0 -1
  45. package/dist/ipc.js +0 -145
  46. package/dist/ipc.js.map +0 -1
  47. package/dist/open-folder.js +0 -28
  48. package/dist/open-folder.js.map +0 -1
  49. package/dist/phases.js +0 -346
  50. package/dist/phases.js.map +0 -1
  51. package/dist/progress.js +0 -184
  52. package/dist/progress.js.map +0 -1
  53. package/dist/source-inbox.js +0 -297
  54. package/dist/source-inbox.js.map +0 -1
  55. package/dist/types.js +0 -3
  56. package/dist/types.js.map +0 -1
  57. package/dist/version.js +0 -18
  58. package/dist/version.js.map +0 -1
  59. package/dist/yaml-io.js +0 -376
  60. package/dist/yaml-io.js.map +0 -1
  61. package/maintenance-skill/SKILL.md +0 -18
  62. package/maintenance-skill/agents/openai.yaml +0 -4
@@ -1,432 +0,0 @@
1
- import { fileURLToPath } from "node:url";
2
- import { spawnSync } from "node:child_process";
3
- import { accessSync, constants, statSync } from "node:fs";
4
- import { homedir } from "node:os";
5
- import { basename, dirname, resolve } from "node:path";
6
- import { detectAgents, resolveSkillPathWithDiagnostics } from "./detect.js";
7
- import { runPhaseWithAgent } from "./runner.js";
8
- import { readConfig, resolveConfiguredAgent } from "../config.js";
9
- import { projectFolder, readTape } from "../yaml-io.js";
10
- const AGENT_PHASES = new Set([
11
- "framing",
12
- "candidates",
13
- "evaluation",
14
- "quality",
15
- "synthesis",
16
- "assembly",
17
- "improvement",
18
- ]);
19
- let stdoutBroken = false;
20
- process.stdout.on("error", (error) => {
21
- if (isBrokenPipeError(error)) {
22
- stdoutBroken = true;
23
- return;
24
- }
25
- throw error;
26
- });
27
- export function parseHeadlessArgs(argv) {
28
- const values = new Map();
29
- let resume = false;
30
- for (let i = 0; i < argv.length; i++) {
31
- const arg = argv[i] ?? "";
32
- if (arg === "--help" || arg === "-h") {
33
- return { ok: false, code: 0, message: usage() };
34
- }
35
- if (arg === "--resume") {
36
- resume = true;
37
- continue;
38
- }
39
- const [name, inlineValue] = splitArg(arg);
40
- if (!name) {
41
- return { ok: false, code: 2, message: `Unknown argument: ${arg}` };
42
- }
43
- const value = inlineValue ?? argv[++i];
44
- if (value == null || value.startsWith("--")) {
45
- return { ok: false, code: 2, message: `Missing value for --${name}` };
46
- }
47
- values.set(name, value);
48
- }
49
- const project = values.get("project")?.trim();
50
- if (!project) {
51
- return { ok: false, code: 2, message: "Missing required --project" };
52
- }
53
- const rawPhase = values.get("phase")?.trim();
54
- if (!rawPhase || !AGENT_PHASES.has(rawPhase)) {
55
- return {
56
- ok: false,
57
- code: 2,
58
- message: `--phase must be one of: ${Array.from(AGENT_PHASES).join(", ")}`,
59
- };
60
- }
61
- const rawAgent = values.get("agent")?.trim() ?? "auto";
62
- if (rawAgent !== "auto" && rawAgent !== "claude" && rawAgent !== "codex") {
63
- return { ok: false, code: 2, message: "--agent must be auto, claude, or codex" };
64
- }
65
- if (rawPhase === "improvement" && resume) {
66
- return {
67
- ok: false,
68
- code: 2,
69
- message: "Improve Corpus retries must start a fresh isolated agent session; --resume is not supported",
70
- };
71
- }
72
- const skillPath = values.get("skill-path")?.trim();
73
- return {
74
- ok: true,
75
- args: {
76
- project,
77
- phaseId: rawPhase,
78
- agent: rawAgent,
79
- skillPath: skillPath || undefined,
80
- resume,
81
- },
82
- };
83
- }
84
- export function selectHeadlessAgent(choice, installed, config = readConfig()) {
85
- if (choice !== "auto") {
86
- const envBin = process.env[choice === "claude" ? "LINER_CLAUDE_BIN" : "LINER_CODEX_BIN"]?.trim();
87
- if (!envBin && config.runner?.agent === choice) {
88
- const envHome = process.env[choice === "claude" ? "LINER_CLAUDE_HOME" : "LINER_CODEX_HOME"]?.trim() ||
89
- process.env[choice === "claude" ? "CLAUDE_CONFIG_DIR" : "CODEX_HOME"]?.trim();
90
- return {
91
- ok: true,
92
- agent: {
93
- id: choice,
94
- name: choice === "claude" ? "Claude" : "OpenAI",
95
- bin: config.runner.executable,
96
- configHome: envHome || config.runner.configHome,
97
- },
98
- };
99
- }
100
- const agent = installed.find((candidate) => candidate.id === choice);
101
- if (agent)
102
- return { ok: true, agent };
103
- return {
104
- ok: false,
105
- code: 2,
106
- message: `${choice} agent was requested, but it was not found on PATH.`,
107
- };
108
- }
109
- const envChoice = process.env["LINER_AGENT"]?.trim().toLowerCase();
110
- const configured = resolveConfiguredAgent(installed, config);
111
- if (configured)
112
- return { ok: true, agent: configured };
113
- if (envChoice === "claude" || envChoice === "codex") {
114
- return {
115
- ok: false,
116
- code: 2,
117
- message: `${envChoice} is selected by LINER_AGENT, but its executable is unavailable. Set ${envChoice === "claude" ? "LINER_CLAUDE_BIN" : "LINER_CODEX_BIN"} or update LINER_AGENT.`,
118
- };
119
- }
120
- if (installed.length === 0) {
121
- return {
122
- ok: false,
123
- code: 2,
124
- message: "No supported agent found on PATH. Install the Claude Code or Codex CLI.",
125
- };
126
- }
127
- return {
128
- ok: false,
129
- code: 2,
130
- message: `Multiple agents found (${installed.map((a) => a.id).join(", ")}). ` +
131
- `Pass --agent or set LINER_AGENT.`,
132
- };
133
- }
134
- export function preflightAgent(agent) {
135
- const providerLabel = agent.id === "claude" ? "Claude" : "OpenAI";
136
- const cliLabel = agent.id === "claude" ? "Claude Code" : "Codex CLI";
137
- const homeEnv = agent.id === "claude" ? "LINER_CLAUDE_HOME" : "LINER_CODEX_HOME";
138
- const configHome = agent.configHome;
139
- if (!configHome || !directoryReadable(configHome)) {
140
- return {
141
- ok: false,
142
- message: `${providerLabel} config home is not accessible: ${configHome || "(not configured)"}. Update Settings or ${homeEnv}.`,
143
- };
144
- }
145
- const env = agentEnvironment(agent);
146
- const version = spawnSync(agent.bin, ["--version"], { encoding: "utf8", env, timeout: 10_000 });
147
- const identity = `${version.stdout || ""}\n${version.stderr || ""}`.toLowerCase();
148
- if (version.status !== 0 || !identity.includes(agent.id === "claude" ? "claude" : "codex")) {
149
- return {
150
- ok: false,
151
- message: `${cliLabel} executable identity check failed: ${agent.bin}. Update Settings or ${agent.id === "claude" ? "LINER_CLAUDE_BIN" : "LINER_CODEX_BIN"}.`,
152
- };
153
- }
154
- const capability = spawnSync(agent.bin, ["--help"], { encoding: "utf8", env, timeout: 10_000 });
155
- const help = `${capability.stdout || ""}\n${capability.stderr || ""}`.toLowerCase();
156
- const supportsHeadless = agent.id === "codex" ? /\bexec\b/.test(help) : /(?:^|\s)(?:-p|--print)(?:\s|,|$)/m.test(help);
157
- if (capability.status !== 0 || !supportsHeadless) {
158
- return {
159
- ok: false,
160
- message: `${cliLabel} is not a supported headless runner: ${agent.bin}. Upgrade the CLI and retry.`,
161
- };
162
- }
163
- const authArgs = agent.id === "claude" ? ["auth", "status"] : ["login", "status"];
164
- const auth = spawnSync(agent.bin, authArgs, { encoding: "utf8", env, timeout: 10_000 });
165
- if (auth.status !== 0) {
166
- return {
167
- ok: false,
168
- message: `${providerLabel} authentication is not ready. Run: ${agent.bin} ${agent.id === "claude" ? "auth login" : "login"}`,
169
- };
170
- }
171
- return { ok: true };
172
- }
173
- function directoryReadable(path) {
174
- try {
175
- if (!statSync(path).isDirectory())
176
- return false;
177
- accessSync(path, constants.R_OK);
178
- return true;
179
- }
180
- catch {
181
- return false;
182
- }
183
- }
184
- function agentEnvironment(agent) {
185
- if (!agent.configHome)
186
- return process.env;
187
- return {
188
- ...process.env,
189
- [agent.id === "claude" ? "CLAUDE_CONFIG_DIR" : "CODEX_HOME"]: agent.configHome,
190
- };
191
- }
192
- export async function main(argv = process.argv.slice(2)) {
193
- const parsed = parseHeadlessArgs(argv);
194
- if (!parsed.ok) {
195
- if (parsed.code === 0) {
196
- process.stdout.write(parsed.message + "\n");
197
- }
198
- else {
199
- emitRunnerFailure("preflight", parsed.message);
200
- }
201
- return parsed.code;
202
- }
203
- try {
204
- const args = parsed.args;
205
- const skillPath = resolveHeadlessSkillPath(args.skillPath);
206
- if (!skillPath) {
207
- emitRunnerFailure("preflight", "Could not find the curating-mixtapes skill bundle. Pass --skill-path.");
208
- return 2;
209
- }
210
- const selection = selectHeadlessAgent(args.agent, detectAgents());
211
- if (!selection.ok) {
212
- emitRunnerFailure("preflight", selection.message);
213
- return selection.code;
214
- }
215
- const preflight = preflightAgent(selection.agent);
216
- if (!preflight.ok) {
217
- emitRunnerFailure("preflight", preflight.message);
218
- return 2;
219
- }
220
- const folder = projectFolder(args.project);
221
- const { tape } = readTape(folder.tapePath);
222
- const handle = runPhaseWithAgent({
223
- agent: selection.agent,
224
- phaseId: args.phaseId,
225
- project: folder.path,
226
- skillPath,
227
- tape,
228
- resume: args.resume,
229
- onEvent: emit,
230
- });
231
- emit({
232
- kind: "runner_start",
233
- phaseId: args.phaseId,
234
- project: folder.path,
235
- agent: selection.agent.id,
236
- skillPath,
237
- resume: args.resume,
238
- });
239
- let cancelled = false;
240
- const cancel = () => {
241
- cancelled = true;
242
- handle.cancel();
243
- };
244
- process.once("SIGINT", cancel);
245
- process.once("SIGTERM", cancel);
246
- const result = await handle.done;
247
- process.off("SIGINT", cancel);
248
- process.off("SIGTERM", cancel);
249
- const failure = classifyRunnerFailure(result.stderr, result.code !== 0);
250
- for (const diagnostic of failure.diagnostics) {
251
- emit({
252
- kind: "runner_diagnostic",
253
- category: runnerDiagnosticCategory(diagnostic),
254
- message: diagnostic,
255
- });
256
- }
257
- if (cancelled) {
258
- emit({
259
- kind: "runner_cancelled",
260
- message: "AI run cancelled.",
261
- recovery: "Retry this phase when ready, or return to the project.",
262
- });
263
- }
264
- else if (result.code !== 0 && failure.message) {
265
- emit({
266
- kind: "runner_failure",
267
- failureKind: "runtime",
268
- message: failure.message,
269
- recovery: failure.recovery,
270
- });
271
- }
272
- emit({
273
- kind: "runner_done",
274
- outcome: cancelled ? "cancelled" : result.code === 0 ? "success" : "failed",
275
- code: result.code,
276
- logPath: result.logPath,
277
- });
278
- return result.code ?? 1;
279
- }
280
- catch (error) {
281
- emitRunnerFailure("runtime", error instanceof Error ? error.message : String(error));
282
- return 1;
283
- }
284
- }
285
- function emitRunnerFailure(failureKind, message) {
286
- emit({
287
- kind: "runner_failure",
288
- failureKind,
289
- message,
290
- recovery: runnerRecovery(message),
291
- });
292
- }
293
- export function classifyRunnerFailure(stderr, failed = true) {
294
- const lines = stderr
295
- .split(/\r?\n/)
296
- .map((line) => line.trim())
297
- .filter(Boolean);
298
- if (!failed) {
299
- return {
300
- message: "",
301
- recovery: "",
302
- diagnostics: lines.filter(isRunnerDiagnostic),
303
- };
304
- }
305
- const candidates = lines.filter((line) => !isNonfatalRunnerDiagnostic(line) && runnerFailureScore(line) > 0);
306
- const primary = candidates.reduce((best, line) => runnerFailureScore(line) > runnerFailureScore(best) ? line : best, "");
307
- const diagnostics = lines.filter((line) => isRunnerDiagnostic(line) && line !== primary);
308
- const message = primary.replace(/^(?:fatal|error)(?:\s*:\s*|\s+)/i, "").trim();
309
- return {
310
- message,
311
- recovery: message ? runnerRecovery(message) : "",
312
- diagnostics,
313
- };
314
- }
315
- function isRunnerDiagnostic(line) {
316
- const value = line.toLowerCase();
317
- return (/(?:^|\s)warn(?:ing)?(?:\s|:)/i.test(line) ||
318
- value.includes("failed to load skill") ||
319
- value.includes("codex_core_skills::loader") ||
320
- value.includes("rmcp::") ||
321
- value.includes("mcp connector") ||
322
- value.includes("optional connector") ||
323
- value.includes("integration:"));
324
- }
325
- function isNonfatalRunnerDiagnostic(line) {
326
- const value = line.toLowerCase();
327
- return /(?:^|\s)warn(?:ing)?(?:\s|:)/i.test(line) || value.includes("optional connector");
328
- }
329
- function runnerFailureScore(line) {
330
- const value = line.toLowerCase();
331
- if (!value)
332
- return -1;
333
- if (/\b(?:auth(?:entication)?|login|token expired|logged in)\b/.test(value))
334
- return 100;
335
- if (/\b(?:version|unsupported|upgrade)\b/.test(value))
336
- return 90;
337
- if (value.includes("required") && isRunnerDiagnostic(line))
338
- return 85;
339
- if (/\b(?:config home|executable|not found|missing|denied|invalid|timed? out)\b/.test(value))
340
- return 80;
341
- if (/\bfatal\b/.test(value))
342
- return 70;
343
- if (/\b(?:error|failed|failure)\b/.test(value))
344
- return 40;
345
- return 0;
346
- }
347
- function runnerDiagnosticCategory(line) {
348
- const value = line.toLowerCase();
349
- if (value.includes("skill"))
350
- return "skill";
351
- if (value.includes("mcp") || value.includes("connector"))
352
- return "mcp";
353
- if (value.includes("integration"))
354
- return "integration";
355
- return "warning";
356
- }
357
- function runnerRecovery(message) {
358
- const value = message.toLowerCase();
359
- if (value.includes("version") || value.includes("unsupported") || value.includes("upgrade")) {
360
- return "Upgrade the configured AI runner, then retry this phase.";
361
- }
362
- if (value.includes("auth") || value.includes("login") || value.includes("logged in")) {
363
- return "Authenticate the configured AI runner, then retry this phase.";
364
- }
365
- if (value.includes("config home") || value.includes("settings") || value.includes("executable")) {
366
- return "Update the AI runner profile in Settings, then retry this phase.";
367
- }
368
- if (value.includes("required") && (value.includes("mcp") || value.includes("connector") || value.includes("integration"))) {
369
- return "Repair the required AI runner integration, then retry this phase.";
370
- }
371
- return "Retry this phase. If it fails again, inspect the full runner log.";
372
- }
373
- export function resolveHeadlessSkillPath(explicit) {
374
- if (!explicit)
375
- return resolveSkillPathWithDiagnostics().path;
376
- const expanded = explicit === "~"
377
- ? homedir()
378
- : explicit.startsWith("~/")
379
- ? resolve(homedir(), explicit.slice(2))
380
- : explicit;
381
- const directory = basename(expanded) === "SKILL.md" ? dirname(expanded) : expanded;
382
- return resolve(directory);
383
- }
384
- function splitArg(arg) {
385
- if (!arg.startsWith("--"))
386
- return [null, undefined];
387
- const body = arg.slice(2);
388
- const eq = body.indexOf("=");
389
- if (eq === -1)
390
- return [body, undefined];
391
- return [body.slice(0, eq), body.slice(eq + 1)];
392
- }
393
- function emit(event) {
394
- if (stdoutBroken)
395
- return;
396
- if (!writeHeadlessEvent(event))
397
- stdoutBroken = true;
398
- }
399
- export function writeHeadlessEvent(event, write = (line) => process.stdout.write(line)) {
400
- try {
401
- write(JSON.stringify(event) + "\n");
402
- return true;
403
- }
404
- catch (error) {
405
- if (isBrokenPipeError(error))
406
- return false;
407
- throw error;
408
- }
409
- }
410
- export function isBrokenPipeError(error) {
411
- return Boolean(error &&
412
- typeof error === "object" &&
413
- "code" in error &&
414
- error.code === "EPIPE");
415
- }
416
- function usage() {
417
- return [
418
- "Usage: node dist/agents/headless-runner.js --project <path> --phase <phase> [options]",
419
- "",
420
- "Options:",
421
- " --agent auto|claude|codex Agent to run. Defaults to auto.",
422
- " --skill-path <path> Directory containing SKILL.md.",
423
- " --resume Continue the last agent session for this project.",
424
- " -h, --help Show this help.",
425
- ].join("\n");
426
- }
427
- if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
428
- void main().then((code) => {
429
- process.exitCode = code;
430
- });
431
- }
432
- //# sourceMappingURL=headless-runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"headless-runner.js","sourceRoot":"","sources":["../../src/agents/headless-runner.ts"],"names":[],"mappings":"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"}
@@ -1,169 +0,0 @@
1
- // Capability elicitation — generate 3-4 clarifying questions targeted at what
2
- // the user wants this Liner to help a future AI agent do.
3
- //
4
- // Runs as a side task at wizard time, not as a methodology phase. The agent
5
- // answers in JSON; we accumulate streamed text and parse once the run
6
- // completes. If the agent fails, the caller should surface the failure and let
7
- // the user retry; Liner should not hide the problem behind canned questions.
8
- import { runAgentTask } from "./runner.js";
9
- import { resolveRunProfile } from "./models.js";
10
- import { readConfig } from "../config.js";
11
- /**
12
- * Generate clarifying questions for a raw capability goal. Returns the agent's
13
- * questions on success. Throws after retry when no agent is available, the
14
- * agent crashes or times out, or the answer cannot be parsed.
15
- */
16
- export async function elicitClarifyingQuestions(args) {
17
- if (!args.agent || !args.skillPath) {
18
- throw new Error("Clarifying questions require an available Claude or OpenAI provider and skill bundle");
19
- }
20
- const prompt = buildClarifyingQuestionsPrompt(args.jtbd);
21
- const failures = [];
22
- for (let attempt = 1; attempt <= 2; attempt++) {
23
- try {
24
- return await runClarifyAttempt(args, prompt);
25
- }
26
- catch (error) {
27
- if (error instanceof ExplicitConfiguredOptionRejectionError)
28
- throw error;
29
- failures.push(error instanceof Error ? error.message : String(error));
30
- }
31
- }
32
- throw new Error(`Could not generate clarification questions after retry: ${failures.join("; retry: ")}`);
33
- }
34
- async function runClarifyAttempt(args, prompt) {
35
- // Accumulate every text + tool-result event into one buffer; the response
36
- // will be in there somewhere. The agent's `summary.finalText` lands at the
37
- // end and is usually the cleanest source of the JSON.
38
- let finalText = "";
39
- const textChunks = [];
40
- const config = readConfig();
41
- const preference = config.providerPreferences?.[args.agent.id];
42
- const profile = resolveRunProfile(args.agent.id, "jtbd-clarify", config.models?.[args.agent.id], preference);
43
- const handle = runAgentTask({
44
- agent: args.agent,
45
- project: args.cwd,
46
- skillPath: args.skillPath,
47
- prompt,
48
- model: profile.model,
49
- reasoningEffort: profile.reasoningEffort,
50
- modelFallbackSource: profile.modelSource === "auto" || profile.modelSource === "builtin" ? profile.modelSource : undefined,
51
- allowEffortFallback: profile.effortSource === "auto",
52
- taskLabel: "jtbd-clarify",
53
- onEvent: (event) => {
54
- if (event.kind === "text") {
55
- textChunks.push(event.text);
56
- }
57
- else if (event.kind === "summary" && event.finalText) {
58
- finalText = event.finalText;
59
- }
60
- },
61
- });
62
- const timeoutMs = args.timeoutMs ?? 60_000;
63
- let timedOut = false;
64
- const timeout = setTimeout(() => {
65
- timedOut = true;
66
- handle.cancel();
67
- }, timeoutMs);
68
- try {
69
- const { code, stderr } = await handle.done;
70
- if (timedOut) {
71
- throw new Error(`${args.agent.name} did not return clarification questions before timeout`);
72
- }
73
- if (code !== 0) {
74
- const rejection = explicitConfiguredOptionRejectionMessage(stderr);
75
- if (rejection)
76
- throw new ExplicitConfiguredOptionRejectionError(rejection);
77
- throw new Error(`${args.agent.name} exited with code ${code}`);
78
- }
79
- const body = finalText || textChunks.join("\n");
80
- const questions = parseQuestions(body);
81
- if (questions.length === 0) {
82
- throw new Error(`${args.agent.name} did not return a JSON array of questions`);
83
- }
84
- // Clamp to a sane range: at least 2, at most 6. The wizard step renders
85
- // them one at a time, so very long question lists fatigue the user.
86
- return questions.slice(0, 6);
87
- }
88
- finally {
89
- clearTimeout(timeout);
90
- }
91
- }
92
- class ExplicitConfiguredOptionRejectionError extends Error {
93
- }
94
- function explicitConfiguredOptionRejectionMessage(stderr) {
95
- const line = stderr
96
- .split("\n")
97
- .map((value) => value.trim())
98
- .find((value) => (value.includes("rejected configured model") && value.includes("did not substitute another model")) ||
99
- (value.includes("rejected configured Thinking effort") && value.includes("did not substitute another effort or model")));
100
- return line || null;
101
- }
102
- export function buildClarifyingQuestionsPrompt(jtbd) {
103
- return `You are helping a curator sharpen a plain-language capability goal for a Liner project.
104
-
105
- # The capability goal
106
- ${jtbd}
107
-
108
- # Your task
109
-
110
- Generate 3-4 targeted questions whose answers will help Liner build a hyper-specific, source-grounded resource for a future AI agent. The user should not have to name research lanes, source categories, or formal JTBD syntax. Ask only what is needed to infer those.
111
-
112
- Ask questions that are specific to this capability. Do not use a generic checklist. Prefer questions that clarify:
113
-
114
- - what future AI sessions should produce, decide, critique, translate, or prevent
115
- - the narrow niche or situation where the resource should be excellent
116
- - domain constraints, risk boundaries, regulated contexts, or things the agent must avoid
117
- - quality anchors only when the user already hinted at examples, people, products, or styles they care about
118
- - whether the future agent should ask follow-up questions at runtime or act autonomously from the request and corpus
119
-
120
- If the goal involves images, moodboards, references, examples, inspiration, style, art direction, visual language, or translating one medium/domain into another output, include at least one question that clarifies the runtime inputs and output contract. Ask what kinds of references the future agent may receive and what the caller needs back (for example: observations, interpretation, carry-forward rules, implementation vocabulary, avoid-list, or clarification questions). This is not asking the user to name research sources; it is clarifying the job the corpus must support.
121
-
122
- If the goal names multiple domains, ask how they relate in the capability. Do not ask the user "what sources should we gather" or "what should Liner extract"; Liner infers that from the capability.
123
-
124
- # Output format (strict)
125
-
126
- Respond with ONLY a JSON array of strings, each string being one question. No prose before or after. No markdown code fences. Example:
127
-
128
- ["First question?", "Second question?", "Third question?"]
129
-
130
- Do not use any tools. Do not write to disk. Just output the JSON array.`;
131
- }
132
- /**
133
- * Extract a JSON array of question strings from the agent's response body.
134
- * Permissive — accepts the array nested in a code fence, surrounded by
135
- * prose, or as a top-level value. Returns an empty array on any failure.
136
- */
137
- function parseQuestions(body) {
138
- if (!body)
139
- return [];
140
- // Strip common code-fence wrappers first.
141
- const fenceMatch = body.match(/```(?:json)?\s*([\s\S]*?)```/);
142
- const candidate = fenceMatch ? fenceMatch[1] : body;
143
- // Find the first [ ... ] that parses cleanly as an array.
144
- const arrayMatch = candidate.match(/\[\s*(?:[\s\S]*?)\s*\]/);
145
- const json = arrayMatch ? arrayMatch[0] : candidate.trim();
146
- let parsed;
147
- try {
148
- parsed = JSON.parse(json);
149
- }
150
- catch {
151
- return [];
152
- }
153
- if (!Array.isArray(parsed))
154
- return [];
155
- const out = [];
156
- for (const item of parsed) {
157
- if (typeof item === "string" && item.trim()) {
158
- out.push(item.trim());
159
- }
160
- else if (item && typeof item === "object" && "question" in item) {
161
- // Accept {question: "..."} shape too — some agents like the structure.
162
- const q = item["question"];
163
- if (typeof q === "string" && q.trim())
164
- out.push(q.trim());
165
- }
166
- }
167
- return out;
168
- }
169
- //# sourceMappingURL=jtbd-clarify.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jtbd-clarify.js","sourceRoot":"","sources":["../../src/agents/jtbd-clarify.ts"],"names":[],"mappings":"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"}