@armadra/agent 0.3.0 → 0.5.0
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 +257 -0
- package/README.md +263 -95
- package/THIRD_PARTY_NOTICES.md +34 -0
- package/dist/acp.d.ts +18 -0
- package/dist/acp.js +19 -0
- package/dist/agent/limits.d.ts +38 -0
- package/dist/agent/limits.js +127 -0
- package/dist/agent/loop-guard.d.ts +38 -0
- package/dist/agent/loop-guard.js +95 -0
- package/dist/agent/loop.d.ts +4 -0
- package/dist/agent/loop.js +7 -0
- package/dist/agent/prompt-rules.d.ts +12 -0
- package/dist/agent/prompt-rules.js +18 -0
- package/dist/agent/reminders.d.ts +59 -0
- package/dist/agent/reminders.js +327 -0
- package/dist/agent/retry.d.ts +1 -1
- package/dist/agent/retry.js +2 -1
- package/dist/agent/session-cache.d.ts +5 -0
- package/dist/agent/session-cache.js +18 -2
- package/dist/agent/session-classifier.d.ts +18 -0
- package/dist/agent/session-classifier.js +105 -0
- package/dist/agent/session-compaction.d.ts +35 -6
- package/dist/agent/session-compaction.js +157 -31
- package/dist/agent/session-core.d.ts +40 -1
- package/dist/agent/session-extensions.d.ts +61 -0
- package/dist/agent/session-extensions.js +129 -0
- package/dist/agent/session-images.d.ts +23 -0
- package/dist/agent/session-images.js +97 -0
- package/dist/agent/session-plan.d.ts +21 -0
- package/dist/agent/session-plan.js +524 -0
- package/dist/agent/session-rewind.d.ts +81 -0
- package/dist/agent/session-rewind.js +354 -0
- package/dist/agent/session-run.d.ts +28 -1
- package/dist/agent/session-run.js +157 -6
- package/dist/agent/session-settings.d.ts +49 -0
- package/dist/agent/session-settings.js +95 -0
- package/dist/agent/session-subagent.d.ts +36 -24
- package/dist/agent/session-subagent.js +259 -129
- package/dist/agent/session-sync.d.ts +10 -3
- package/dist/agent/session-sync.js +37 -8
- package/dist/agent/session-telemetry.d.ts +39 -0
- package/dist/agent/session-telemetry.js +231 -0
- package/dist/agent/session-tools.js +63 -3
- package/dist/agent/session.d.ts +33 -29
- package/dist/agent/session.js +91 -126
- package/dist/agent/subagent-registry.d.ts +91 -0
- package/dist/agent/subagent-registry.js +494 -0
- package/dist/agent/system-prompt.d.ts +6 -3
- package/dist/agent/system-prompt.js +7 -2
- package/dist/agent/tool-runner.d.ts +8 -1
- package/dist/agent/tool-runner.js +72 -6
- package/dist/agent/types-w5.d.ts +192 -0
- package/dist/agent/types-w5.js +10 -0
- package/dist/agent/types.d.ts +55 -4
- package/dist/agent/types.js +2 -0
- package/dist/agent/worktree.d.ts +36 -0
- package/dist/agent/worktree.js +86 -0
- package/dist/agents/builtin.d.ts +14 -0
- package/dist/agents/builtin.js +39 -0
- package/dist/agents/catalog.d.ts +43 -0
- package/dist/agents/catalog.js +82 -0
- package/dist/agents/discover.d.ts +35 -0
- package/dist/agents/discover.js +83 -0
- package/dist/agents/external.d.ts +82 -0
- package/dist/agents/external.js +326 -0
- package/dist/agents/parse.d.ts +18 -0
- package/dist/agents/parse.js +116 -0
- package/dist/agents/result.d.ts +32 -0
- package/dist/agents/result.js +67 -0
- package/dist/agents/task-control.d.ts +17 -0
- package/dist/agents/task-control.js +17 -0
- package/dist/agents/task-record.d.ts +78 -0
- package/dist/agents/task-record.js +141 -0
- package/dist/agents/types.d.ts +46 -0
- package/dist/agents/types.js +8 -0
- package/dist/ai/apis/anthropic-compat.d.ts +36 -0
- package/dist/ai/apis/anthropic-compat.js +92 -0
- package/dist/ai/apis/anthropic-messages.js +3 -2
- package/dist/ai/apis/anthropic-request.d.ts +7 -6
- package/dist/ai/apis/anthropic-request.js +10 -28
- package/dist/ai/apis/cache-params.d.ts +11 -2
- package/dist/ai/apis/cache-params.js +25 -6
- package/dist/ai/apis/google-generative-ai.js +3 -2
- package/dist/ai/apis/openai-compat.d.ts +4 -1
- package/dist/ai/apis/openai-compat.js +8 -1
- package/dist/ai/apis/openai-completions.js +3 -2
- package/dist/ai/apis/openai-responses.js +3 -2
- package/dist/ai/http.d.ts +28 -6
- package/dist/ai/http.js +41 -8
- package/dist/ai/image-limits.d.ts +45 -0
- package/dist/ai/image-limits.js +68 -0
- package/dist/ai/providers/builtin.d.ts +18 -6
- package/dist/ai/providers/builtin.js +135 -6
- package/dist/ai/providers/catalog-data.js +17 -13
- package/dist/ai/providers/catalog.d.ts +60 -7
- package/dist/ai/providers/catalog.js +197 -38
- package/dist/ai/providers/channels.d.ts +33 -3
- package/dist/ai/providers/channels.js +108 -7
- package/dist/ai/providers/enrich.d.ts +6 -3
- package/dist/ai/providers/enrich.js +19 -4
- package/dist/ai/providers/models-dev-cache.d.ts +28 -24
- package/dist/ai/providers/models-dev-cache.js +92 -78
- package/dist/ai/providers/models-dev-data.d.ts +7 -0
- package/dist/ai/providers/models-dev-data.js +32 -0
- package/dist/ai/providers/models-dev-snapshot.d.ts +50 -0
- package/dist/ai/providers/models-dev-snapshot.js +137 -0
- package/dist/ai/providers/models-dev.d.ts +51 -10
- package/dist/ai/providers/models-dev.js +132 -39
- package/dist/ai/providers/registry.d.ts +28 -11
- package/dist/ai/providers/registry.js +112 -65
- package/dist/ai/providers/suggest.d.ts +18 -0
- package/dist/ai/providers/suggest.js +72 -0
- package/dist/ai/sse.d.ts +6 -2
- package/dist/ai/sse.js +22 -2
- package/dist/ai/types.d.ts +37 -4
- package/dist/ai/types.js +5 -0
- package/dist/bundle/ama.cjs +41979 -21147
- package/dist/checkpoints/backend.d.ts +61 -0
- package/dist/checkpoints/backend.js +135 -0
- package/dist/checkpoints/blobs.d.ts +60 -0
- package/dist/checkpoints/blobs.js +203 -0
- package/dist/checkpoints/gc.d.ts +47 -0
- package/dist/checkpoints/gc.js +144 -0
- package/dist/checkpoints/git-head.d.ts +15 -0
- package/dist/checkpoints/git-head.js +89 -0
- package/dist/checkpoints/index.d.ts +17 -0
- package/dist/checkpoints/index.js +17 -0
- package/dist/checkpoints/replay.d.ts +48 -0
- package/dist/checkpoints/replay.js +154 -0
- package/dist/checkpoints/restore.d.ts +86 -0
- package/dist/checkpoints/restore.js +263 -0
- package/dist/checkpoints/settings.d.ts +14 -0
- package/dist/checkpoints/settings.js +23 -0
- package/dist/checkpoints/shadow-git.d.ts +108 -0
- package/dist/checkpoints/shadow-git.js +491 -0
- package/dist/checkpoints/shadow-restore.d.ts +25 -0
- package/dist/checkpoints/shadow-restore.js +128 -0
- package/dist/checkpoints/tracker.d.ts +64 -0
- package/dist/checkpoints/tracker.js +192 -0
- package/dist/checkpoints/types.d.ts +99 -0
- package/dist/checkpoints/types.js +12 -0
- package/dist/cli/args.d.ts +26 -7
- package/dist/cli/args.js +75 -82
- package/dist/cli/bootstrap.js +40 -4
- package/dist/cli/codemode-notice.d.ts +21 -0
- package/dist/cli/codemode-notice.js +56 -0
- package/dist/cli/compose-agents.d.ts +27 -0
- package/dist/cli/compose-agents.js +111 -0
- package/dist/cli/compose-extensions.d.ts +29 -0
- package/dist/cli/compose-extensions.js +44 -0
- package/dist/cli/compose-session.d.ts +8 -0
- package/dist/cli/compose-session.js +76 -2
- package/dist/cli/compose-store.d.ts +1 -1
- package/dist/cli/compose-store.js +3 -1
- package/dist/cli/compose.d.ts +17 -4
- package/dist/cli/compose.js +60 -14
- package/dist/cli/default-model.d.ts +38 -1
- package/dist/cli/default-model.js +96 -9
- package/dist/cli/deps.d.ts +42 -0
- package/dist/cli/exit-codes.d.ts +12 -0
- package/dist/cli/exit-codes.js +15 -0
- package/dist/cli/fake-visibility.d.ts +13 -0
- package/dist/cli/fake-visibility.js +26 -0
- package/dist/cli/from-prompt.d.ts +18 -0
- package/dist/cli/from-prompt.js +49 -0
- package/dist/cli/help-text.d.ts +4 -0
- package/dist/cli/help-text.js +102 -0
- package/dist/cli/main.d.ts +9 -2
- package/dist/cli/main.js +77 -3
- package/dist/cli/proxy.d.ts +51 -0
- package/dist/cli/proxy.js +135 -0
- package/dist/cli/startup-screen.d.ts +29 -0
- package/dist/cli/startup-screen.js +51 -2
- package/dist/cli/startup-steps.d.ts +1 -1
- package/dist/cli/startup-steps.js +21 -13
- package/dist/cli/subcommands/config.d.ts +22 -3
- package/dist/cli/subcommands/config.js +119 -21
- package/dist/cli/subcommands/context.js +4 -1
- package/dist/cli/subcommands/doctor.js +33 -1
- package/dist/cli/subcommands/init.js +2 -1
- package/dist/cli/subcommands/models-discover.d.ts +15 -9
- package/dist/cli/subcommands/models-discover.js +58 -52
- package/dist/cli/subcommands/models.d.ts +2 -0
- package/dist/cli/subcommands/models.js +33 -14
- package/dist/cli/subcommands/probe-runner.d.ts +96 -0
- package/dist/cli/subcommands/probe-runner.js +264 -0
- package/dist/cli/subcommands/providers-probe.d.ts +34 -0
- package/dist/cli/subcommands/providers-probe.js +87 -0
- package/dist/cli/subcommands/providers.d.ts +3 -2
- package/dist/cli/subcommands/providers.js +53 -51
- package/dist/cli/subcommands/sessions-export.d.ts +10 -0
- package/dist/cli/subcommands/sessions-export.js +59 -0
- package/dist/cli/subcommands/sessions-search.d.ts +13 -0
- package/dist/cli/subcommands/sessions-search.js +103 -0
- package/dist/cli/subcommands/sessions.d.ts +6 -3
- package/dist/cli/subcommands/sessions.js +58 -3
- package/dist/cli/subcommands/stats.d.ts +17 -0
- package/dist/cli/subcommands/stats.js +198 -0
- package/dist/cli/system-prompt-arg.d.ts +11 -0
- package/dist/cli/system-prompt-arg.js +34 -0
- package/dist/codemode/capability.d.ts +24 -7
- package/dist/codemode/capability.js +38 -10
- package/dist/codemode/host-side.d.ts +14 -0
- package/dist/codemode/host-side.js +24 -1
- package/dist/codemode/modes.d.ts +4 -11
- package/dist/codemode/modes.js +5 -27
- package/dist/codemode/tool.d.ts +18 -14
- package/dist/codemode/tool.js +76 -31
- package/dist/compaction/breaker.d.ts +25 -9
- package/dist/compaction/breaker.js +47 -17
- package/dist/compaction/estimate.d.ts +11 -3
- package/dist/compaction/estimate.js +64 -22
- package/dist/compaction/image-budget.d.ts +45 -0
- package/dist/compaction/image-budget.js +115 -0
- package/dist/compaction/post-compact.d.ts +38 -0
- package/dist/compaction/post-compact.js +152 -0
- package/dist/compaction/protect.d.ts +27 -0
- package/dist/compaction/protect.js +56 -0
- package/dist/compaction/prune-tier.d.ts +58 -12
- package/dist/compaction/prune-tier.js +120 -54
- package/dist/compaction/summarize-tier.d.ts +23 -4
- package/dist/compaction/summarize-tier.js +100 -29
- package/dist/config/checker.d.ts +28 -0
- package/dist/config/checker.js +97 -0
- package/dist/config/init.d.ts +6 -2
- package/dist/config/init.js +12 -5
- package/dist/config/json-schema.d.ts +1 -0
- package/dist/config/json-schema.js +98 -4
- package/dist/config/key-docs.d.ts +22 -0
- package/dist/config/key-docs.js +174 -0
- package/dist/config/merge.d.ts +12 -9
- package/dist/config/merge.js +102 -13
- package/dist/config/profile.d.ts +2 -0
- package/dist/config/profile.js +2 -0
- package/dist/config/schema-w5.d.ts +18 -0
- package/dist/config/schema-w5.js +109 -0
- package/dist/config/schema.d.ts +5 -9
- package/dist/config/schema.js +91 -118
- package/dist/config/types-w5.d.ts +118 -0
- package/dist/config/types-w5.js +20 -0
- package/dist/config/types.d.ts +84 -7
- package/dist/config/types.js +29 -1
- package/dist/drivers/acp/client.d.ts +57 -0
- package/dist/drivers/acp/client.js +160 -0
- package/dist/drivers/acp/driver.d.ts +31 -0
- package/dist/drivers/acp/driver.js +274 -0
- package/dist/drivers/acp/testing/fake-agent-main.d.ts +5 -0
- package/dist/drivers/acp/testing/fake-agent-main.js +7 -0
- package/dist/drivers/acp/testing/fake-agent.d.ts +27 -0
- package/dist/drivers/acp/testing/fake-agent.js +211 -0
- package/dist/drivers/acp/types.d.ts +285 -0
- package/dist/drivers/acp/types.js +36 -0
- package/dist/drivers/agents.d.ts +58 -0
- package/dist/drivers/agents.js +142 -0
- package/dist/drivers/base.d.ts +35 -0
- package/dist/drivers/base.js +59 -0
- package/dist/drivers/catalog.d.ts +46 -0
- package/dist/drivers/catalog.js +167 -0
- package/dist/drivers/env.d.ts +20 -0
- package/dist/drivers/env.js +46 -0
- package/dist/drivers/host-runners.d.ts +18 -0
- package/dist/drivers/host-runners.js +45 -0
- package/dist/drivers/jsonrpc.d.ts +58 -0
- package/dist/drivers/jsonrpc.js +180 -0
- package/dist/drivers/native/claude-normalize.d.ts +46 -0
- package/dist/drivers/native/claude-normalize.js +106 -0
- package/dist/drivers/native/claude-stream.d.ts +29 -0
- package/dist/drivers/native/claude-stream.js +456 -0
- package/dist/drivers/native/codex-app-server.d.ts +26 -0
- package/dist/drivers/native/codex-app-server.js +407 -0
- package/dist/drivers/native/codex-normalize.d.ts +38 -0
- package/dist/drivers/native/codex-normalize.js +124 -0
- package/dist/drivers/native/oneshot.d.ts +28 -0
- package/dist/drivers/native/oneshot.js +312 -0
- package/dist/drivers/permissions.d.ts +40 -0
- package/dist/drivers/permissions.js +92 -0
- package/dist/drivers/pids.d.ts +32 -0
- package/dist/drivers/pids.js +93 -0
- package/dist/drivers/pool.d.ts +28 -0
- package/dist/drivers/pool.js +96 -0
- package/dist/drivers/probe.d.ts +47 -0
- package/dist/drivers/probe.js +172 -0
- package/dist/drivers/process.d.ts +48 -0
- package/dist/drivers/process.js +100 -0
- package/dist/drivers/runner.d.ts +61 -0
- package/dist/drivers/runner.js +388 -0
- package/dist/drivers/store.d.ts +49 -0
- package/dist/drivers/store.js +91 -0
- package/dist/drivers/turn.d.ts +41 -0
- package/dist/drivers/turn.js +99 -0
- package/dist/drivers/types.d.ts +122 -0
- package/dist/drivers/types.js +11 -0
- package/dist/git/info.d.ts +75 -0
- package/dist/git/info.js +191 -0
- package/dist/hooks/protocol.js +6 -1
- package/dist/hooks/types.d.ts +10 -1
- package/dist/hooks/types.js +2 -0
- package/dist/host/api-impl.d.ts +7 -0
- package/dist/host/api-impl.js +15 -0
- package/dist/host/types.d.ts +24 -2
- package/dist/host/types.js +4 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -0
- package/dist/modes/acp/acp-events.d.ts +46 -0
- package/dist/modes/acp/acp-events.js +233 -0
- package/dist/modes/acp/acp-mode.d.ts +17 -0
- package/dist/modes/acp/acp-mode.js +47 -0
- package/dist/modes/acp/acp-server.d.ts +79 -0
- package/dist/modes/acp/acp-server.js +315 -0
- package/dist/modes/commands-core.d.ts +7 -1
- package/dist/modes/commands-core.js +61 -5
- package/dist/modes/image-input.d.ts +12 -4
- package/dist/modes/image-input.js +22 -5
- package/dist/modes/interactive/agent-panels.d.ts +14 -0
- package/dist/modes/interactive/agent-panels.js +103 -0
- package/dist/modes/interactive/agent-ui.d.ts +73 -0
- package/dist/modes/interactive/agent-ui.js +234 -0
- package/dist/modes/interactive/approval-dialog.d.ts +40 -7
- package/dist/modes/interactive/approval-dialog.js +192 -35
- package/dist/modes/interactive/approval-merge.d.ts +41 -0
- package/dist/modes/interactive/approval-merge.js +89 -0
- package/dist/modes/interactive/clipboard-paste.d.ts +18 -0
- package/dist/modes/interactive/clipboard-paste.js +28 -0
- package/dist/modes/interactive/commands.d.ts +20 -3
- package/dist/modes/interactive/commands.js +75 -16
- package/dist/modes/interactive/double-esc.d.ts +20 -0
- package/dist/modes/interactive/double-esc.js +34 -0
- package/dist/modes/interactive/event-notices.d.ts +32 -0
- package/dist/modes/interactive/event-notices.js +79 -0
- package/dist/modes/interactive/external-editor.d.ts +16 -0
- package/dist/modes/interactive/external-editor.js +39 -0
- package/dist/modes/interactive/interactive-mode.d.ts +16 -2
- package/dist/modes/interactive/interactive-mode.js +184 -202
- package/dist/modes/interactive/key-dispatch.d.ts +18 -2
- package/dist/modes/interactive/key-dispatch.js +53 -6
- package/dist/modes/interactive/line/line-mode.d.ts +3 -1
- package/dist/modes/interactive/line/line-mode.js +28 -9
- package/dist/modes/interactive/line/line-render.d.ts +6 -1
- package/dist/modes/interactive/line/line-render.js +66 -8
- package/dist/modes/interactive/message-view.d.ts +49 -10
- package/dist/modes/interactive/message-view.js +262 -46
- package/dist/modes/interactive/panels.d.ts +35 -0
- package/dist/modes/interactive/panels.js +157 -0
- package/dist/modes/interactive/pickers.d.ts +23 -2
- package/dist/modes/interactive/pickers.js +48 -15
- package/dist/modes/interactive/plan-command.d.ts +40 -0
- package/dist/modes/interactive/plan-command.js +129 -0
- package/dist/modes/interactive/plan-dialog.d.ts +98 -0
- package/dist/modes/interactive/plan-dialog.js +290 -0
- package/dist/modes/interactive/plan-flow.d.ts +34 -0
- package/dist/modes/interactive/plan-flow.js +98 -0
- package/dist/modes/interactive/rewind-command.d.ts +31 -0
- package/dist/modes/interactive/rewind-command.js +106 -0
- package/dist/modes/interactive/rewind-flow.d.ts +37 -0
- package/dist/modes/interactive/rewind-flow.js +151 -0
- package/dist/modes/interactive/rewind-list.d.ts +36 -0
- package/dist/modes/interactive/rewind-list.js +123 -0
- package/dist/modes/interactive/rewind-panel.d.ts +77 -0
- package/dist/modes/interactive/rewind-panel.js +309 -0
- package/dist/modes/interactive/rewind-text.d.ts +40 -0
- package/dist/modes/interactive/rewind-text.js +139 -0
- package/dist/modes/interactive/run-indicator.d.ts +51 -0
- package/dist/modes/interactive/run-indicator.js +189 -0
- package/dist/modes/interactive/session-events.d.ts +24 -0
- package/dist/modes/interactive/session-events.js +96 -0
- package/dist/modes/interactive/startup-header.d.ts +40 -0
- package/dist/modes/interactive/startup-header.js +169 -0
- package/dist/modes/interactive/status-area.d.ts +73 -0
- package/dist/modes/interactive/status-area.js +190 -0
- package/dist/modes/interactive/status-bar.d.ts +107 -16
- package/dist/modes/interactive/status-bar.js +306 -81
- package/dist/modes/interactive/status-line.d.ts +33 -0
- package/dist/modes/interactive/status-line.js +113 -0
- package/dist/modes/interactive/subagent-view.d.ts +56 -0
- package/dist/modes/interactive/subagent-view.js +154 -0
- package/dist/modes/interactive/tasks-report.d.ts +27 -0
- package/dist/modes/interactive/tasks-report.js +114 -0
- package/dist/modes/interactive/tool-summary.d.ts +46 -0
- package/dist/modes/interactive/tool-summary.js +218 -0
- package/dist/modes/interactive/tool-view.d.ts +58 -15
- package/dist/modes/interactive/tool-view.js +233 -145
- package/dist/modes/print/print-mode.d.ts +40 -4
- package/dist/modes/print/print-mode.js +161 -8
- package/dist/modes/rpc/commands.d.ts +9 -0
- package/dist/modes/rpc/commands.js +49 -0
- package/dist/modes/rpc/rpc-mode.js +7 -1
- package/dist/modes/session-report.d.ts +11 -0
- package/dist/modes/session-report.js +48 -1
- package/dist/permissions/auto-safe.d.ts +65 -0
- package/dist/permissions/auto-safe.js +547 -0
- package/dist/permissions/classifier.d.ts +68 -0
- package/dist/permissions/classifier.js +186 -0
- package/dist/permissions/dangerous.d.ts +5 -0
- package/dist/permissions/dangerous.js +1 -1
- package/dist/permissions/modes.d.ts +30 -0
- package/dist/permissions/modes.js +78 -0
- package/dist/permissions/pipeline.d.ts +72 -6
- package/dist/permissions/pipeline.js +306 -11
- package/dist/permissions/protected.d.ts +19 -0
- package/dist/permissions/protected.js +74 -0
- package/dist/permissions/readonly-bash.d.ts +30 -0
- package/dist/permissions/readonly-bash.js +118 -0
- package/dist/permissions/rules.js +3 -0
- package/dist/permissions/types.d.ts +92 -3
- package/dist/permissions/types.js +3 -0
- package/dist/plan/compose.d.ts +9 -0
- package/dist/plan/compose.js +19 -0
- package/dist/plan/controller.d.ts +71 -0
- package/dist/plan/controller.js +27 -0
- package/dist/plan/done-markers.d.ts +17 -0
- package/dist/plan/done-markers.js +51 -0
- package/dist/plan/extract.d.ts +29 -0
- package/dist/plan/extract.js +160 -0
- package/dist/plan/prompts.d.ts +36 -0
- package/dist/plan/prompts.js +89 -0
- package/dist/plan/store.d.ts +37 -0
- package/dist/plan/store.js +90 -0
- package/dist/rpc.d.ts +58 -2
- package/dist/rpc.js +7 -0
- package/dist/sandbox/bash.d.ts +74 -0
- package/dist/sandbox/bash.js +126 -0
- package/dist/sandbox/detect.d.ts +48 -0
- package/dist/sandbox/detect.js +149 -0
- package/dist/sandbox/index.d.ts +5 -0
- package/dist/sandbox/index.js +5 -0
- package/dist/sandbox/profile.d.ts +33 -0
- package/dist/sandbox/profile.js +76 -0
- package/dist/sandbox/wrap.d.ts +29 -0
- package/dist/sandbox/wrap.js +117 -0
- package/dist/sdk.d.ts +42 -5
- package/dist/sdk.js +34 -4
- package/dist/session/export.d.ts +32 -0
- package/dist/session/export.js +187 -0
- package/dist/session/redact.d.ts +15 -0
- package/dist/session/redact.js +55 -0
- package/dist/session/reuse.d.ts +33 -0
- package/dist/session/reuse.js +86 -0
- package/dist/session/scan.d.ts +34 -0
- package/dist/session/scan.js +140 -0
- package/dist/session/search.d.ts +52 -0
- package/dist/session/search.js +211 -0
- package/dist/session/stats-aggregate.d.ts +63 -0
- package/dist/session/stats-aggregate.js +163 -0
- package/dist/session/stats-index.d.ts +26 -0
- package/dist/session/stats-index.js +91 -0
- package/dist/session/stats-scan.d.ts +54 -0
- package/dist/session/stats-scan.js +236 -0
- package/dist/session/types.d.ts +3 -1
- package/dist/session/types.js +1 -0
- package/dist/skills/builtin.d.ts +31 -0
- package/dist/skills/builtin.js +109 -0
- package/dist/skills/discover.d.ts +2 -1
- package/dist/skills/index-prompt.js +5 -8
- package/dist/tools/background-jobs.d.ts +71 -0
- package/dist/tools/background-jobs.js +198 -0
- package/dist/tools/bash.d.ts +53 -1
- package/dist/tools/bash.js +158 -7
- package/dist/tools/clipboard-image.d.ts +44 -0
- package/dist/tools/clipboard-image.js +148 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.js +18 -3
- package/dist/tools/image-file.d.ts +38 -3
- package/dist/tools/image-file.js +81 -10
- package/dist/tools/image-resize.d.ts +58 -0
- package/dist/tools/image-resize.js +97 -0
- package/dist/tools/presets.d.ts +40 -8
- package/dist/tools/presets.js +65 -19
- package/dist/tools/read.d.ts +5 -2
- package/dist/tools/read.js +13 -10
- package/dist/tools/registry.d.ts +7 -1
- package/dist/tools/registry.js +27 -4
- package/dist/tools/task-ctl.d.ts +22 -0
- package/dist/tools/task-ctl.js +116 -0
- package/dist/tools/task.d.ts +22 -10
- package/dist/tools/task.js +66 -26
- package/dist/tools/todo.d.ts +22 -2
- package/dist/tools/todo.js +58 -14
- package/dist/tools/truncate.d.ts +15 -0
- package/dist/tools/truncate.js +25 -0
- package/dist/tools/types.d.ts +113 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/write.js +3 -0
- package/dist/tui/component.d.ts +8 -2
- package/dist/tui/component.js +3 -1
- package/dist/tui/components/box.d.ts +6 -1
- package/dist/tui/components/box.js +16 -6
- package/dist/tui/components/card.d.ts +23 -0
- package/dist/tui/components/card.js +37 -0
- package/dist/tui/components/editor-history.d.ts +6 -0
- package/dist/tui/components/editor-history.js +45 -0
- package/dist/tui/components/editor-paste.d.ts +1 -1
- package/dist/tui/components/editor-paste.js +4 -4
- package/dist/tui/components/editor.d.ts +11 -5
- package/dist/tui/components/editor.js +52 -58
- package/dist/tui/components/key-value.d.ts +3 -0
- package/dist/tui/components/key-value.js +16 -6
- package/dist/tui/components/loader.d.ts +37 -7
- package/dist/tui/components/loader.js +84 -21
- package/dist/tui/components/markdown.d.ts +5 -1
- package/dist/tui/components/markdown.js +45 -21
- package/dist/tui/components/meter.d.ts +3 -3
- package/dist/tui/components/meter.js +13 -11
- package/dist/tui/components/select-list.d.ts +23 -1
- package/dist/tui/components/select-list.js +76 -13
- package/dist/tui/glyphs.d.ts +72 -0
- package/dist/tui/glyphs.js +118 -0
- package/dist/tui/keybindings.d.ts +5 -0
- package/dist/tui/keybindings.js +5 -0
- package/dist/tui/theme.d.ts +30 -6
- package/dist/tui/theme.js +103 -17
- package/dist/tui.d.ts +4 -2
- package/dist/tui.js +3 -1
- package/docs/acp.md +78 -0
- package/docs/agents.md +250 -0
- package/docs/codemode.md +28 -10
- package/docs/hooks.md +36 -32
- package/docs/permissions.md +212 -0
- package/docs/plan.md +107 -0
- package/docs/providers.md +261 -62
- package/docs/rewind-plan.md +181 -0
- package/docs/rpc.md +127 -40
- package/docs/sandbox.md +215 -0
- package/docs/session-format.md +43 -22
- package/docs/sessions.md +174 -0
- package/docs/tui-design.md +751 -0
- package/docs/tui.md +260 -64
- package/package.json +15 -2
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 字形表与 ASCII 回退(终端界面视觉设计 v1 §2.2)。
|
|
3
|
+
*
|
|
4
|
+
* 所有组件通过 `theme.glyphs` 取字形,不另加参数;`UNICODE_GLYPHS` 里每个字形都是 1 列宽
|
|
5
|
+
* (`codePointWidth` 判定,与 wcwidth 一致;个别字体把 `⏺` 画成两格时用 `AMA_ASCII=1`)。
|
|
6
|
+
*
|
|
7
|
+
* ASCII 触发:`ui.ascii: true` / `AMA_ASCII=1`,或自动检测——区域设置(`LC_ALL` > `LC_CTYPE` > `LANG`)
|
|
8
|
+
* 已设置但不含 UTF-8、`TERM=linux`、Windows 上 `WT_SESSION` 与 `TERM_PROGRAM` 都为空(旧 conhost)。
|
|
9
|
+
* `AMA_ASCII=0` 强制 Unicode。区域变量都没设时按 Unicode 处理(容器与 CI 里常见)。
|
|
10
|
+
*/
|
|
11
|
+
export const UNICODE_GLYPHS = {
|
|
12
|
+
ascii: false,
|
|
13
|
+
prompt: "›",
|
|
14
|
+
tool: "⏺",
|
|
15
|
+
result: "⎿",
|
|
16
|
+
ok: "✓",
|
|
17
|
+
fail: "✗",
|
|
18
|
+
warn: "!",
|
|
19
|
+
thinking: "✻",
|
|
20
|
+
queued: "↳",
|
|
21
|
+
retry: "↻",
|
|
22
|
+
blocked: "⛔",
|
|
23
|
+
card: "▎",
|
|
24
|
+
expand: "▸",
|
|
25
|
+
collapse: "▾",
|
|
26
|
+
warm: "♨",
|
|
27
|
+
check: "✓",
|
|
28
|
+
bullets: ["•", "◦", "▪"],
|
|
29
|
+
meterFull: "▮",
|
|
30
|
+
meterEmpty: "▯",
|
|
31
|
+
box: {
|
|
32
|
+
topLeft: "╭",
|
|
33
|
+
topRight: "╮",
|
|
34
|
+
bottomLeft: "╰",
|
|
35
|
+
bottomRight: "╯",
|
|
36
|
+
vertical: "│",
|
|
37
|
+
horizontal: "─",
|
|
38
|
+
},
|
|
39
|
+
rule: "─",
|
|
40
|
+
spinner: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"],
|
|
41
|
+
spinnerStatic: "·",
|
|
42
|
+
ellipsis: "…",
|
|
43
|
+
arrowUp: "↑",
|
|
44
|
+
arrowDown: "↓",
|
|
45
|
+
branch: "⎇",
|
|
46
|
+
dot: "•",
|
|
47
|
+
};
|
|
48
|
+
export const ASCII_GLYPHS = {
|
|
49
|
+
ascii: true,
|
|
50
|
+
prompt: ">",
|
|
51
|
+
tool: "*",
|
|
52
|
+
result: "L",
|
|
53
|
+
ok: "v",
|
|
54
|
+
fail: "x",
|
|
55
|
+
warn: "!",
|
|
56
|
+
thinking: "~",
|
|
57
|
+
queued: "->",
|
|
58
|
+
retry: "@",
|
|
59
|
+
blocked: "X",
|
|
60
|
+
card: "|",
|
|
61
|
+
expand: ">",
|
|
62
|
+
collapse: "v",
|
|
63
|
+
warm: "~",
|
|
64
|
+
check: "v",
|
|
65
|
+
bullets: ["-", "*", "+"],
|
|
66
|
+
meterFull: "#",
|
|
67
|
+
meterEmpty: ".",
|
|
68
|
+
box: {
|
|
69
|
+
topLeft: "+",
|
|
70
|
+
topRight: "+",
|
|
71
|
+
bottomLeft: "+",
|
|
72
|
+
bottomRight: "+",
|
|
73
|
+
vertical: "|",
|
|
74
|
+
horizontal: "-",
|
|
75
|
+
},
|
|
76
|
+
rule: "-",
|
|
77
|
+
spinner: ["-", "\\", "|", "/"],
|
|
78
|
+
spinnerStatic: ".",
|
|
79
|
+
ellipsis: "...",
|
|
80
|
+
arrowUp: "^",
|
|
81
|
+
arrowDown: "v",
|
|
82
|
+
branch: "git",
|
|
83
|
+
dot: "*",
|
|
84
|
+
};
|
|
85
|
+
function truthy(value) {
|
|
86
|
+
if (value === undefined || value === "")
|
|
87
|
+
return undefined;
|
|
88
|
+
const v = value.toLowerCase();
|
|
89
|
+
if (v === "1" || v === "true" || v === "yes" || v === "on")
|
|
90
|
+
return true;
|
|
91
|
+
if (v === "0" || v === "false" || v === "no" || v === "off")
|
|
92
|
+
return false;
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
/** 由环境判断是否用 ASCII 字形(`AMA_ASCII` 优先)。 */
|
|
96
|
+
export function detectAscii(env = process.env, platform = process.platform) {
|
|
97
|
+
const forced = truthy(env["AMA_ASCII"]);
|
|
98
|
+
if (forced !== undefined)
|
|
99
|
+
return forced;
|
|
100
|
+
const locale = env["LC_ALL"] || env["LC_CTYPE"] || env["LANG"] || "";
|
|
101
|
+
if (locale !== "" && !/utf-?8/i.test(locale))
|
|
102
|
+
return true;
|
|
103
|
+
if ((env["TERM"] ?? "") === "linux")
|
|
104
|
+
return true;
|
|
105
|
+
if (platform === "win32" && !env["WT_SESSION"] && !env["TERM_PROGRAM"])
|
|
106
|
+
return true;
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
/** 配置与环境合并:`AMA_ASCII` 显式值 > `ui.ascii` > 自动检测。 */
|
|
110
|
+
export function resolveAscii(configured, env = process.env, platform = process.platform) {
|
|
111
|
+
const forced = truthy(env["AMA_ASCII"]);
|
|
112
|
+
if (forced !== undefined)
|
|
113
|
+
return forced;
|
|
114
|
+
return configured ?? detectAscii(env, platform);
|
|
115
|
+
}
|
|
116
|
+
export function glyphsFor(ascii) {
|
|
117
|
+
return ascii ? ASCII_GLYPHS : UNICODE_GLYPHS;
|
|
118
|
+
}
|
|
@@ -31,6 +31,7 @@ export declare const DEFAULT_KEYBINDINGS: {
|
|
|
31
31
|
readonly "tui.select.confirm": readonly ["enter", "tab"];
|
|
32
32
|
readonly "tui.select.cancel": readonly ["escape", "ctrl+c"];
|
|
33
33
|
readonly "app.interrupt": readonly ["escape"];
|
|
34
|
+
readonly "app.rewind": readonly ["escape"];
|
|
34
35
|
readonly "app.clear": readonly ["ctrl+c"];
|
|
35
36
|
readonly "app.exit": readonly ["ctrl+d"];
|
|
36
37
|
readonly "app.message.followUp": readonly ["alt+enter"];
|
|
@@ -39,6 +40,10 @@ export declare const DEFAULT_KEYBINDINGS: {
|
|
|
39
40
|
readonly "app.tools.expand": readonly ["ctrl+o"];
|
|
40
41
|
readonly "app.model.select": readonly ["ctrl+l"];
|
|
41
42
|
readonly "app.thinking.select": readonly ["ctrl+t"];
|
|
43
|
+
/** [W5-A] 底部信息行 full ↔ compact(只影响本会话)。 */
|
|
44
|
+
readonly "app.statusLine.toggle": readonly ["ctrl+g"];
|
|
45
|
+
/** [W5-U] 粘贴剪贴板图片(写进数据目录,输入框插入 `@路径`)。 */
|
|
46
|
+
readonly "app.paste.image": readonly ["ctrl+v"];
|
|
42
47
|
};
|
|
43
48
|
export type ActionId = keyof typeof DEFAULT_KEYBINDINGS;
|
|
44
49
|
export type KeybindingOverrides = Partial<Record<ActionId, readonly string[]>>;
|
package/dist/tui/keybindings.js
CHANGED
|
@@ -33,6 +33,7 @@ export const DEFAULT_KEYBINDINGS = {
|
|
|
33
33
|
"tui.select.confirm": ["enter", "tab"],
|
|
34
34
|
"tui.select.cancel": ["escape", "ctrl+c"],
|
|
35
35
|
"app.interrupt": ["escape"],
|
|
36
|
+
"app.rewind": ["escape"],
|
|
36
37
|
"app.clear": ["ctrl+c"],
|
|
37
38
|
"app.exit": ["ctrl+d"],
|
|
38
39
|
"app.message.followUp": ["alt+enter"],
|
|
@@ -41,6 +42,10 @@ export const DEFAULT_KEYBINDINGS = {
|
|
|
41
42
|
"app.tools.expand": ["ctrl+o"],
|
|
42
43
|
"app.model.select": ["ctrl+l"],
|
|
43
44
|
"app.thinking.select": ["ctrl+t"],
|
|
45
|
+
/** [W5-A] 底部信息行 full ↔ compact(只影响本会话)。 */
|
|
46
|
+
"app.statusLine.toggle": ["ctrl+g"],
|
|
47
|
+
/** [W5-U] 粘贴剪贴板图片(写进数据目录,输入框插入 `@路径`)。 */
|
|
48
|
+
"app.paste.image": ["ctrl+v"],
|
|
44
49
|
};
|
|
45
50
|
export function isActionId(id) {
|
|
46
51
|
return Object.prototype.hasOwnProperty.call(DEFAULT_KEYBINDINGS, id);
|
package/dist/tui/theme.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 主题与颜色能力(设计 §12.7)。[B4]
|
|
3
3
|
*
|
|
4
|
-
* - `dark` / `light`
|
|
5
|
-
*
|
|
4
|
+
* - `dark` / `light` 两套语义色(14 个名字,终端界面视觉设计 v1 §2.1),以 24 位 RGB 定义;取值都落在
|
|
5
|
+
* xterm 256 色立方 / 灰阶上,所以 256 色回退无损。
|
|
6
|
+
* - 能力降级:truecolor → 256 色(6×6×6 立方 + 灰阶取近)→ 16 色(内置色板按 `THEME_ANSI16` 查表,
|
|
7
|
+
* 覆盖色按 xterm 缺省调色板取近)→ 无色。
|
|
8
|
+
* - `bg("selection")` 在 < 256 色时退化为 `accent` 粗体前景(16 色下底色太跳,且常留「尾巴」)。
|
|
6
9
|
* - `NO_COLOR`(非空)或 `TERM=dumb` → 无色;不探测终端背景(不发查询序列)。
|
|
7
10
|
* - 样式用各自的关闭码(39 / 49 / 22 / 23 / 24)而不是全重置,可以嵌套。
|
|
8
11
|
*/
|
|
@@ -10,6 +13,21 @@ import type { ColorDepth, SemanticColor, Theme, ThemeCapabilities } from "./comp
|
|
|
10
13
|
export type ThemeName = "dark" | "light";
|
|
11
14
|
type Rgb = readonly [number, number, number];
|
|
12
15
|
export declare const THEME_PALETTES: Record<ThemeName, Record<SemanticColor, string>>;
|
|
16
|
+
/**
|
|
17
|
+
* 16 色下的索引(xterm 0–15)。距离取近对饱和色不可靠(`#ff5f5f` 会落到灰 8),所以内置色板查表;
|
|
18
|
+
* `selection` 在 16 色下不作 bg,表里给前景兜底值。
|
|
19
|
+
*/
|
|
20
|
+
export declare const THEME_ANSI16: Record<ThemeName, Record<SemanticColor, number>>;
|
|
21
|
+
/** 阈值档位:≥ dangerAt error,≥ warnAt warning,否则 success(状态栏 ctx、Meter、/session 共用)。 */
|
|
22
|
+
export declare function levelColor(ratio: number, thresholds?: {
|
|
23
|
+
warnAt?: number;
|
|
24
|
+
dangerAt?: number;
|
|
25
|
+
}): SemanticColor;
|
|
26
|
+
/**
|
|
27
|
+
* `auto` → dark / light:不发查询序列,只看环境。`COLORFGBG` 的最后一段是背景色号(0–6、8 暗,
|
|
28
|
+
* 7、9–15 亮);没有时 Apple Terminal 按 dark;其余缺省 dark。只是猜,文档建议显式配置。
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveThemeName(name: ThemeName | "auto" | undefined, env?: NodeJS.ProcessEnv): ThemeName;
|
|
13
31
|
/** 由环境推断颜色深度。 */
|
|
14
32
|
export declare function detectColorDepth(env?: NodeJS.ProcessEnv, isTTY?: boolean): ColorDepth;
|
|
15
33
|
export declare function detectCapabilities(env?: NodeJS.ProcessEnv, isTTY?: boolean): ThemeCapabilities;
|
|
@@ -18,14 +36,20 @@ export declare function parseHex(hex: string): Rgb;
|
|
|
18
36
|
export declare function rgbTo256(rgb: Rgb): number;
|
|
19
37
|
/** RGB → 16 色索引(0–15)。 */
|
|
20
38
|
export declare function rgbTo16(rgb: Rgb): number;
|
|
21
|
-
/**
|
|
22
|
-
|
|
39
|
+
/**
|
|
40
|
+
* 生成前景 / 背景开启序列;depth 0 返回空串。`ansi16` 给定时 16 色下直接用它(内置色板查表)。
|
|
41
|
+
*/
|
|
42
|
+
export declare function colorCode(hex: string, depth: ColorDepth, background: boolean, ansi16?: number): string;
|
|
23
43
|
export interface CreateThemeOptions {
|
|
24
44
|
caps?: ThemeCapabilities;
|
|
25
45
|
/** 覆盖部分语义色(`#rrggbb`)。 */
|
|
26
46
|
overrides?: Partial<Record<SemanticColor, string>>;
|
|
47
|
+
/** ASCII 字形;缺省按环境检测(`detectAscii`)。 */
|
|
48
|
+
ascii?: boolean;
|
|
27
49
|
}
|
|
28
50
|
export declare function createTheme(name?: ThemeName, options?: CreateThemeOptions): Theme;
|
|
29
|
-
/** 无色主题(测试、line 模式、NO_COLOR
|
|
30
|
-
export declare function plainTheme(
|
|
51
|
+
/** 无色主题(测试、line 模式、NO_COLOR):所有方法原样返回文本;字形缺省 Unicode。 */
|
|
52
|
+
export declare function plainTheme(options?: {
|
|
53
|
+
ascii?: boolean;
|
|
54
|
+
}): Theme;
|
|
31
55
|
export {};
|
package/dist/tui/theme.js
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 主题与颜色能力(设计 §12.7)。[B4]
|
|
3
3
|
*
|
|
4
|
-
* - `dark` / `light`
|
|
5
|
-
*
|
|
4
|
+
* - `dark` / `light` 两套语义色(14 个名字,终端界面视觉设计 v1 §2.1),以 24 位 RGB 定义;取值都落在
|
|
5
|
+
* xterm 256 色立方 / 灰阶上,所以 256 色回退无损。
|
|
6
|
+
* - 能力降级:truecolor → 256 色(6×6×6 立方 + 灰阶取近)→ 16 色(内置色板按 `THEME_ANSI16` 查表,
|
|
7
|
+
* 覆盖色按 xterm 缺省调色板取近)→ 无色。
|
|
8
|
+
* - `bg("selection")` 在 < 256 色时退化为 `accent` 粗体前景(16 色下底色太跳,且常留「尾巴」)。
|
|
6
9
|
* - `NO_COLOR`(非空)或 `TERM=dumb` → 无色;不探测终端背景(不发查询序列)。
|
|
7
10
|
* - 样式用各自的关闭码(39 / 49 / 22 / 23 / 24)而不是全重置,可以嵌套。
|
|
8
11
|
*/
|
|
12
|
+
import { detectAscii, glyphsFor } from "./glyphs.js";
|
|
9
13
|
export const THEME_PALETTES = {
|
|
10
14
|
dark: {
|
|
11
15
|
text: "#e4e4e4",
|
|
12
|
-
|
|
16
|
+
muted: "#a8a8a8",
|
|
17
|
+
dim: "#6c6c6c",
|
|
13
18
|
accent: "#5fafff",
|
|
14
19
|
success: "#5fd787",
|
|
15
20
|
warning: "#ffd75f",
|
|
@@ -17,12 +22,15 @@ export const THEME_PALETTES = {
|
|
|
17
22
|
user: "#87afff",
|
|
18
23
|
assistant: "#e4e4e4",
|
|
19
24
|
tool: "#af87ff",
|
|
20
|
-
border: "#
|
|
25
|
+
border: "#585858",
|
|
21
26
|
code: "#ffaf5f",
|
|
27
|
+
link: "#87d7ff",
|
|
28
|
+
selection: "#303030",
|
|
22
29
|
},
|
|
23
30
|
light: {
|
|
24
31
|
text: "#1c1c1c",
|
|
25
|
-
|
|
32
|
+
muted: "#585858",
|
|
33
|
+
dim: "#8a8a8a",
|
|
26
34
|
accent: "#005fd7",
|
|
27
35
|
success: "#008700",
|
|
28
36
|
warning: "#af5f00",
|
|
@@ -30,10 +38,73 @@ export const THEME_PALETTES = {
|
|
|
30
38
|
user: "#005faf",
|
|
31
39
|
assistant: "#1c1c1c",
|
|
32
40
|
tool: "#8700af",
|
|
33
|
-
border: "#
|
|
41
|
+
border: "#bcbcbc",
|
|
34
42
|
code: "#875f00",
|
|
43
|
+
link: "#0087af",
|
|
44
|
+
selection: "#e4e4e4",
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* 16 色下的索引(xterm 0–15)。距离取近对饱和色不可靠(`#ff5f5f` 会落到灰 8),所以内置色板查表;
|
|
49
|
+
* `selection` 在 16 色下不作 bg,表里给前景兜底值。
|
|
50
|
+
*/
|
|
51
|
+
export const THEME_ANSI16 = {
|
|
52
|
+
dark: {
|
|
53
|
+
text: 7,
|
|
54
|
+
muted: 7,
|
|
55
|
+
dim: 8,
|
|
56
|
+
accent: 12,
|
|
57
|
+
success: 10,
|
|
58
|
+
warning: 11,
|
|
59
|
+
error: 9,
|
|
60
|
+
user: 12,
|
|
61
|
+
assistant: 7,
|
|
62
|
+
tool: 13,
|
|
63
|
+
border: 8,
|
|
64
|
+
code: 11,
|
|
65
|
+
link: 14,
|
|
66
|
+
selection: 8,
|
|
67
|
+
},
|
|
68
|
+
light: {
|
|
69
|
+
text: 0,
|
|
70
|
+
muted: 8,
|
|
71
|
+
dim: 8,
|
|
72
|
+
accent: 4,
|
|
73
|
+
success: 2,
|
|
74
|
+
warning: 3,
|
|
75
|
+
error: 1,
|
|
76
|
+
user: 4,
|
|
77
|
+
assistant: 0,
|
|
78
|
+
tool: 5,
|
|
79
|
+
border: 7,
|
|
80
|
+
code: 3,
|
|
81
|
+
link: 6,
|
|
82
|
+
selection: 7,
|
|
35
83
|
},
|
|
36
84
|
};
|
|
85
|
+
/** 阈值档位:≥ dangerAt error,≥ warnAt warning,否则 success(状态栏 ctx、Meter、/session 共用)。 */
|
|
86
|
+
export function levelColor(ratio, thresholds = {}) {
|
|
87
|
+
if (ratio >= (thresholds.dangerAt ?? 0.9))
|
|
88
|
+
return "error";
|
|
89
|
+
if (ratio >= (thresholds.warnAt ?? 0.7))
|
|
90
|
+
return "warning";
|
|
91
|
+
return "success";
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* `auto` → dark / light:不发查询序列,只看环境。`COLORFGBG` 的最后一段是背景色号(0–6、8 暗,
|
|
95
|
+
* 7、9–15 亮);没有时 Apple Terminal 按 dark;其余缺省 dark。只是猜,文档建议显式配置。
|
|
96
|
+
*/
|
|
97
|
+
export function resolveThemeName(name, env = process.env) {
|
|
98
|
+
if (name === "dark" || name === "light")
|
|
99
|
+
return name;
|
|
100
|
+
const colorfgbg = env["COLORFGBG"];
|
|
101
|
+
if (colorfgbg !== undefined && colorfgbg !== "") {
|
|
102
|
+
const bg = Number(colorfgbg.split(";").at(-1));
|
|
103
|
+
if (Number.isInteger(bg) && bg >= 0 && bg <= 15)
|
|
104
|
+
return bg === 7 || bg >= 9 ? "light" : "dark";
|
|
105
|
+
}
|
|
106
|
+
return "dark";
|
|
107
|
+
}
|
|
37
108
|
/** 由环境推断颜色深度。 */
|
|
38
109
|
export function detectColorDepth(env = process.env, isTTY = process.stdout.isTTY === true) {
|
|
39
110
|
if (env["NO_COLOR"] !== undefined && env["NO_COLOR"] !== "")
|
|
@@ -116,8 +187,10 @@ export function rgbTo16(rgb) {
|
|
|
116
187
|
}
|
|
117
188
|
return best;
|
|
118
189
|
}
|
|
119
|
-
/**
|
|
120
|
-
|
|
190
|
+
/**
|
|
191
|
+
* 生成前景 / 背景开启序列;depth 0 返回空串。`ansi16` 给定时 16 色下直接用它(内置色板查表)。
|
|
192
|
+
*/
|
|
193
|
+
export function colorCode(hex, depth, background, ansi16) {
|
|
121
194
|
if (depth === 0)
|
|
122
195
|
return "";
|
|
123
196
|
const rgb = parseHex(hex);
|
|
@@ -125,23 +198,25 @@ export function colorCode(hex, depth, background) {
|
|
|
125
198
|
return `\x1b[${background ? 48 : 38};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
|
|
126
199
|
if (depth === 256)
|
|
127
200
|
return `\x1b[${background ? 48 : 38};5;${rgbTo256(rgb)}m`;
|
|
128
|
-
const idx = rgbTo16(rgb);
|
|
201
|
+
const idx = ansi16 ?? rgbTo16(rgb);
|
|
129
202
|
const base = idx < 8 ? (background ? 40 : 30) + idx : (background ? 100 : 90) + idx - 8;
|
|
130
203
|
return `\x1b[${base}m`;
|
|
131
204
|
}
|
|
132
205
|
class PaletteTheme {
|
|
133
206
|
name;
|
|
134
207
|
caps;
|
|
208
|
+
glyphs;
|
|
135
209
|
fgCodes;
|
|
136
210
|
bgCodes;
|
|
137
|
-
constructor(name, palette, caps) {
|
|
211
|
+
constructor(name, palette, caps, glyphs, ansi16 = {}) {
|
|
138
212
|
this.name = name;
|
|
139
213
|
this.caps = caps;
|
|
214
|
+
this.glyphs = glyphs;
|
|
140
215
|
const fg = {};
|
|
141
216
|
const bg = {};
|
|
142
217
|
for (const key of Object.keys(palette)) {
|
|
143
|
-
fg[key] = colorCode(palette[key], caps.colors, false);
|
|
144
|
-
bg[key] = colorCode(palette[key], caps.colors, true);
|
|
218
|
+
fg[key] = colorCode(palette[key], caps.colors, false, ansi16[key]);
|
|
219
|
+
bg[key] = colorCode(palette[key], caps.colors, true, ansi16[key]);
|
|
145
220
|
}
|
|
146
221
|
this.fgCodes = fg;
|
|
147
222
|
this.bgCodes = bg;
|
|
@@ -151,6 +226,8 @@ class PaletteTheme {
|
|
|
151
226
|
return code === "" ? text : `${code}${text}\x1b[39m`;
|
|
152
227
|
}
|
|
153
228
|
bg(color, text) {
|
|
229
|
+
if (color === "selection" && this.caps.colors < 256)
|
|
230
|
+
return this.bold(this.fg("accent", text));
|
|
154
231
|
const code = this.bgCodes[color];
|
|
155
232
|
return code === "" ? text : `${code}${text}\x1b[49m`;
|
|
156
233
|
}
|
|
@@ -168,16 +245,25 @@ class PaletteTheme {
|
|
|
168
245
|
}
|
|
169
246
|
}
|
|
170
247
|
export function createTheme(name = "dark", options = {}) {
|
|
171
|
-
const
|
|
172
|
-
|
|
248
|
+
const overrides = options.overrides ?? {};
|
|
249
|
+
const palette = { ...THEME_PALETTES[name], ...overrides };
|
|
250
|
+
const ansi16 = { ...THEME_ANSI16[name] };
|
|
251
|
+
for (const key of Object.keys(overrides))
|
|
252
|
+
delete ansi16[key];
|
|
253
|
+
const glyphs = glyphsFor(options.ascii ?? detectAscii());
|
|
254
|
+
return new PaletteTheme(name, palette, options.caps ?? detectCapabilities(), glyphs, ansi16);
|
|
173
255
|
}
|
|
174
|
-
/** 无色主题(测试、line 模式、NO_COLOR
|
|
175
|
-
export function plainTheme() {
|
|
176
|
-
return new PlainTheme();
|
|
256
|
+
/** 无色主题(测试、line 模式、NO_COLOR):所有方法原样返回文本;字形缺省 Unicode。 */
|
|
257
|
+
export function plainTheme(options = {}) {
|
|
258
|
+
return new PlainTheme(glyphsFor(options.ascii === true));
|
|
177
259
|
}
|
|
178
260
|
class PlainTheme {
|
|
261
|
+
glyphs;
|
|
179
262
|
name = "plain";
|
|
180
263
|
caps = { colors: 0 };
|
|
264
|
+
constructor(glyphs) {
|
|
265
|
+
this.glyphs = glyphs;
|
|
266
|
+
}
|
|
181
267
|
fg(_color, text) {
|
|
182
268
|
return text;
|
|
183
269
|
}
|
package/dist/tui.d.ts
CHANGED
|
@@ -13,7 +13,8 @@ export { VirtualScreen, type ScreenModes } from "./tui/vt-screen.js";
|
|
|
13
13
|
export { StdinBuffer, defaultEscTimeout, type StdinBufferOptions } from "./tui/stdin-buffer.js";
|
|
14
14
|
export { parseKey, matchesKey, normalizeKeyId, isPasteData, unwrapPaste, isPrintableText, PASTE_START, PASTE_END, type KeyEvent, } from "./tui/keys.js";
|
|
15
15
|
export { visibleWidth, truncateToWidth, sliceByColumn, wrapTextWithAnsi, padToWidth, stripAnsi, codePointWidth, graphemeWidth, SGR_RESET, } from "./tui/ansi.js";
|
|
16
|
-
export { createTheme, plainTheme, detectCapabilities, detectColorDepth, colorCode, rgbTo256, rgbTo16, THEME_PALETTES, type ThemeName, type CreateThemeOptions, } from "./tui/theme.js";
|
|
16
|
+
export { createTheme, plainTheme, detectCapabilities, detectColorDepth, colorCode, rgbTo256, rgbTo16, THEME_PALETTES, THEME_ANSI16, resolveThemeName, levelColor, type ThemeName, type CreateThemeOptions, } from "./tui/theme.js";
|
|
17
|
+
export { UNICODE_GLYPHS, ASCII_GLYPHS, detectAscii, resolveAscii, glyphsFor, } from "./tui/glyphs.js";
|
|
17
18
|
export { Keybindings, defaultKeybindings, DEFAULT_KEYBINDINGS, parseKeybindings, loadKeybindingsFile, isActionId, type ActionId, type KeybindingOverrides, type ParsedKeybindings, } from "./tui/keybindings.js";
|
|
18
19
|
export { Container } from "./tui/components/container.js";
|
|
19
20
|
export { Text, TruncatedText, type TextOptions } from "./tui/components/text.js";
|
|
@@ -23,8 +24,9 @@ export { Editor, loadHistoryFile, type EditorOptions, type AutocompleteProvider,
|
|
|
23
24
|
export { PasteStore, shouldCollapse, formatMarker, PASTE_LINE_THRESHOLD, PASTE_CHAR_THRESHOLD, } from "./tui/components/editor-paste.js";
|
|
24
25
|
export { SelectList, filterItems, type SelectItem, type SelectListOptions, } from "./tui/components/select-list.js";
|
|
25
26
|
export { Box, type BoxOptions } from "./tui/components/box.js";
|
|
27
|
+
export { Card, type CardOptions } from "./tui/components/card.js";
|
|
26
28
|
export { Spacer } from "./tui/components/spacer.js";
|
|
27
|
-
export { Loader, LOADER_FRAMES, formatElapsed, type LoaderOptions, } from "./tui/components/loader.js";
|
|
29
|
+
export { Loader, LOADER_FRAMES, formatElapsed, type LoaderOptions, type LoaderVerbOptions, } from "./tui/components/loader.js";
|
|
28
30
|
export { compositeOverlays, type OverlayAnchor, type OverlayOptions, type OverlayLayer, } from "./tui/components/overlay.js";
|
|
29
31
|
export { KeyValue, type KeyValueRow, type KeyValueOptions } from "./tui/components/key-value.js";
|
|
30
32
|
export { Meter, METER_FULL, METER_EMPTY, type MeterOptions } from "./tui/components/meter.js";
|
package/dist/tui.js
CHANGED
|
@@ -13,7 +13,8 @@ export { VirtualScreen } from "./tui/vt-screen.js";
|
|
|
13
13
|
export { StdinBuffer, defaultEscTimeout } from "./tui/stdin-buffer.js";
|
|
14
14
|
export { parseKey, matchesKey, normalizeKeyId, isPasteData, unwrapPaste, isPrintableText, PASTE_START, PASTE_END, } from "./tui/keys.js";
|
|
15
15
|
export { visibleWidth, truncateToWidth, sliceByColumn, wrapTextWithAnsi, padToWidth, stripAnsi, codePointWidth, graphemeWidth, SGR_RESET, } from "./tui/ansi.js";
|
|
16
|
-
export { createTheme, plainTheme, detectCapabilities, detectColorDepth, colorCode, rgbTo256, rgbTo16, THEME_PALETTES, } from "./tui/theme.js";
|
|
16
|
+
export { createTheme, plainTheme, detectCapabilities, detectColorDepth, colorCode, rgbTo256, rgbTo16, THEME_PALETTES, THEME_ANSI16, resolveThemeName, levelColor, } from "./tui/theme.js";
|
|
17
|
+
export { UNICODE_GLYPHS, ASCII_GLYPHS, detectAscii, resolveAscii, glyphsFor, } from "./tui/glyphs.js";
|
|
17
18
|
export { Keybindings, defaultKeybindings, DEFAULT_KEYBINDINGS, parseKeybindings, loadKeybindingsFile, isActionId, } from "./tui/keybindings.js";
|
|
18
19
|
export { Container } from "./tui/components/container.js";
|
|
19
20
|
export { Text, TruncatedText } from "./tui/components/text.js";
|
|
@@ -23,6 +24,7 @@ export { Editor, loadHistoryFile, } from "./tui/components/editor.js";
|
|
|
23
24
|
export { PasteStore, shouldCollapse, formatMarker, PASTE_LINE_THRESHOLD, PASTE_CHAR_THRESHOLD, } from "./tui/components/editor-paste.js";
|
|
24
25
|
export { SelectList, filterItems, } from "./tui/components/select-list.js";
|
|
25
26
|
export { Box } from "./tui/components/box.js";
|
|
27
|
+
export { Card } from "./tui/components/card.js";
|
|
26
28
|
export { Spacer } from "./tui/components/spacer.js";
|
|
27
29
|
export { Loader, LOADER_FRAMES, formatElapsed, } from "./tui/components/loader.js";
|
|
28
30
|
export { compositeOverlays, } from "./tui/components/overlay.js";
|
package/docs/acp.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# ACP(Agent Client Protocol)
|
|
2
|
+
|
|
3
|
+
ama 在 ACP 两侧都能用:
|
|
4
|
+
|
|
5
|
+
- **服务端**:`ama --mode acp` 把 ama 暴露为 ACP Agent,供 Zed、JetBrains、Armadra 的 ACP 节点驱动;
|
|
6
|
+
- **客户端**:ama 经 ACP 驱动外部 Agent(Gemini CLI、OpenCode、Kimi、Copilot 等原生 ACP,或装了适配器的 Claude Code / Codex),见 [agents.md](agents.md)。
|
|
7
|
+
|
|
8
|
+
协议栈零依赖、手写,只维护一份:`@armadra/agent/acp` 导出类型、分帧、客户端与假 Agent,Armadra 直接复用。设计依据见 [wave5-plan.md](wave5-plan.md) §5(D14)。
|
|
9
|
+
|
|
10
|
+
## 线路
|
|
11
|
+
|
|
12
|
+
JSON-RPC 2.0 over NDJSON(stdio):只按 `\n` 切行,64 KiB 分片写并等待背压,与 [rpc.md](rpc.md) 的「线路」一致。stdout 只有协议行,诊断写 stderr。由客户端以 `initialize` 起头,没有 `hello`。
|
|
13
|
+
|
|
14
|
+
## `ama --mode acp`
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
ama --mode acp # 与 -p 互斥;其余参数(--model、--profile、--trust 等)照常
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
| 方法 | ama 的行为 |
|
|
21
|
+
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
22
|
+
| `initialize` | `protocolVersion: 1`;`loadSession: true`,`sessionCapabilities: { list, resume, close }`,`promptCapabilities: { image: true, embeddedContext: true }`;不要认证 |
|
|
23
|
+
| `session/new` | 新开会话(启动时那个空会话第一次直接认领);`cwd` 必须是 ama 的启动目录(按 realpath 比较),否则 invalid params |
|
|
24
|
+
| `session/load` | 切到该会话并以 `session/update` 回放历史(用户消息、回复、思考、工具调用) |
|
|
25
|
+
| `session/resume` | 切到该会话,不回放 |
|
|
26
|
+
| `session/list` | 启动目录下的会话(标题取会话名或首条提示) |
|
|
27
|
+
| `session/close` | 中断运行并释放活动会话 |
|
|
28
|
+
| `session/prompt` | 文本与图片照收;`resource_link` 以 `@uri` 文本给出,嵌入资源取文本。回合结束:中断 → `cancelled`,输出截断 → `max_tokens`,出错 → JSON-RPC 错误 |
|
|
29
|
+
| `session/cancel`(通知) | 中断当前回合 |
|
|
30
|
+
| `session/set_mode` | 模式 id 就是 ama 的权限模式(`plan`、`allowlist`、`default`、`auto-edit`、`auto`、`full-auto`) |
|
|
31
|
+
|
|
32
|
+
一次只有一个活动会话;对非活动会话发 `session/prompt` 时(空闲)先切过去,运行中切换报 invalid request。
|
|
33
|
+
|
|
34
|
+
### 事件映射
|
|
35
|
+
|
|
36
|
+
| ama | `session/update` |
|
|
37
|
+
| ------------------- | ---------------------------------------------------------------------------------- |
|
|
38
|
+
| 文本增量 / 思考增量 | `agent_message_chunk` / `agent_thought_chunk` |
|
|
39
|
+
| 模型发出工具调用 | `tool_call`(`pending`,带 `rawInput`、`kind`、`locations`) |
|
|
40
|
+
| 工具开始 / 结束 | `tool_call_update`(`in_progress` → `completed` / `failed`,结果只带前 4 KB 文本) |
|
|
41
|
+
| `todo` 更新 | `plan` |
|
|
42
|
+
| 每轮结束 | `usage_update`(上下文已用、窗口、会话累计美元) |
|
|
43
|
+
| 权限模式变化 | `current_mode_update` |
|
|
44
|
+
|
|
45
|
+
codemode 内层调用不单列。`session/prompt` 的结果带本回合 token 用量(`inputTokens`、`outputTokens`、`cachedReadTokens`、`cachedWriteTokens`、`totalTokens`)。
|
|
46
|
+
|
|
47
|
+
### 审批
|
|
48
|
+
|
|
49
|
+
ama 需要询问的调用经 `session/request_permission` 交给客户端,三个选项:`allow_once`(允许)、`allow_always`(本会话允许)、`reject_once`(拒绝)。`toolCall.toolCallId` 关联到先前 `tool_call` 的 id。客户端回 `cancelled`、连接断开或回合被中断时,按无人作答处理(拒绝)。auto 模式下 ama 自己的分类器照常工作——这只影响 ama 自己的工具;ama 驱动的外部 Agent 发来的请求只交给人(见 [agents.md](agents.md))。
|
|
50
|
+
|
|
51
|
+
不声明、也不使用客户端的 `fs` / `terminal` 能力:ama 自己读写、自己跑命令,按自己的权限管线。
|
|
52
|
+
|
|
53
|
+
### 退出
|
|
54
|
+
|
|
55
|
+
stdin 关闭后等已开始的运行结束再退出(0);SIGINT / SIGTERM 中断后退出 130 / 143。宿主看到的模式是 `rpc`(`HostApi.mode`)。SDK 直接 `bootstrap(--mode acp)` 时得到 `mode: "rpc"` 的 Runtime,再交给 `runAcpMode`。
|
|
56
|
+
|
|
57
|
+
## 作为客户端
|
|
58
|
+
|
|
59
|
+
模型经 `task(agent="acp:<程序>")` 使用 ACP Agent(ama 自己是 `task(agent="acp:ama")`,见 [agents.md](agents.md)「在 task 里使用」)。
|
|
60
|
+
|
|
61
|
+
`AcpClient`(`@armadra/agent/acp`):`initialize`、`newSession`、`resumeSession`(优先,不回放)、`loadSession`、`listSessions`、`closeSession`、`prompt`、`setMode`、`cancel`。
|
|
62
|
+
|
|
63
|
+
- 声明的客户端能力为空:Agent 发来的 `fs/*`、`terminal/*` 请求回 method not found。
|
|
64
|
+
- `session/request_permission` 交给 `onPermission`;没有处理器时回首个 `reject_once`(无人值守)。
|
|
65
|
+
- `cancel(sessionId)` 发 `session/cancel`,并让该会话挂起的权限请求回 `cancelled`(规范要求)。
|
|
66
|
+
- 只接受 Agent 自己给出的 `optionId`。
|
|
67
|
+
|
|
68
|
+
`AcpDriver` 在客户端之上实现驱动契约(`AgentDriver`):续接优先 `session/resume`,其次 `session/load`(回放的历史丢弃),都不支持就新开并提示;按 ama 模式 `session/set_mode`,只读模式找不到对应模式 id 时拒绝启动。
|
|
69
|
+
|
|
70
|
+
## 测试替身
|
|
71
|
+
|
|
72
|
+
`runFakeAcpAgent(input, output)` 是进程内的假 ACP Agent,`fakeAcpAgentPath()` 是它的可执行入口(`node <path> [--minimal]`)。行为由提示里的标记决定:`[permission]`(请求权限,四个选项)、`[slow]`(等到 cancel)、`[plan]`、`[think]`、`[refuse]`,其余回 `echo: <文本>`。`--minimal` 不声明 resume / load / list / close,也不给模式,用来测降级路径。
|
|
73
|
+
|
|
74
|
+
黄金记录在 `test/fixtures/acp/`:`driver-{allow,reject,cancel}.jsonl`(ama 驱动假 Agent 的三条路径)与 `mode-prompt.jsonl`(`ama --mode acp` 一轮往返)。`UPDATE_GOLDEN=1` 重写。
|
|
75
|
+
|
|
76
|
+
## 兼容性
|
|
77
|
+
|
|
78
|
+
按 ACP v1(含 2026 年稳定的 `session/list`、`session/resume`、`session/close`、`usage_update`)。v2 计划取消 `session/load`,ama 作客户端时已优先 `resume`。
|