@armadra/agent 0.0.0-stage → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/README.md +426 -2
- package/dist/agent/agent.d.ts +56 -0
- package/dist/agent/agent.js +129 -0
- package/dist/agent/loop.d.ts +51 -0
- package/dist/agent/loop.js +158 -0
- package/dist/agent/queue.d.ts +25 -0
- package/dist/agent/queue.js +55 -0
- package/dist/agent/retry.d.ts +22 -0
- package/dist/agent/retry.js +92 -0
- package/dist/agent/schema.d.ts +27 -0
- package/dist/agent/schema.js +186 -0
- package/dist/agent/session-cache.d.ts +100 -0
- package/dist/agent/session-cache.js +511 -0
- package/dist/agent/session-compaction.d.ts +49 -0
- package/dist/agent/session-compaction.js +251 -0
- package/dist/agent/session-core.d.ts +103 -0
- package/dist/agent/session-core.js +7 -0
- package/dist/agent/session-run.d.ts +55 -0
- package/dist/agent/session-run.js +246 -0
- package/dist/agent/session-state.d.ts +39 -0
- package/dist/agent/session-state.js +118 -0
- package/dist/agent/session-subagent.d.ts +54 -0
- package/dist/agent/session-subagent.js +157 -0
- package/dist/agent/session-sync.d.ts +20 -0
- package/dist/agent/session-sync.js +104 -0
- package/dist/agent/session-tools.d.ts +24 -0
- package/dist/agent/session-tools.js +277 -0
- package/dist/agent/session.d.ts +117 -0
- package/dist/agent/session.js +484 -0
- package/dist/agent/system-prompt.d.ts +49 -0
- package/dist/agent/system-prompt.js +121 -0
- package/dist/agent/tool-runner.d.ts +64 -0
- package/dist/agent/tool-runner.js +309 -0
- package/dist/agent/transform.d.ts +26 -0
- package/dist/agent/transform.js +171 -0
- package/dist/agent/types.d.ts +378 -0
- package/dist/agent/types.js +21 -0
- package/dist/ai/apis/anthropic-messages.d.ts +26 -0
- package/dist/ai/apis/anthropic-messages.js +214 -0
- package/dist/ai/apis/anthropic-request.d.ts +42 -0
- package/dist/ai/apis/anthropic-request.js +282 -0
- package/dist/ai/apis/api.d.ts +28 -0
- package/dist/ai/apis/api.js +102 -0
- package/dist/ai/apis/cache-params.d.ts +48 -0
- package/dist/ai/apis/cache-params.js +163 -0
- package/dist/ai/apis/google-generative-ai.d.ts +32 -0
- package/dist/ai/apis/google-generative-ai.js +249 -0
- package/dist/ai/apis/google-request.d.ts +40 -0
- package/dist/ai/apis/google-request.js +255 -0
- package/dist/ai/apis/openai-compat.d.ts +35 -0
- package/dist/ai/apis/openai-compat.js +142 -0
- package/dist/ai/apis/openai-completions.d.ts +28 -0
- package/dist/ai/apis/openai-completions.js +246 -0
- package/dist/ai/apis/openai-request.d.ts +35 -0
- package/dist/ai/apis/openai-request.js +303 -0
- package/dist/ai/apis/openai-responses-request.d.ts +52 -0
- package/dist/ai/apis/openai-responses-request.js +266 -0
- package/dist/ai/apis/openai-responses.d.ts +28 -0
- package/dist/ai/apis/openai-responses.js +303 -0
- package/dist/ai/apis/shared.d.ts +56 -0
- package/dist/ai/apis/shared.js +179 -0
- package/dist/ai/cache/economics.d.ts +24 -0
- package/dist/ai/cache/economics.js +69 -0
- package/dist/ai/cache/fingerprint.d.ts +17 -0
- package/dist/ai/cache/fingerprint.js +39 -0
- package/dist/ai/cache/miss.d.ts +49 -0
- package/dist/ai/cache/miss.js +96 -0
- package/dist/ai/cache/reporting.d.ts +39 -0
- package/dist/ai/cache/reporting.js +102 -0
- package/dist/ai/cache/types.d.ts +94 -0
- package/dist/ai/cache/types.js +19 -0
- package/dist/ai/cache/warmer.d.ts +94 -0
- package/dist/ai/cache/warmer.js +224 -0
- package/dist/ai/context.d.ts +35 -0
- package/dist/ai/context.js +114 -0
- package/dist/ai/cost.d.ts +21 -0
- package/dist/ai/cost.js +60 -0
- package/dist/ai/event-stream.d.ts +33 -0
- package/dist/ai/event-stream.js +101 -0
- package/dist/ai/fake/fake-provider.d.ts +68 -0
- package/dist/ai/fake/fake-provider.js +278 -0
- package/dist/ai/fake/fake-script.d.ts +69 -0
- package/dist/ai/fake/fake-script.js +142 -0
- package/dist/ai/http.d.ts +54 -0
- package/dist/ai/http.js +212 -0
- package/dist/ai/json-partial.d.ts +17 -0
- package/dist/ai/json-partial.js +243 -0
- package/dist/ai/overflow.d.ts +22 -0
- package/dist/ai/overflow.js +61 -0
- package/dist/ai/providers/auth.d.ts +71 -0
- package/dist/ai/providers/auth.js +202 -0
- package/dist/ai/providers/builtin.d.ts +23 -0
- package/dist/ai/providers/builtin.js +148 -0
- package/dist/ai/providers/catalog-data.d.ts +5 -0
- package/dist/ai/providers/catalog-data.js +19 -0
- package/dist/ai/providers/catalog.d.ts +28 -0
- package/dist/ai/providers/catalog.js +166 -0
- package/dist/ai/providers/registry.d.ts +83 -0
- package/dist/ai/providers/registry.js +305 -0
- package/dist/ai/sse.d.ts +32 -0
- package/dist/ai/sse.js +140 -0
- package/dist/ai/thinking.d.ts +42 -0
- package/dist/ai/thinking.js +101 -0
- package/dist/ai/types.d.ts +428 -0
- package/dist/ai/types.js +19 -0
- package/dist/bundle/ama-sandbox.cjs +324 -0
- package/dist/bundle/ama.cjs +25770 -0
- package/dist/bundle.d.ts +9 -0
- package/dist/bundle.js +15 -0
- package/dist/cli/args.d.ts +82 -0
- package/dist/cli/args.js +381 -0
- package/dist/cli/bootstrap.d.ts +18 -0
- package/dist/cli/bootstrap.js +398 -0
- package/dist/cli/compose-providers.d.ts +37 -0
- package/dist/cli/compose-providers.js +104 -0
- package/dist/cli/compose-session.d.ts +69 -0
- package/dist/cli/compose-session.js +370 -0
- package/dist/cli/compose-store.d.ts +24 -0
- package/dist/cli/compose-store.js +125 -0
- package/dist/cli/compose.d.ts +106 -0
- package/dist/cli/compose.js +206 -0
- package/dist/cli/default-model.d.ts +16 -0
- package/dist/cli/default-model.js +24 -0
- package/dist/cli/deps.d.ts +205 -0
- package/dist/cli/deps.js +12 -0
- package/dist/cli/exit-codes.d.ts +29 -0
- package/dist/cli/exit-codes.js +40 -0
- package/dist/cli/main.d.ts +26 -0
- package/dist/cli/main.js +165 -0
- package/dist/cli/runtime.d.ts +90 -0
- package/dist/cli/runtime.js +8 -0
- package/dist/cli/startup-screen.d.ts +15 -0
- package/dist/cli/startup-screen.js +56 -0
- package/dist/cli/startup-steps.d.ts +35 -0
- package/dist/cli/startup-steps.js +197 -0
- package/dist/cli/subcommands/auth.d.ts +12 -0
- package/dist/cli/subcommands/auth.js +91 -0
- package/dist/cli/subcommands/config.d.ts +44 -0
- package/dist/cli/subcommands/config.js +201 -0
- package/dist/cli/subcommands/context.d.ts +21 -0
- package/dist/cli/subcommands/context.js +41 -0
- package/dist/cli/subcommands/doctor.d.ts +11 -0
- package/dist/cli/subcommands/doctor.js +246 -0
- package/dist/cli/subcommands/models-cache-probe.d.ts +34 -0
- package/dist/cli/subcommands/models-cache-probe.js +190 -0
- package/dist/cli/subcommands/models-discover.d.ts +40 -0
- package/dist/cli/subcommands/models-discover.js +204 -0
- package/dist/cli/subcommands/models.d.ts +40 -0
- package/dist/cli/subcommands/models.js +144 -0
- package/dist/cli/subcommands/sessions.d.ts +11 -0
- package/dist/cli/subcommands/sessions.js +100 -0
- package/dist/codemode/capability.d.ts +37 -0
- package/dist/codemode/capability.js +55 -0
- package/dist/codemode/declarations.d.ts +44 -0
- package/dist/codemode/declarations.js +111 -0
- package/dist/codemode/host-side.d.ts +59 -0
- package/dist/codemode/host-side.js +253 -0
- package/dist/codemode/modes.d.ts +23 -0
- package/dist/codemode/modes.js +40 -0
- package/dist/codemode/protocol.d.ts +91 -0
- package/dist/codemode/protocol.js +114 -0
- package/dist/codemode/sandbox-entry.d.ts +25 -0
- package/dist/codemode/sandbox-entry.js +323 -0
- package/dist/codemode/store.d.ts +26 -0
- package/dist/codemode/store.js +53 -0
- package/dist/codemode/tool.d.ts +105 -0
- package/dist/codemode/tool.js +283 -0
- package/dist/compaction/branch-summary.d.ts +30 -0
- package/dist/compaction/branch-summary.js +79 -0
- package/dist/compaction/breaker.d.ts +32 -0
- package/dist/compaction/breaker.js +65 -0
- package/dist/compaction/cut-point.d.ts +23 -0
- package/dist/compaction/cut-point.js +70 -0
- package/dist/compaction/estimate.d.ts +30 -0
- package/dist/compaction/estimate.js +114 -0
- package/dist/compaction/prune-tier.d.ts +31 -0
- package/dist/compaction/prune-tier.js +83 -0
- package/dist/compaction/serialize.d.ts +20 -0
- package/dist/compaction/serialize.js +115 -0
- package/dist/compaction/summarize-tier.d.ts +111 -0
- package/dist/compaction/summarize-tier.js +305 -0
- package/dist/config/auth-file.d.ts +39 -0
- package/dist/config/auth-file.js +92 -0
- package/dist/config/context-files.d.ts +30 -0
- package/dist/config/context-files.js +77 -0
- package/dist/config/load.d.ts +45 -0
- package/dist/config/load.js +97 -0
- package/dist/config/merge.d.ts +73 -0
- package/dist/config/merge.js +248 -0
- package/dist/config/paths.d.ts +38 -0
- package/dist/config/paths.js +108 -0
- package/dist/config/profile.d.ts +27 -0
- package/dist/config/profile.js +65 -0
- package/dist/config/schema.d.ts +34 -0
- package/dist/config/schema.js +413 -0
- package/dist/config/trust.d.ts +42 -0
- package/dist/config/trust.js +122 -0
- package/dist/config/types.d.ts +172 -0
- package/dist/config/types.js +27 -0
- package/dist/config/write.d.ts +10 -0
- package/dist/config/write.js +25 -0
- package/dist/errors.d.ts +28 -0
- package/dist/errors.js +30 -0
- package/dist/hooks/config.d.ts +49 -0
- package/dist/hooks/config.js +102 -0
- package/dist/hooks/dispatcher.d.ts +41 -0
- package/dist/hooks/dispatcher.js +104 -0
- package/dist/hooks/matcher.d.ts +22 -0
- package/dist/hooks/matcher.js +108 -0
- package/dist/hooks/protocol.d.ts +33 -0
- package/dist/hooks/protocol.js +240 -0
- package/dist/hooks/runner.d.ts +30 -0
- package/dist/hooks/runner.js +143 -0
- package/dist/hooks/types.d.ts +147 -0
- package/dist/hooks/types.js +20 -0
- package/dist/host/api-impl.d.ts +75 -0
- package/dist/host/api-impl.js +173 -0
- package/dist/host/loader.d.ts +31 -0
- package/dist/host/loader.js +147 -0
- package/dist/host/types.d.ts +169 -0
- package/dist/host/types.js +14 -0
- package/dist/host.d.ts +5 -0
- package/dist/host.js +4 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +28 -0
- package/dist/modes/commands-core.d.ts +44 -0
- package/dist/modes/commands-core.js +171 -0
- package/dist/modes/interactive/approval-dialog.d.ts +48 -0
- package/dist/modes/interactive/approval-dialog.js +202 -0
- package/dist/modes/interactive/commands.d.ts +41 -0
- package/dist/modes/interactive/commands.js +202 -0
- package/dist/modes/interactive/completion.d.ts +53 -0
- package/dist/modes/interactive/completion.js +157 -0
- package/dist/modes/interactive/interactive-mode.d.ts +46 -0
- package/dist/modes/interactive/interactive-mode.js +487 -0
- package/dist/modes/interactive/key-dispatch.d.ts +29 -0
- package/dist/modes/interactive/key-dispatch.js +107 -0
- package/dist/modes/interactive/line/line-editor.d.ts +50 -0
- package/dist/modes/interactive/line/line-editor.js +232 -0
- package/dist/modes/interactive/line/line-mode.d.ts +20 -0
- package/dist/modes/interactive/line/line-mode.js +216 -0
- package/dist/modes/interactive/line/line-render.d.ts +35 -0
- package/dist/modes/interactive/line/line-render.js +171 -0
- package/dist/modes/interactive/line/paste-state.d.ts +26 -0
- package/dist/modes/interactive/line/paste-state.js +72 -0
- package/dist/modes/interactive/message-view.d.ts +77 -0
- package/dist/modes/interactive/message-view.js +269 -0
- package/dist/modes/interactive/pickers.d.ts +42 -0
- package/dist/modes/interactive/pickers.js +115 -0
- package/dist/modes/interactive/startup-ui.d.ts +28 -0
- package/dist/modes/interactive/startup-ui.js +238 -0
- package/dist/modes/interactive/status-bar.d.ts +48 -0
- package/dist/modes/interactive/status-bar.js +139 -0
- package/dist/modes/interactive/tool-view.d.ts +95 -0
- package/dist/modes/interactive/tool-view.js +344 -0
- package/dist/modes/print/json-event.d.ts +15 -0
- package/dist/modes/print/json-event.js +39 -0
- package/dist/modes/print/print-mode.d.ts +15 -0
- package/dist/modes/print/print-mode.js +96 -0
- package/dist/modes/rpc/commands.d.ts +40 -0
- package/dist/modes/rpc/commands.js +258 -0
- package/dist/modes/rpc/jsonl.d.ts +16 -0
- package/dist/modes/rpc/jsonl.js +55 -0
- package/dist/modes/rpc/rpc-mode.d.ts +22 -0
- package/dist/modes/rpc/rpc-mode.js +153 -0
- package/dist/modes/session-report.d.ts +55 -0
- package/dist/modes/session-report.js +278 -0
- package/dist/modes/shared.d.ts +13 -0
- package/dist/modes/shared.js +52 -0
- package/dist/modes/startup-ui-text.d.ts +16 -0
- package/dist/modes/startup-ui-text.js +103 -0
- package/dist/permissions/broker.d.ts +47 -0
- package/dist/permissions/broker.js +107 -0
- package/dist/permissions/dangerous.d.ts +47 -0
- package/dist/permissions/dangerous.js +370 -0
- package/dist/permissions/pipeline.d.ts +51 -0
- package/dist/permissions/pipeline.js +181 -0
- package/dist/permissions/preview.d.ts +43 -0
- package/dist/permissions/preview.js +463 -0
- package/dist/permissions/rules.d.ts +58 -0
- package/dist/permissions/rules.js +249 -0
- package/dist/permissions/types.d.ts +100 -0
- package/dist/permissions/types.js +18 -0
- package/dist/rpc.d.ts +171 -0
- package/dist/rpc.js +13 -0
- package/dist/sdk.d.ts +98 -0
- package/dist/sdk.js +195 -0
- package/dist/session/manager.d.ts +70 -0
- package/dist/session/manager.js +278 -0
- package/dist/session/migrate.d.ts +19 -0
- package/dist/session/migrate.js +53 -0
- package/dist/session/projection.d.ts +50 -0
- package/dist/session/projection.js +180 -0
- package/dist/session/store.d.ts +47 -0
- package/dist/session/store.js +210 -0
- package/dist/session/tree.d.ts +21 -0
- package/dist/session/tree.js +88 -0
- package/dist/session/types.d.ts +199 -0
- package/dist/session/types.js +18 -0
- package/dist/skills/discover.d.ts +60 -0
- package/dist/skills/discover.js +160 -0
- package/dist/skills/expand.d.ts +35 -0
- package/dist/skills/expand.js +46 -0
- package/dist/skills/frontmatter.d.ts +27 -0
- package/dist/skills/frontmatter.js +157 -0
- package/dist/skills/index-prompt.d.ts +13 -0
- package/dist/skills/index-prompt.js +42 -0
- package/dist/skills/templates.d.ts +52 -0
- package/dist/skills/templates.js +177 -0
- package/dist/tools/bash.d.ts +49 -0
- package/dist/tools/bash.js +222 -0
- package/dist/tools/edit-fuzzy.d.ts +36 -0
- package/dist/tools/edit-fuzzy.js +129 -0
- package/dist/tools/edit.d.ts +38 -0
- package/dist/tools/edit.js +241 -0
- package/dist/tools/file-mutex.d.ts +8 -0
- package/dist/tools/file-mutex.js +29 -0
- package/dist/tools/glob.d.ts +44 -0
- package/dist/tools/glob.js +217 -0
- package/dist/tools/grep.d.ts +39 -0
- package/dist/tools/grep.js +179 -0
- package/dist/tools/ignore.d.ts +40 -0
- package/dist/tools/ignore.js +174 -0
- package/dist/tools/ls.d.ts +21 -0
- package/dist/tools/ls.js +96 -0
- package/dist/tools/output-accumulator.d.ts +48 -0
- package/dist/tools/output-accumulator.js +106 -0
- package/dist/tools/paths.d.ts +20 -0
- package/dist/tools/paths.js +58 -0
- package/dist/tools/presets.d.ts +71 -0
- package/dist/tools/presets.js +128 -0
- package/dist/tools/process-tree.d.ts +35 -0
- package/dist/tools/process-tree.js +125 -0
- package/dist/tools/read.d.ts +28 -0
- package/dist/tools/read.js +181 -0
- package/dist/tools/registry.d.ts +43 -0
- package/dist/tools/registry.js +106 -0
- package/dist/tools/shell.d.ts +38 -0
- package/dist/tools/shell.js +91 -0
- package/dist/tools/task.d.ts +29 -0
- package/dist/tools/task.js +107 -0
- package/dist/tools/todo.d.ts +28 -0
- package/dist/tools/todo.js +107 -0
- package/dist/tools/truncate.d.ts +44 -0
- package/dist/tools/truncate.js +175 -0
- package/dist/tools/types.d.ts +135 -0
- package/dist/tools/types.js +19 -0
- package/dist/tools/write.d.ts +20 -0
- package/dist/tools/write.js +84 -0
- package/dist/tui/ansi.d.ts +29 -0
- package/dist/tui/ansi.js +420 -0
- package/dist/tui/component.d.ts +38 -0
- package/dist/tui/component.js +13 -0
- package/dist/tui/components/box.d.ts +26 -0
- package/dist/tui/components/box.js +65 -0
- package/dist/tui/components/container.d.ts +14 -0
- package/dist/tui/components/container.js +39 -0
- package/dist/tui/components/editor-buffer.d.ts +67 -0
- package/dist/tui/components/editor-buffer.js +300 -0
- package/dist/tui/components/editor-paste.d.ts +29 -0
- package/dist/tui/components/editor-paste.js +64 -0
- package/dist/tui/components/editor.d.ts +114 -0
- package/dist/tui/components/editor.js +530 -0
- package/dist/tui/components/key-value.d.ts +29 -0
- package/dist/tui/components/key-value.js +48 -0
- package/dist/tui/components/loader.d.ts +35 -0
- package/dist/tui/components/loader.js +71 -0
- package/dist/tui/components/markdown.d.ts +90 -0
- package/dist/tui/components/markdown.js +462 -0
- package/dist/tui/components/meter.d.ts +29 -0
- package/dist/tui/components/meter.js +47 -0
- package/dist/tui/components/overlay.d.ts +24 -0
- package/dist/tui/components/overlay.js +52 -0
- package/dist/tui/components/select-list.d.ts +57 -0
- package/dist/tui/components/select-list.js +179 -0
- package/dist/tui/components/spacer.d.ts +11 -0
- package/dist/tui/components/spacer.js +16 -0
- package/dist/tui/components/text.d.ts +30 -0
- package/dist/tui/components/text.js +65 -0
- package/dist/tui/keybindings.d.ts +66 -0
- package/dist/tui/keybindings.js +120 -0
- package/dist/tui/keys.d.ts +38 -0
- package/dist/tui/keys.js +275 -0
- package/dist/tui/stdin-buffer.d.ts +41 -0
- package/dist/tui/stdin-buffer.js +206 -0
- package/dist/tui/terminal.d.ts +79 -0
- package/dist/tui/terminal.js +153 -0
- package/dist/tui/theme.d.ts +31 -0
- package/dist/tui/theme.js +199 -0
- package/dist/tui/tui.d.ts +103 -0
- package/dist/tui/tui.js +363 -0
- package/dist/tui/vt-screen.d.ts +46 -0
- package/dist/tui/vt-screen.js +251 -0
- package/dist/tui.d.ts +30 -0
- package/dist/tui.js +31 -0
- package/dist/version.d.ts +8 -0
- package/dist/version.js +24 -0
- package/docs/codemode.md +102 -0
- package/docs/hooks.md +196 -0
- package/docs/host-api.md +161 -0
- package/docs/providers.md +316 -0
- package/docs/rpc.md +253 -0
- package/docs/session-format.md +119 -0
- package/docs/tui.md +168 -0
- package/package.json +101 -4
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# 会话文件格式(JSONL 条目树)
|
|
2
|
+
|
|
3
|
+
会话是一个只追加的 JSONL 文件:首行是头,其后每行一个条目(以及可选的 `leaf` 行)。条目经 `parentId` 连成树,「当前分支」是从根到叶子的一条路径;发给模型的上下文由当前分支**投影**得到。类型定义在 `src/session/types.ts`(经 `@armadra/agent` 导出),格式版本 `SESSION_FORMAT_VERSION = 1`。设计依据见 [design.md](design.md) §8、§9。
|
|
4
|
+
|
|
5
|
+
## 位置与文件
|
|
6
|
+
|
|
7
|
+
- 目录:`--session-dir` > profile `sessionDir` > `<数据目录>/sessions`(数据目录缺省 `~/.local/share/ama`,`AMA_DATA_DIR` 可改)。
|
|
8
|
+
- 文件:`<sessions>/<编码 cwd>/<ISO 时间>_<uuid>.jsonl`。编码 cwd = 去掉开头的分隔符,`/`、`\`、`:` 换成 `-`;ISO 时间里的 `:` 与 `.` 也换成 `-`。文件名里的 uuid 就是会话 id。
|
|
9
|
+
- 延迟落盘:新会话先在内存里,首次模型请求前才建文件、写头与已缓存的条目;之前退出不留文件。
|
|
10
|
+
- 只追加:每条记录一行 JSON + LF,以 O_APPEND 写入。打开时若末行是半行(写入中途崩溃),截掉半行再继续;中间行损坏 → 拒绝打开(`session_corrupt`,退出码 5),不猜测、不重写文件。
|
|
11
|
+
- 单写者锁:`<file>.lock`(O_EXCL 创建,内容为 pid);持锁进程已不在时视为陈旧锁并接管。
|
|
12
|
+
- `ama sessions prune [--older-than <天>]`(缺省 30 天)把文件移到 `<sessions>/.trash/`,文件名前缀删除时间;trash 里超过 7 天的再清理。
|
|
13
|
+
|
|
14
|
+
## 头
|
|
15
|
+
|
|
16
|
+
```json
|
|
17
|
+
{
|
|
18
|
+
"type": "session",
|
|
19
|
+
"version": 1,
|
|
20
|
+
"id": "0b7f…",
|
|
21
|
+
"timestamp": "2026-10-02T08:00:00.000Z",
|
|
22
|
+
"cwd": "/home/me/proj",
|
|
23
|
+
"agent": { "name": "ama", "version": "0.1.0" },
|
|
24
|
+
"parentSession": "/…/上一个会话.jsonl"
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`parentSession` 只在 fork 与 `task` 子会话里出现,指向来源文件。读取时 `version` 不是 1 → 拒绝并提示升级 ama;缺头、头损坏、条目缺 `id` 或 `type`、出现第二个头 → 拒绝。
|
|
29
|
+
|
|
30
|
+
## 条目
|
|
31
|
+
|
|
32
|
+
全部条目都有 `id`、`parentId`(根条目为 `null`)、`timestamp`(ISO 8601)。
|
|
33
|
+
|
|
34
|
+
| `type` | 字段 | 进上下文 |
|
|
35
|
+
| ----------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------- |
|
|
36
|
+
| `message` | `message`:`system` / `user` / `assistant` / `toolResult` 四种 LLM 消息 | 是 |
|
|
37
|
+
| `compaction` | `summary`、`firstKeptEntryId`、`tokensBefore`、`usage?`、`details?`(`readFiles` / `modifiedFiles`) | 是,作为摘要消息 |
|
|
38
|
+
| `branch_summary` | `fromId`、`summary`、`usage?`、`details?` | 是,作为分支摘要消息 |
|
|
39
|
+
| `context_edit` | `targetId`、`replacement: string \| null`、`reason: prune \| abort \| retry \| overflow \| manual` | 改写目标条目 |
|
|
40
|
+
| `model_change` | `provider`、`modelId` | 否(决定续会话时的模型) |
|
|
41
|
+
| `thinking_level_change` | `thinkingLevel` | 否(决定续会话时的思考级别) |
|
|
42
|
+
| `custom` | `customType`、`data` | 否 |
|
|
43
|
+
| `custom_message` | `customType`、`content`(字符串或内容块)、`display`、`details?` | 是,作为 custom 消息 |
|
|
44
|
+
| `label` | `targetId`、`label?`(缺省 = 清除标签) | 否 |
|
|
45
|
+
| `session_info` | `name?` | 否 |
|
|
46
|
+
| `usage` | `kind`、`provider`、`model`(不含 provider 的模型 id)、`usage` | 否 |
|
|
47
|
+
|
|
48
|
+
### 消息
|
|
49
|
+
|
|
50
|
+
- `system`:`{ role: "system", sections, toolsAdded?, toolsRemoved?, timestamp }`。首条是全量:系统提示的命名节(固定顺序 `preamble → tools → rules → project_context → skills → hooks → cwd → host`)与工具声明表;之后只落**补丁**——节名级替换、值为 `null` 表示删除该节,`toolsAdded` / `toolsRemoved` 增删工具。依次重放得到当前系统提示;请求时由协议层重装全量。首条 system 消息在首次请求前落盘,也就是建文件的时刻。
|
|
51
|
+
- `user`:`content`、`origin?`(缺省 = 普通用户输入;`steer` / `followUp` 是运行中插话与排队,`host` 是宿主 `sendUser` 注入,其它字符串原样记录)。
|
|
52
|
+
- `assistant`:`content`(文本 / 思考 / 工具调用块)、`api`、`provider`、`model`、`usage`、`stopReason`,以及可选的 `responseId`、`thinkingLevel`、`providerThinkingLevel`、`rawStopReason`、`errorMessage`。`usage` 是 `{ input, output, cacheRead, cacheWrite, cacheWrite1h?, reasoning?, totalTokens, cost?, cacheReported? }`:`input` 不含缓存部分,`cost` 是 `{ input, output, cacheRead, cacheWrite, total }`(美元,模型无价格时缺省),`cacheReported` 表示原始响应里出现过缓存字段。
|
|
53
|
+
- `toolResult`:对应工具调用的结果(`toolCallId`、`toolName`、`content`、`isError`、`details?`)。
|
|
54
|
+
|
|
55
|
+
### `usage` 条目
|
|
56
|
+
|
|
57
|
+
不进上下文的请求用量,计入 `/session` 费用与 RPC 统计,投影时跳过。第一期只有 `kind: "cache_warm"`(缓存保温请求,见 [providers.md](providers.md)「缓存」):
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"type": "usage",
|
|
62
|
+
"kind": "cache_warm",
|
|
63
|
+
"provider": "anthropic",
|
|
64
|
+
"model": "<model-id>",
|
|
65
|
+
"usage": {
|
|
66
|
+
"input": 1,
|
|
67
|
+
"output": 1,
|
|
68
|
+
"cacheRead": 12000,
|
|
69
|
+
"cacheWrite": 0,
|
|
70
|
+
"totalTokens": 12002,
|
|
71
|
+
"cost": { "input": 0, "output": 0, "cacheRead": 0.0036, "cacheWrite": 0, "total": 0.0036 }
|
|
72
|
+
},
|
|
73
|
+
"id": "…",
|
|
74
|
+
"parentId": "…",
|
|
75
|
+
"timestamp": "…"
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### `leaf` 行
|
|
80
|
+
|
|
81
|
+
`/tree` 在同一文件里换叶子时追加一行 `{"type":"leaf","id":<条目 id 或 null>,"timestamp":…}`。它**不是条目**:没有 `parentId`,`get_entries` 与树不返回它,fork 不复制它。打开文件时,最后一条 `leaf` 行若在最后一条条目之后,就用它的 `id` 作叶子(`null` = 回到根之前的空分支);之后又追加了条目则作废。
|
|
82
|
+
|
|
83
|
+
`usage` 条目与 `leaf` 行都是 v1 的可选行,格式版本不升。
|
|
84
|
+
|
|
85
|
+
## 投影
|
|
86
|
+
|
|
87
|
+
当前分支 → 上下文消息(`src/session/projection.ts`):
|
|
88
|
+
|
|
89
|
+
1. **压缩**:分支上若有 `compaction`,取最新一条。上下文 = 该 compaction(作为摘要消息)+ `firstKeptEntryId` 到它之间的非 system 条目 + 它之后的全部条目。compaction 之前的 system 消息依次重放后折成一条完整的 system **检查点**放在最前(文件里不另存检查点)。
|
|
90
|
+
2. **改写**:对分支上每个目标取最新一条 `context_edit`:`replacement` 为 `null` → 从上下文剔除;字符串 → 只换内容,保留角色与元数据(assistant 换成一个文本块,摘要类换 `summary`,system 不改)。用途:档一裁剪旧工具结果(`prune`)、中断(`abort`)、失败重试的尝试(`retry`)、溢出恢复(`overflow`)、手动(`manual`)。
|
|
91
|
+
3. **映射**:`message` → 原消息;`custom_message` → `{ role: "custom", customType, content, display, details? }`;`compaction` → `{ role: "compactionSummary", summary, tokensBefore }`;`branch_summary` → `{ role: "branchSummary", summary, fromId }`;其余类型(含 `usage` 与未知类型)不进上下文。
|
|
92
|
+
4. **模型与思考级别**:分支上最近的 `model_change` / `thinking_level_change`,续会话时据此恢复。
|
|
93
|
+
|
|
94
|
+
发给模型前,`convertToLlm` 把三种扩展角色(custom、compactionSummary、branchSummary)转成 user 消息。
|
|
95
|
+
|
|
96
|
+
## 分支与 fork
|
|
97
|
+
|
|
98
|
+
- `/tree`:同一文件换叶子(落 `leaf` 行);从旧位置再发消息就形成新分支。离开的分支可以写 `branch_summary` 带进新分支。
|
|
99
|
+
- fork(`--fork <id>`、`/fork`、RPC `fork`):把根 → 指定条目的分支复制到新文件,头的 `parentSession` 指回原文件;不复制 `leaf` 行。
|
|
100
|
+
- `task` 子会话:独立文件,头带 `parentSession`,首条条目是 `custom{customType:"ama.task"}`。
|
|
101
|
+
|
|
102
|
+
## custom 类型
|
|
103
|
+
|
|
104
|
+
`custom` 不进上下文,`custom_message` 进上下文。ama 自己使用的 `customType`:
|
|
105
|
+
|
|
106
|
+
| `customType` | 条目类型 | 内容 | 写入时机 |
|
|
107
|
+
| -------------------- | ---------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------- |
|
|
108
|
+
| `ama.todo` | `custom` | `data: { items: { id, text, status: pending \| in_progress \| done }[] }`,整表快照 | `todo` 工具 `set`;`get` 取分支上最近一条 |
|
|
109
|
+
| `ama.task` | `custom` | `data: { parentToolCallId, description, parentSession? }` | `task` 子会话的首条条目 |
|
|
110
|
+
| `ama.codemode-store` | `custom` | `data: { entries }`,`store()` 的完整快照 | codemode 脚本成功结束且写过 store;读取取分支上最近一条 |
|
|
111
|
+
| `ama.aborted` | `custom_message` | `content`:告诉模型上一条回复被用户中断;`display: false` | 用户中断运行 |
|
|
112
|
+
| `ama.hook_context` | `custom_message` | `content`:UserPromptSubmit Hook 的 `additionalContext`;`display: false` | 随用户提示进上下文 |
|
|
113
|
+
|
|
114
|
+
其它程序(宿主、SDK 工具经 `ToolContext.session.appendCustom`)可以写自己的 `customType`;建议加前缀避免冲突,`ama.` 前缀保留给 ama。
|
|
115
|
+
|
|
116
|
+
## 读取方
|
|
117
|
+
|
|
118
|
+
- `ama sessions list|show`、交互模式 `/resume`、RPC `get_entries{since}`(以 entry id 为游标返回 `{ entries, leafId }`)、`get_tree`。
|
|
119
|
+
- 嵌入方可以直接读文件:按行解析,首行为头,跳过 `type: "leaf"` 的行后按 `parentId` 建树;遇到不认识的条目类型保留但不进上下文。
|
package/docs/tui.md
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# 终端界面
|
|
2
|
+
|
|
3
|
+
交互模式的使用说明,以及终端组件库 `@armadra/agent/tui` 的 API。设计依据见 [design.md](design.md) §12。
|
|
4
|
+
|
|
5
|
+
`ama` 在终端里直接运行(stdin / stdout 都是 TTY、`TERM` 不是 `dumb`、没有 `--no-tui`)时进入交互模式。界面只用**主屏**:对话历史滚进终端回滚,不切备用屏,所以在 tmux 里 `capture-pane` 能读到完整对话,退出后对话也留在屏幕上。
|
|
6
|
+
|
|
7
|
+
## 布局
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
ama 0.1.0 · Enter 发送 · Esc 中断 · Ctrl+C 两次退出 · /help 命令 ← 启动画面
|
|
11
|
+
› 读一下 README ← 用户消息
|
|
12
|
+
思考 · 120 token ← 思考块(折叠)
|
|
13
|
+
● read README.md ← 工具调用
|
|
14
|
+
…前 3 行结果…
|
|
15
|
+
回答正文(Markdown)
|
|
16
|
+
↳ followUp 之后再提交 ← 排队消息
|
|
17
|
+
⠋ 工作中 · Esc 中断 (12s) ← 运行中
|
|
18
|
+
──────────────────────────────────
|
|
19
|
+
输入框
|
|
20
|
+
──────────────────────────────────
|
|
21
|
+
anthropic/claude-sonnet · think:medium · ↑12k ↓1.2k · cache 80% ♨ · $0.12 · rebill $0.11 · ctx 34% · mode:default · preset:default
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- **用户消息**:`›` 开头;运行中插话标 `↳ steer`,排到本轮之后的标 `↳ followUp`,宿主(Armadra 画布)注入的标 `↳ host`。
|
|
25
|
+
- **思考块**:`ui.showThinking` = `collapsed`(缺省,一行计数)/ `full`(全文)/ `hidden`。
|
|
26
|
+
- **工具调用**:一行标题,圆点运行中为强调色、成功绿、失败红;折叠显示结果前 3 行,`edit` 显示 diff(前 12 行),`bash` 运行中滚动显示最后 8 行。`Ctrl+O` 展开 / 折叠全部。codemode 脚本里的内层调用挂在外层调用下面。
|
|
27
|
+
- **提示**:压缩摘要卡、`↻ 重试 n/m`、`⛔ Hook 阻止`、宿主通知、审批被拒或超时的说明都进消息区。
|
|
28
|
+
- **状态栏**:模型 · 思考级别 · `↑` 输入(含缓存读写)`↓` 输出 · 缓存 · 费用 · 重计费 · 上下文占用 · 排队数 · 权限模式 · codemode · 工具预设 · 宿主状态。终端太窄时依次丢弃宿主状态、预设、重计费、费用、缓存、token、思考级别、排队数、codemode,模型、上下文与权限模式最后丢。
|
|
29
|
+
|
|
30
|
+
## 缓存与上下文
|
|
31
|
+
|
|
32
|
+
状态栏各项:
|
|
33
|
+
|
|
34
|
+
| 项 | 含义 |
|
|
35
|
+
| --------------- | ------------------------------------------------------------------------------------------------------------------- |
|
|
36
|
+
| `cache 83%` | **最近一次**请求的命中率(读缓存 /(输入 + 缓存读 + 缓存写));会话累计在 `/session` |
|
|
37
|
+
| `cache —` | 端点还没报过缓存(`unknown`:还没有足够长的可比请求) |
|
|
38
|
+
| `cache 未报告` | 端点不报缓存(`silent`:连续 3 个可比请求读写都是 0,或 `compat.cacheReporting: "silent"`);这类请求不进命中率分母 |
|
|
39
|
+
| `♨` | 保温计时中(工具长时间运行时按 TTL 重放前缀,`/cache warm` 可切换) |
|
|
40
|
+
| `rebill $0.11` | 本会话缓存未命中导致的重计费金额;模型没有价格时显示 token 数;为 0 不显示 |
|
|
41
|
+
| `ctx 72%` | 上下文占用,≥ 70% 黄色、≥ 90% 红色;`ctx ?` 表示模型没有窗口信息 |
|
|
42
|
+
| `codemode:only` | codemode 生效(`on` / `only`);运行时 Node 的权限模型不隔离网络(Node 22 / 24)时追加红色 `net!` |
|
|
43
|
+
|
|
44
|
+
消息区(line 模式写 stderr,前缀 `ama: `)只在两种情况下提示一行,`cache.missNotices: false` 可关:
|
|
45
|
+
|
|
46
|
+
- 一次未命中重计费 ≥ 20k token 或 ≥ $0.10:`缓存未命中(空闲 7 分钟后):重计费 38.2k token(约 $0.11)`。原因有空闲超时、子任务运行、切换模型、系统提示 / 工具表变化、服务端淘汰;更小的未命中只进统计。
|
|
47
|
+
- 上下文占用跨过 70% / 90%(各一次):`上下文已用 72%,约剩 9 回合(按最近 5 回合均值)`;回合数估不出时给余量 token。
|
|
48
|
+
- line 模式在 `AMA_LOG=info` 时另写保温成功:`缓存保温已刷新(读 12k token,$0.001)`。
|
|
49
|
+
|
|
50
|
+
`/session` 在会话信息之后有「缓存」段,`/cache` 只显示这一段:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
缓存
|
|
54
|
+
输入 3.4k = 缓存读 2.2k(65%)+ 未缓存 1.2k
|
|
55
|
+
报告状态 reported
|
|
56
|
+
命中率 最近 84% · 会话 65%
|
|
57
|
+
未命中 0 次
|
|
58
|
+
保温 streaming · 已停止:模型目录没有缓存 TTL
|
|
59
|
+
上下文 1%,余量 ≈ 127k token ≈ 2443 回合
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
未命中行按原因分列(`3 次,重计费 61k token ≈ $0.18(空闲超时 2 · 前缀变化 1)`);保温行在计时中显示 `streaming · 下次 2m 10s · 期望节省 $0.18 ≥ $0.05`,停止时给原因;有 task 子会话时另有「子任务」行。
|
|
63
|
+
|
|
64
|
+
- `/cache warm off|streaming|idle`:本会话内切换保温(不写配置;`idle` 在空闲时也保温,适合贵模型)。
|
|
65
|
+
- `/cache fingerprint`:最近一次真实请求的前缀指纹——system 与工具表各一个 16 位哈希加模型名。两次之间哈希变了,就是宿主或 Hook 中途改了系统提示 / 工具表。
|
|
66
|
+
|
|
67
|
+
取舍:状态栏显示最近一次命中率(会话累计放 `/session`);`cache.missNotices` 缺省开(门槛下很少触发);`Meter` 组件不进缺省状态栏。命中率、未命中与保温的判定规则见 [providers.md](providers.md)「缓存」。
|
|
68
|
+
|
|
69
|
+
`ama models cache-probe <provider/model>` 用一个固定前缀相隔几秒发两次最小请求,判定端点 `reported` / `silent` / `inconclusive` 并给出配置建议(会计费:先打印预估,非交互环境需 `--yes`)。
|
|
70
|
+
|
|
71
|
+
## 按键
|
|
72
|
+
|
|
73
|
+
| 按键 | 作用 |
|
|
74
|
+
| -------------------- | ------------------------------------------------------------------ |
|
|
75
|
+
| Enter | 发送;运行中 = steer(插到当前轮) |
|
|
76
|
+
| Alt+Enter | 运行中排到本轮之后(followUp);空闲时等同 Enter |
|
|
77
|
+
| Shift+Enter / Ctrl+J | 换行 |
|
|
78
|
+
| Esc | 中断:排队的消息回填到输入框,然后停止当前运行;补全打开时先关补全 |
|
|
79
|
+
| Alt+↑ | 取回最后一条排队消息 |
|
|
80
|
+
| Shift+Tab | 循环权限模式 plan → default → auto-edit → full-auto |
|
|
81
|
+
| Ctrl+O | 展开 / 折叠工具输出 |
|
|
82
|
+
| Ctrl+L / Ctrl+T | 选择模型 / 思考级别 |
|
|
83
|
+
| Ctrl+C | 清空输入;输入为空时 1.5 秒内再按一次退出(退出码 130) |
|
|
84
|
+
| Ctrl+D | 输入为空时退出 |
|
|
85
|
+
| Tab | 补全 |
|
|
86
|
+
| ↑ / ↓ | 单行时浏览历史(`<数据目录>/history`,500 条) |
|
|
87
|
+
|
|
88
|
+
按键可在 `~/.config/ama/keybindings.json` 覆盖,键是动作 id(`app.interrupt`、`app.message.followUp`、`tui.editor.newLine` ……),值是按键或按键数组,空数组表示禁用。
|
|
89
|
+
|
|
90
|
+
## 命令
|
|
91
|
+
|
|
92
|
+
`/help` 列出全部命令。交互模式另有:
|
|
93
|
+
|
|
94
|
+
- `/tree`:列出会话里的全部用户消息(分叉处缩进,`●` 是当前分支);选中一条后回到它之前,原文回填输入框,修改后发送就形成新分支。
|
|
95
|
+
- `/fork`(无参数):同样选一条用户消息,从它之前复制出新会话。
|
|
96
|
+
- `/model`、`/resume`、`/permission`、`/thinking` 不带参数时打开选择器;`/permissions` 显示权限判定顺序与已加载规则。
|
|
97
|
+
- `/session`、`/cache`:会话用量与缓存统计(见下文「缓存与上下文」)。
|
|
98
|
+
|
|
99
|
+
## 补全
|
|
100
|
+
|
|
101
|
+
- 首行行首输入 `/`:命令、提示模板(`/<名字>`)、Skill(`/skill:<名字>`)。
|
|
102
|
+
- `@`(行首或空格之后):当前目录下的文件与目录(尊重 `.gitignore`),含 `*` `?` `[` `{` 时按 glob 匹配相对路径。
|
|
103
|
+
|
|
104
|
+
## 审批
|
|
105
|
+
|
|
106
|
+
工具调用需要确认时,底部弹出对话框:bash 显示完整命令,write 显示路径与行数,edit 显示每处修改的 −/+ 摘要;子 Agent 发起的请求标 `[task]`。`y` 允许、`n` / Esc 拒绝、`a` 本会话内同类不再询问、`v` 查看完整输入。10 分钟不作答按拒绝处理(`AMA_APPROVAL_TIMEOUT_MS` 可改)。
|
|
107
|
+
|
|
108
|
+
输入摘要之后是**执行前预览**:这一步会碰到什么。
|
|
109
|
+
|
|
110
|
+
- bash:识别每段命令(含 `sh -c`、`eval`、`xargs`、`find -exec` 里嵌套的命令)中的 `rm` / `rmdir` / `unlink`、`mv`、`git clean`、`git checkout -- <路径>`、`git reset --hard` 与 `>` / `>>` 重定向目标,列出路径是否存在、大小、目录里的文件数;通配符与变量不展开,原样显示并提示实际范围可能更大。
|
|
111
|
+
- write:目标是否存在、现有行数与大小 → 新内容;覆盖本会话没读过的文件标黄。
|
|
112
|
+
- edit:对原文干跑一遍,列出每处 −n/+m 行与总变化;匹配不到或不唯一时提前说明。
|
|
113
|
+
|
|
114
|
+
预览按严重度着色(危险红、警告黄、其余暗色),只读、有上限:每个目录最多计 2000 项,整次预览 200 ms 预算,超出只给提示、不降低严重度;超过 2 MiB 的文件只报大小。预览失败不影响审批。line 模式在问句之前逐行打印同样的预览;RPC 客户端从 `permission_request.preview` 拿到它([rpc.md](rpc.md)「审批」)。
|
|
115
|
+
|
|
116
|
+
## 启动画面
|
|
117
|
+
|
|
118
|
+
`ui.quietStartup` / `--quiet-startup`:`normal` 显示标题、模型、目录与信任状态、已加载的上下文文件 / Skill / 提示模板 / Hook;`header` 只有标题行(profile 缺省);`silent` 不显示。`--resume` 不带 id、模型没有 key、会话目录不存在、项目资源需要信任时,界面启动前会先出现一个小的选择 / 输入提示,答完收成一行留在屏幕上。
|
|
119
|
+
|
|
120
|
+
## 在 tmux / Armadra 终端节点里
|
|
121
|
+
|
|
122
|
+
- 括号粘贴:启动时开启;粘贴的多行内容整体进入输入框(超过 10 行或 1 000 字符折叠为 `[paste #N +M lines]`),粘贴后紧跟的回车直接发送,适合由外部程序写入。
|
|
123
|
+
- 不查询终端能力、不开鼠标与 Kitty 键盘协议,避免回包混进输入;tmux ≥ 3.4 透传同步输出,旧版本也能正常显示。
|
|
124
|
+
- 窗口尺寸变化时整屏重画最后一屏,回滚里的历史不受影响。
|
|
125
|
+
- 自动降级:非 TTY、`TERM=dumb`、`--no-tui` 或终端初始化失败时使用行式界面,命令与审批问答相同。
|
|
126
|
+
|
|
127
|
+
## 组件库(`@armadra/agent/tui`)
|
|
128
|
+
|
|
129
|
+
交互模式用的终端组件单独导出,零依赖,宿主或其它 Node 程序可以直接用来画主屏界面。
|
|
130
|
+
|
|
131
|
+
```ts
|
|
132
|
+
import { TUI, ProcessTerminal, Text, Editor, createTheme } from "@armadra/agent/tui";
|
|
133
|
+
|
|
134
|
+
const tui = new TUI(new ProcessTerminal());
|
|
135
|
+
const theme = createTheme("dark");
|
|
136
|
+
const log = new Text("");
|
|
137
|
+
const editor = new Editor({
|
|
138
|
+
theme,
|
|
139
|
+
requestRender: () => tui.requestRender(),
|
|
140
|
+
onSubmit: (text) => {
|
|
141
|
+
log.setText(`you said: ${text}`);
|
|
142
|
+
tui.requestRender();
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
tui.addChild(log);
|
|
146
|
+
tui.addChild(editor);
|
|
147
|
+
tui.setFocus(editor);
|
|
148
|
+
tui.start();
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
| 导出 | 作用 |
|
|
152
|
+
| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
|
|
153
|
+
| `Component`、`Focusable`、`CURSOR_MARKER` | 组件契约:`render(width)` 返回各行(每行可见宽 ≤ width)、`handleInput?(data)`、`invalidate()`;获焦组件在光标处输出 `CURSOR_MARKER` |
|
|
154
|
+
| `TUI` | 根容器与差分渲染(主屏、同步输出):`addChild`、`start` / `stop`、`requestRender`、`setFocus`、`addInputListener`、`showOverlay` |
|
|
155
|
+
| `ProcessTerminal`、`MemoryTerminal`、`VirtualScreen` | 真实终端(raw 模式、括号粘贴);内存终端与 VT 屏幕(测试、帧黄金) |
|
|
156
|
+
| `Container`、`Text`、`TruncatedText`、`Markdown`、`Box`、`Spacer`、`Loader` | 基础组件 |
|
|
157
|
+
| `Editor`、`EditorBuffer`、`PasteStore` | 多行编辑器(历史、补全接口 `AutocompleteProvider`、粘贴折叠) |
|
|
158
|
+
| `SelectList` | 可过滤的选择列表 |
|
|
159
|
+
| `KeyValue`、`Meter` | 两列对齐的键值表;进度条 |
|
|
160
|
+
| `compositeOverlays`、`OverlayOptions` | 覆盖层合成(居中 / 底部锚定) |
|
|
161
|
+
| `createTheme`、`plainTheme`、`detectCapabilities`、`Theme` | 主题与颜色能力探测(`NO_COLOR`、16 / 256 / truecolor);11 个语义色 |
|
|
162
|
+
| `Keybindings`、`DEFAULT_KEYBINDINGS`、`loadKeybindingsFile` | 动作 id → 按键,`keybindings.json` 覆盖 |
|
|
163
|
+
| `parseKey`、`matchesKey`、`StdinBuffer` | 键序列解析与 Esc 超时切分(`AMA_TUI_ESC_TIMEOUT`) |
|
|
164
|
+
| `visibleWidth`、`truncateToWidth`、`wrapTextWithAnsi`、`sliceByColumn` 等 | 带 ANSI 与宽字符的宽度计算与截断 |
|
|
165
|
+
|
|
166
|
+
## 测试
|
|
167
|
+
|
|
168
|
+
`src/modes/interactive/interactive-mode.test.ts` 用 `MemoryTerminal`(80x24、40x24)+ fake 供应商跑一次完整的读文件 run,把启动、输入、工具运行中、结束、`Ctrl+O` 展开、退出各帧写进 `test/fixtures/tui/run-*.txt`。改界面后用 `AMA_UPDATE_GOLDEN=1 pnpm vitest run src/modes/interactive` 更新并审阅差异。
|
package/package.json
CHANGED
|
@@ -1,6 +1,103 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@armadra/agent",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "可独立使用、可嵌入 Armadra 的编码 / 协调 Agent",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"coding-agent",
|
|
8
|
+
"agent",
|
|
9
|
+
"ai",
|
|
10
|
+
"llm",
|
|
11
|
+
"cli",
|
|
12
|
+
"tui",
|
|
13
|
+
"anthropic",
|
|
14
|
+
"openai",
|
|
15
|
+
"claude",
|
|
16
|
+
"deepseek",
|
|
17
|
+
"codemode",
|
|
18
|
+
"prompt-cache",
|
|
19
|
+
"sdk",
|
|
20
|
+
"armadra"
|
|
21
|
+
],
|
|
22
|
+
"homepage": "https://github.com/Owlbay/armadra-agent#readme",
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/Owlbay/armadra-agent/issues"
|
|
25
|
+
},
|
|
26
|
+
"author": "YoVinchen",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/Owlbay/armadra-agent.git"
|
|
31
|
+
},
|
|
32
|
+
"bin": {
|
|
33
|
+
"ama": "dist/cli/main.js"
|
|
34
|
+
},
|
|
35
|
+
"exports": {
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./dist/index.d.ts",
|
|
38
|
+
"import": "./dist/index.js"
|
|
39
|
+
},
|
|
40
|
+
"./host": {
|
|
41
|
+
"types": "./dist/host.d.ts",
|
|
42
|
+
"import": "./dist/host.js"
|
|
43
|
+
},
|
|
44
|
+
"./rpc": {
|
|
45
|
+
"types": "./dist/rpc.d.ts",
|
|
46
|
+
"import": "./dist/rpc.js"
|
|
47
|
+
},
|
|
48
|
+
"./tui": {
|
|
49
|
+
"types": "./dist/tui.d.ts",
|
|
50
|
+
"import": "./dist/tui.js"
|
|
51
|
+
},
|
|
52
|
+
"./bundle": "./dist/bundle/ama.cjs",
|
|
53
|
+
"./package.json": "./package.json"
|
|
54
|
+
},
|
|
55
|
+
"files": [
|
|
56
|
+
"dist",
|
|
57
|
+
"docs/rpc.md",
|
|
58
|
+
"docs/host-api.md",
|
|
59
|
+
"docs/hooks.md",
|
|
60
|
+
"docs/providers.md",
|
|
61
|
+
"docs/codemode.md",
|
|
62
|
+
"docs/tui.md",
|
|
63
|
+
"docs/session-format.md",
|
|
64
|
+
"CHANGELOG.md"
|
|
65
|
+
],
|
|
66
|
+
"sideEffects": [
|
|
67
|
+
"./dist/cli/main.js",
|
|
68
|
+
"./dist/codemode/sandbox-entry.js",
|
|
69
|
+
"./dist/bundle/*.cjs"
|
|
70
|
+
],
|
|
71
|
+
"engines": {
|
|
72
|
+
"node": ">=22"
|
|
73
|
+
},
|
|
74
|
+
"publishConfig": {
|
|
75
|
+
"access": "public",
|
|
76
|
+
"provenance": true
|
|
77
|
+
},
|
|
78
|
+
"scripts": {
|
|
79
|
+
"build": "pnpm build:lib && pnpm build:bundle",
|
|
80
|
+
"build:lib": "tsc -p tsconfig.build.json",
|
|
81
|
+
"build:bundle": "node scripts/build-bundle.mjs",
|
|
82
|
+
"typecheck": "tsc --noEmit",
|
|
83
|
+
"test": "vitest run",
|
|
84
|
+
"test:watch": "vitest",
|
|
85
|
+
"test:e2e": "AMA_E2E=1 vitest run test/e2e",
|
|
86
|
+
"fmt": "prettier --write .",
|
|
87
|
+
"fmt:check": "prettier --check .",
|
|
88
|
+
"check:deps": "node scripts/check-no-deps.mjs",
|
|
89
|
+
"release:check": "node scripts/release-check.mjs",
|
|
90
|
+
"bench:presets": "node scripts/bench-presets.mjs",
|
|
91
|
+
"bench:cache": "node scripts/cache-experiment.mjs",
|
|
92
|
+
"ci": "pnpm typecheck && pnpm fmt:check && pnpm check:deps && pnpm release:check && pnpm test && pnpm build && node dist/bundle/ama.cjs --version"
|
|
93
|
+
},
|
|
94
|
+
"dependencies": {},
|
|
95
|
+
"devDependencies": {
|
|
96
|
+
"@types/node": "^22.20.4",
|
|
97
|
+
"esbuild": "^0.28.2",
|
|
98
|
+
"prettier": "^3.9.9",
|
|
99
|
+
"typescript": "~5.9.3",
|
|
100
|
+
"vitest": "^4.1.11"
|
|
101
|
+
},
|
|
102
|
+
"packageManager": "pnpm@11.18.0"
|
|
103
|
+
}
|