@agentdocumentformat/cli 0.8.2 → 0.8.3
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/dist/adf.mjs +3 -3
- package/dist/chunks/{App-4AZZJNN2.mjs → App-UHLJRFZJ.mjs} +185 -59
- package/dist/chunks/{chunk-IMVMSU3A.mjs → chunk-FUQRYTGX.mjs} +3 -3
- package/dist/chunks/{chunk-RJDOVMM4.mjs → chunk-OHTB4UW4.mjs} +18 -16
- package/dist/chunks/{chunk-7JZXMDDF.mjs → chunk-WPT3FAFX.mjs} +102 -1
- package/dist/chunks/{cli-PCVFB6B4.mjs → cli-UVIJAGRZ.mjs} +32 -7
- package/dist/chunks/{daemon-HEQ3FUYH.mjs → daemon-YHD7PUQI.mjs} +216 -89
- package/dist/chunks/{store-55CQSAOX.mjs → store-D2WLXEY2.mjs} +2 -2
- package/dist/chunks/{tui-RAUVFOYY.mjs → tui-ZEI2NAQV.mjs} +3 -3
- package/package.json +1 -1
|
@@ -447,11 +447,112 @@ function loopToLLMMessages(entries) {
|
|
|
447
447
|
}));
|
|
448
448
|
}
|
|
449
449
|
|
|
450
|
+
// src/shared/utils/ask-form.ts
|
|
451
|
+
var ask_form_exports = {};
|
|
452
|
+
__export(ask_form_exports, {
|
|
453
|
+
ASK_ALL_SKIPPED: () => ASK_ALL_SKIPPED,
|
|
454
|
+
ASK_SKIPPED: () => ASK_SKIPPED,
|
|
455
|
+
AskAnswerError: () => AskAnswerError,
|
|
456
|
+
askQuestions: () => askQuestions,
|
|
457
|
+
formatAskAnswers: () => formatAskAnswers,
|
|
458
|
+
normalizeAskAnswers: () => normalizeAskAnswers,
|
|
459
|
+
parseAskResult: () => parseAskResult,
|
|
460
|
+
summarizeAsk: () => summarizeAsk
|
|
461
|
+
});
|
|
462
|
+
var ASK_SKIPPED = "(skipped)", ASK_ALL_SKIPPED = "The human skipped all questions.", AskAnswerError = class extends Error {
|
|
463
|
+
constructor(message) {
|
|
464
|
+
super(message), this.name = "AskAnswerError";
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
function askQuestions(input) {
|
|
468
|
+
let obj = input && typeof input == "object" ? input : {};
|
|
469
|
+
if (Array.isArray(obj.questions)) {
|
|
470
|
+
let out = [];
|
|
471
|
+
for (let raw of obj.questions) {
|
|
472
|
+
if (!raw || typeof raw != "object") continue;
|
|
473
|
+
let q = raw;
|
|
474
|
+
if (typeof q.question != "string") continue;
|
|
475
|
+
let options = Array.isArray(q.options) ? q.options.flatMap((o) => {
|
|
476
|
+
if (o && typeof o == "object" && typeof o.label == "string") {
|
|
477
|
+
let { label, description } = o;
|
|
478
|
+
return [typeof description == "string" && description ? { label, description } : { label }];
|
|
479
|
+
}
|
|
480
|
+
return [];
|
|
481
|
+
}) : [];
|
|
482
|
+
out.push({
|
|
483
|
+
question: q.question,
|
|
484
|
+
...options.length > 0 ? { options } : {},
|
|
485
|
+
...options.length > 0 && q.multiple === !0 ? { multiple: !0 } : {}
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
return out;
|
|
489
|
+
}
|
|
490
|
+
return typeof obj.question == "string" ? [{ question: obj.question }] : [];
|
|
491
|
+
}
|
|
492
|
+
function summarizeAsk(questions) {
|
|
493
|
+
if (questions.length === 0) return "";
|
|
494
|
+
let first = questions[0].question;
|
|
495
|
+
return questions.length > 1 ? `${first} (+${questions.length - 1} more)` : first;
|
|
496
|
+
}
|
|
497
|
+
function normalizeAskAnswers(questions, raw) {
|
|
498
|
+
if (!Array.isArray(raw)) throw new AskAnswerError("answers must be an array with one entry per question");
|
|
499
|
+
if (raw.length !== questions.length)
|
|
500
|
+
throw new AskAnswerError(`answers has ${raw.length} entries but the ask has ${questions.length} question${questions.length === 1 ? "" : "s"}`);
|
|
501
|
+
return questions.map((q, i) => {
|
|
502
|
+
let value = raw[i], n = i + 1;
|
|
503
|
+
if (value == null) return null;
|
|
504
|
+
if (typeof value == "string") return value.trim() || null;
|
|
505
|
+
if (!Array.isArray(value) || value.some((v) => typeof v != "string"))
|
|
506
|
+
throw new AskAnswerError(`answer ${n} must be a string, an array of strings, or null`);
|
|
507
|
+
let picks = value.map((v) => v.trim()).filter(Boolean);
|
|
508
|
+
return picks.length === 0 ? null : q.multiple ? picks : picks.join(", ");
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
function answerText(q, answer) {
|
|
512
|
+
if (answer === null) return ASK_SKIPPED;
|
|
513
|
+
let labels = new Set((q.options ?? []).map((o) => o.label)), picks = Array.isArray(answer) ? answer : [answer];
|
|
514
|
+
return q.options ? picks.map((p) => labels.has(p) ? p : `Other: ${p}`).join(", ") : picks.join(", ");
|
|
515
|
+
}
|
|
516
|
+
function formatAskAnswers(questions, answers) {
|
|
517
|
+
return answers.every((a) => a === null) ? ASK_ALL_SKIPPED : questions.map((q, i) => `Q: ${q.question}
|
|
518
|
+
A: ${answerText(q, answers[i] ?? null)}`).join(`
|
|
519
|
+
|
|
520
|
+
`);
|
|
521
|
+
}
|
|
522
|
+
var LEGACY_PREFIX = "Human answered: ";
|
|
523
|
+
function parseAskResult(questions, result) {
|
|
524
|
+
if (result === ASK_ALL_SKIPPED) return questions.map(() => null);
|
|
525
|
+
if (result.startsWith(LEGACY_PREFIX)) {
|
|
526
|
+
let text = result.slice(LEGACY_PREFIX.length);
|
|
527
|
+
return questions.map((_, i) => i === 0 && text && text !== "[skipped]" ? text : null);
|
|
528
|
+
}
|
|
529
|
+
let out = [], cursor = 0;
|
|
530
|
+
for (let i = 0; i < questions.length; i++) {
|
|
531
|
+
let head = `Q: ${questions[i].question}
|
|
532
|
+
A: `, start = result.indexOf(head, cursor);
|
|
533
|
+
if (start < 0) {
|
|
534
|
+
out.push(null);
|
|
535
|
+
continue;
|
|
536
|
+
}
|
|
537
|
+
let bodyStart = start + head.length, next = i + 1 < questions.length ? result.indexOf(`
|
|
538
|
+
|
|
539
|
+
Q: ${questions[i + 1].question}
|
|
540
|
+
A: `, bodyStart) : -1, body = next < 0 ? result.slice(bodyStart) : result.slice(bodyStart, next);
|
|
541
|
+
out.push(body === ASK_SKIPPED ? null : body), cursor = next < 0 ? result.length : next;
|
|
542
|
+
}
|
|
543
|
+
return out;
|
|
544
|
+
}
|
|
545
|
+
|
|
450
546
|
export {
|
|
451
547
|
formatOwnerCommandRow,
|
|
452
548
|
owner_command_row_exports,
|
|
453
549
|
formatTurnErrorRow,
|
|
454
550
|
providerContextCategory,
|
|
455
551
|
parseLoopToDisplay,
|
|
456
|
-
loop_parser_exports
|
|
552
|
+
loop_parser_exports,
|
|
553
|
+
AskAnswerError,
|
|
554
|
+
summarizeAsk,
|
|
555
|
+
normalizeAskAnswers,
|
|
556
|
+
formatAskAnswers,
|
|
557
|
+
ask_form_exports
|
|
457
558
|
};
|
|
@@ -531,7 +531,7 @@ function tuiInvocation(argv) {
|
|
|
531
531
|
return argv.filter((a) => a !== "--json");
|
|
532
532
|
}
|
|
533
533
|
async function defaultLaunchTui(argv) {
|
|
534
|
-
let { runTui } = await import("./tui-
|
|
534
|
+
let { runTui } = await import("./tui-ZEI2NAQV.mjs");
|
|
535
535
|
return await runTui(argv);
|
|
536
536
|
}
|
|
537
537
|
function urlFromArgv(argv, env) {
|
|
@@ -794,6 +794,16 @@ function takeLoop(args) {
|
|
|
794
794
|
}
|
|
795
795
|
return { loop: loop && loop !== "main" ? loop : void 0, rest };
|
|
796
796
|
}
|
|
797
|
+
function takeAnswersFlag(args) {
|
|
798
|
+
let rest = [], answers;
|
|
799
|
+
for (let i = 0; i < args.length; i++) {
|
|
800
|
+
let arg = args[i];
|
|
801
|
+
if (arg === "--answers") {
|
|
802
|
+
if (answers = args[++i], answers === void 0) throw new Error("--answers requires a JSON array");
|
|
803
|
+
} else arg.startsWith("--answers=") ? answers = arg.slice(10) : rest.push(arg);
|
|
804
|
+
}
|
|
805
|
+
return { answers, rest };
|
|
806
|
+
}
|
|
797
807
|
function takeAttachments(args) {
|
|
798
808
|
let rest = [], files = [];
|
|
799
809
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -871,13 +881,23 @@ async function resolveTask(io, options, args, action) {
|
|
|
871
881
|
return io.stdout(options.json ? `${JSON.stringify(data, null, 2)}
|
|
872
882
|
` : formatTaskResolution(action, taskId, data)), 0;
|
|
873
883
|
}
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
884
|
+
var ANSWER_USAGE = "Usage: adf answer <agent> <requestId> [--loop <name>] <answer>, or --answers '<json array>' for a form";
|
|
885
|
+
async function answerAsk(io, options, argv) {
|
|
886
|
+
let { loop, rest: afterLoop } = takeLoop(argv), { answers: answersJson, rest: args } = takeAnswersFlag(afterLoop), agent = args[0], requestId = args[1], text = args.slice(2).join(" ");
|
|
887
|
+
if (!agent || !requestId || answersJson === void 0 == !text) throw new Error(ANSWER_USAGE);
|
|
888
|
+
let answers;
|
|
889
|
+
if (answersJson !== void 0)
|
|
890
|
+
try {
|
|
891
|
+
answers = JSON.parse(answersJson);
|
|
892
|
+
} catch {
|
|
893
|
+
throw new Error(`--answers is not valid JSON. ${ANSWER_USAGE}`);
|
|
894
|
+
}
|
|
895
|
+
else
|
|
896
|
+
answers = [text];
|
|
877
897
|
let data = await requestJson(io, options, `/agents/${enc(agent)}/asks/${enc(requestId)}/respond`, {
|
|
878
898
|
method: "POST",
|
|
879
899
|
headers: { "Content-Type": "application/json" },
|
|
880
|
-
body: JSON.stringify({
|
|
900
|
+
body: JSON.stringify({ answers, ...loop ? { loop } : {} })
|
|
881
901
|
});
|
|
882
902
|
return io.stdout(options.json ? `${JSON.stringify(data, null, 2)}
|
|
883
903
|
` : `Answered ${requestId}
|
|
@@ -1710,8 +1730,13 @@ Commands:
|
|
|
1710
1730
|
approve <agent> <taskId> Approve a pending task
|
|
1711
1731
|
deny <agent> <taskId> [reason] Deny a pending task
|
|
1712
1732
|
asks <agent> List pending ask requests
|
|
1713
|
-
answer <agent> <requestId> <answer>
|
|
1714
|
-
Answer a pending ask
|
|
1733
|
+
answer <agent> <requestId> [--loop <name>] <answer>
|
|
1734
|
+
Answer a pending one-question ask
|
|
1735
|
+
answer <agent> <requestId> [--loop <name>] --answers '<json>'
|
|
1736
|
+
Answer an ask form: a JSON array with one
|
|
1737
|
+
entry per question, in order: text or an
|
|
1738
|
+
option label, an array of labels for a
|
|
1739
|
+
multi-pick question, or null to skip
|
|
1715
1740
|
identities <agent> List identity metadata without secret values
|
|
1716
1741
|
mcp [agent] Show daemon MCP registrations or agent MCP state
|
|
1717
1742
|
adapters [agent] Show daemon adapter registrations or agent adapter state
|