@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,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ama stats` 的单文件摘要(只读、按行)。[W4-D]
|
|
3
|
+
*
|
|
4
|
+
* 一个会话文件 → 若干「桶」:按(本地日期、请求来源 kind、provider、model、channel)累加。
|
|
5
|
+
* - 请求来源:assistant 消息 = `turn`;`usage` 条目用自己的 `kind`(cache_warm、permission_classify…);
|
|
6
|
+
* `compaction` / `branch_summary` 带的 usage 记为同名 kind(模型取最近一条 assistant 的)。
|
|
7
|
+
* - token:input(不含缓存)/ output / cacheRead / cacheWrite;费用只累加有 `usage.cost` 的请求,
|
|
8
|
+
* `costed` 记有价请求数,展示层据此区分「有价」「部分无价」「全无价」。
|
|
9
|
+
* - 缓存三态:桶记下是否出现过 cacheRead > 0 或 cacheWrite > 0(`cacheSeen`);汇总时同一端点
|
|
10
|
+
* (provider/model@channel)任一桶出现过即算报告缓存,其余端点不进命中率分母(同会话层三态)。
|
|
11
|
+
* - 回合:非 `steer` 的用户消息开始一个回合,到下一个回合开始为止;回合计入首条 assistant 的桶,
|
|
12
|
+
* 耗时 = 最后一条 assistant 条目时间 − 用户消息条目时间(都是落盘时间戳)。没有 assistant 的回合不计。
|
|
13
|
+
* - 工具调用:assistant 内容里的 toolCall 块按名字计(codemode 内层调用不展开)。
|
|
14
|
+
* - 重试:`context_edit{reason:"retry"}` 计入当时最近一条 assistant 的桶;`stopReason:"error"` 计错误。
|
|
15
|
+
* - toolResult、custom、label 等行按前缀跳过、不解析;末尾半行忽略;中间坏行跳过并计数。
|
|
16
|
+
* - channel:最近一条 `model_change` 与该请求同 provider / model 时取它的 channel。
|
|
17
|
+
*/
|
|
18
|
+
import { forEachLine, lineType } from "./scan.js";
|
|
19
|
+
const SKIP_TYPES = new Set([
|
|
20
|
+
"custom",
|
|
21
|
+
"custom_message",
|
|
22
|
+
"label",
|
|
23
|
+
"leaf",
|
|
24
|
+
"session_info",
|
|
25
|
+
"thinking_level_change",
|
|
26
|
+
]);
|
|
27
|
+
function pad(n) {
|
|
28
|
+
return n < 10 ? `0${n}` : String(n);
|
|
29
|
+
}
|
|
30
|
+
/** ISO → 本地日期;不可解析 → undefined。 */
|
|
31
|
+
export function localDay(iso) {
|
|
32
|
+
if (typeof iso !== "string")
|
|
33
|
+
return undefined;
|
|
34
|
+
const ms = Date.parse(iso);
|
|
35
|
+
if (!Number.isFinite(ms))
|
|
36
|
+
return undefined;
|
|
37
|
+
const d = new Date(ms);
|
|
38
|
+
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
|
|
39
|
+
}
|
|
40
|
+
const isRec = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
41
|
+
const num = (v) => (typeof v === "number" && Number.isFinite(v) ? v : 0);
|
|
42
|
+
export function summarizeSessionFile(file) {
|
|
43
|
+
let header;
|
|
44
|
+
const buckets = new Map();
|
|
45
|
+
const tools = new Map();
|
|
46
|
+
let badLines = 0;
|
|
47
|
+
let channel;
|
|
48
|
+
let lastAssistant;
|
|
49
|
+
let lastBucket;
|
|
50
|
+
let turn;
|
|
51
|
+
const bucketOf = (day, kind, ref) => {
|
|
52
|
+
const key = `${day}\u0000${kind}\u0000${ref.provider}\u0000${ref.model}\u0000${ref.channel ?? ""}`;
|
|
53
|
+
let bucket = buckets.get(key);
|
|
54
|
+
if (bucket === undefined) {
|
|
55
|
+
bucket = {
|
|
56
|
+
day,
|
|
57
|
+
kind,
|
|
58
|
+
provider: ref.provider,
|
|
59
|
+
model: ref.model,
|
|
60
|
+
requests: 0,
|
|
61
|
+
input: 0,
|
|
62
|
+
output: 0,
|
|
63
|
+
cacheRead: 0,
|
|
64
|
+
cacheWrite: 0,
|
|
65
|
+
cost: 0,
|
|
66
|
+
costed: 0,
|
|
67
|
+
cacheSeen: false,
|
|
68
|
+
errors: 0,
|
|
69
|
+
retries: 0,
|
|
70
|
+
turns: 0,
|
|
71
|
+
turnMs: 0,
|
|
72
|
+
timedTurns: 0,
|
|
73
|
+
};
|
|
74
|
+
if (ref.channel !== undefined)
|
|
75
|
+
bucket.channel = ref.channel;
|
|
76
|
+
buckets.set(key, bucket);
|
|
77
|
+
}
|
|
78
|
+
return bucket;
|
|
79
|
+
};
|
|
80
|
+
const addUsage = (bucket, usage) => {
|
|
81
|
+
bucket.requests++;
|
|
82
|
+
if (!isRec(usage))
|
|
83
|
+
return;
|
|
84
|
+
const u = usage;
|
|
85
|
+
bucket.input += num(u.input);
|
|
86
|
+
bucket.output += num(u.output);
|
|
87
|
+
bucket.cacheRead += num(u.cacheRead);
|
|
88
|
+
bucket.cacheWrite += num(u.cacheWrite);
|
|
89
|
+
if (num(u.cacheRead) > 0 || num(u.cacheWrite) > 0)
|
|
90
|
+
bucket.cacheSeen = true;
|
|
91
|
+
if (isRec(u.cost) && typeof u.cost["total"] === "number") {
|
|
92
|
+
bucket.cost += num(u.cost["total"]);
|
|
93
|
+
bucket.costed++;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const refFor = (provider, model) => {
|
|
97
|
+
const ref = { provider, model };
|
|
98
|
+
if (channel?.channel !== undefined &&
|
|
99
|
+
channel.provider === provider &&
|
|
100
|
+
channel.model === model) {
|
|
101
|
+
ref.channel = channel.channel;
|
|
102
|
+
}
|
|
103
|
+
return ref;
|
|
104
|
+
};
|
|
105
|
+
const closeTurn = () => {
|
|
106
|
+
if (turn?.bucket !== undefined) {
|
|
107
|
+
turn.bucket.turns++;
|
|
108
|
+
if (turn.end !== undefined && turn.end >= turn.start) {
|
|
109
|
+
turn.bucket.turnMs += turn.end - turn.start;
|
|
110
|
+
turn.bucket.timedTurns++;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
turn = undefined;
|
|
114
|
+
};
|
|
115
|
+
try {
|
|
116
|
+
forEachLine(file, (line, index, last) => {
|
|
117
|
+
if (index > 0) {
|
|
118
|
+
const quick = lineType(line);
|
|
119
|
+
if (quick !== undefined) {
|
|
120
|
+
if (SKIP_TYPES.has(quick.type))
|
|
121
|
+
return;
|
|
122
|
+
if (quick.type === "message" && quick.role === "toolResult")
|
|
123
|
+
return;
|
|
124
|
+
if (quick.type === "message" && quick.role === "system")
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
let value;
|
|
129
|
+
try {
|
|
130
|
+
value = JSON.parse(line);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
if (!last)
|
|
134
|
+
badLines++;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (!isRec(value))
|
|
138
|
+
return;
|
|
139
|
+
if (index === 0) {
|
|
140
|
+
if (value["type"] !== "session" || typeof value["cwd"] !== "string")
|
|
141
|
+
return false;
|
|
142
|
+
header = value;
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const ts = value["timestamp"];
|
|
146
|
+
const day = localDay(ts);
|
|
147
|
+
if (day === undefined)
|
|
148
|
+
return;
|
|
149
|
+
switch (value["type"]) {
|
|
150
|
+
case "model_change": {
|
|
151
|
+
const ref = {
|
|
152
|
+
provider: String(value["provider"]),
|
|
153
|
+
model: String(value["modelId"]),
|
|
154
|
+
};
|
|
155
|
+
if (typeof value["channel"] === "string")
|
|
156
|
+
ref.channel = value["channel"];
|
|
157
|
+
channel = ref;
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
case "message": {
|
|
161
|
+
const message = value["message"];
|
|
162
|
+
if (!isRec(message))
|
|
163
|
+
return;
|
|
164
|
+
if (message["role"] === "user") {
|
|
165
|
+
if (message["origin"] === "steer" && turn !== undefined)
|
|
166
|
+
return;
|
|
167
|
+
closeTurn();
|
|
168
|
+
turn = { start: Date.parse(ts), day };
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (message["role"] !== "assistant")
|
|
172
|
+
return;
|
|
173
|
+
const ref = refFor(String(message["provider"]), String(message["model"]));
|
|
174
|
+
lastAssistant = ref;
|
|
175
|
+
const bucket = bucketOf(day, "turn", ref);
|
|
176
|
+
lastBucket = bucket;
|
|
177
|
+
addUsage(bucket, message["usage"]);
|
|
178
|
+
if (message["stopReason"] === "error")
|
|
179
|
+
bucket.errors++;
|
|
180
|
+
const content = message["content"];
|
|
181
|
+
if (Array.isArray(content)) {
|
|
182
|
+
for (const block of content) {
|
|
183
|
+
if (isRec(block) &&
|
|
184
|
+
block["type"] === "toolCall" &&
|
|
185
|
+
typeof block["name"] === "string") {
|
|
186
|
+
const key = `${day}\u0000${block["name"]}`;
|
|
187
|
+
tools.set(key, (tools.get(key) ?? 0) + 1);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (turn !== undefined) {
|
|
192
|
+
if (turn.bucket === undefined)
|
|
193
|
+
turn.bucket = bucketOf(turn.day, "turn", ref);
|
|
194
|
+
turn.end = Date.parse(ts);
|
|
195
|
+
}
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
case "usage": {
|
|
199
|
+
const ref = refFor(String(value["provider"]), String(value["model"]));
|
|
200
|
+
addUsage(bucketOf(day, String(value["kind"] ?? "usage"), ref), value["usage"]);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
case "compaction":
|
|
204
|
+
case "branch_summary": {
|
|
205
|
+
if (value["usage"] === undefined)
|
|
206
|
+
return;
|
|
207
|
+
const ref = lastAssistant ?? { provider: "?", model: "?" };
|
|
208
|
+
addUsage(bucketOf(day, value["type"], ref), value["usage"]);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
case "context_edit":
|
|
212
|
+
if (value["reason"] === "retry" && lastBucket !== undefined)
|
|
213
|
+
lastBucket.retries++;
|
|
214
|
+
return;
|
|
215
|
+
default:
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
closeTurn();
|
|
224
|
+
if (header === undefined)
|
|
225
|
+
return undefined;
|
|
226
|
+
return {
|
|
227
|
+
id: String(header["id"]),
|
|
228
|
+
cwd: String(header["cwd"]),
|
|
229
|
+
buckets: [...buckets.values()],
|
|
230
|
+
tools: [...tools].map(([key, count]) => {
|
|
231
|
+
const [day = "", name = ""] = key.split("\u0000");
|
|
232
|
+
return [day, name, count];
|
|
233
|
+
}),
|
|
234
|
+
badLines,
|
|
235
|
+
};
|
|
236
|
+
}
|
package/dist/session/types.d.ts
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* `append()` 同步:返回带 id 的条目并把叶子移到它(落盘可延迟到首条提示,§11.1 第 16 步)。
|
|
15
15
|
* - (W3-C0)第三波 §1.7 / A7:新增 `usage` 条目(保温等不进上下文的请求用量,计入统计)与
|
|
16
16
|
* 非条目的 `leaf` 行(`/tree` 位置落盘);都是 v1 可选行,格式版本不升。
|
|
17
|
+
* - (W5-C0)`context_edit.reason` 加 `image_budget`(第五波 §4);格式版本不升。
|
|
17
18
|
*/
|
|
18
19
|
import type { ContentBlock, Message, ModelThinkingLevel, Usage } from "../ai/types.js";
|
|
19
20
|
export declare const SESSION_FORMAT_VERSION: 1;
|
|
@@ -60,7 +61,8 @@ export interface BranchSummaryEntry extends EntryBase {
|
|
|
60
61
|
usage?: Usage;
|
|
61
62
|
details?: FileOpsDetails;
|
|
62
63
|
}
|
|
63
|
-
|
|
64
|
+
/** [W5-C0] `image_budget`:单请求图片总量超预算时把旧图换成占位文本(wave5-plan §4)。 */
|
|
65
|
+
export type ContextEditReason = "prune" | "abort" | "retry" | "overflow" | "manual" | "image_budget";
|
|
64
66
|
/** 同一目标最新一条赢;replacement 为 null 表示从上下文剔除。 */
|
|
65
67
|
export interface ContextEditEntry extends EntryBase {
|
|
66
68
|
type: "context_edit";
|
package/dist/session/types.js
CHANGED
|
@@ -14,5 +14,6 @@
|
|
|
14
14
|
* `append()` 同步:返回带 id 的条目并把叶子移到它(落盘可延迟到首条提示,§11.1 第 16 步)。
|
|
15
15
|
* - (W3-C0)第三波 §1.7 / A7:新增 `usage` 条目(保温等不进上下文的请求用量,计入统计)与
|
|
16
16
|
* 非条目的 `leaf` 行(`/tree` 位置落盘);都是 v1 可选行,格式版本不升。
|
|
17
|
+
* - (W5-C0)`context_edit.reason` 加 `image_budget`(第五波 §4);格式版本不升。
|
|
17
18
|
*/
|
|
18
19
|
export const SESSION_FORMAT_VERSION = 1;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 内置 Skill(替代把 ama 自身文档塞进系统提示)。
|
|
3
|
+
*
|
|
4
|
+
* 系统提示里只常驻索引的一条(名字 + 一句描述,约 60 token),正文按需读取。单文件 bundle 没有
|
|
5
|
+
* docs 目录,所以正文是内联的配置速查(≤ 3 KB),会话发现时写到 `<dataDir>/builtin/<名>.md`(路径短,进前缀)
|
|
6
|
+
* (内容不变不重写),模型用 read 读、用户用 `/skill:ama-docs` 调用都走现成路径。
|
|
7
|
+
*
|
|
8
|
+
* - 排在全部用户 / 项目 Skill 之后:同名时用户的优先,内置的静默让位(不报重名 warning)。
|
|
9
|
+
* - 路径只取决于数据目录,会话开始时确定、会话内不变,不影响前缀稳定(设计 §9.1)。
|
|
10
|
+
* - 写盘失败只记 warning 并跳过该内置 Skill。
|
|
11
|
+
*/
|
|
12
|
+
import type { Skill } from "./discover.js";
|
|
13
|
+
export declare const BUILTIN_SKILLS_DIR = "builtin";
|
|
14
|
+
export interface BuiltinSkill {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
body: string;
|
|
18
|
+
}
|
|
19
|
+
export declare const BUILTIN_SKILLS: readonly BuiltinSkill[];
|
|
20
|
+
export declare function builtinSkillPath(dataDir: string, name: string): string;
|
|
21
|
+
/** 是否内置 Skill(启动头的「已加载」只数用户 / 项目的)。 */
|
|
22
|
+
export declare function isBuiltinSkill(skill: {
|
|
23
|
+
name: string;
|
|
24
|
+
location: string;
|
|
25
|
+
}): boolean;
|
|
26
|
+
export declare function builtinSkillText(skill: BuiltinSkill): string;
|
|
27
|
+
/** 在已发现的 Skill 之后追加内置 Skill(同名让位给已有的);返回新数组与 warning。 */
|
|
28
|
+
export declare function withBuiltinSkills(skills: readonly Skill[], dataDir: string, builtins?: readonly BuiltinSkill[]): Promise<{
|
|
29
|
+
skills: Skill[];
|
|
30
|
+
warnings: string[];
|
|
31
|
+
}>;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 内置 Skill(替代把 ama 自身文档塞进系统提示)。
|
|
3
|
+
*
|
|
4
|
+
* 系统提示里只常驻索引的一条(名字 + 一句描述,约 60 token),正文按需读取。单文件 bundle 没有
|
|
5
|
+
* docs 目录,所以正文是内联的配置速查(≤ 3 KB),会话发现时写到 `<dataDir>/builtin/<名>.md`(路径短,进前缀)
|
|
6
|
+
* (内容不变不重写),模型用 read 读、用户用 `/skill:ama-docs` 调用都走现成路径。
|
|
7
|
+
*
|
|
8
|
+
* - 排在全部用户 / 项目 Skill 之后:同名时用户的优先,内置的静默让位(不报重名 warning)。
|
|
9
|
+
* - 路径只取决于数据目录,会话开始时确定、会话内不变,不影响前缀稳定(设计 §9.1)。
|
|
10
|
+
* - 写盘失败只记 warning 并跳过该内置 Skill。
|
|
11
|
+
*/
|
|
12
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
13
|
+
import { dirname, join } from "node:path";
|
|
14
|
+
export const BUILTIN_SKILLS_DIR = "builtin";
|
|
15
|
+
const AMA_DOCS_BODY = `# ama quick reference
|
|
16
|
+
|
|
17
|
+
ama is the coding agent running this session. Docs: https://github.com/Owlbay/armadra-agent (README.md, docs/).
|
|
18
|
+
|
|
19
|
+
## Files
|
|
20
|
+
- User config dir \`~/.config/ama/\` (\`AMA_CONFIG_DIR\`; Windows \`%APPDATA%\\ama\`): \`config.json\`, \`auth.json\` (keys, 0600), \`hooks.json\`, \`keybindings.json\`, \`trust.json\`, \`AGENTS.md\`, \`skills/\`, \`prompts/\`.
|
|
21
|
+
- Data dir \`~/.local/share/ama/\` (\`AMA_DATA_DIR\`): \`sessions/\` (JSONL), \`models-dev.json\`.
|
|
22
|
+
- Project: \`AGENTS.md\` (found upward from cwd), \`.ama/config.json\` (can only tighten), \`.ama/hooks.json\`, \`.ama/skills/\`, \`.ama/prompts/\` (need trust).
|
|
23
|
+
- Merge order: defaults < user < profile < project. \`ama config show\` prints effective values and sources; \`ama config path\`, \`ama config edit\`, \`ama doctor\`.
|
|
24
|
+
|
|
25
|
+
## config.json (common keys)
|
|
26
|
+
\`\`\`json
|
|
27
|
+
{ "version": 1, "defaultModel": "provider/model-id", "thinkingLevel": "medium",
|
|
28
|
+
"permission": { "mode": "default", "allow": ["bash(git status*)"], "deny": ["write(**/.env*)"] },
|
|
29
|
+
"tools": { "preset": "default", "default": ["+task", "-glob"] }, "providers": {} }
|
|
30
|
+
\`\`\`
|
|
31
|
+
Other sections have defaults: compaction, retry, codemode, hooks, ui, skills, cache, request.
|
|
32
|
+
|
|
33
|
+
## Providers and models
|
|
34
|
+
- Zero config: set a standard key env var (ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, DEEPSEEK_API_KEY, ...). \`OPENAI_BASE_URL\` / \`ANTHROPIC_BASE_URL\` are honored.
|
|
35
|
+
- Store a key: \`ama auth set <provider>\` (reads stdin), \`ama auth list\`, \`ama auth remove <provider>\`. Never put keys in config; use \`"apiKey": "$ENV_VAR"\` or \`"!command"\`.
|
|
36
|
+
- Relay / custom endpoint: \`ama providers add <name> --base-url <url> --key-env VAR --probe\`; models may set \`"api"\`: openai-completions | openai-responses | anthropic-messages | google-generative-ai.
|
|
37
|
+
- \`ama models list\`, \`ama models discover <provider>\`, \`ama models check provider/model\`. Model refs are \`provider/model[@channel]\`; switch with \`--model\` or \`/model\`.
|
|
38
|
+
|
|
39
|
+
## Permissions
|
|
40
|
+
Modes (\`--permission-mode\`, \`permission.mode\`, \`/permission\`, Shift+Tab): plan, default (ask for writes and commands), auto-edit, auto, full-auto, allowlist. Rules like \`bash(git push*)\`, \`write(src/**)\`; \`--allow\` / \`--deny\`. Dangerous commands always ask. Unattended runs (-p, RPC) treat "ask" as deny.
|
|
41
|
+
|
|
42
|
+
## Tools
|
|
43
|
+
Presets (\`--tools-preset\`, \`tools.preset\`): default, minimal, codemode-only, coordinator. \`/tools\` toggles tools; \`--codemode off|on|only\`.
|
|
44
|
+
|
|
45
|
+
## Sessions and rewind
|
|
46
|
+
- \`-c\` continues the latest session here, \`-r [id]\` resumes; \`/resume\`, \`/new\`, \`/fork\`, \`/tree\`, \`/compact\`.
|
|
47
|
+
- \`/rewind\` (or Esc Esc when idle) returns to before a user message: both, conversation only, or code only (edit/write checkpoints).
|
|
48
|
+
- \`ama sessions search|show|export\`, \`ama stats\`.
|
|
49
|
+
|
|
50
|
+
## Skills and hooks
|
|
51
|
+
Skills: \`<dir>/<name>/SKILL.md\` with \`name\` and \`description\` frontmatter in \`~/.config/ama/skills/\` or \`.ama/skills/\`; invoke with \`/skill:<name>\`. Hooks: \`hooks.json\` runs commands on PreToolUse, PostToolUse, UserPromptSubmit, Stop and more.
|
|
52
|
+
`;
|
|
53
|
+
export const BUILTIN_SKILLS = Object.freeze([
|
|
54
|
+
{
|
|
55
|
+
name: "ama-docs",
|
|
56
|
+
description: "How to configure and use ama itself.",
|
|
57
|
+
body: AMA_DOCS_BODY,
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
60
|
+
export function builtinSkillPath(dataDir, name) {
|
|
61
|
+
return join(dataDir, BUILTIN_SKILLS_DIR, `${name}.md`);
|
|
62
|
+
}
|
|
63
|
+
/** 是否内置 Skill(启动头的「已加载」只数用户 / 项目的)。 */
|
|
64
|
+
export function isBuiltinSkill(skill) {
|
|
65
|
+
return (BUILTIN_SKILLS.some((b) => b.name === skill.name) &&
|
|
66
|
+
skill.location.endsWith(join(BUILTIN_SKILLS_DIR, `${skill.name}.md`)));
|
|
67
|
+
}
|
|
68
|
+
export function builtinSkillText(skill) {
|
|
69
|
+
return `---\nname: ${skill.name}\ndescription: ${skill.description}\n---\n\n${skill.body}`;
|
|
70
|
+
}
|
|
71
|
+
async function ensureFile(path, text) {
|
|
72
|
+
try {
|
|
73
|
+
if ((await readFile(path, "utf8")) === text)
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// 不存在:下面写
|
|
78
|
+
}
|
|
79
|
+
await mkdir(dirname(path), { recursive: true });
|
|
80
|
+
await writeFile(path, text, "utf8");
|
|
81
|
+
}
|
|
82
|
+
/** 在已发现的 Skill 之后追加内置 Skill(同名让位给已有的);返回新数组与 warning。 */
|
|
83
|
+
export async function withBuiltinSkills(skills, dataDir, builtins = BUILTIN_SKILLS) {
|
|
84
|
+
const out = [...skills];
|
|
85
|
+
const warnings = [];
|
|
86
|
+
const taken = new Set(skills.map((skill) => skill.name));
|
|
87
|
+
for (const builtin of builtins) {
|
|
88
|
+
if (taken.has(builtin.name))
|
|
89
|
+
continue;
|
|
90
|
+
const baseDir = join(dataDir, BUILTIN_SKILLS_DIR);
|
|
91
|
+
const location = builtinSkillPath(dataDir, builtin.name);
|
|
92
|
+
try {
|
|
93
|
+
await ensureFile(location, builtinSkillText(builtin));
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
warnings.push(`内置 Skill ${builtin.name} 写入失败:${error.message}`);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
out.push({
|
|
100
|
+
name: builtin.name,
|
|
101
|
+
description: builtin.description,
|
|
102
|
+
location,
|
|
103
|
+
baseDir,
|
|
104
|
+
disableModelInvocation: false,
|
|
105
|
+
scope: "builtin",
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return { skills: out, warnings };
|
|
109
|
+
}
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
* frontmatter:`name`(≤ 64,`^[a-z0-9-]+$`,缺省取目录名)、`description`(必填,≤ 1024)、
|
|
11
11
|
* `disable-model-invocation`、`allowed-tools`(只做提示)。
|
|
12
12
|
*/
|
|
13
|
-
|
|
13
|
+
/** `builtin`:随 ama 分发的内置 Skill(builtin.ts),排在最后,同名让位。 */
|
|
14
|
+
export type SkillScope = "cli" | "profile" | "config" | "user" | "project" | "ancestor" | "builtin";
|
|
14
15
|
export interface SkillSource {
|
|
15
16
|
dir: string;
|
|
16
17
|
scope: SkillScope;
|
|
@@ -18,24 +18,21 @@ export function formatSkillIndex(skills, options) {
|
|
|
18
18
|
return "";
|
|
19
19
|
let how;
|
|
20
20
|
if (options.hasSkillTool) {
|
|
21
|
-
how =
|
|
22
|
-
"Call the skill tool with a skill's name to load it when the task matches its description.";
|
|
21
|
+
how = "call the skill tool with its name";
|
|
23
22
|
}
|
|
24
23
|
else if (options.hasReadTool) {
|
|
25
|
-
how = "
|
|
24
|
+
how = "read its file";
|
|
26
25
|
}
|
|
27
26
|
else {
|
|
28
27
|
return "";
|
|
29
28
|
}
|
|
29
|
+
// 每个字都进缓存前缀(预算见 src/cli/prompt-budget.test.ts),说明保持一行。
|
|
30
30
|
const lines = [
|
|
31
|
-
|
|
32
|
-
how,
|
|
33
|
-
"When a skill file references a relative path, resolve it against the skill's directory.",
|
|
34
|
-
"",
|
|
31
|
+
`Skills: when a task matches one, ${how} first; resolve its relative paths against its directory.`,
|
|
35
32
|
"<available_skills>",
|
|
36
33
|
];
|
|
37
34
|
for (const s of visible) {
|
|
38
|
-
lines.push(
|
|
35
|
+
lines.push(`<skill name="${escapeXml(s.name)}" location="${escapeXml(s.location)}">${escapeXml(s.description)}</skill>`);
|
|
39
36
|
}
|
|
40
37
|
lines.push("</available_skills>");
|
|
41
38
|
return lines.join("\n");
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 后台命令(docs/wave5-plan.md §8.3 H6,D29:不加新工具,`bash{background}` + `bash{job, action}`)。[W5-H2]
|
|
3
|
+
*
|
|
4
|
+
* - `start`:调用方(bash.ts)给出 `spawn(stdout)`——**进程只在 bash.ts 的 `spawnShell` 里创建**,
|
|
5
|
+
* 这里只拿到 ChildProcess;stdout / stderr 直接写进 `outputPath`(文件描述符交给子进程,ama 退出也不
|
|
6
|
+
* 会因管道断开而 SIGPIPE)。POSIX 自成进程组并登记(进程退出时同步 SIGKILL 残留组)。
|
|
7
|
+
* - `wait(id, timeoutMs)`:等到退出或超时;`stop(id)`:杀整棵树(SIGTERM → 宽限 → SIGKILL);
|
|
8
|
+
* `output(id)`:读输出文件尾部(2000 行 / 50 KB)。
|
|
9
|
+
* - 生命周期事件经 `onChange` 发出(started / exited / stopped);`takeExited()` 取走尚未通知的已退出
|
|
10
|
+
* 任务(提醒通道 reminders.ts 据此告诉模型「后台命令 jobId 已退出(码 N)」)。
|
|
11
|
+
* - 按会话 id 登记(`jobsForSession`);`disposeSessionJobs` 在会话 dispose 时回收进程树。
|
|
12
|
+
*/
|
|
13
|
+
import type { ChildProcess } from "node:child_process";
|
|
14
|
+
import { type ProcessDeps } from "./process-tree.js";
|
|
15
|
+
import { type TruncateResult } from "./truncate.js";
|
|
16
|
+
export type JobStatus = "running" | "exited" | "stopped";
|
|
17
|
+
export interface Job {
|
|
18
|
+
id: string;
|
|
19
|
+
command: string;
|
|
20
|
+
cwd: string;
|
|
21
|
+
pid?: number;
|
|
22
|
+
outputPath: string;
|
|
23
|
+
startedAt: number;
|
|
24
|
+
status: JobStatus;
|
|
25
|
+
/** 退出码(信号退出为 128 + signo);运行中 undefined。 */
|
|
26
|
+
exitCode?: number;
|
|
27
|
+
endedAt?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface JobStartOptions {
|
|
30
|
+
cwd: string;
|
|
31
|
+
outputPath: string;
|
|
32
|
+
/** 用给定的输出文件描述符启动进程(bash.ts 的 spawnShell)。 */
|
|
33
|
+
spawn(outputFd: number): ChildProcess;
|
|
34
|
+
processDeps?: ProcessDeps;
|
|
35
|
+
}
|
|
36
|
+
export type JobChange = {
|
|
37
|
+
phase: "started" | "exited" | "stopped";
|
|
38
|
+
job: Job;
|
|
39
|
+
};
|
|
40
|
+
/** 后台 bash 的查询形状:`{ job, action: wait | stop | output }`,不带 command。 */
|
|
41
|
+
export declare function isBackgroundJobQuery(toolName: string, input: unknown): boolean;
|
|
42
|
+
export declare class BackgroundJobs {
|
|
43
|
+
private readonly entries;
|
|
44
|
+
private readonly listeners;
|
|
45
|
+
private seq;
|
|
46
|
+
start(command: string, options: JobStartOptions): Job;
|
|
47
|
+
get(id: string): Job | undefined;
|
|
48
|
+
list(): Job[];
|
|
49
|
+
/** 等到退出或超时(`signal` 可提前结束等待,不杀进程)。 */
|
|
50
|
+
wait(id: string, timeoutMs: number, signal?: AbortSignal): Promise<Job | undefined>;
|
|
51
|
+
stop(id: string): Promise<Job | undefined>;
|
|
52
|
+
/** 输出文件尾部(2000 行 / 50 KB)。 */
|
|
53
|
+
output(id: string): (TruncateResult & {
|
|
54
|
+
job: Job;
|
|
55
|
+
}) | undefined;
|
|
56
|
+
/** 取走已退出、尚未通知的任务(提醒通道用;wait 已看到退出的也算已知)。 */
|
|
57
|
+
takeExited(): Job[];
|
|
58
|
+
/** 标记为已知(模型已经通过 wait / output 看到了退出)。 */
|
|
59
|
+
markSeen(id: string): void;
|
|
60
|
+
onChange(listener: (change: JobChange) => void): () => void;
|
|
61
|
+
get running(): number;
|
|
62
|
+
/** 杀掉全部仍在运行的任务(会话 dispose)。 */
|
|
63
|
+
disposeAll(): Promise<void>;
|
|
64
|
+
private notify;
|
|
65
|
+
}
|
|
66
|
+
/** 会话的后台任务表(按会话 id,首次使用时建)。 */
|
|
67
|
+
export declare function jobsForSession(sessionId: string): BackgroundJobs;
|
|
68
|
+
/** 已有的任务表(不新建)。 */
|
|
69
|
+
export declare function existingJobs(sessionId: string): BackgroundJobs | undefined;
|
|
70
|
+
/** 会话 dispose:杀掉该会话仍在运行的后台任务并注销。 */
|
|
71
|
+
export declare function disposeSessionJobs(sessionId: string): Promise<void>;
|