@armadra/agent 0.6.2 → 0.6.4

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 (147) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/CHANGELOG.zh-CN.md +59 -0
  3. package/README.md +168 -575
  4. package/README.zh-CN.md +165 -596
  5. package/dist/agent/queue.d.ts +9 -0
  6. package/dist/agent/queue.js +27 -0
  7. package/dist/agent/session-subagent.d.ts +1 -0
  8. package/dist/agent/session-subagent.js +9 -0
  9. package/dist/agent/session.d.ts +11 -0
  10. package/dist/agent/session.js +29 -2
  11. package/dist/agent/subagent-background.d.ts +75 -0
  12. package/dist/agent/subagent-background.js +209 -0
  13. package/dist/agent/subagent-direct.d.ts +5 -2
  14. package/dist/agent/subagent-direct.js +34 -1
  15. package/dist/agent/subagent-registry.d.ts +26 -6
  16. package/dist/agent/subagent-registry.js +66 -94
  17. package/dist/agent/types-w5.d.ts +11 -1
  18. package/dist/agent/types.d.ts +12 -0
  19. package/dist/agents/builtin.js +0 -1
  20. package/dist/agents/external.js +0 -1
  21. package/dist/agents/parse.js +4 -3
  22. package/dist/agents/result.d.ts +7 -1
  23. package/dist/agents/result.js +20 -1
  24. package/dist/agents/task-control.d.ts +13 -2
  25. package/dist/agents/task-record.d.ts +16 -4
  26. package/dist/agents/task-record.js +32 -0
  27. package/dist/agents/types.d.ts +5 -1
  28. package/dist/ai/apis/chatgpt-rate-limits.js +7 -2
  29. package/dist/ai/providers/discovered-cache.d.ts +10 -4
  30. package/dist/ai/providers/discovered-cache.js +30 -14
  31. package/dist/ai/types.d.ts +2 -1
  32. package/dist/auth/chatgpt/backend-client.d.ts +6 -5
  33. package/dist/auth/chatgpt/backend-client.js +8 -7
  34. package/dist/bundle/ama.cjs +2034 -552
  35. package/dist/cli/compose-agents.d.ts +2 -1
  36. package/dist/cli/compose-agents.js +11 -2
  37. package/dist/cli/subcommands/models-discover.d.ts +1 -0
  38. package/dist/cli/subcommands/models-discover.js +12 -2
  39. package/dist/config/json-schema.js +10 -2
  40. package/dist/config/key-docs.js +9 -2
  41. package/dist/config/merge.d.ts +1 -1
  42. package/dist/config/merge.js +20 -3
  43. package/dist/config/schema-w5.js +4 -2
  44. package/dist/config/schema.js +4 -0
  45. package/dist/config/settings-registry.js +5 -0
  46. package/dist/config/types-w5.d.ts +10 -0
  47. package/dist/config/types-w5.js +2 -0
  48. package/dist/config/types.d.ts +5 -1
  49. package/dist/drivers/runner.js +29 -2
  50. package/dist/git/info.d.ts +19 -0
  51. package/dist/git/info.js +64 -8
  52. package/dist/i18n/catalog.d.ts +58 -8
  53. package/dist/i18n/messages/agents.d.ts +60 -0
  54. package/dist/i18n/messages/agents.js +62 -2
  55. package/dist/i18n/messages/config-keys.d.ts +8 -0
  56. package/dist/i18n/messages/config-keys.js +18 -10
  57. package/dist/i18n/messages/config.d.ts +8 -0
  58. package/dist/i18n/messages/interactive-startup.d.ts +0 -16
  59. package/dist/i18n/messages/interactive-startup.js +0 -16
  60. package/dist/i18n/messages/interactive-view.d.ts +8 -0
  61. package/dist/i18n/messages/interactive-view.js +10 -0
  62. package/dist/i18n/messages/interactive.d.ts +33 -16
  63. package/dist/i18n/messages/interactive.js +31 -0
  64. package/dist/i18n/messages/print.d.ts +4 -0
  65. package/dist/i18n/messages/print.js +4 -0
  66. package/dist/i18n/messages/report.d.ts +8 -0
  67. package/dist/i18n/messages/report.js +12 -4
  68. package/dist/i18n/messages/settings.d.ts +8 -0
  69. package/dist/i18n/messages/settings.js +8 -0
  70. package/dist/i18n/messages/subcommands-config.d.ts +4 -0
  71. package/dist/i18n/messages/subcommands-config.js +4 -0
  72. package/dist/i18n/messages/subcommands.d.ts +4 -0
  73. package/dist/index.d.ts +1 -0
  74. package/dist/modes/commands-core.js +19 -4
  75. package/dist/modes/interactive/agent-bar.d.ts +3 -1
  76. package/dist/modes/interactive/agent-bar.js +12 -5
  77. package/dist/modes/interactive/agent-ui.d.ts +21 -3
  78. package/dist/modes/interactive/agent-ui.js +82 -12
  79. package/dist/modes/interactive/agent-view.d.ts +9 -0
  80. package/dist/modes/interactive/agent-view.js +28 -4
  81. package/dist/modes/interactive/approval-dock.d.ts +51 -0
  82. package/dist/modes/interactive/approval-dock.js +112 -0
  83. package/dist/modes/interactive/approval-ui.d.ts +43 -0
  84. package/dist/modes/interactive/approval-ui.js +64 -0
  85. package/dist/modes/interactive/commands.js +4 -1
  86. package/dist/modes/interactive/event-notices.d.ts +6 -1
  87. package/dist/modes/interactive/event-notices.js +7 -1
  88. package/dist/modes/interactive/interactive-mode.d.ts +4 -2
  89. package/dist/modes/interactive/interactive-mode.js +46 -39
  90. package/dist/modes/interactive/interrupt-send.d.ts +25 -0
  91. package/dist/modes/interactive/interrupt-send.js +32 -0
  92. package/dist/modes/interactive/key-dispatch.d.ts +29 -5
  93. package/dist/modes/interactive/key-dispatch.js +97 -8
  94. package/dist/modes/interactive/line/line-mode.d.ts +1 -0
  95. package/dist/modes/interactive/line/line-mode.js +34 -7
  96. package/dist/modes/interactive/run-indicator.d.ts +34 -2
  97. package/dist/modes/interactive/run-indicator.js +62 -8
  98. package/dist/modes/interactive/session-events.js +5 -1
  99. package/dist/modes/interactive/startup-header.d.ts +29 -14
  100. package/dist/modes/interactive/startup-header.js +93 -59
  101. package/dist/modes/interactive/startup-logo.d.ts +83 -0
  102. package/dist/modes/interactive/startup-logo.js +183 -0
  103. package/dist/modes/interactive/status-area.d.ts +18 -0
  104. package/dist/modes/interactive/status-area.js +67 -1
  105. package/dist/modes/interactive/status-bar.d.ts +13 -2
  106. package/dist/modes/interactive/status-bar.js +60 -17
  107. package/dist/modes/interactive/status-line.d.ts +11 -8
  108. package/dist/modes/interactive/status-line.js +52 -39
  109. package/dist/modes/interactive/status-quota.d.ts +58 -0
  110. package/dist/modes/interactive/status-quota.js +155 -0
  111. package/dist/modes/interactive/subagent-view.d.ts +1 -0
  112. package/dist/modes/interactive/subagent-view.js +8 -0
  113. package/dist/modes/interactive/task-background.d.ts +31 -0
  114. package/dist/modes/interactive/task-background.js +68 -0
  115. package/dist/modes/interactive/tool-view.d.ts +7 -1
  116. package/dist/modes/interactive/tool-view.js +24 -1
  117. package/dist/modes/print/print-mode.d.ts +11 -0
  118. package/dist/modes/print/print-mode.js +36 -1
  119. package/dist/modes/rpc/commands.d.ts +4 -1
  120. package/dist/modes/rpc/commands.js +24 -2
  121. package/dist/rpc.d.ts +20 -0
  122. package/dist/rpc.js +3 -0
  123. package/dist/tools/task-ctl.d.ts +2 -0
  124. package/dist/tools/task-ctl.js +7 -2
  125. package/dist/tools/task.d.ts +11 -0
  126. package/dist/tools/task.js +20 -2
  127. package/dist/tools/types.d.ts +6 -0
  128. package/dist/tui/components/editor.d.ts +2 -0
  129. package/dist/tui/components/editor.js +4 -0
  130. package/dist/tui/components/loader.d.ts +5 -1
  131. package/dist/tui/components/loader.js +18 -5
  132. package/dist/tui/keybindings.d.ts +15 -3
  133. package/dist/tui/keybindings.js +15 -3
  134. package/docs/agents.md +52 -28
  135. package/docs/en/host-api.md +5 -1
  136. package/docs/en/providers.md +1 -1
  137. package/docs/en/rpc.md +28 -14
  138. package/docs/en/sessions.md +3 -1
  139. package/docs/en/tui.md +106 -70
  140. package/docs/host-api.md +5 -1
  141. package/docs/providers.md +4 -2
  142. package/docs/rpc.md +28 -14
  143. package/docs/session-format.md +1 -1
  144. package/docs/sessions.md +2 -1
  145. package/docs/tui-design.md +42 -29
  146. package/docs/tui.md +106 -70
  147. package/package.json +1 -1
@@ -3,9 +3,13 @@
3
3
  *
4
4
  * 模型表为空、接受任意 slug 的供应商(`chatgpt` 的订阅后端)在选择器里原本一个模型都看不到。
5
5
  * `ama auth login chatgpt` 成功后与 `ama models discover chatgpt` 把账户可用的 slug 写进这里;组装注册表时
6
- * (`mergeDiscoveredModels`)并入**模型表仍为空**的供应商,元数据用 models.dev(快照 ⊕ 用户刷新)补全。
7
- * `ama auth logout chatgpt` 删掉它。只存 slug、显示名、后端给的元数据(codex:上下文窗口、输入模态、推理强度,
8
- * models.dev 补不到时用)、flavor 与时间戳——没有 token、账户 id。
6
+ * (`mergeDiscoveredModels`)并入**模型表仍为空**的供应商。`ama auth logout chatgpt` 删掉它。只存 slug、显示名、
7
+ * 后端给的元数据(上下文窗口、输入模态、推理强度)、flavor 与时间戳——没有 token、账户 id。
8
+ *
9
+ * 元数据优先级:后端明确给的 > models.dev(快照 ⊕ 用户刷新)> 自定义缺省。上下文窗口尤其如此:订阅后端的生效
10
+ * 窗口(如 codex 的 272k)可能远小于 models.dev 记的 API 版窗口(1.1M),按后者算压缩阈值会让请求超窗被拒。
11
+ * 旧版本写的缓存(siwc 不含上下文窗口)照旧用 models.dev;`chatgpt` 两边都没有时用保守缺省
12
+ * `SUBSCRIPTION_FALLBACK_CONTEXT_WINDOW`,不让自动压缩关闭。
9
13
  *
10
14
  * ChatGPT 的缓存带登录 flavor;组装时与当前登录的 flavor 不符视为过期、不并入(选择器提示重新发现)。
11
15
  */
@@ -93,26 +97,38 @@ export function thinkingMapOf(levels) {
93
97
  map[level] = levels.includes(level) ? level : null;
94
98
  return map;
95
99
  }
96
- /** models.dev 没补上的字段用后端给的元数据。 */
97
- function withBackendMetadata(model, cached, matched) {
98
- if (model.contextWindow === undefined && cached.contextWindow !== undefined)
100
+ /** 订阅后端:models.dev 与后端都没给上下文窗口时的保守缺省。 */
101
+ export const SUBSCRIPTION_FALLBACK_CONTEXT_WINDOW = 128_000;
102
+ const SUBSCRIPTION_PROVIDERS = new Set(["chatgpt"]);
103
+ /** 后端明确给的元数据覆盖 models.dev 补的;没给的字段保留 models.dev 的(maxTokens 只来自 models.dev)。 */
104
+ function withBackendMetadata(model, cached) {
105
+ if (cached.contextWindow !== undefined) {
99
106
  model.contextWindow = cached.contextWindow;
100
- if (matched)
101
- return;
107
+ // models.dev 的输入上限是 API 版的,超过后端窗口就没有意义
108
+ if (model.inputLimit !== undefined && model.inputLimit >= cached.contextWindow)
109
+ delete model.inputLimit;
110
+ }
102
111
  if (cached.input !== undefined)
103
112
  model.input = [...cached.input];
104
- const efforts = (cached.reasoningLevels ?? []).filter((x) => x !== "none");
105
- if (efforts.length > 0) {
113
+ if (cached.reasoningLevels === undefined)
114
+ return;
115
+ if (cached.reasoningLevels.some((x) => x !== "none")) {
106
116
  model.reasoning = true;
107
- model.thinkingLevelMap = thinkingMapOf(cached.reasoningLevels ?? []);
117
+ model.thinkingLevelMap = thinkingMapOf(cached.reasoningLevels);
118
+ }
119
+ else {
120
+ model.reasoning = false;
121
+ delete model.thinkingLevelMap;
108
122
  }
109
123
  }
110
- /** 缓存里的模型 → 注册表模型(models.dev 补元数据,补不到用后端给的,再补不到用自定义缺省)。 */
124
+ /** 缓存里的模型 → 注册表模型(后端给的元数据优先,其次 models.dev,再次自定义缺省)。 */
111
125
  export function discoveredModels(file, provider, modelsDev) {
112
126
  return file.models.map((m) => {
113
- const { entry, metadata } = enrichEntry(m.name ? { id: m.id, name: m.name } : { id: m.id }, modelsDev);
127
+ const { entry } = enrichEntry(m.name ? { id: m.id, name: m.name } : { id: m.id }, modelsDev);
114
128
  const model = withCustomDefaults(entry, provider.id, provider.api);
115
- withBackendMetadata(model, m, metadata.match !== undefined);
129
+ withBackendMetadata(model, m);
130
+ if (model.contextWindow === undefined && SUBSCRIPTION_PROVIDERS.has(provider.id))
131
+ model.contextWindow = SUBSCRIPTION_FALLBACK_CONTEXT_WINDOW;
116
132
  // 只挂发现时登录的 flavor 对应的渠道(订阅后端的另一条渠道用不了,不在说明与 `@` 行里出现);
117
133
  // 缓存没写 flavor 或渠道不存在时用供应商的缺省渠道
118
134
  const names = (provider.channels ?? []).map((c) => c.name);
@@ -136,7 +136,8 @@ export interface SystemMessage {
136
136
  toolsRemoved?: string[];
137
137
  timestamp: number;
138
138
  }
139
- export type KnownMessageOrigin = "steer" | "followUp" | "host";
139
+ /** `interrupt`:打断当前回合并立即发送(`prompt / steer` 的 `interrupt: true`)开的新回合。 */
140
+ export type KnownMessageOrigin = "steer" | "followUp" | "host" | "interrupt";
140
141
  export type MessageOrigin = KnownMessageOrigin | (string & {});
141
142
  export interface UserMessage {
142
143
  role: "user";
@@ -1,12 +1,13 @@
1
1
  /**
2
2
  * ChatGPT 后端的只读查询([W6-O]):模型列表(`ama models discover chatgpt`)与 codex 的 `wham/usage`。
3
3
  *
4
- * - SIWC:`GET {base}/models`,只留 `visibility === "list"`(没有该字段的也留);
4
+ * - SIWC:`GET {base}/models`,只留 `visibility === "list"`(没有该字段的也留);条目若带下述元数据字段同样取;
5
5
  * - codex:`GET {base}/models?client_version=<Codex CLI 版本>`(`codexClientVersion()`;后端按每个模型的
6
6
  * `minimal_client_version` 过滤,发 ama 自己的版本号会一个都拿不到),`models[].slug`(同样按 visibility 筛),
7
- * 另取 `context_window`、`input_modalities`、`supported_reasoning_levels` 作元数据(models.dev 补不到时用);
8
- * `GET https://chatgpt.com/backend-api/wham/usage`(由 codex base 推出),私有格式,解析失败返回 undefined。
9
- * SIWC 只取 slug 与显示名。请求带 Bearer;codex 另带 `ChatGPT-Account-ID` 与 `originator`。
7
+ * 另取 `context_window`、`input_modalities`、`supported_reasoning_levels` 作元数据(后端给了就优先于 models.dev,
8
+ * 见 discovered-cache.ts;`max_context_window` 是可调上限而非生效值、`auto_compact_token_limit` 没有对应的模型字段,
9
+ * 都不取);`GET https://chatgpt.com/backend-api/wham/usage`(由 codex base 推出),私有格式,解析失败返回 undefined。
10
+ * 请求带 Bearer;codex 另带 `ChatGPT-Account-ID` 与 `originator`。
10
11
  */
11
12
  import { type QuotaSnapshot } from "../../ai/apis/chatgpt-rate-limits.js";
12
13
  import type { ChatGptFlavor } from "../../config/types-w6.js";
@@ -23,7 +24,7 @@ export interface BackendAuth {
23
24
  export interface DiscoveredModel {
24
25
  id: string;
25
26
  name?: string;
26
- /** 以下只有 codex 后端给。 */
27
+ /** 以下是后端给的元数据(codex 后端给;SIWC 条目带了也取)。 */
27
28
  contextWindow?: number;
28
29
  input?: ("text" | "image")[];
29
30
  /** 支持的推理强度(`none` / `minimal` / `low` / `medium` / `high` / `xhigh` …)。 */
@@ -1,12 +1,13 @@
1
1
  /**
2
2
  * ChatGPT 后端的只读查询([W6-O]):模型列表(`ama models discover chatgpt`)与 codex 的 `wham/usage`。
3
3
  *
4
- * - SIWC:`GET {base}/models`,只留 `visibility === "list"`(没有该字段的也留);
4
+ * - SIWC:`GET {base}/models`,只留 `visibility === "list"`(没有该字段的也留);条目若带下述元数据字段同样取;
5
5
  * - codex:`GET {base}/models?client_version=<Codex CLI 版本>`(`codexClientVersion()`;后端按每个模型的
6
6
  * `minimal_client_version` 过滤,发 ama 自己的版本号会一个都拿不到),`models[].slug`(同样按 visibility 筛),
7
- * 另取 `context_window`、`input_modalities`、`supported_reasoning_levels` 作元数据(models.dev 补不到时用);
8
- * `GET https://chatgpt.com/backend-api/wham/usage`(由 codex base 推出),私有格式,解析失败返回 undefined。
9
- * SIWC 只取 slug 与显示名。请求带 Bearer;codex 另带 `ChatGPT-Account-ID` 与 `originator`。
7
+ * 另取 `context_window`、`input_modalities`、`supported_reasoning_levels` 作元数据(后端给了就优先于 models.dev,
8
+ * 见 discovered-cache.ts;`max_context_window` 是可调上限而非生效值、`auto_compact_token_limit` 没有对应的模型字段,
9
+ * 都不取);`GET https://chatgpt.com/backend-api/wham/usage`(由 codex base 推出),私有格式,解析失败返回 undefined。
10
+ * 请求带 Bearer;codex 另带 `ChatGPT-Account-ID` 与 `originator`。
10
11
  */
11
12
  import { parseUsagePayload } from "../../ai/apis/chatgpt-rate-limits.js";
12
13
  import { DEFAULT_CODEX_CLIENT_VERSION, DEFAULT_ORIGINATOR } from "./presets.js";
@@ -27,8 +28,8 @@ function listed(item) {
27
28
  const visibility = item["visibility"];
28
29
  return visibility === undefined || visibility === "list";
29
30
  }
30
- /** codex 模型条目里的元数据;字段缺失或形状不对就不填。 */
31
- function codexMetadata(item) {
31
+ /** 模型条目里的元数据;字段缺失或形状不对就不填。 */
32
+ function backendMetadata(item) {
32
33
  const out = {};
33
34
  const window = item["context_window"];
34
35
  if (typeof window === "number" && Number.isInteger(window) && window > 0)
@@ -80,7 +81,7 @@ export async function listChatGptModels(fetchFn, baseUrl, auth) {
80
81
  out.push({
81
82
  id,
82
83
  ...(typeof name === "string" && name !== "" ? { name } : {}),
83
- ...(auth.flavor === "codex" ? codexMetadata(item) : {}),
84
+ ...backendMetadata(item),
84
85
  });
85
86
  }
86
87
  return out;