@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.
@@ -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-RAUVFOYY.mjs");
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
- async function answerAsk(io, options, args) {
875
- let agent = args[0], requestId = args[1], answer = args.slice(2).join(" ");
876
- if (!agent || !requestId || !answer) throw new Error("Usage: adf answer <agent> <requestId> <answer>");
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({ answer })
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 request
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