@kweaver-ai/kweaver-sdk 0.8.1 → 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.
Files changed (214) hide show
  1. package/README.md +40 -52
  2. package/README.zh.md +41 -46
  3. package/dist/agent-providers/index.d.ts +7 -0
  4. package/dist/agent-providers/index.js +5 -0
  5. package/dist/agent-providers/prompt-template.d.ts +62 -0
  6. package/dist/agent-providers/prompt-template.js +105 -0
  7. package/dist/agent-providers/prompts/rubric-judge-v1.prompt.md +51 -0
  8. package/dist/agent-providers/prompts/within-trace-synthesizer-v1.prompt.md +60 -0
  9. package/dist/agent-providers/providers/claude-code-subprocess.d.ts +74 -0
  10. package/dist/agent-providers/providers/claude-code-subprocess.js +259 -0
  11. package/dist/agent-providers/providers/stub.d.ts +47 -0
  12. package/dist/agent-providers/providers/stub.js +77 -0
  13. package/dist/agent-providers/registry.d.ts +45 -0
  14. package/dist/agent-providers/registry.js +77 -0
  15. package/dist/agent-providers/types.d.ts +91 -0
  16. package/dist/agent-providers/types.js +25 -0
  17. package/dist/api/agent-chat.js +8 -6
  18. package/dist/api/context-loader.d.ts +1 -0
  19. package/dist/api/resources.d.ts +94 -0
  20. package/dist/api/resources.js +166 -0
  21. package/dist/api/semantic-search.d.ts +5 -0
  22. package/dist/api/semantic-search.js +5 -0
  23. package/dist/api/skills.d.ts +75 -2
  24. package/dist/api/skills.js +108 -12
  25. package/dist/api/trace.d.ts +5 -0
  26. package/dist/api/trace.js +4 -0
  27. package/dist/cli.js +109 -15
  28. package/dist/client.d.ts +3 -3
  29. package/dist/client.js +5 -5
  30. package/dist/commands/agent/mode.d.ts +6 -0
  31. package/dist/commands/agent/mode.js +75 -0
  32. package/dist/commands/agent-members.js +27 -11
  33. package/dist/commands/agent.js +469 -286
  34. package/dist/commands/auth.js +184 -71
  35. package/dist/commands/bkn-metric.js +37 -16
  36. package/dist/commands/bkn-ops.js +164 -86
  37. package/dist/commands/bkn-query.js +99 -31
  38. package/dist/commands/bkn-schema.d.ts +3 -3
  39. package/dist/commands/bkn-schema.js +127 -86
  40. package/dist/commands/bkn.js +153 -114
  41. package/dist/commands/call.js +23 -13
  42. package/dist/commands/config.js +22 -12
  43. package/dist/commands/context-loader.js +625 -49
  44. package/dist/commands/dataflow.js +14 -6
  45. package/dist/commands/ds.js +52 -30
  46. package/dist/commands/explore.js +18 -15
  47. package/dist/commands/model.js +53 -42
  48. package/dist/commands/resource.d.ts +1 -0
  49. package/dist/commands/{dataview.js → resource.js} +62 -84
  50. package/dist/commands/skill.d.ts +21 -1
  51. package/dist/commands/skill.js +567 -43
  52. package/dist/commands/token.js +11 -0
  53. package/dist/commands/tool.js +46 -29
  54. package/dist/commands/toolbox.js +31 -15
  55. package/dist/commands/trace.d.ts +26 -1
  56. package/dist/commands/trace.js +515 -15
  57. package/dist/commands/vega.js +466 -250
  58. package/dist/help/format.d.ts +65 -0
  59. package/dist/help/format.js +141 -0
  60. package/dist/index.d.ts +5 -5
  61. package/dist/index.js +3 -3
  62. package/dist/resources/bkn.d.ts +5 -0
  63. package/dist/resources/bkn.js +5 -0
  64. package/dist/resources/{dataviews.d.ts → resources.d.ts} +10 -11
  65. package/dist/resources/{dataviews.js → resources.js} +12 -13
  66. package/dist/resources/skills.d.ts +17 -1
  67. package/dist/resources/skills.js +32 -1
  68. package/dist/trace-ai/diagnose/agent-binding.d.ts +67 -0
  69. package/dist/trace-ai/diagnose/agent-binding.js +257 -0
  70. package/dist/trace-ai/diagnose/builtin-rules/tool-retry-intent-mismatch.yaml +68 -0
  71. package/dist/trace-ai/diagnose/index.d.ts +32 -0
  72. package/dist/trace-ai/diagnose/index.js +246 -0
  73. package/dist/trace-ai/diagnose/output-schema-converter.d.ts +24 -0
  74. package/dist/trace-ai/diagnose/output-schema-converter.js +81 -0
  75. package/dist/trace-ai/diagnose/query-extractor.d.ts +14 -0
  76. package/dist/trace-ai/diagnose/query-extractor.js +45 -0
  77. package/dist/trace-ai/diagnose/report-assembler.d.ts +31 -0
  78. package/dist/{trace-core → trace-ai}/diagnose/report-assembler.js +19 -9
  79. package/dist/trace-ai/diagnose/report-markdown.d.ts +18 -0
  80. package/dist/trace-ai/diagnose/report-markdown.js +192 -0
  81. package/dist/{trace-core → trace-ai}/diagnose/rule-loader.js +42 -8
  82. package/dist/{trace-core → trace-ai}/diagnose/schemas.d.ts +77 -2
  83. package/dist/trace-ai/diagnose/schemas.js +154 -0
  84. package/dist/trace-ai/diagnose/signal-probe.d.ts +17 -0
  85. package/dist/trace-ai/diagnose/signal-probe.js +39 -0
  86. package/dist/trace-ai/diagnose/synthesizer-agent.d.ts +40 -0
  87. package/dist/trace-ai/diagnose/synthesizer-agent.js +158 -0
  88. package/dist/{trace-core → trace-ai}/diagnose/trace-shaper.js +1 -0
  89. package/dist/{trace-core → trace-ai}/diagnose/types.d.ts +55 -6
  90. package/dist/trace-ai/eval-set/assertion-evaluator.d.ts +29 -0
  91. package/dist/trace-ai/eval-set/assertion-evaluator.js +100 -0
  92. package/dist/trace-ai/eval-set/builder.d.ts +36 -0
  93. package/dist/trace-ai/eval-set/builder.js +126 -0
  94. package/dist/trace-ai/eval-set/index.d.ts +15 -0
  95. package/dist/trace-ai/eval-set/index.js +10 -0
  96. package/dist/trace-ai/eval-set/output-writer.d.ts +27 -0
  97. package/dist/trace-ai/eval-set/output-writer.js +126 -0
  98. package/dist/trace-ai/eval-set/query-picker.d.ts +37 -0
  99. package/dist/trace-ai/eval-set/query-picker.js +147 -0
  100. package/dist/trace-ai/eval-set/redactor.d.ts +42 -0
  101. package/dist/trace-ai/eval-set/redactor.js +133 -0
  102. package/dist/trace-ai/eval-set/rubric-templates/answer-match-reference.prompt.md +19 -0
  103. package/dist/trace-ai/eval-set/schemas.d.ts +136 -0
  104. package/dist/trace-ai/eval-set/schemas.js +130 -0
  105. package/dist/trace-ai/eval-set/semantic-match-provider.d.ts +33 -0
  106. package/dist/trace-ai/eval-set/semantic-match-provider.js +51 -0
  107. package/dist/trace-ai/eval-set/test-runner.d.ts +34 -0
  108. package/dist/trace-ai/eval-set/test-runner.js +153 -0
  109. package/dist/trace-ai/eval-set/types.d.ts +46 -0
  110. package/dist/trace-ai/eval-set/types.js +8 -0
  111. package/dist/trace-ai/exp/bundle-writer.d.ts +10 -0
  112. package/dist/trace-ai/exp/bundle-writer.js +54 -0
  113. package/dist/trace-ai/exp/claude-binary.d.ts +5 -0
  114. package/dist/trace-ai/exp/claude-binary.js +30 -0
  115. package/dist/trace-ai/exp/coordinator.d.ts +45 -0
  116. package/dist/trace-ai/exp/coordinator.js +203 -0
  117. package/dist/trace-ai/exp/eval-runner.d.ts +14 -0
  118. package/dist/trace-ai/exp/eval-runner.js +47 -0
  119. package/dist/trace-ai/exp/exp-store/abort-signal.d.ts +3 -0
  120. package/dist/trace-ai/exp/exp-store/abort-signal.js +27 -0
  121. package/dist/trace-ai/exp/exp-store/candidate-lineage-yaml.d.ts +4 -0
  122. package/dist/trace-ai/exp/exp-store/candidate-lineage-yaml.js +37 -0
  123. package/dist/trace-ai/exp/exp-store/events-jsonl.d.ts +17 -0
  124. package/dist/trace-ai/exp/exp-store/events-jsonl.js +60 -0
  125. package/dist/trace-ai/exp/exp-store/exp-registry.d.ts +6 -0
  126. package/dist/trace-ai/exp/exp-store/exp-registry.js +41 -0
  127. package/dist/trace-ai/exp/exp-store/index.d.ts +46 -0
  128. package/dist/trace-ai/exp/exp-store/index.js +59 -0
  129. package/dist/trace-ai/exp/exp-store/lock.d.ts +3 -0
  130. package/dist/trace-ai/exp/exp-store/lock.js +73 -0
  131. package/dist/trace-ai/exp/exp-store/mission-md.d.ts +3 -0
  132. package/dist/trace-ai/exp/exp-store/mission-md.js +37 -0
  133. package/dist/trace-ai/exp/exp-store/readme-template.d.ts +5 -0
  134. package/dist/trace-ai/exp/exp-store/readme-template.js +25 -0
  135. package/dist/trace-ai/exp/exp-store/round-yaml.d.ts +3 -0
  136. package/dist/trace-ai/exp/exp-store/round-yaml.js +33 -0
  137. package/dist/trace-ai/exp/index.d.ts +8 -0
  138. package/dist/trace-ai/exp/index.js +238 -0
  139. package/dist/trace-ai/exp/info.d.ts +35 -0
  140. package/dist/trace-ai/exp/info.js +120 -0
  141. package/dist/trace-ai/exp/patch/agent-config.d.ts +1 -0
  142. package/dist/trace-ai/exp/patch/agent-config.js +26 -0
  143. package/dist/trace-ai/exp/patch/index.d.ts +2 -0
  144. package/dist/trace-ai/exp/patch/index.js +13 -0
  145. package/dist/trace-ai/exp/patch/skill.d.ts +1 -0
  146. package/dist/trace-ai/exp/patch/skill.js +24 -0
  147. package/dist/trace-ai/exp/providers/synthesizer-client.d.ts +14 -0
  148. package/dist/trace-ai/exp/providers/synthesizer-client.js +39 -0
  149. package/dist/trace-ai/exp/providers/triage-client.d.ts +19 -0
  150. package/dist/trace-ai/exp/providers/triage-client.js +51 -0
  151. package/dist/trace-ai/exp/schemas.d.ts +147 -0
  152. package/dist/trace-ai/exp/schemas.js +50 -0
  153. package/dist/trace-ai/exp/scoring.d.ts +2 -0
  154. package/dist/trace-ai/exp/scoring.js +46 -0
  155. package/dist/trace-ai/scan/aggregator.d.ts +20 -0
  156. package/dist/trace-ai/scan/aggregator.js +26 -0
  157. package/dist/trace-ai/scan/artifacts/paths.d.ts +12 -0
  158. package/dist/trace-ai/scan/artifacts/paths.js +18 -0
  159. package/dist/trace-ai/scan/artifacts/writer.d.ts +67 -0
  160. package/dist/trace-ai/scan/artifacts/writer.js +96 -0
  161. package/dist/trace-ai/scan/batched-rubric.d.ts +55 -0
  162. package/dist/trace-ai/scan/batched-rubric.js +159 -0
  163. package/dist/trace-ai/scan/cross-trace-synthesizer.d.ts +24 -0
  164. package/dist/trace-ai/scan/cross-trace-synthesizer.js +93 -0
  165. package/dist/trace-ai/scan/index.d.ts +31 -0
  166. package/dist/trace-ai/scan/index.js +390 -0
  167. package/dist/trace-ai/scan/prompts/builtin/cross-trace-synthesizer-v1.prompt.md +44 -0
  168. package/dist/trace-ai/scan/prompts/builtin/rubric-judge-batch-v1.prompt.md +44 -0
  169. package/dist/trace-ai/scan/runner.d.ts +25 -0
  170. package/dist/trace-ai/scan/runner.js +42 -0
  171. package/dist/trace-ai/scan/sampler.d.ts +18 -0
  172. package/dist/trace-ai/scan/sampler.js +81 -0
  173. package/dist/trace-ai/scan/scan-summary-markdown.d.ts +2 -0
  174. package/dist/trace-ai/scan/scan-summary-markdown.js +71 -0
  175. package/dist/trace-ai/scan/scan-summary-schema.d.ts +73 -0
  176. package/dist/trace-ai/scan/scan-summary-schema.js +61 -0
  177. package/dist/trace-ai/scan/single-agent-validator.d.ts +23 -0
  178. package/dist/trace-ai/scan/single-agent-validator.js +42 -0
  179. package/dist/trace-ai/scan/traces-list-parser.d.ts +15 -0
  180. package/dist/trace-ai/scan/traces-list-parser.js +46 -0
  181. package/package.json +2 -2
  182. package/dist/api/dataviews.d.ts +0 -117
  183. package/dist/api/dataviews.js +0 -265
  184. package/dist/commands/dataview.d.ts +0 -8
  185. package/dist/trace-core/diagnose/index.d.ts +0 -9
  186. package/dist/trace-core/diagnose/index.js +0 -104
  187. package/dist/trace-core/diagnose/report-assembler.d.ts +0 -12
  188. package/dist/trace-core/diagnose/schemas.js +0 -94
  189. package/dist/trace-core/diagnose/signal-probe.d.ts +0 -5
  190. package/dist/trace-core/diagnose/signal-probe.js +0 -21
  191. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/excessive-tool-calls-per-turn.d.ts +0 -0
  192. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/excessive-tool-calls-per-turn.js +0 -0
  193. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/excessive-tool-calls-per-turn.yaml +0 -0
  194. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/llm-response-truncated-no-continue.d.ts +0 -0
  195. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/llm-response-truncated-no-continue.js +0 -0
  196. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/llm-response-truncated-no-continue.yaml +0 -0
  197. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/register.d.ts +0 -0
  198. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/register.js +0 -0
  199. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/retrieval-empty-no-fallback.d.ts +0 -0
  200. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/retrieval-empty-no-fallback.js +0 -0
  201. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/retrieval-empty-no-fallback.yaml +0 -0
  202. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/tool-error-swallowed.d.ts +0 -0
  203. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/tool-error-swallowed.js +0 -0
  204. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/tool-error-swallowed.yaml +0 -0
  205. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/tool-loop-no-state-change.d.ts +0 -0
  206. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/tool-loop-no-state-change.js +0 -0
  207. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/tool-loop-no-state-change.yaml +0 -0
  208. /package/dist/{trace-core → trace-ai}/diagnose/predicate-registry.d.ts +0 -0
  209. /package/dist/{trace-core → trace-ai}/diagnose/predicate-registry.js +0 -0
  210. /package/dist/{trace-core → trace-ai}/diagnose/rule-loader.d.ts +0 -0
  211. /package/dist/{trace-core → trace-ai}/diagnose/synthesizer-template.d.ts +0 -0
  212. /package/dist/{trace-core → trace-ai}/diagnose/synthesizer-template.js +0 -0
  213. /package/dist/{trace-core → trace-ai}/diagnose/trace-shaper.d.ts +0 -0
  214. /package/dist/{trace-core → trace-ai}/diagnose/types.js +0 -0
@@ -1,6 +1,53 @@
1
1
  import { ensureValidToken, formatHttpError, with401RefreshRetry } from "../auth/oauth.js";
2
+ import { renderHelp } from "../help/format.js";
3
+ const AGENT_HELP = renderHelp({
4
+ tagline: "Agent CRUD, chat, sessions, history, publish/unpublish",
5
+ usage: "kweaver agent <subcommand> [flags]",
6
+ sections: [
7
+ {
8
+ title: "DISCOVERY",
9
+ items: [
10
+ { name: "list", desc: "List published agents" },
11
+ { name: "personal-list", desc: "List personal-space agents" },
12
+ { name: "category-list", desc: "List agent categories" },
13
+ { name: "template-list", desc: "List published agent templates" },
14
+ { name: "template-get", desc: "Get published agent template details" },
15
+ ],
16
+ },
17
+ {
18
+ title: "CRUD",
19
+ items: [
20
+ { name: "get", desc: "Get agent details" },
21
+ { name: "get-by-key", desc: "Get agent by key" },
22
+ { name: "create", desc: "Create a new agent" },
23
+ { name: "update", desc: "Update an existing agent" },
24
+ { name: "delete", desc: "Delete an agent" },
25
+ { name: "publish", desc: "Publish an agent" },
26
+ { name: "unpublish", desc: "Unpublish an agent" },
27
+ ],
28
+ },
29
+ {
30
+ title: "RUNTIME",
31
+ items: [
32
+ { name: "chat", desc: "Interactive chat (or single message with -m)" },
33
+ { name: "sessions", desc: "List conversations for an agent" },
34
+ { name: "history", desc: "Show message history for a conversation" },
35
+ { name: "trace", desc: "Get trace data for a conversation (--view tree|perf|evidence|reasoning|all)" },
36
+ { name: "skill", desc: "Manage skills attached to an agent (add / remove / list)" },
37
+ ],
38
+ },
39
+ ],
40
+ inheritedFlags: "--base-url, --token, --user, --help",
41
+ examples: [
42
+ "kweaver agent list --limit 20",
43
+ "kweaver agent chat <agent_id> -m \"hello\"",
44
+ "kweaver agent trace <conversation_id> --view all",
45
+ ],
46
+ learnMore: ["Use `kweaver agent <subcommand> --help` for flag details"],
47
+ });
2
48
  import { runAgentChatCommand } from "./agent-chat.js";
3
49
  import { runAgentSkillCommand } from "./agent-members.js";
50
+ import { AGENT_MODE_HELP, applyAgentModeToConfig, normalizeAgentConfigInput, parseAgentMode, } from "./agent/mode.js";
4
51
  import { listAgents, getAgent, getAgentByKey, createAgent, updateAgent, deleteAgent, publishAgent, unpublishAgent, listPersonalAgents, listPublishedAgentTemplates, getPublishedAgentTemplate, listAgentCategories, } from "../api/agent-list.js";
5
52
  import { listConversations, listMessages, getTracesByConversation } from "../api/conversations.js";
6
53
  import { fetchAgentInfo } from "../api/agent-chat.js";
@@ -47,21 +94,21 @@ export async function resolveLlmName(options) {
47
94
  }
48
95
  }
49
96
  /**
50
- * 生成带时间戳的文件路径
51
- * @param path 用户提供的路径
52
- * @returns 带时间戳的文件路径
97
+ * Generate a timestamped file path.
98
+ * @param path User-provided output path.
99
+ * @returns The timestamped file path.
53
100
  */
54
101
  function generateTimestampedPath(path) {
55
102
  const timestamp = new Date().toISOString().replace(/[:.]/g, "-").slice(0, 19);
56
- // 如果路径以 / 结尾,视为目录,在目录下生成文件
103
+ // Treat paths ending in / as directories.
57
104
  if (path.endsWith("/")) {
58
105
  return join(path, `agent-config-${timestamp}.json`);
59
106
  }
60
- // 在文件名中插入时间戳:config.json -> config-2025-01-15T12-30-45.json
107
+ // Insert the timestamp before the extension: config.json -> config-2025-01-15T12-30-45.json.
61
108
  const ext = extname(path);
62
109
  const base = basename(path, ext);
63
110
  const dir = dirname(path);
64
- // 如果 dir ".",说明没有目录前缀,直接返回带时间戳的文件名
111
+ // No directory prefix was provided, so return only the timestamped file name.
65
112
  if (dir === ".") {
66
113
  return `${base}-${timestamp}${ext}`;
67
114
  }
@@ -537,30 +584,7 @@ export function parseAgentTraceArgs(args) {
537
584
  export async function runAgentCommand(args) {
538
585
  const [subcommand, ...rest] = args;
539
586
  if (!subcommand || subcommand === "--help" || subcommand === "-h") {
540
- console.log(`kweaver agent
541
-
542
- Subcommands:
543
- list [options] List published agents
544
- personal-list [options] List personal space agents
545
- category-list [options] List agent categories
546
- template-list [options] List published agent templates
547
- template-get <tpl_id> Get published agent template details
548
- get <agent_id> [--verbose] Get agent details
549
- get-by-key <key> Get agent by key
550
- create --name <n> --profile <p> Create a new agent
551
- [--key <key>] [--product-key <pk>] [--system-prompt <sp>]
552
- [--llm-id <id>] [--llm-max-tokens <n>]
553
- update <agent_id> [options] Update an existing agent
554
- delete <agent_id> [-y] Delete an agent
555
- publish <agent_id> Publish an agent
556
- unpublish <agent_id> Unpublish an agent
557
- chat <agent_id> Start interactive chat with an agent
558
- chat <agent_id> -m "message" Send a single message (non-interactive)
559
- skill <verb> ... Manage skills attached to an agent (add/remove/list)
560
- sessions <agent_id> List all conversations for an agent
561
- history <agent_id> <conversation_id> Show message history for a conversation
562
- trace <conversation_id> [--view tree|perf|evidence|reasoning|all] [--json]
563
- Get trace data for a conversation`);
587
+ console.log(AGENT_HELP);
564
588
  return Promise.resolve(0);
565
589
  }
566
590
  const dispatch = async () => {
@@ -603,177 +627,230 @@ Subcommands:
603
627
  // Show subcommand-specific help inline (no retry needed)
604
628
  if (subcommand === "chat") {
605
629
  if (rest.length === 1 && (rest[0] === "--help" || rest[0] === "-h")) {
606
- console.log(`kweaver agent chat <agent_id> [-m "message"] [options]
607
-
608
- Interactive mode (default when -m is omitted):
609
- kweaver agent chat <agent_id>
610
- Type your message and press Enter. Type 'exit', 'quit', or 'q' to quit.
611
-
612
- Non-interactive mode:
613
- kweaver agent chat <agent_id> -m "your message"
614
- kweaver agent chat <agent_id> -m "continue" --conversation-id <id>
615
-
616
- Options:
617
- -m, --message <text> Single message (non-interactive)
618
- --conversation-id <id> Continue existing conversation
619
- -cid <id> Short alias for --conversation-id
620
- --session-id <id> Alias for --conversation-id
621
- -conversation_id <id> Compatibility alias for reference examples
622
- --version <value> Agent version used to resolve the agent key (default: v0)
623
- --stream Enable streaming (default in interactive)
624
- --no-stream Disable streaming (default with -m)
625
- --verbose, -v Print request details to stderr
626
- -bd, --biz-domain <value> Override x-business-domain (default: bd_public)`);
630
+ console.log(renderHelp({
631
+ tagline: "Chat with an agent — interactive (default) or single-shot (-m)",
632
+ usage: [
633
+ "kweaver agent chat <agent_id> (interactive)",
634
+ "kweaver agent chat <agent_id> -m \"message\" (single-shot)",
635
+ "kweaver agent chat <agent_id> -m \"...\" --conversation-id <id>",
636
+ ],
637
+ flags: [
638
+ {
639
+ title: "Message",
640
+ flags: [
641
+ { name: "-m, --message <text>", desc: "Single message (non-interactive)" },
642
+ { name: "--conversation-id <id>", desc: "Continue existing conversation (aliases: -cid, --session-id, -conversation_id)" },
643
+ { name: "--version <value>", desc: "Agent version used to resolve agent key (default: v0)" },
644
+ ],
645
+ },
646
+ {
647
+ title: "Streaming",
648
+ flags: [
649
+ { name: "--stream", desc: "Enable streaming (default in interactive)" },
650
+ { name: "--no-stream", desc: "Disable streaming (default with -m)" },
651
+ ],
652
+ },
653
+ {
654
+ title: "Common",
655
+ flags: [
656
+ { name: "--verbose, -v", desc: "Print request details to stderr" },
657
+ { name: "-bd, --biz-domain <value>", desc: "Override x-business-domain (default: bd_public)" },
658
+ ],
659
+ },
660
+ ],
661
+ inheritedFlags: "--base-url, --token, --user, --help",
662
+ examples: [
663
+ "kweaver agent chat agt-123",
664
+ "kweaver agent chat agt-123 -m \"hello\"",
665
+ "kweaver agent chat agt-123 -m \"continue\" --conversation-id conv-456",
666
+ "kweaver agent chat agt-123 -m \"hello\" --no-stream --verbose",
667
+ ],
668
+ learnMore: ["Interactive mode: type 'exit', 'quit', or 'q' to quit"],
669
+ }));
627
670
  return Promise.resolve(0);
628
671
  }
629
672
  return runAgentChatCommand(rest);
630
673
  }
631
674
  if (subcommand === "get") {
632
675
  if (rest.length === 1 && (rest[0] === "--help" || rest[0] === "-h")) {
633
- console.log(`kweaver agent get <agent_id> [options]
634
-
635
- Get agent details from the agent-factory API.
636
-
637
- Options:
638
- --verbose, -v Show full JSON response
639
- -bd, --biz-domain <value> Business domain (default: bd_public)
640
- --pretty Pretty-print JSON output (default)
641
- --save-config <path> Save config to file with timestamp (output: <path-with-timestamp>)`);
676
+ console.log(renderHelp({
677
+ tagline: "Get agent details from the agent-factory API.",
678
+ usage: "kweaver agent get <agent_id> [options]",
679
+ flags: [
680
+ { name: "--verbose, -v", desc: "Show full JSON response" },
681
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
682
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
683
+ { name: "--save-config <path>", desc: "Save config to file with timestamp (output: <path-with-timestamp>)" },
684
+ ],
685
+ inheritedFlags: "--base-url, --token, --user, --help",
686
+ examples: ["kweaver agent get <agent_id>"],
687
+ }));
642
688
  return 0;
643
689
  }
644
690
  }
645
691
  if (subcommand === "update") {
646
692
  if (rest.length === 1 && (rest[0] === "--help" || rest[0] === "-h")) {
647
- console.log(`kweaver agent update <agent_id> [options]
648
-
649
- Update an existing agent.
650
-
651
- Options:
652
- --name <text> Agent name (max 50)
653
- --profile <text> Agent description (max 500)
654
- --system-prompt <text> System prompt
655
- --knowledge-network-id <id> Business knowledge network ID to configure
656
- --config-path <path> Path to config file (read from file instead of API)`);
693
+ console.log(renderHelp({
694
+ tagline: "Update an existing agent.",
695
+ usage: "kweaver agent update <agent_id> [options]",
696
+ flags: [
697
+ { name: "--name <text>", desc: "Agent name (max 50)" },
698
+ { name: "--profile <text>", desc: "Agent description (max 500)" },
699
+ { name: "--system-prompt <text>", desc: "System prompt" },
700
+ { name: "--knowledge-network-id <id>", desc: "Business knowledge network ID to configure" },
701
+ { name: "--config-path <path>", desc: "Path to config object file, or full agent JSON with config" },
702
+ { name: "--mode <mode>", desc: "Agent mode: default, dolphin, react (default: default)" },
703
+ ],
704
+ inheritedFlags: "--base-url, --token, --user, --help",
705
+ examples: ["kweaver agent update <agent_id> --name MyAgent"],
706
+ learnMore: [AGENT_MODE_HELP],
707
+ }));
657
708
  return 0;
658
709
  }
659
710
  }
660
711
  if (subcommand === "list") {
661
712
  if (rest.length === 1 && (rest[0] === "--help" || rest[0] === "-h")) {
662
- console.log(`kweaver agent list [options]
663
-
664
- List published agents from the agent-factory API.
665
-
666
- Options:
667
- --name <text> Filter by name
668
- --offset <n> Pagination offset (default: 0)
669
- --limit <n> Max items to return (default: 30)
670
- --category-id <id> Filter by category
671
- --custom-space-id <id> Filter by custom space
672
- --is-to-square <0|1> Is to square (default: 1)
673
- --verbose, -v Show full JSON response
674
- -bd, --biz-domain <value> Business domain (default: bd_public)
675
- --pretty Pretty-print JSON output (applies to both modes)`);
713
+ console.log(renderHelp({
714
+ tagline: "List published agents from the agent-factory API.",
715
+ usage: "kweaver agent list [options]",
716
+ flags: [
717
+ { name: "--name <text>", desc: "Filter by name" },
718
+ { name: "--offset <n>", desc: "Pagination offset (default: 0)" },
719
+ { name: "--limit <n>", desc: "Max items to return (default: 30)" },
720
+ { name: "--category-id <id>", desc: "Filter by category" },
721
+ { name: "--custom-space-id <id>", desc: "Filter by custom space" },
722
+ { name: "--is-to-square <0|1>", desc: "Is to square (default: 1)" },
723
+ { name: "--verbose, -v", desc: "Show full JSON response" },
724
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
725
+ { name: "--pretty", desc: "Pretty-print JSON output (applies to both modes)" },
726
+ ],
727
+ inheritedFlags: "--base-url, --token, --user, --help",
728
+ examples: ["kweaver agent list --limit 10"],
729
+ }));
676
730
  return 0;
677
731
  }
678
732
  }
679
733
  if (subcommand === "personal-list") {
680
734
  if (rest.length === 1 && (rest[0] === "--help" || rest[0] === "-h")) {
681
- console.log(`kweaver agent personal-list [options]
682
-
683
- List personal space agents from the agent-factory API.
684
-
685
- Options:
686
- --name <text> Filter by name
687
- --pagination-marker <str> Pagination marker
688
- --publish-status <status> Filter by publish status
689
- --publish-to-be <value> Publish to be filter
690
- --size <n> Max items to return (default: 48)
691
- --verbose, -v Show full JSON response
692
- -bd, --biz-domain <value> Business domain (default: bd_public)
693
- --pretty Pretty-print JSON output (default)`);
735
+ console.log(renderHelp({
736
+ tagline: "List personal space agents from the agent-factory API.",
737
+ usage: "kweaver agent personal-list [options]",
738
+ flags: [
739
+ { name: "--name <text>", desc: "Filter by name" },
740
+ { name: "--pagination-marker <str>", desc: "Pagination marker" },
741
+ { name: "--publish-status <status>", desc: "Filter by publish status" },
742
+ { name: "--publish-to-be <value>", desc: "Publish to be filter" },
743
+ { name: "--size <n>", desc: "Max items to return (default: 48)" },
744
+ { name: "--verbose, -v", desc: "Show full JSON response" },
745
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
746
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
747
+ ],
748
+ inheritedFlags: "--base-url, --token, --user, --help",
749
+ examples: ["kweaver agent personal-list --size 20"],
750
+ }));
694
751
  return 0;
695
752
  }
696
753
  }
697
754
  if (subcommand === "category-list") {
698
755
  if (rest.length === 1 && (rest[0] === "--help" || rest[0] === "-h")) {
699
- console.log(`kweaver agent category-list [options]
700
-
701
- List agent categories from the agent-factory API.
702
-
703
- Options:
704
- --verbose, -v Show full JSON response
705
- -bd, --biz-domain <value> Business domain (default: bd_public)
706
- --pretty Pretty-print JSON output (default)`);
756
+ console.log(renderHelp({
757
+ tagline: "List agent categories from the agent-factory API.",
758
+ usage: "kweaver agent category-list [options]",
759
+ flags: [
760
+ { name: "--verbose, -v", desc: "Show full JSON response" },
761
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
762
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
763
+ ],
764
+ inheritedFlags: "--base-url, --token, --user, --help",
765
+ examples: ["kweaver agent category-list"],
766
+ }));
707
767
  return 0;
708
768
  }
709
769
  }
710
770
  if (subcommand === "template-list") {
711
771
  if (rest.length === 1 && (rest[0] === "--help" || rest[0] === "-h")) {
712
- console.log(`kweaver agent template-list [options]
713
-
714
- List published agent templates from the agent-factory API.
715
-
716
- Options:
717
- --category-id <id> Filter by category
718
- --name <text> Filter by name
719
- --pagination-marker <str> Pagination marker
720
- --size <n> Max items to return (default: 48)
721
- --verbose, -v Show full JSON response
722
- -bd, --biz-domain <value> Business domain (default: bd_public)
723
- --pretty Pretty-print JSON output (default)`);
772
+ console.log(renderHelp({
773
+ tagline: "List published agent templates from the agent-factory API.",
774
+ usage: "kweaver agent template-list [options]",
775
+ flags: [
776
+ { name: "--category-id <id>", desc: "Filter by category" },
777
+ { name: "--name <text>", desc: "Filter by name" },
778
+ { name: "--pagination-marker <str>", desc: "Pagination marker" },
779
+ { name: "--size <n>", desc: "Max items to return (default: 48)" },
780
+ { name: "--verbose, -v", desc: "Show full JSON response" },
781
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
782
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
783
+ ],
784
+ inheritedFlags: "--base-url, --token, --user, --help",
785
+ examples: ["kweaver agent template-list --size 20"],
786
+ }));
724
787
  return 0;
725
788
  }
726
789
  }
727
790
  if (subcommand === "template-get") {
728
791
  if (rest.length === 1 && (rest[0] === "--help" || rest[0] === "-h")) {
729
- console.log(`kweaver agent template-get <template_id> [options]
730
-
731
- Get published agent template details from the agent-factory API.
732
-
733
- Options:
734
- --verbose, -v Show full JSON response
735
- -bd, --biz-domain <value> Business domain (default: bd_public)
736
- --pretty Pretty-print JSON output (default)`);
792
+ console.log(renderHelp({
793
+ tagline: "Get published agent template details from the agent-factory API.",
794
+ usage: "kweaver agent template-get <template_id> [options]",
795
+ flags: [
796
+ { name: "--verbose, -v", desc: "Show full JSON response" },
797
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
798
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
799
+ ],
800
+ inheritedFlags: "--base-url, --token, --user, --help",
801
+ examples: ["kweaver agent template-get <template_id>"],
802
+ }));
737
803
  return 0;
738
804
  }
739
805
  }
740
806
  if (subcommand === "sessions") {
741
807
  if (rest.length === 1 && (rest[0] === "--help" || rest[0] === "-h")) {
742
- console.log(`kweaver agent sessions <agent_id> [options]
743
-
744
- List all conversations for an agent.
745
-
746
- Options:
747
- --limit <n> Max conversations to return (default: 30)
748
- -bd, --biz-domain <value> Business domain (default: bd_public)
749
- --pretty Pretty-print JSON output (default)`);
808
+ console.log(renderHelp({
809
+ tagline: "List all conversations for an agent.",
810
+ usage: "kweaver agent sessions <agent_id> [options]",
811
+ flags: [
812
+ { name: "--limit <n>", desc: "Max conversations to return (default: 30)" },
813
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
814
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
815
+ ],
816
+ inheritedFlags: "--base-url, --token, --user, --help",
817
+ examples: ["kweaver agent sessions <agent_id>"],
818
+ }));
750
819
  return 0;
751
820
  }
752
821
  }
753
822
  if (subcommand === "history") {
754
823
  if (rest.length === 1 && (rest[0] === "--help" || rest[0] === "-h")) {
755
- console.log(`kweaver agent history <agent_id> <conversation_id> [options]
756
-
757
- Show conversation detail (messages) for an agent.
758
-
759
- Options:
760
- -bd, --biz-domain <value> Business domain (default: bd_public)
761
- --pretty Pretty-print JSON output (default)`);
824
+ console.log(renderHelp({
825
+ tagline: "Show conversation detail (messages) for an agent.",
826
+ usage: "kweaver agent history <agent_id> <conversation_id> [options]",
827
+ flags: [
828
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
829
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
830
+ ],
831
+ inheritedFlags: "--base-url, --token, --user, --help",
832
+ examples: ["kweaver agent history <agent_id> <conversation_id>"],
833
+ }));
762
834
  return 0;
763
835
  }
764
836
  }
765
837
  if (subcommand === "trace") {
766
838
  if (rest.length === 1 && (rest[0] === "--help" || rest[0] === "-h")) {
767
- console.log(`kweaver agent trace <conversation_id> [options]
768
- kweaver agent trace <agent_id> <conversation_id> [options] (legacy)
769
-
770
- Get trace data for a conversation.
771
-
772
- Options:
773
- --view tree|perf|evidence|reasoning|all Render style (default: tree)
774
- --json Emit raw TracesByConversationResult JSON
775
- --pretty Pretty-print JSON output (default)
776
- --compact Compact JSON output`);
839
+ console.log(renderHelp({
840
+ tagline: "Get trace data for a conversation.",
841
+ usage: [
842
+ "kweaver agent trace <conversation_id> [options]",
843
+ "kweaver agent trace <agent_id> <conversation_id> [options] (legacy)",
844
+ ],
845
+ flags: [
846
+ { name: "--view tree|perf|evidence|reasoning|all", desc: "Render style (default: tree)" },
847
+ { name: "--json", desc: "Emit raw TracesByConversationResult JSON" },
848
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
849
+ { name: "--compact", desc: "Compact JSON output" },
850
+ ],
851
+ inheritedFlags: "--base-url, --token, --user, --help",
852
+ examples: ["kweaver agent trace <conversation_id>"],
853
+ }));
777
854
  return 0;
778
855
  }
779
856
  }
@@ -868,15 +945,18 @@ async function runAgentGetCommand(args) {
868
945
  }
869
946
  catch (error) {
870
947
  if (error instanceof Error && error.message === "help") {
871
- console.log(`kweaver agent get <agent_id> [options]
872
-
873
- Get agent details from the agent-factory API.
874
-
875
- Options:
876
- --verbose, -v Show full JSON response
877
- -bd, --biz-domain <value> Business domain (default: bd_public)
878
- --pretty Pretty-print JSON output (default)
879
- --save-config <path> Save config to file with timestamp (output: <path-with-timestamp>)`);
948
+ console.log(renderHelp({
949
+ tagline: "Get agent details from the agent-factory API.",
950
+ usage: "kweaver agent get <agent_id> [options]",
951
+ flags: [
952
+ { name: "--verbose, -v", desc: "Show full JSON response" },
953
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
954
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
955
+ { name: "--save-config <path>", desc: "Save config to file with timestamp (output: <path-with-timestamp>)" },
956
+ ],
957
+ inheritedFlags: "--base-url, --token, --user, --help",
958
+ examples: ["kweaver agent get <agent_id>"],
959
+ }));
880
960
  return 0;
881
961
  }
882
962
  console.error(formatHttpError(error));
@@ -891,12 +971,12 @@ Options:
891
971
  businessDomain: options.businessDomain,
892
972
  });
893
973
  if (body) {
894
- // 如果指定了 --save-config,保存 config 到文件(带时间戳)
974
+ // Save only the agent config object when --save-config is provided.
895
975
  if (options.saveConfig) {
896
976
  const parsed = JSON.parse(body);
897
977
  const config = parsed.config ?? {};
898
978
  const timestampedPath = generateTimestampedPath(options.saveConfig);
899
- // 确保目录存在
979
+ // Ensure the output directory exists.
900
980
  const dir = dirname(timestampedPath);
901
981
  await fs.mkdir(dir, { recursive: true });
902
982
  await fs.writeFile(timestampedPath, JSON.stringify(config, null, 2), "utf-8");
@@ -919,20 +999,23 @@ async function runAgentListCommand(args) {
919
999
  }
920
1000
  catch (error) {
921
1001
  if (error instanceof Error && error.message === "help") {
922
- console.log(`kweaver agent list [options]
923
-
924
- List published agents from the agent-factory API.
925
-
926
- Options:
927
- --name <text> Filter by name
928
- --offset <n> Pagination offset (default: 0)
929
- --limit <n> Max items to return (default: 30)
930
- --category-id <id> Filter by category
931
- --custom-space-id <id> Filter by custom space
932
- --is-to-square <0|1> Is to square (default: 1)
933
- --verbose, -v Show full JSON response
934
- -bd, --biz-domain <value> Business domain (default: bd_public)
935
- --pretty Pretty-print JSON output (applies to both modes)`);
1002
+ console.log(renderHelp({
1003
+ tagline: "List published agents from the agent-factory API.",
1004
+ usage: "kweaver agent list [options]",
1005
+ flags: [
1006
+ { name: "--name <text>", desc: "Filter by name" },
1007
+ { name: "--offset <n>", desc: "Pagination offset (default: 0)" },
1008
+ { name: "--limit <n>", desc: "Max items to return (default: 30)" },
1009
+ { name: "--category-id <id>", desc: "Filter by category" },
1010
+ { name: "--custom-space-id <id>", desc: "Filter by custom space" },
1011
+ { name: "--is-to-square <0|1>", desc: "Is to square (default: 1)" },
1012
+ { name: "--verbose, -v", desc: "Show full JSON response" },
1013
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
1014
+ { name: "--pretty", desc: "Pretty-print JSON output (applies to both modes)" },
1015
+ ],
1016
+ inheritedFlags: "--base-url, --token, --user, --help",
1017
+ examples: ["kweaver agent list"],
1018
+ }));
936
1019
  return 0;
937
1020
  }
938
1021
  console.error(formatHttpError(error));
@@ -968,14 +1051,17 @@ async function runAgentSessionsCommand(args) {
968
1051
  }
969
1052
  catch (error) {
970
1053
  if (error instanceof Error && error.message === "help") {
971
- console.log(`kweaver agent sessions <agent_id> [options]
972
-
973
- List all conversations for an agent.
974
-
975
- Options:
976
- --limit <n> Max conversations to return (default: 30)
977
- -bd, --biz-domain <value> Business domain (default: bd_public)
978
- --pretty Pretty-print JSON output (default)`);
1054
+ console.log(renderHelp({
1055
+ tagline: "List all conversations for an agent.",
1056
+ usage: "kweaver agent sessions <agent_id> [options]",
1057
+ flags: [
1058
+ { name: "--limit <n>", desc: "Max conversations to return (default: 30)" },
1059
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
1060
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
1061
+ ],
1062
+ inheritedFlags: "--base-url, --token, --user, --help",
1063
+ examples: ["kweaver agent sessions <agent_id>"],
1064
+ }));
979
1065
  return 0;
980
1066
  }
981
1067
  console.error(formatHttpError(error));
@@ -1021,13 +1107,16 @@ async function runAgentHistoryCommand(args) {
1021
1107
  }
1022
1108
  catch (error) {
1023
1109
  if (error instanceof Error && error.message === "help") {
1024
- console.log(`kweaver agent history <agent_id> <conversation_id> [options]
1025
-
1026
- Show conversation detail (messages) for an agent.
1027
-
1028
- Options:
1029
- -bd, --biz-domain <value> Business domain (default: bd_public)
1030
- --pretty Pretty-print JSON output (default)`);
1110
+ console.log(renderHelp({
1111
+ tagline: "Show conversation detail (messages) for an agent.",
1112
+ usage: "kweaver agent history <agent_id> <conversation_id> [options]",
1113
+ flags: [
1114
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
1115
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
1116
+ ],
1117
+ inheritedFlags: "--base-url, --token, --user, --help",
1118
+ examples: ["kweaver agent history <agent_id> <conversation_id>"],
1119
+ }));
1031
1120
  return 0;
1032
1121
  }
1033
1122
  console.error(formatHttpError(error));
@@ -1074,18 +1163,21 @@ async function runAgentTraceCommand(args) {
1074
1163
  }
1075
1164
  catch (error) {
1076
1165
  if (error instanceof Error && error.message === "help") {
1077
- console.log(`kweaver agent trace <conversation_id> [options]
1078
- kweaver agent trace <agent_id> <conversation_id> [options] (legacy)
1079
-
1080
- Get trace data for a conversation. Spans are fetched from trace-ai via a 2-jump
1081
- lookup that recovers pipeline spans (HTTP entry, internal RPCs, prompt-build)
1082
- which the simpler /by-conversation endpoint omits.
1083
-
1084
- Options:
1085
- --view tree|perf|evidence|reasoning|all Render style (default: tree)
1086
- --json Emit raw TracesByConversationResult JSON
1087
- --pretty Pretty-print JSON output (default)
1088
- --compact Compact JSON output`);
1166
+ console.log(renderHelp({
1167
+ tagline: "Get trace data for a conversation. Spans are fetched from trace-ai via a 2-jump lookup that recovers pipeline spans (HTTP entry, internal RPCs, prompt-build) which the simpler /by-conversation endpoint omits.",
1168
+ usage: "kweaver agent trace <conversation_id> [options]",
1169
+ flags: [
1170
+ { name: "--view tree|perf|evidence|reasoning|all", desc: "Render style (default: tree)" },
1171
+ { name: "--json", desc: "Emit raw TracesByConversationResult JSON" },
1172
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
1173
+ { name: "--compact", desc: "Compact JSON output" },
1174
+ ],
1175
+ inheritedFlags: "--base-url, --token, --user, --help",
1176
+ examples: [
1177
+ "kweaver agent trace <conversation_id>",
1178
+ "kweaver agent trace <agent_id> <conversation_id> (legacy)",
1179
+ ],
1180
+ }));
1089
1181
  return 0;
1090
1182
  }
1091
1183
  console.error(formatHttpError(error));
@@ -1146,25 +1238,29 @@ async function runAgentCreateCommand(args) {
1146
1238
  let llmMaxTokens = 4096;
1147
1239
  let businessDomain = "";
1148
1240
  let configStr = "";
1241
+ let explicitMode;
1149
1242
  for (let i = 0; i < args.length; i += 1) {
1150
1243
  const arg = args[i];
1151
1244
  if (arg === "--help" || arg === "-h") {
1152
- console.log(`kweaver agent create --name <name> --profile <profile> [options]
1153
-
1154
- Create a new agent.
1155
-
1156
- Required (when --config is not provided):
1157
- --name <text> Agent name (max 50)
1158
- --profile <text> Agent description (max 500)
1159
-
1160
- Optional:
1161
- --key <text> Agent unique key (auto-generated if omitted)
1162
- --product-key <text> Product key: dip, AnyShare, ChatBI (default: dip)
1163
- --system-prompt <text> System prompt
1164
- --llm-id <id> LLM model ID (required for public API)
1165
- --llm-max-tokens <n> LLM max tokens (default: 4096)
1166
- --config <json|path> Full config object as JSON string or file path (overrides individual config options)
1167
- -bd, --biz-domain <val> Business domain (default: bd_public)`);
1245
+ console.log(renderHelp({
1246
+ tagline: "Create a new agent.",
1247
+ usage: "kweaver agent create --name <name> --profile <profile> [options]",
1248
+ flags: [
1249
+ { name: "--name <text>", desc: "Agent name (max 50) [required when --config not provided]" },
1250
+ { name: "--profile <text>", desc: "Agent description (max 500) [required when --config not provided]" },
1251
+ { name: "--key <text>", desc: "Agent unique key (auto-generated if omitted)" },
1252
+ { name: "--product-key <text>", desc: "Product key: dip, AnyShare, ChatBI (default: dip)" },
1253
+ { name: "--system-prompt <text>", desc: "System prompt" },
1254
+ { name: "--llm-id <id>", desc: "LLM model ID (required for public API)" },
1255
+ { name: "--llm-max-tokens <n>", desc: "LLM max tokens (default: 4096)" },
1256
+ { name: "--mode <mode>", desc: "Agent mode: default, dolphin, react (default: default)" },
1257
+ { name: "--config <json|path>", desc: "Full config object as JSON string or file path (overrides individual config options)" },
1258
+ { name: "-bd, --biz-domain <val>", desc: "Business domain (default: bd_public)" },
1259
+ ],
1260
+ inheritedFlags: "--base-url, --token, --user, --help",
1261
+ examples: ["kweaver agent create --name MyAgent --profile \"desc\""],
1262
+ learnMore: [AGENT_MODE_HELP],
1263
+ }));
1168
1264
  return 0;
1169
1265
  }
1170
1266
  if (arg === "--name") {
@@ -1195,6 +1291,17 @@ Optional:
1195
1291
  llmMaxTokens = parseInt(args[++i] ?? "4096", 10);
1196
1292
  continue;
1197
1293
  }
1294
+ if (arg === "--mode") {
1295
+ const value = args[++i] ?? "";
1296
+ try {
1297
+ explicitMode = parseAgentMode(value);
1298
+ }
1299
+ catch (error) {
1300
+ console.error(error instanceof Error ? error.message : String(error));
1301
+ return 1;
1302
+ }
1303
+ continue;
1304
+ }
1198
1305
  if (arg === "--config") {
1199
1306
  configStr = args[++i] ?? "";
1200
1307
  continue;
@@ -1241,13 +1348,19 @@ Optional:
1241
1348
  system_prompt: systemPrompt,
1242
1349
  };
1243
1350
  }
1351
+ try {
1352
+ applyAgentModeToConfig(config, explicitMode);
1353
+ }
1354
+ catch (error) {
1355
+ console.error(error instanceof Error ? error.message : String(error));
1356
+ return 1;
1357
+ }
1244
1358
  const payload = {
1245
1359
  name,
1246
1360
  profile,
1247
1361
  avatar_type: 1,
1248
1362
  avatar: "icon-dip-agent-default",
1249
1363
  product_key: productKey,
1250
- product_name: "DIP",
1251
1364
  config,
1252
1365
  };
1253
1366
  if (key)
@@ -1276,41 +1389,81 @@ Optional:
1276
1389
  // ── Update ───────────────────────────────────────────────────────────────────
1277
1390
  async function runAgentUpdateCommand(args) {
1278
1391
  const agentId = args[0];
1392
+ if (agentId === "--help" || agentId === "-h") {
1393
+ console.log(renderHelp({
1394
+ tagline: "Update an existing agent.",
1395
+ usage: "kweaver agent update <agent_id> [options]",
1396
+ flags: [
1397
+ { name: "--name <text>", desc: "Agent name" },
1398
+ { name: "--profile <text>", desc: "Agent description" },
1399
+ { name: "--system-prompt <text>", desc: "System prompt" },
1400
+ { name: "--knowledge-network-id <id>", desc: "Knowledge network ID" },
1401
+ { name: "--config-path <path>", desc: "Read config object from file, or full agent JSON with config" },
1402
+ { name: "--mode <mode>", desc: "Agent mode: default, dolphin, react (default: default)" },
1403
+ ],
1404
+ inheritedFlags: "--base-url, --token, --user, --help",
1405
+ examples: ["kweaver agent update <agent_id> --name MyAgent"],
1406
+ learnMore: [AGENT_MODE_HELP],
1407
+ }));
1408
+ return 0;
1409
+ }
1279
1410
  if (!agentId || agentId.startsWith("-")) {
1280
- console.error("Usage: kweaver agent update <agent_id> [--name <n>] [--profile <p>] [--system-prompt <sp>] [--knowledge-network-id <id> [--config-path <path>]]");
1411
+ console.error("Usage: kweaver agent update <agent_id> [--name <n>] [--profile <p>] [--system-prompt <sp>] [--mode <mode>] [--knowledge-network-id <id> [--config-path <path>]]");
1281
1412
  return 1;
1282
1413
  }
1283
1414
  let knowledgeNetworkId = null;
1284
1415
  let configPath = null;
1285
- try {
1286
- const token = await ensureValidToken();
1287
- let current;
1288
- let configFromFile = null;
1289
- // 如果指定了 --config-path,从文件读取配置
1290
- if (args.includes("--config-path")) {
1291
- const configPathIndex = args.indexOf("--config-path");
1292
- configPath = args[configPathIndex + 1] ?? "";
1416
+ let explicitMode;
1417
+ for (let i = 1; i < args.length; i += 1) {
1418
+ const arg = args[i];
1419
+ if (arg === "--mode") {
1420
+ const value = args[++i] ?? "";
1421
+ try {
1422
+ explicitMode = parseAgentMode(value);
1423
+ }
1424
+ catch (error) {
1425
+ console.error(error instanceof Error ? error.message : String(error));
1426
+ return 1;
1427
+ }
1428
+ continue;
1429
+ }
1430
+ if (arg === "--config-path") {
1431
+ configPath = args[++i] ?? "";
1293
1432
  if (!configPath || configPath.startsWith("-")) {
1294
1433
  console.error("Missing value for --config-path flag");
1295
1434
  return 1;
1296
1435
  }
1436
+ continue;
1437
+ }
1438
+ }
1439
+ try {
1440
+ let current;
1441
+ let configFromFile = null;
1442
+ // Read config from file before fetching the current agent so invalid local config fails early.
1443
+ if (configPath) {
1297
1444
  try {
1298
1445
  const fileContent = await fs.readFile(configPath, "utf-8");
1299
- configFromFile = JSON.parse(fileContent);
1446
+ configFromFile = normalizeAgentConfigInput(JSON.parse(fileContent));
1447
+ if (!explicitMode) {
1448
+ applyAgentModeToConfig(configFromFile);
1449
+ }
1300
1450
  }
1301
1451
  catch (error) {
1302
- console.error(`Failed to read config from ${configPath}: ${error}`);
1452
+ console.error(error instanceof Error && error.message.startsWith("config.mode")
1453
+ ? error.message
1454
+ : `Failed to read config from ${configPath}: ${error}`);
1303
1455
  return 1;
1304
1456
  }
1305
1457
  }
1306
- // 从API获取当前 agent 配置
1458
+ const token = await ensureValidToken();
1459
+ // Fetch the current agent for read-modify-write updates.
1307
1460
  const currentRaw = await getAgent({
1308
1461
  baseUrl: token.baseUrl,
1309
1462
  accessToken: token.accessToken,
1310
1463
  agentId,
1311
1464
  });
1312
1465
  current = JSON.parse(currentRaw);
1313
- // 如果从文件读取了 config,合并到 current
1466
+ // Replace only current.config when a config file was provided.
1314
1467
  if (configFromFile) {
1315
1468
  current.config = configFromFile;
1316
1469
  }
@@ -1324,6 +1477,14 @@ async function runAgentUpdateCommand(args) {
1324
1477
  current.profile = args[++i] ?? current.profile;
1325
1478
  continue;
1326
1479
  }
1480
+ if (arg === "--mode") {
1481
+ i += 1;
1482
+ continue;
1483
+ }
1484
+ if (arg === "--config-path") {
1485
+ i += 1;
1486
+ continue;
1487
+ }
1327
1488
  if (arg === "--system-prompt") {
1328
1489
  const config = (current.config ?? {});
1329
1490
  config.system_prompt = args[++i] ?? "";
@@ -1339,21 +1500,28 @@ async function runAgentUpdateCommand(args) {
1339
1500
  continue;
1340
1501
  }
1341
1502
  }
1342
- // 如果指定了 --knowledge-network-id,更新 data_source.knowledge_network
1503
+ // Update config.data_source.knowledge_network when requested.
1343
1504
  if (knowledgeNetworkId) {
1344
1505
  const config = (current.config ?? {});
1345
1506
  const dataSource = (config.data_source ?? {});
1346
- // 获取知识网络名称(如果需要的话,可以查询BKN获取)
1347
1507
  const knowledgeNetwork = [
1348
1508
  {
1349
1509
  knowledge_network_id: knowledgeNetworkId,
1350
- knowledge_network_name: "", // 可选:通过BKN API获取名称
1351
1510
  },
1352
1511
  ];
1353
1512
  dataSource.knowledge_network = knowledgeNetwork;
1354
1513
  config.data_source = dataSource;
1355
1514
  current.config = config;
1356
1515
  }
1516
+ const config = (current.config ?? {});
1517
+ try {
1518
+ applyAgentModeToConfig(config, explicitMode);
1519
+ }
1520
+ catch (error) {
1521
+ console.error(error instanceof Error ? error.message : String(error));
1522
+ return 1;
1523
+ }
1524
+ current.config = config;
1357
1525
  const body = await updateAgent({
1358
1526
  baseUrl: token.baseUrl,
1359
1527
  accessToken: token.accessToken,
@@ -1428,13 +1596,16 @@ async function runAgentPublishCommand(args) {
1428
1596
  continue;
1429
1597
  }
1430
1598
  if (arg === "--help" || arg === "-h") {
1431
- console.log(`kweaver agent publish <agent_id> [options]
1432
-
1433
- Publish an agent.
1434
-
1435
- Options:
1436
- --category-id <id> Category ID for the agent
1437
- -bd, --biz-domain <value> Business domain (default: bd_public)`);
1599
+ console.log(renderHelp({
1600
+ tagline: "Publish an agent.",
1601
+ usage: "kweaver agent publish <agent_id> [options]",
1602
+ flags: [
1603
+ { name: "--category-id <id>", desc: "Category ID for the agent" },
1604
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
1605
+ ],
1606
+ inheritedFlags: "--base-url, --token, --user, --help",
1607
+ examples: ["kweaver agent publish <agent_id>"],
1608
+ }));
1438
1609
  return 0;
1439
1610
  }
1440
1611
  }
@@ -1484,19 +1655,22 @@ async function runAgentPersonalListCommand(args) {
1484
1655
  }
1485
1656
  catch (error) {
1486
1657
  if (error instanceof Error && error.message === "help") {
1487
- console.log(`kweaver agent personal-list [options]
1488
-
1489
- List personal space agents from the agent-factory API.
1490
-
1491
- Options:
1492
- --name <text> Filter by name
1493
- --pagination-marker <str> Pagination marker
1494
- --publish-status <status> Filter by publish status
1495
- --publish-to-be <value> Publish to be filter
1496
- --size <n> Max items to return (default: 48)
1497
- --verbose, -v Show full JSON response
1498
- -bd, --biz-domain <value> Business domain (default: bd_public)
1499
- --pretty Pretty-print JSON output (default)`);
1658
+ console.log(renderHelp({
1659
+ tagline: "List personal space agents from the agent-factory API.",
1660
+ usage: "kweaver agent personal-list [options]",
1661
+ flags: [
1662
+ { name: "--name <text>", desc: "Filter by name" },
1663
+ { name: "--pagination-marker <str>", desc: "Pagination marker" },
1664
+ { name: "--publish-status <status>", desc: "Filter by publish status" },
1665
+ { name: "--publish-to-be <value>", desc: "Publish to be filter" },
1666
+ { name: "--size <n>", desc: "Max items to return (default: 48)" },
1667
+ { name: "--verbose, -v", desc: "Show full JSON response" },
1668
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
1669
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
1670
+ ],
1671
+ inheritedFlags: "--base-url, --token, --user, --help",
1672
+ examples: ["kweaver agent personal-list"],
1673
+ }));
1500
1674
  return 0;
1501
1675
  }
1502
1676
  console.error(formatHttpError(error));
@@ -1532,18 +1706,21 @@ async function runAgentTemplateListCommand(args) {
1532
1706
  }
1533
1707
  catch (error) {
1534
1708
  if (error instanceof Error && error.message === "help") {
1535
- console.log(`kweaver agent template-list [options]
1536
-
1537
- List published agent templates from the agent-factory API.
1538
-
1539
- Options:
1540
- --category-id <id> Filter by category
1541
- --name <text> Filter by name
1542
- --pagination-marker <str> Pagination marker
1543
- --size <n> Max items to return (default: 48)
1544
- --verbose, -v Show full JSON response
1545
- -bd, --biz-domain <value> Business domain (default: bd_public)
1546
- --pretty Pretty-print JSON output (default)`);
1709
+ console.log(renderHelp({
1710
+ tagline: "List published agent templates from the agent-factory API.",
1711
+ usage: "kweaver agent template-list [options]",
1712
+ flags: [
1713
+ { name: "--category-id <id>", desc: "Filter by category" },
1714
+ { name: "--name <text>", desc: "Filter by name" },
1715
+ { name: "--pagination-marker <str>", desc: "Pagination marker" },
1716
+ { name: "--size <n>", desc: "Max items to return (default: 48)" },
1717
+ { name: "--verbose, -v", desc: "Show full JSON response" },
1718
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
1719
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
1720
+ ],
1721
+ inheritedFlags: "--base-url, --token, --user, --help",
1722
+ examples: ["kweaver agent template-list"],
1723
+ }));
1547
1724
  return 0;
1548
1725
  }
1549
1726
  console.error(formatHttpError(error));
@@ -1578,15 +1755,18 @@ async function runAgentTemplateGetCommand(args) {
1578
1755
  }
1579
1756
  catch (error) {
1580
1757
  if (error instanceof Error && error.message === "help") {
1581
- console.log(`kweaver agent template-get <template_id> [options]
1582
-
1583
- Get published agent template details from the agent-factory API.
1584
-
1585
- Options:
1586
- --verbose, -v Show full JSON response
1587
- -bd, --biz-domain <value> Business domain (default: bd_public)
1588
- --pretty Pretty-print JSON output (default)
1589
- --save-config <path> Save config to file with timestamp (output: <path-with-timestamp>)`);
1758
+ console.log(renderHelp({
1759
+ tagline: "Get published agent template details from the agent-factory API.",
1760
+ usage: "kweaver agent template-get <template_id> [options]",
1761
+ flags: [
1762
+ { name: "--verbose, -v", desc: "Show full JSON response" },
1763
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
1764
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
1765
+ { name: "--save-config <path>", desc: "Save config to file with timestamp (output: <path-with-timestamp>)" },
1766
+ ],
1767
+ inheritedFlags: "--base-url, --token, --user, --help",
1768
+ examples: ["kweaver agent template-get <template_id>"],
1769
+ }));
1590
1770
  return 0;
1591
1771
  }
1592
1772
  console.error(formatHttpError(error));
@@ -1601,12 +1781,12 @@ Options:
1601
1781
  businessDomain: options.businessDomain,
1602
1782
  });
1603
1783
  if (body) {
1604
- // 如果指定了 --save-config,保存 config 到文件(带时间戳)
1784
+ // Save only the template config object when --save-config is provided.
1605
1785
  if (options.saveConfig) {
1606
1786
  const parsed = JSON.parse(body);
1607
1787
  const config = parsed.config ?? {};
1608
1788
  const timestampedPath = generateTimestampedPath(options.saveConfig);
1609
- // 确保目录存在
1789
+ // Ensure the output directory exists.
1610
1790
  const dir = dirname(timestampedPath);
1611
1791
  await fs.mkdir(dir, { recursive: true });
1612
1792
  await fs.writeFile(timestampedPath, JSON.stringify(config, null, 2), "utf-8");
@@ -1630,14 +1810,17 @@ async function runAgentCategoryListCommand(args) {
1630
1810
  for (let i = 0; i < args.length; i += 1) {
1631
1811
  const arg = args[i];
1632
1812
  if (arg === "--help" || arg === "-h") {
1633
- console.log(`kweaver agent category-list [options]
1634
-
1635
- List agent categories from the agent-factory API.
1636
-
1637
- Options:
1638
- --verbose, -v Show full JSON response
1639
- -bd, --biz-domain <value> Business domain (default: bd_public)
1640
- --pretty Pretty-print JSON output (default)`);
1813
+ console.log(renderHelp({
1814
+ tagline: "List agent categories from the agent-factory API.",
1815
+ usage: "kweaver agent category-list [options]",
1816
+ flags: [
1817
+ { name: "--verbose, -v", desc: "Show full JSON response" },
1818
+ { name: "-bd, --biz-domain <value>", desc: "Business domain (default: bd_public)" },
1819
+ { name: "--pretty", desc: "Pretty-print JSON output (default)" },
1820
+ ],
1821
+ inheritedFlags: "--base-url, --token, --user, --help",
1822
+ examples: ["kweaver agent category-list"],
1823
+ }));
1641
1824
  return 0;
1642
1825
  }
1643
1826
  if (arg === "-bd" || arg === "--biz-domain") {