agency-lang 0.7.0 → 0.7.2

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 (182) hide show
  1. package/dist/lib/agents/agency-agent/agent.agency +169 -28
  2. package/dist/lib/agents/agency-agent/agent.js +579 -152
  3. package/dist/lib/agents/agency-agent/lib/attachments.js +2 -2
  4. package/dist/lib/agents/agency-agent/lib/config.agency +5 -0
  5. package/dist/lib/agents/agency-agent/lib/config.js +11 -0
  6. package/dist/lib/agents/agency-agent/lib/defaultPolicy.agency +106 -0
  7. package/dist/lib/agents/agency-agent/lib/defaultPolicy.js +764 -3
  8. package/dist/lib/agents/agency-agent/lib/modelFilters.js +1 -1
  9. package/dist/lib/agents/agency-agent/lib/resolution.js +4 -4
  10. package/dist/lib/agents/agency-agent/lib/search.js +3 -3
  11. package/dist/lib/agents/agency-agent/lib/settings.js +1 -1
  12. package/dist/lib/agents/agency-agent/lib/utils.js +1 -1
  13. package/dist/lib/agents/agency-agent/shared.agency +22 -0
  14. package/dist/lib/agents/agency-agent/shared.js +160 -3
  15. package/dist/lib/agents/agency-agent/subagents/code.js +1 -1
  16. package/dist/lib/agents/agency-agent/subagents/explorer.js +1 -1
  17. package/dist/lib/agents/agency-agent/subagents/oracle.js +1 -1
  18. package/dist/lib/agents/agency-agent/subagents/research.js +1 -1
  19. package/dist/lib/agents/agency-agent/subagents/review.js +4 -4
  20. package/dist/lib/agents/agency-agent/tests/agentTurn.js +1 -1
  21. package/dist/lib/agents/agency-agent/tests/attachments.js +1 -1
  22. package/dist/lib/agents/agency-agent/tests/attachmentsTurn.js +2 -2
  23. package/dist/lib/agents/agency-agent/tests/gitPolicy.js +3 -3
  24. package/dist/lib/agents/agency-agent/tests/oneShotRounds.agency +20 -0
  25. package/dist/lib/agents/agency-agent/tests/oneShotRounds.js +555 -0
  26. package/dist/lib/agents/agency-agent/tests/oneShotRounds.test.json +9 -0
  27. package/dist/lib/agents/review/agent.js +3 -3
  28. package/dist/lib/cli/doctor.d.ts +8 -0
  29. package/dist/lib/cli/doctor.js +21 -13
  30. package/dist/lib/cli/doctor.test.js +34 -0
  31. package/dist/lib/cli/help.js +1 -5
  32. package/dist/lib/cli/runBundledAgent.d.ts +17 -1
  33. package/dist/lib/cli/runBundledAgent.js +73 -2
  34. package/dist/lib/cli/runBundledAgent.test.d.ts +1 -0
  35. package/dist/lib/cli/runBundledAgent.test.js +96 -0
  36. package/dist/lib/config.d.ts +42 -33
  37. package/dist/lib/config.js +108 -6
  38. package/dist/lib/config.test.js +121 -2
  39. package/dist/lib/ir/prettyPrint.js +25 -4
  40. package/dist/lib/parseCache.js +8 -13
  41. package/dist/lib/parseCache.test.js +5 -8
  42. package/dist/lib/parser.js +5 -12
  43. package/dist/lib/preprocessors/typescriptPreprocessor.d.ts +0 -28
  44. package/dist/lib/preprocessors/typescriptPreprocessor.js +0 -245
  45. package/dist/lib/runtime/configOverrides.d.ts +17 -16
  46. package/dist/lib/runtime/configOverrides.js +27 -16
  47. package/dist/lib/runtime/configOverrides.test.js +116 -2
  48. package/dist/lib/runtime/prompt.js +7 -3
  49. package/dist/lib/runtime/runner.d.ts +2 -2
  50. package/dist/lib/runtime/runner.js +26 -7
  51. package/dist/lib/runtime/state/context.js +9 -2
  52. package/dist/lib/stdlib/llm.d.ts +1 -0
  53. package/dist/lib/stdlib/version.d.ts +1 -1
  54. package/dist/lib/stdlib/version.js +1 -1
  55. package/dist/scripts/agency.d.ts +2 -0
  56. package/dist/scripts/agency.js +55 -12
  57. package/dist/scripts/agency.test.js +73 -1
  58. package/package.json +1 -1
  59. package/stdlib/agency/eval.js +1 -1
  60. package/stdlib/agency.js +1 -1
  61. package/stdlib/agent.agency +9 -9
  62. package/stdlib/agent.js +5 -5
  63. package/stdlib/data/tech/hackernews.js +1 -1
  64. package/stdlib/index.js +15 -15
  65. package/stdlib/llm.agency +2 -1
  66. package/stdlib/llm.js +3 -3
  67. package/stdlib/markdown.js +1 -1
  68. package/stdlib/memory.js +2 -2
  69. package/stdlib/object.js +5 -5
  70. package/stdlib/policy.agency +21 -7
  71. package/stdlib/policy.js +45 -16
  72. package/stdlib/skills.js +1 -1
  73. package/stdlib/strategy.js +3 -3
  74. package/stdlib/thread.js +3 -3
  75. package/stdlib/ui/chart.js +2 -2
  76. package/stdlib/ui/cli.agency +1 -1
  77. package/stdlib/ui/cli.js +1 -1
  78. package/stdlib/ui/layout.js +3 -3
  79. package/stdlib/ui/table.js +2 -2
  80. package/stdlib/ui.js +3 -3
  81. package/dist/lib/agents/docs/cli/cli/agent.md +0 -16
  82. package/dist/lib/agents/docs/cli/cli/compile.md +0 -21
  83. package/dist/lib/agents/docs/cli/cli/coverage.md +0 -112
  84. package/dist/lib/agents/docs/cli/cli/debug.md +0 -41
  85. package/dist/lib/agents/docs/cli/cli/doc.md +0 -98
  86. package/dist/lib/agents/docs/cli/cli/editor-integration.md +0 -44
  87. package/dist/lib/agents/docs/cli/cli/eval-judge.md +0 -72
  88. package/dist/lib/agents/docs/cli/cli/eval.md +0 -194
  89. package/dist/lib/agents/docs/cli/cli/format.md +0 -23
  90. package/dist/lib/agents/docs/cli/cli/index.md +0 -7
  91. package/dist/lib/agents/docs/cli/cli/local.md +0 -92
  92. package/dist/lib/agents/docs/cli/cli/models.md +0 -63
  93. package/dist/lib/agents/docs/cli/cli/optimize.md +0 -338
  94. package/dist/lib/agents/docs/cli/cli/pack.md +0 -56
  95. package/dist/lib/agents/docs/cli/cli/policy.md +0 -23
  96. package/dist/lib/agents/docs/cli/cli/preprocess-and-ast.md +0 -21
  97. package/dist/lib/agents/docs/cli/cli/review.md +0 -16
  98. package/dist/lib/agents/docs/cli/cli/run.md +0 -79
  99. package/dist/lib/agents/docs/cli/cli/schedule.md +0 -89
  100. package/dist/lib/agents/docs/cli/cli/serve.md +0 -52
  101. package/dist/lib/agents/docs/cli/cli/test.md +0 -44
  102. package/dist/lib/agents/docs/cli/cli/trace-and-bundle.md +0 -75
  103. package/dist/lib/agents/docs/cli/cli/typecheck.md +0 -19
  104. package/dist/lib/agents/docs/guide/guide/advanced-types.md +0 -26
  105. package/dist/lib/agents/docs/guide/guide/agency-config-file.md +0 -212
  106. package/dist/lib/agents/docs/guide/guide/agency-packages.md +0 -54
  107. package/dist/lib/agents/docs/guide/guide/agency-stdlib.md +0 -14
  108. package/dist/lib/agents/docs/guide/guide/agency-vs-typescript.md +0 -33
  109. package/dist/lib/agents/docs/guide/guide/attachments.md +0 -56
  110. package/dist/lib/agents/docs/guide/guide/basic-syntax.md +0 -350
  111. package/dist/lib/agents/docs/guide/guide/blocks.md +0 -134
  112. package/dist/lib/agents/docs/guide/guide/build-integration.md +0 -99
  113. package/dist/lib/agents/docs/guide/guide/builtins.md +0 -84
  114. package/dist/lib/agents/docs/guide/guide/callbacks.md +0 -169
  115. package/dist/lib/agents/docs/guide/guide/checkpointing.md +0 -101
  116. package/dist/lib/agents/docs/guide/guide/cli-args.md +0 -190
  117. package/dist/lib/agents/docs/guide/guide/common-functions.md +0 -36
  118. package/dist/lib/agents/docs/guide/guide/compiling-and-running.md +0 -62
  119. package/dist/lib/agents/docs/guide/guide/concurrency.md +0 -108
  120. package/dist/lib/agents/docs/guide/guide/cross-thread-context.md +0 -226
  121. package/dist/lib/agents/docs/guide/guide/custom-providers.md +0 -195
  122. package/dist/lib/agents/docs/guide/guide/debugging.md +0 -67
  123. package/dist/lib/agents/docs/guide/guide/developer-tools.md +0 -90
  124. package/dist/lib/agents/docs/guide/guide/effects-and-raises.md +0 -137
  125. package/dist/lib/agents/docs/guide/guide/effects.md +0 -100
  126. package/dist/lib/agents/docs/guide/guide/error-handling.md +0 -161
  127. package/dist/lib/agents/docs/guide/guide/exercise-1.md +0 -32
  128. package/dist/lib/agents/docs/guide/guide/functions.md +0 -94
  129. package/dist/lib/agents/docs/guide/guide/getting-started.md +0 -35
  130. package/dist/lib/agents/docs/guide/guide/global-var-initialization.md +0 -70
  131. package/dist/lib/agents/docs/guide/guide/global-vs-static.md +0 -76
  132. package/dist/lib/agents/docs/guide/guide/guards.md +0 -134
  133. package/dist/lib/agents/docs/guide/guide/handlers.md +0 -196
  134. package/dist/lib/agents/docs/guide/guide/image-generation.md +0 -113
  135. package/dist/lib/agents/docs/guide/guide/imports-and-packages.md +0 -100
  136. package/dist/lib/agents/docs/guide/guide/interrupts-from-typescript.md +0 -84
  137. package/dist/lib/agents/docs/guide/guide/interrupts-part-2.md +0 -54
  138. package/dist/lib/agents/docs/guide/guide/interrupts.md +0 -139
  139. package/dist/lib/agents/docs/guide/guide/llm-part-2.md +0 -111
  140. package/dist/lib/agents/docs/guide/guide/llm.md +0 -109
  141. package/dist/lib/agents/docs/guide/guide/mcp.md +0 -295
  142. package/dist/lib/agents/docs/guide/guide/memory.md +0 -401
  143. package/dist/lib/agents/docs/guide/guide/message-threads.md +0 -111
  144. package/dist/lib/agents/docs/guide/guide/nodes.md +0 -50
  145. package/dist/lib/agents/docs/guide/guide/observability.md +0 -99
  146. package/dist/lib/agents/docs/guide/guide/partial-application.md +0 -96
  147. package/dist/lib/agents/docs/guide/guide/pattern-matching.md +0 -366
  148. package/dist/lib/agents/docs/guide/guide/policies.md +0 -67
  149. package/dist/lib/agents/docs/guide/guide/schema-parameter-injection.md +0 -101
  150. package/dist/lib/agents/docs/guide/guide/schemas.md +0 -99
  151. package/dist/lib/agents/docs/guide/guide/serving.md +0 -165
  152. package/dist/lib/agents/docs/guide/guide/state-isolation.md +0 -139
  153. package/dist/lib/agents/docs/guide/guide/streaming.md +0 -28
  154. package/dist/lib/agents/docs/guide/guide/tags.md +0 -72
  155. package/dist/lib/agents/docs/guide/guide/testing.md +0 -187
  156. package/dist/lib/agents/docs/guide/guide/troubleshooting.md +0 -86
  157. package/dist/lib/agents/docs/guide/guide/ts-helpers.md +0 -559
  158. package/dist/lib/agents/docs/guide/guide/ts-interop.md +0 -72
  159. package/dist/lib/agents/docs/guide/guide/type-validation.md +0 -187
  160. package/dist/lib/agents/docs/guide/guide/types.md +0 -181
  161. package/dist/lib/agents/docs/guide/guide/unused.md +0 -178
  162. package/dist/lib/agents/docs/guide/guide/unused2.md +0 -258
  163. package/dist/lib/agents/docs/guide/guide/value-parameterized-types.md +0 -186
  164. package/dist/lib/agents/docs/guide/guide/vscode-extension.md +0 -33
  165. package/dist/lib/agents/docs/guide/guide/why-agency.md +0 -323
  166. package/dist/lib/preprocessors/typescriptPreprocessor.config.test.js +0 -327
  167. package/stdlib/browser.js +0 -421
  168. package/stdlib/chart.js +0 -983
  169. package/stdlib/cli.js +0 -1116
  170. package/stdlib/email.js +0 -1104
  171. package/stdlib/imessage.js +0 -377
  172. package/stdlib/keyring.js +0 -803
  173. package/stdlib/layout.js +0 -3657
  174. package/stdlib/oauth.js +0 -862
  175. package/stdlib/schemas.js +0 -223
  176. package/stdlib/search.js +0 -629
  177. package/stdlib/sms.js +0 -419
  178. package/stdlib/table.js +0 -1419
  179. package/stdlib/threads.js +0 -1041
  180. package/stdlib/types.js +0 -222
  181. package/stdlib/validators.js +0 -1606
  182. /package/dist/lib/{preprocessors/typescriptPreprocessor.config.test.d.ts → cli/doctor.test.d.ts} +0 -0
@@ -6,21 +6,13 @@ import {
6
6
  } from "std::agency/local"
7
7
  import { parseArgs } from "std::args"
8
8
  import { map } from "std::array"
9
- import {
10
- clearMessages,
11
- pushMessage,
12
- repl,
13
- clearScreen,
14
- clearHistory,
15
- } from "std::ui/cli"
16
9
  import { today } from "std::date"
17
10
  import { generateImage } from "std::image"
18
11
  import { applyAgentCwd, setAgentCwd } from "std::index"
12
+ import { listHostedModels, hostedModelInfo, setLlmOptions } from "std::llm"
13
+ import { setMemoryId, disableMemory } from "std::memory"
19
14
  import { keys } from "std::object"
20
15
  import { basename, dirname } from "std::path"
21
- import { box, render } from "std::ui/layout"
22
- import { listHostedModels, hostedModelInfo } from "std::llm"
23
- import { setMemoryId, disableMemory } from "std::memory"
24
16
  import {
25
17
  ScopedRuleFields,
26
18
  cliPolicyHandler,
@@ -31,15 +23,38 @@ import { exists } from "std::shell"
31
23
  import { commandsDir, expandSlash } from "std::skills"
32
24
  import { highlight } from "std::syntax"
33
25
  import { cwd, env, isTTY, readStdin, setTitle } from "std::system"
34
- import { Attachment, attachToReply, getCost, getModelCosts, image, systemMessage } from "std::thread"
26
+ import {
27
+ Attachment,
28
+ attachToReply,
29
+ getCost,
30
+ getModelCosts,
31
+ image,
32
+ systemMessage,
33
+ } from "std::thread"
35
34
  import { chooseOption, ChoiceItem } from "std::ui"
35
+ import {
36
+ clearMessages,
37
+ pushMessage,
38
+ repl,
39
+ clearScreen,
40
+ clearHistory,
41
+ } from "std::ui/cli"
42
+ import { box, render } from "std::ui/layout"
36
43
 
37
44
  import { figs, title } from "./images/images.agency"
38
45
  import { detectAttachments, modalityFilter } from "./lib/attachments.agency"
39
- import { POLICY_PATH, HISTORY_PATH, ALWAYS_FIELDS } from "./lib/config.agency"
46
+ import {
47
+ POLICY_PATH,
48
+ SESSION_POLICY_PATH,
49
+ HISTORY_PATH,
50
+ ALWAYS_FIELDS,
51
+ } from "./lib/config.agency"
40
52
  import {
41
53
  minimalAutoApprovePolicy,
42
54
  recommendedAutoApprovePolicy,
55
+ builtinPolicy,
56
+ builtinPolicyNames,
57
+ BUILTIN_POLICIES,
43
58
  } from "./lib/defaultPolicy.agency"
44
59
  import { filterHostedModels, ModelFilters } from "./lib/modelFilters.agency"
45
60
  import { parseModelFlag, knownProviders, Resolved } from "./lib/models.agency"
@@ -66,6 +81,7 @@ import {
66
81
  applyResolved,
67
82
  promoteAll,
68
83
  currentProvider,
84
+ resolveMaxToolCallRounds,
69
85
  } from "./shared.agency"
70
86
  import { codeAgent } from "./subagents/code.agency"
71
87
  import { explorerAgent } from "./subagents/explorer.agency"
@@ -128,6 +144,11 @@ let VERBOSE: boolean = false
128
144
  // scroll-output writes when stdout is destined for a Unix pipe.
129
145
  let _isInteractive: boolean = true
130
146
 
147
+ // The `--policy` argument (a built-in name or a policy-file path), or ""
148
+ // when the flag is absent. Set in main() before `setupSession` runs;
149
+ // consumed there to override the saved policy for this run only.
150
+ let _policyArg: string = ""
151
+
131
152
  // Live tool-call tracing. Always shown in the interactive REPL; in
132
153
  // one-shot mode it's suppressed so piped output is just the reply,
133
154
  // unless the user opts in with `--verbose` / `--debug` (AGENT_DEBUG).
@@ -856,7 +877,12 @@ export def generateImageFile(
856
877
  // writeBinary rejects an absolute filename when dir is set, so split
857
878
  // path into (dir, name); useAgentCwd resolves a relative dir against
858
879
  // the agent cwd (absolute dirs pass through untouched).
859
- const written = writeBinary(basename(path), generated.value.base64, dirname(path), useAgentCwd: true)
880
+ const written = writeBinary(
881
+ basename(path),
882
+ generated.value.base64,
883
+ dirname(path),
884
+ useAgentCwd: true,
885
+ )
860
886
  if (isFailure(written)) {
861
887
  return "Generated the image, but saving to ${path} failed: ${written.error}"
862
888
  }
@@ -921,7 +947,9 @@ export def agentReplyVia(target: string, userMsg: string): string {
921
947
  // every attach and every skip prints a visible line.
922
948
  const detected = modalityFilter(detectAttachments(expanded))
923
949
  for (skippedFile in detected.skipped) {
924
- pushMessage(color.yellow("📎 skipped ${skippedFile.label} (${skippedFile.reason})"))
950
+ pushMessage(
951
+ color.yellow("📎 skipped ${skippedFile.label} (${skippedFile.reason})"),
952
+ )
925
953
  }
926
954
  if (detected.attached.length == 0) {
927
955
  // Deliberate special case: a text-only turn stays a bare string. A
@@ -993,6 +1021,21 @@ def printHeader() {
993
1021
  print(render(data, color: true))
994
1022
  }
995
1023
 
1024
+ // Print `--policy` usage and list the built-in policies (name + one-line
1025
+ // description). Shown when `--policy` is passed with no value.
1026
+ def printPolicyHelp() {
1027
+ print(color.bold("Usage: agency agent --policy <name | path>"))
1028
+ print(
1029
+ "Select the approval policy for this run: a built-in name below, or a path to a policy JSON file.",
1030
+ )
1031
+ print("")
1032
+ print(color.bold("Built-in policies:"))
1033
+ for (p in BUILTIN_POLICIES) {
1034
+ print(" ${color.cyan(p.name)}")
1035
+ print(" ${p.description}")
1036
+ }
1037
+ }
1038
+
996
1039
  def givePolicyChoice() {
997
1040
  const title = "Welcome to the agency agent. Please pick a policy to start."
998
1041
  const body = "Don't worry, you can change this later. The policy just controls how the agent asks for your approval when it wants to do something. You can also create your own custom policy file at ${POLICY_PATH} and the agent will use it automatically."
@@ -1034,25 +1077,66 @@ def setupSession(interactive: boolean): any {
1034
1077
  const projectContext = loadAgentsMd(cwd()) with approve
1035
1078
  _context = "\n\nCurrent date: ${today()}\nCurrent working directory: ${cwd()}${projectContext}"
1036
1079
 
1037
- const policy = parsePolicyFile(POLICY_PATH)
1038
- if (policy is failure(f)) {
1039
- if (f.status == "doesnt-exist") {
1040
- if (interactive) {
1041
- print(color.yellow("No existing policy found at ${POLICY_PATH}."))
1042
- setPolicy(POLICY_PATH, givePolicyChoice())
1080
+ // Which file the handler persists against, and an optional in-memory
1081
+ // policy to start from. Normally the user's saved policy loaded from
1082
+ // POLICY_PATH; a `--policy` override redirects this (see below) so the
1083
+ // saved policy is never read or written.
1084
+ let policyFile = POLICY_PATH
1085
+ let sessionPolicy: any = null
1086
+
1087
+ if (_policyArg != "") {
1088
+ // `--policy` override: a built-in name or a path to a policy file.
1089
+ // The cwd-scoped built-ins pin the launch directory, so we resolve
1090
+ // them against `cwd()` (what `setAgentCwd` just stored, and what the
1091
+ // write/git/bash interrupts resolve their default paths back to).
1092
+ const builtin = builtinPolicy(_policyArg, cwd())
1093
+ if (builtin != null) {
1094
+ // Hand the policy to the handler in memory (no disk write): a
1095
+ // one-off, cwd-scoped override must not clobber the saved policy
1096
+ // or leak into a later run from a different directory. Any new
1097
+ // interactive "always" decision persists to the session file.
1098
+ policyFile = SESSION_POLICY_PATH
1099
+ sessionPolicy = builtin
1100
+ } else {
1101
+ // Not a built-in name — treat it as a policy file path and use it
1102
+ // directly (the handler loads/persists it). Validate up front so a
1103
+ // typo fails fast instead of silently starting from empty.
1104
+ const loaded = parsePolicyFile(_policyArg)
1105
+ if (loaded is failure(f)) {
1106
+ print(
1107
+ color.red(
1108
+ "--policy '${_policyArg}' is neither a built-in policy (${builtinPolicyNames().join(", ")}) nor a readable policy file (${f.status}).",
1109
+ ),
1110
+ )
1111
+ process.exit(1)
1112
+ }
1113
+ policyFile = _policyArg
1114
+ }
1115
+ } else {
1116
+ const policy = parsePolicyFile(POLICY_PATH)
1117
+ if (policy is failure(f)) {
1118
+ if (f.status == "doesnt-exist") {
1119
+ if (interactive) {
1120
+ print(color.yellow("No existing policy found at ${POLICY_PATH}."))
1121
+ setPolicy(POLICY_PATH, givePolicyChoice())
1122
+ } else {
1123
+ setPolicy(POLICY_PATH, recommendedAutoApprovePolicy)
1124
+ }
1043
1125
  } else {
1044
- setPolicy(POLICY_PATH, recommendedAutoApprovePolicy)
1126
+ print(color.red("Failed to load policy: ${JSON.stringify(f.error)}"))
1127
+ process.exit(1)
1045
1128
  }
1046
1129
  } else {
1047
- print(color.red("Failed to load policy: ${JSON.stringify(f.error)}"))
1048
- process.exit(1)
1130
+ setPolicy(POLICY_PATH, policy.value)
1049
1131
  }
1050
- } else {
1051
- setPolicy(POLICY_PATH, policy.value)
1052
1132
  }
1053
1133
  // Bind the handler to a local var so `with handler` parses (the
1054
1134
  // `with` clause only accepts an identifier, not a call expression).
1055
- return cliPolicyHandler(file: POLICY_PATH, fields: ALWAYS_FIELDS)
1135
+ return cliPolicyHandler(
1136
+ file: policyFile,
1137
+ fields: ALWAYS_FIELDS,
1138
+ policy: sessionPolicy,
1139
+ )
1056
1140
  }
1057
1141
 
1058
1142
  // One-shot entry: run a single turn through the same `mainAgent` the
@@ -1170,6 +1254,11 @@ node main() {
1170
1254
  type: "string",
1171
1255
  description: "Route the starting prompt to a named subagent: code, research, oracle, explorer, review (default: coordinator)"
1172
1256
  },
1257
+ policy: {
1258
+ type: "string",
1259
+ optional: true,
1260
+ description: "Approval policy for this run: a built-in name (minimal, recommended, with-writes, with-bash) or a path to a policy JSON file. with-writes/with-bash auto-approve writes (and, for with-bash, shell) scoped to the current directory and its children. Overrides the saved policy without persisting it. Pass --policy with no value to list the built-in policies."
1261
+ },
1173
1262
  local: {
1174
1263
  type: "string",
1175
1264
  optional: true,
@@ -1179,17 +1268,48 @@ node main() {
1179
1268
  type: "string",
1180
1269
  optional: true,
1181
1270
  description: "Deprecated alias for --local."
1271
+ },
1272
+ trace: {
1273
+ type: "string",
1274
+ optional: true,
1275
+ description: "Write an execution trace to this file for debugging (bare --trace writes <runId>.agencytrace in the current directory)"
1276
+ },
1277
+ "log-file": {
1278
+ type: "string",
1279
+ description: "Append structured statelog events (one JSON object per line) to this file for debugging"
1280
+ },
1281
+ "max-tool-call-rounds": {
1282
+ type: "number",
1283
+ description: "Max LLM tool-call rounds before a tool loop halts (default 10 interactive, 50 in one-shot/-p mode)"
1284
+ },
1285
+ "max-tool-result-chars": {
1286
+ type: "number",
1287
+ description: "Max chars of a single tool result fed back to the model (0 disables; default 100000)"
1182
1288
  }
1183
1289
  }
1184
1290
  },
1185
1291
  )
1186
1292
 
1293
+ // NOTE: --trace / --log-file are declared here only for --help and so
1294
+ // parseArgs accepts them. runBundledAgent extracts them from the forwarded
1295
+ // args and passes them to this process as the AGENCY_CONFIG_OVERRIDES env
1296
+ // var, read when the RuntimeContext is constructed — before this main() runs.
1297
+ // Do not re-handle them here.
1298
+
1187
1299
  if (args.flags.debug) {
1188
1300
  AGENT_DEBUG = true
1189
1301
  }
1190
1302
  if (args.flags.verbose) {
1191
1303
  VERBOSE = true
1192
1304
  }
1305
+ // `--policy` is an optional-value flag: a bare `--policy` (no name or
1306
+ // path) prints the usage + the built-in policies and exits, rather than
1307
+ // silently doing nothing.
1308
+ if (args.flags.policy == "") {
1309
+ printPolicyHelp()
1310
+ process.exit(0)
1311
+ }
1312
+ _policyArg = args.flags.policy ?? ""
1193
1313
 
1194
1314
  // Model setup. `--local` (deprecated alias: `--local-model`) is an optional-
1195
1315
  // value flag with three states: absent (null); bare empty-string for guided
@@ -1292,6 +1412,28 @@ node main() {
1292
1412
  const startAgent = args.flags.agent ?? ""
1293
1413
  const wantInteractive = args.flags.interactive
1294
1414
 
1415
+ // Seeded interactive: run the prompt as the first turn, then hand over the
1416
+ // REPL (needs a TTY + query, and not --print). Everything else is one-shot.
1417
+ const seededInteractive = wantInteractive && hasQuery && isTTY() && !args.flags.print
1418
+ const runningOneShot = !seededInteractive && (args.flags.print || hasQuery || !isTTY())
1419
+
1420
+ // Tool-loop caps. One-shot runs (--print / piped / a positional query) have
1421
+ // no REPL to continue an autonomous task, so maxToolCallRounds defaults
1422
+ // higher (resolveMaxToolCallRounds); an explicit --max-tool-call-rounds always
1423
+ // wins. Set as branch-scoped defaults on the root branch BEFORE any subagent
1424
+ // is dispatched, so every (fork-seeded) subagent inherits them. setLlmOptions
1425
+ // merges only present keys, so this never clobbers the model defaults above.
1426
+ // Separate calls, each gated on its own value: setLlmOptions only skips
1427
+ // `undefined`, not `null`, so passing an absent key would clobber the bag.
1428
+ const maxRounds = resolveMaxToolCallRounds(args.flags["max-tool-call-rounds"] ?? null, runningOneShot)
1429
+ if (maxRounds != null) {
1430
+ setLlmOptions({ maxToolCallRounds: maxRounds })
1431
+ }
1432
+ const maxResultChars = args.flags["max-tool-result-chars"]
1433
+ if (maxResultChars != null) {
1434
+ setLlmOptions({ maxToolResultChars: maxResultChars })
1435
+ }
1436
+
1295
1437
  // Validate the target subagent name up front (empty = coordinator).
1296
1438
  if (startAgent != "" && !START_AGENTS.includes(startAgent)) {
1297
1439
  print(
@@ -1308,7 +1450,7 @@ node main() {
1308
1450
  // and exit with no REPL. Without a TTY (or with `--print`) we fall
1309
1451
  // through to one-shot below; `--interactive` with no prompt falls through
1310
1452
  // to the plain REPL.
1311
- if (wantInteractive && hasQuery && isTTY() && !args.flags.print) {
1453
+ if (seededInteractive) {
1312
1454
  setTitle("Agency Agent")
1313
1455
  clearScreen()
1314
1456
  printHeader()
@@ -1352,4 +1494,3 @@ node main() {
1352
1494
  const handler = setupSession(true)
1353
1495
  startInteractive(handler, "", "")
1354
1496
  }
1355
-