@qlingzzy/qling 1.0.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 +122 -0
- package/LICENSE +21 -0
- package/README.en.md +129 -0
- package/README.md +416 -0
- package/dist/agent/subtask.d.ts +21 -0
- package/dist/agent/subtask.d.ts.map +1 -0
- package/dist/agent/subtask.js +55 -0
- package/dist/agent-loop.d.ts +151 -0
- package/dist/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop.js +1498 -0
- package/dist/agents/isolation-policy.d.ts +14 -0
- package/dist/agents/isolation-policy.d.ts.map +1 -0
- package/dist/agents/isolation-policy.js +52 -0
- package/dist/channels/console-channel.d.ts +15 -0
- package/dist/channels/console-channel.d.ts.map +1 -0
- package/dist/channels/console-channel.js +66 -0
- package/dist/channels/registry.d.ts +10 -0
- package/dist/channels/registry.d.ts.map +1 -0
- package/dist/channels/registry.js +25 -0
- package/dist/channels/slack-channel.d.ts +35 -0
- package/dist/channels/slack-channel.d.ts.map +1 -0
- package/dist/channels/slack-channel.js +232 -0
- package/dist/channels/telegram-channel.d.ts +32 -0
- package/dist/channels/telegram-channel.d.ts.map +1 -0
- package/dist/channels/telegram-channel.js +167 -0
- package/dist/channels/types.d.ts +31 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +4 -0
- package/dist/cli/bootstrap.d.ts +39 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +138 -0
- package/dist/cli/channel-bootstrap.d.ts +23 -0
- package/dist/cli/channel-bootstrap.d.ts.map +1 -0
- package/dist/cli/channel-bootstrap.js +46 -0
- package/dist/cli/daemon-control.d.ts +31 -0
- package/dist/cli/daemon-control.d.ts.map +1 -0
- package/dist/cli/daemon-control.js +177 -0
- package/dist/cli/guidance-panel.d.ts +11 -0
- package/dist/cli/guidance-panel.d.ts.map +1 -0
- package/dist/cli/guidance-panel.js +16 -0
- package/dist/cli/mcp-control.d.ts +7 -0
- package/dist/cli/mcp-control.d.ts.map +1 -0
- package/dist/cli/mcp-control.js +119 -0
- package/dist/cli/mission-views.d.ts +13 -0
- package/dist/cli/mission-views.d.ts.map +1 -0
- package/dist/cli/mission-views.js +82 -0
- package/dist/cli/setup.d.ts +9 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +140 -0
- package/dist/cli/startup-contract.d.ts +23 -0
- package/dist/cli/startup-contract.d.ts.map +1 -0
- package/dist/cli/startup-contract.js +694 -0
- package/dist/commands/agents.d.ts +3 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +44 -0
- package/dist/commands/checkpoint.d.ts +3 -0
- package/dist/commands/checkpoint.d.ts.map +1 -0
- package/dist/commands/checkpoint.js +52 -0
- package/dist/commands/claude-style.d.ts +12 -0
- package/dist/commands/claude-style.d.ts.map +1 -0
- package/dist/commands/claude-style.js +560 -0
- package/dist/commands/clear.d.ts +3 -0
- package/dist/commands/clear.d.ts.map +1 -0
- package/dist/commands/clear.js +20 -0
- package/dist/commands/compact.d.ts +3 -0
- package/dist/commands/compact.d.ts.map +1 -0
- package/dist/commands/compact.js +23 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +22 -0
- package/dist/commands/connect.d.ts +3 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +102 -0
- package/dist/commands/context.d.ts +3 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +13 -0
- package/dist/commands/dashboard.d.ts +3 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +22 -0
- package/dist/commands/detach.d.ts +3 -0
- package/dist/commands/detach.d.ts.map +1 -0
- package/dist/commands/detach.js +44 -0
- package/dist/commands/distill.d.ts +3 -0
- package/dist/commands/distill.d.ts.map +1 -0
- package/dist/commands/distill.js +23 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +13 -0
- package/dist/commands/dream.d.ts +3 -0
- package/dist/commands/dream.d.ts.map +1 -0
- package/dist/commands/dream.js +59 -0
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +18 -0
- package/dist/commands/exports.d.ts +3 -0
- package/dist/commands/exports.d.ts.map +1 -0
- package/dist/commands/exports.js +15 -0
- package/dist/commands/goal.d.ts +3 -0
- package/dist/commands/goal.d.ts.map +1 -0
- package/dist/commands/goal.js +147 -0
- package/dist/commands/help.d.ts +4 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +75 -0
- package/dist/commands/hooks.d.ts +3 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +14 -0
- package/dist/commands/index.d.ts +29 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +417 -0
- package/dist/commands/knowledge.d.ts +8 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +191 -0
- package/dist/commands/loop.d.ts +3 -0
- package/dist/commands/loop.d.ts.map +1 -0
- package/dist/commands/loop.js +138 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +57 -0
- package/dist/commands/memory.d.ts +3 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +215 -0
- package/dist/commands/mission.d.ts +3 -0
- package/dist/commands/mission.d.ts.map +1 -0
- package/dist/commands/mission.js +129 -0
- package/dist/commands/permissions.d.ts +3 -0
- package/dist/commands/permissions.d.ts.map +1 -0
- package/dist/commands/permissions.js +82 -0
- package/dist/commands/privacy.d.ts +3 -0
- package/dist/commands/privacy.d.ts.map +1 -0
- package/dist/commands/privacy.js +13 -0
- package/dist/commands/recap.d.ts +3 -0
- package/dist/commands/recap.d.ts.map +1 -0
- package/dist/commands/recap.js +11 -0
- package/dist/commands/repomap.d.ts +3 -0
- package/dist/commands/repomap.d.ts.map +1 -0
- package/dist/commands/repomap.js +146 -0
- package/dist/commands/resume.d.ts +3 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +42 -0
- package/dist/commands/runtime.d.ts +61 -0
- package/dist/commands/runtime.d.ts.map +1 -0
- package/dist/commands/runtime.js +20 -0
- package/dist/commands/sessions.d.ts +3 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +34 -0
- package/dist/commands/shortcuts.d.ts +3 -0
- package/dist/commands/shortcuts.d.ts.map +1 -0
- package/dist/commands/shortcuts.js +12 -0
- package/dist/commands/skill.d.ts +3 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +20 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +31 -0
- package/dist/commands/statusline.d.ts +3 -0
- package/dist/commands/statusline.d.ts.map +1 -0
- package/dist/commands/statusline.js +40 -0
- package/dist/commands/storage.d.ts +3 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +122 -0
- package/dist/commands/tasks.d.ts +3 -0
- package/dist/commands/tasks.d.ts.map +1 -0
- package/dist/commands/tasks.js +117 -0
- package/dist/commands/types.d.ts +14 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +1 -0
- package/dist/commands/verify.d.ts +3 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +86 -0
- package/dist/config-report.d.ts +35 -0
- package/dist/config-report.d.ts.map +1 -0
- package/dist/config-report.js +100 -0
- package/dist/config.d.ts +217 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +690 -0
- package/dist/context-compactor.d.ts +27 -0
- package/dist/context-compactor.d.ts.map +1 -0
- package/dist/context-compactor.js +489 -0
- package/dist/context-report.d.ts +35 -0
- package/dist/context-report.d.ts.map +1 -0
- package/dist/context-report.js +172 -0
- package/dist/daemon.d.ts +2 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +316 -0
- package/dist/dashboard-server.d.ts +18 -0
- package/dist/dashboard-server.d.ts.map +1 -0
- package/dist/dashboard-server.js +325 -0
- package/dist/discovery-registry.d.ts +28 -0
- package/dist/discovery-registry.d.ts.map +1 -0
- package/dist/discovery-registry.js +106 -0
- package/dist/discovery-types.d.ts +54 -0
- package/dist/discovery-types.d.ts.map +1 -0
- package/dist/discovery-types.js +5 -0
- package/dist/doctor.d.ts +31 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +343 -0
- package/dist/eval/runner.d.ts +10 -0
- package/dist/eval/runner.d.ts.map +1 -0
- package/dist/eval/runner.js +78 -0
- package/dist/eval/tasks.d.ts +3 -0
- package/dist/eval/tasks.d.ts.map +1 -0
- package/dist/eval/tasks.js +179 -0
- package/dist/eval/types.d.ts +31 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +4 -0
- package/dist/git/auto-commit.d.ts +28 -0
- package/dist/git/auto-commit.d.ts.map +1 -0
- package/dist/git/auto-commit.js +112 -0
- package/dist/guard/approval.d.ts +16 -0
- package/dist/guard/approval.d.ts.map +1 -0
- package/dist/guard/approval.js +68 -0
- package/dist/guard/content-filter.d.ts +15 -0
- package/dist/guard/content-filter.d.ts.map +1 -0
- package/dist/guard/content-filter.js +102 -0
- package/dist/guard/permissions.d.ts +17 -0
- package/dist/guard/permissions.d.ts.map +1 -0
- package/dist/guard/permissions.js +54 -0
- package/dist/guard/rate-limit.d.ts +14 -0
- package/dist/guard/rate-limit.d.ts.map +1 -0
- package/dist/guard/rate-limit.js +47 -0
- package/dist/guard.d.ts +21 -0
- package/dist/guard.d.ts.map +1 -0
- package/dist/guard.js +144 -0
- package/dist/help-topics.d.ts +19 -0
- package/dist/help-topics.d.ts.map +1 -0
- package/dist/help-topics.js +391 -0
- package/dist/hooks-report.d.ts +23 -0
- package/dist/hooks-report.d.ts.map +1 -0
- package/dist/hooks-report.js +44 -0
- package/dist/i18n/index.d.ts +5 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +4 -0
- package/dist/i18n/zh-cn.d.ts +180 -0
- package/dist/i18n/zh-cn.d.ts.map +1 -0
- package/dist/i18n/zh-cn.js +184 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1157 -0
- package/dist/knowledge-agent.d.ts +47 -0
- package/dist/knowledge-agent.d.ts.map +1 -0
- package/dist/knowledge-agent.js +320 -0
- package/dist/local-status-report.d.ts +23 -0
- package/dist/local-status-report.d.ts.map +1 -0
- package/dist/local-status-report.js +63 -0
- package/dist/local-storage-report.d.ts +32 -0
- package/dist/local-storage-report.d.ts.map +1 -0
- package/dist/local-storage-report.js +171 -0
- package/dist/mcp/bridge.d.ts +11 -0
- package/dist/mcp/bridge.d.ts.map +1 -0
- package/dist/mcp/bridge.js +37 -0
- package/dist/mcp/client.d.ts +26 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +209 -0
- package/dist/mcp/http-transport.d.ts +21 -0
- package/dist/mcp/http-transport.d.ts.map +1 -0
- package/dist/mcp/http-transport.js +126 -0
- package/dist/mcp/presets.d.ts +22 -0
- package/dist/mcp/presets.d.ts.map +1 -0
- package/dist/mcp/presets.js +80 -0
- package/dist/mcp/registry.d.ts +23 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/registry.js +85 -0
- package/dist/mcp/stdio-transport.d.ts +25 -0
- package/dist/mcp/stdio-transport.d.ts.map +1 -0
- package/dist/mcp/stdio-transport.js +92 -0
- package/dist/mcp/store.d.ts +41 -0
- package/dist/mcp/store.d.ts.map +1 -0
- package/dist/mcp/store.js +100 -0
- package/dist/mcp/types.d.ts +40 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +4 -0
- package/dist/mcp-report.d.ts +30 -0
- package/dist/mcp-report.d.ts.map +1 -0
- package/dist/mcp-report.js +104 -0
- package/dist/memory/cognitive-index.d.ts +56 -0
- package/dist/memory/cognitive-index.d.ts.map +1 -0
- package/dist/memory/cognitive-index.js +265 -0
- package/dist/memory/compactor.d.ts +28 -0
- package/dist/memory/compactor.d.ts.map +1 -0
- package/dist/memory/compactor.js +92 -0
- package/dist/memory/consolidation.d.ts +13 -0
- package/dist/memory/consolidation.d.ts.map +1 -0
- package/dist/memory/consolidation.js +77 -0
- package/dist/memory/embedding.d.ts +15 -0
- package/dist/memory/embedding.d.ts.map +1 -0
- package/dist/memory/embedding.js +59 -0
- package/dist/memory/memory-llm-dream.d.ts +3 -0
- package/dist/memory/memory-llm-dream.d.ts.map +1 -0
- package/dist/memory/memory-llm-dream.js +59 -0
- package/dist/memory/projection-worker.d.ts +30 -0
- package/dist/memory/projection-worker.d.ts.map +1 -0
- package/dist/memory/projection-worker.js +92 -0
- package/dist/memory/semantic-index.d.ts +18 -0
- package/dist/memory/semantic-index.d.ts.map +1 -0
- package/dist/memory/semantic-index.js +86 -0
- package/dist/memory/wal.d.ts +33 -0
- package/dist/memory/wal.d.ts.map +1 -0
- package/dist/memory/wal.js +131 -0
- package/dist/memory-report.d.ts +120 -0
- package/dist/memory-report.d.ts.map +1 -0
- package/dist/memory-report.js +726 -0
- package/dist/memory.d.ts +149 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +632 -0
- package/dist/metrics/agent-telemetry.d.ts +14 -0
- package/dist/metrics/agent-telemetry.d.ts.map +1 -0
- package/dist/metrics/agent-telemetry.js +44 -0
- package/dist/metrics/collector.d.ts +17 -0
- package/dist/metrics/collector.d.ts.map +1 -0
- package/dist/metrics/collector.js +137 -0
- package/dist/metrics/types.d.ts +14 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +4 -0
- package/dist/mission/manager.d.ts +28 -0
- package/dist/mission/manager.d.ts.map +1 -0
- package/dist/mission/manager.js +208 -0
- package/dist/mission/types.d.ts +37 -0
- package/dist/mission/types.d.ts.map +1 -0
- package/dist/mission/types.js +5 -0
- package/dist/onboarding/tutorial.d.ts +33 -0
- package/dist/onboarding/tutorial.d.ts.map +1 -0
- package/dist/onboarding/tutorial.js +96 -0
- package/dist/output-style.d.ts +14 -0
- package/dist/output-style.d.ts.map +1 -0
- package/dist/output-style.js +29 -0
- package/dist/package-version.d.ts +12 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +42 -0
- package/dist/permissions-report.d.ts +42 -0
- package/dist/permissions-report.d.ts.map +1 -0
- package/dist/permissions-report.js +120 -0
- package/dist/pipeline/consistency-checker.d.ts +8 -0
- package/dist/pipeline/consistency-checker.d.ts.map +1 -0
- package/dist/pipeline/consistency-checker.js +40 -0
- package/dist/pipeline/example-generator.d.ts +4 -0
- package/dist/pipeline/example-generator.d.ts.map +1 -0
- package/dist/pipeline/example-generator.js +64 -0
- package/dist/pipeline/hooks.d.ts +68 -0
- package/dist/pipeline/hooks.d.ts.map +1 -0
- package/dist/pipeline/hooks.js +377 -0
- package/dist/pipeline/sections.d.ts +41 -0
- package/dist/pipeline/sections.d.ts.map +1 -0
- package/dist/pipeline/sections.js +244 -0
- package/dist/pipeline/verification.d.ts +12 -0
- package/dist/pipeline/verification.d.ts.map +1 -0
- package/dist/pipeline/verification.js +138 -0
- package/dist/privacy-report.d.ts +24 -0
- package/dist/privacy-report.d.ts.map +1 -0
- package/dist/privacy-report.js +78 -0
- package/dist/providers/presets.d.ts +25 -0
- package/dist/providers/presets.d.ts.map +1 -0
- package/dist/providers/presets.js +205 -0
- package/dist/recap.d.ts +38 -0
- package/dist/recap.d.ts.map +1 -0
- package/dist/recap.js +154 -0
- package/dist/repl.d.ts +41 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +396 -0
- package/dist/runtime-paths.d.ts +32 -0
- package/dist/runtime-paths.d.ts.map +1 -0
- package/dist/runtime-paths.js +134 -0
- package/dist/sdk.d.ts +12 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +18 -0
- package/dist/session/daemon-session-api.d.ts +22 -0
- package/dist/session/daemon-session-api.d.ts.map +1 -0
- package/dist/session/daemon-session-api.js +48 -0
- package/dist/session/durable-session-supervisor.d.ts +24 -0
- package/dist/session/durable-session-supervisor.d.ts.map +1 -0
- package/dist/session/durable-session-supervisor.js +195 -0
- package/dist/session/goal-controller.d.ts +43 -0
- package/dist/session/goal-controller.d.ts.map +1 -0
- package/dist/session/goal-controller.js +77 -0
- package/dist/session/goal-evaluator.d.ts +29 -0
- package/dist/session/goal-evaluator.d.ts.map +1 -0
- package/dist/session/goal-evaluator.js +100 -0
- package/dist/session/loop-prompt.d.ts +14 -0
- package/dist/session/loop-prompt.d.ts.map +1 -0
- package/dist/session/loop-prompt.js +49 -0
- package/dist/session/session-goal-manager.d.ts +51 -0
- package/dist/session/session-goal-manager.d.ts.map +1 -0
- package/dist/session/session-goal-manager.js +118 -0
- package/dist/session/session-registry.d.ts +40 -0
- package/dist/session/session-registry.d.ts.map +1 -0
- package/dist/session/session-registry.js +124 -0
- package/dist/session/session-scheduler.d.ts +59 -0
- package/dist/session/session-scheduler.d.ts.map +1 -0
- package/dist/session/session-scheduler.js +170 -0
- package/dist/session-checkpoint-report.d.ts +22 -0
- package/dist/session-checkpoint-report.d.ts.map +1 -0
- package/dist/session-checkpoint-report.js +99 -0
- package/dist/session-export-index.d.ts +23 -0
- package/dist/session-export-index.d.ts.map +1 -0
- package/dist/session-export-index.js +96 -0
- package/dist/session-export.d.ts +28 -0
- package/dist/session-export.d.ts.map +1 -0
- package/dist/session-export.js +99 -0
- package/dist/session-goal-report.d.ts +37 -0
- package/dist/session-goal-report.d.ts.map +1 -0
- package/dist/session-goal-report.js +219 -0
- package/dist/session-list-report.d.ts +16 -0
- package/dist/session-list-report.d.ts.map +1 -0
- package/dist/session-list-report.js +60 -0
- package/dist/session-task-report.d.ts +23 -0
- package/dist/session-task-report.d.ts.map +1 -0
- package/dist/session-task-report.js +183 -0
- package/dist/shortcuts.d.ts +2 -0
- package/dist/shortcuts.d.ts.map +1 -0
- package/dist/shortcuts.js +32 -0
- package/dist/skills/registry.d.ts +8 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +119 -0
- package/dist/skills/types.d.ts +7 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +4 -0
- package/dist/statusline.d.ts +37 -0
- package/dist/statusline.d.ts.map +1 -0
- package/dist/statusline.js +207 -0
- package/dist/tools/bash.d.ts +10 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +278 -0
- package/dist/tools/browser-fetch.d.ts +7 -0
- package/dist/tools/browser-fetch.d.ts.map +1 -0
- package/dist/tools/browser-fetch.js +133 -0
- package/dist/tools/error-utils.d.ts +9 -0
- package/dist/tools/error-utils.d.ts.map +1 -0
- package/dist/tools/error-utils.js +35 -0
- package/dist/tools/index.d.ts +27 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +86 -0
- package/dist/tools/patch.d.ts +22 -0
- package/dist/tools/patch.d.ts.map +1 -0
- package/dist/tools/patch.js +458 -0
- package/dist/tools/planner.d.ts +7 -0
- package/dist/tools/planner.d.ts.map +1 -0
- package/dist/tools/planner.js +148 -0
- package/dist/tools/read.d.ts +8 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +114 -0
- package/dist/tools/search.d.ts +11 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +636 -0
- package/dist/tools/skill.d.ts +8 -0
- package/dist/tools/skill.d.ts.map +1 -0
- package/dist/tools/skill.js +181 -0
- package/dist/tools/subtask.d.ts +9 -0
- package/dist/tools/subtask.d.ts.map +1 -0
- package/dist/tools/subtask.js +120 -0
- package/dist/tools/todo.d.ts +8 -0
- package/dist/tools/todo.d.ts.map +1 -0
- package/dist/tools/todo.js +170 -0
- package/dist/tools/url-fetch.d.ts +11 -0
- package/dist/tools/url-fetch.d.ts.map +1 -0
- package/dist/tools/url-fetch.js +208 -0
- package/dist/tools/vision-analyze.d.ts +9 -0
- package/dist/tools/vision-analyze.d.ts.map +1 -0
- package/dist/tools/vision-analyze.js +179 -0
- package/dist/tools/write.d.ts +7 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +128 -0
- package/dist/tui/chrome.d.ts +7 -0
- package/dist/tui/chrome.d.ts.map +1 -0
- package/dist/tui/chrome.js +22 -0
- package/dist/tui/input-buffer.d.ts +37 -0
- package/dist/tui/input-buffer.d.ts.map +1 -0
- package/dist/tui/input-buffer.js +228 -0
- package/dist/tui/input-history.d.ts +11 -0
- package/dist/tui/input-history.d.ts.map +1 -0
- package/dist/tui/input-history.js +69 -0
- package/dist/tui/input-queue.d.ts +27 -0
- package/dist/tui/input-queue.d.ts.map +1 -0
- package/dist/tui/input-queue.js +85 -0
- package/dist/tui/markdown.d.ts +10 -0
- package/dist/tui/markdown.d.ts.map +1 -0
- package/dist/tui/markdown.js +396 -0
- package/dist/tui/progress.d.ts +3 -0
- package/dist/tui/progress.d.ts.map +1 -0
- package/dist/tui/progress.js +13 -0
- package/dist/tui/shell.d.ts +67 -0
- package/dist/tui/shell.d.ts.map +1 -0
- package/dist/tui/shell.js +271 -0
- package/dist/tui/streaming-repl.d.ts +39 -0
- package/dist/tui/streaming-repl.d.ts.map +1 -0
- package/dist/tui/streaming-repl.js +460 -0
- package/dist/tui/streaming-tui.d.ts +174 -0
- package/dist/tui/streaming-tui.d.ts.map +1 -0
- package/dist/tui/streaming-tui.js +1049 -0
- package/dist/types.d.ts +221 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +37 -0
- package/dist/utils/symbol-extractor.d.ts +8 -0
- package/dist/utils/symbol-extractor.d.ts.map +1 -0
- package/dist/utils/symbol-extractor.js +190 -0
- package/dist/workflow-runtime.d.ts +45 -0
- package/dist/workflow-runtime.d.ts.map +1 -0
- package/dist/workflow-runtime.js +146 -0
- package/dist/workflow-types.d.ts +73 -0
- package/dist/workflow-types.d.ts.map +1 -0
- package/dist/workflow-types.js +34 -0
- package/docs/docker.md +66 -0
- package/docs/install.md +159 -0
- package/docs/sdk.md +67 -0
- package/docs/skills.md +51 -0
- package/package.json +102 -0
- package/scripts/bootstrap.mjs +63 -0
- package/scripts/check_image.ps1 +18 -0
- package/scripts/clean-dist.mjs +18 -0
- package/scripts/copy_image.ps1 +5 -0
- package/scripts/eval-smoke.mjs +17 -0
- package/skills/examples/repo-triage/SKILL.md +50 -0
- package/skills/qling.md +42 -0
- package/skills/templates/SKILL.md +37 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import * as fs from "fs/promises";
|
|
2
|
+
import { existsSync } from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
const DEFAULT_TASK_COUNT = 20;
|
|
5
|
+
const MAX_TASK_COUNT = 100;
|
|
6
|
+
export function parseSessionTaskCount(value) {
|
|
7
|
+
if (!value)
|
|
8
|
+
return DEFAULT_TASK_COUNT;
|
|
9
|
+
const parsed = Number.parseInt(value, 10);
|
|
10
|
+
if (!Number.isFinite(parsed) || parsed <= 0)
|
|
11
|
+
return DEFAULT_TASK_COUNT;
|
|
12
|
+
return Math.min(parsed, MAX_TASK_COUNT);
|
|
13
|
+
}
|
|
14
|
+
export async function listLocalSessionTasks(stateDir, options = {}) {
|
|
15
|
+
const tasksDir = path.join(stateDir, "session-tasks");
|
|
16
|
+
const count = Math.min(Math.max(1, Math.floor(options.count ?? DEFAULT_TASK_COUNT)), MAX_TASK_COUNT);
|
|
17
|
+
const warnings = [];
|
|
18
|
+
if (!existsSync(tasksDir)) {
|
|
19
|
+
return {
|
|
20
|
+
tasksDir,
|
|
21
|
+
totalFiles: 0,
|
|
22
|
+
totalTasks: 0,
|
|
23
|
+
shownTasks: 0,
|
|
24
|
+
tasks: [],
|
|
25
|
+
warnings,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const files = (await fs.readdir(tasksDir))
|
|
29
|
+
.filter((file) => file.endsWith(".json"))
|
|
30
|
+
.sort();
|
|
31
|
+
const tasks = [];
|
|
32
|
+
for (const file of files) {
|
|
33
|
+
const filePath = path.join(tasksDir, file);
|
|
34
|
+
const sessionId = path.basename(file, ".json");
|
|
35
|
+
try {
|
|
36
|
+
const raw = await fs.readFile(filePath, "utf8");
|
|
37
|
+
const parsed = JSON.parse(raw);
|
|
38
|
+
if (!Array.isArray(parsed)) {
|
|
39
|
+
warnings.push(`${file}: expected task array`);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
for (const task of parsed) {
|
|
43
|
+
if (!task || typeof task.id !== "string") {
|
|
44
|
+
warnings.push(`${file}: skipped task without id`);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
tasks.push({
|
|
48
|
+
...task,
|
|
49
|
+
sessionId,
|
|
50
|
+
filePath,
|
|
51
|
+
runner: task.runner ?? "session",
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
warnings.push(`${file}: ${err instanceof Error ? err.message : String(err)}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const sorted = tasks.sort(compareTasks);
|
|
60
|
+
const shown = sorted.slice(0, count);
|
|
61
|
+
return {
|
|
62
|
+
tasksDir,
|
|
63
|
+
totalFiles: files.length,
|
|
64
|
+
totalTasks: sorted.length,
|
|
65
|
+
shownTasks: shown.length,
|
|
66
|
+
tasks: shown,
|
|
67
|
+
warnings,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export async function cancelLocalSessionTask(stateDir, taskId, options = {}) {
|
|
71
|
+
const tasksDir = path.join(stateDir, "session-tasks");
|
|
72
|
+
if (!existsSync(tasksDir)) {
|
|
73
|
+
throw new Error(`session task not found: ${taskId}`);
|
|
74
|
+
}
|
|
75
|
+
const files = (await fs.readdir(tasksDir))
|
|
76
|
+
.filter((file) => file.endsWith(".json"))
|
|
77
|
+
.sort();
|
|
78
|
+
const now = options.clock?.() ?? Date.now();
|
|
79
|
+
for (const file of files) {
|
|
80
|
+
const filePath = path.join(tasksDir, file);
|
|
81
|
+
const sessionId = path.basename(file, ".json");
|
|
82
|
+
const raw = await fs.readFile(filePath, "utf8");
|
|
83
|
+
const parsed = JSON.parse(raw);
|
|
84
|
+
if (!Array.isArray(parsed))
|
|
85
|
+
continue;
|
|
86
|
+
const index = parsed.findIndex((task) => task?.id === taskId);
|
|
87
|
+
if (index < 0)
|
|
88
|
+
continue;
|
|
89
|
+
const current = parsed[index];
|
|
90
|
+
const next = current.status === "canceled"
|
|
91
|
+
? { ...current, runner: current.runner ?? "session" }
|
|
92
|
+
: {
|
|
93
|
+
...current,
|
|
94
|
+
runner: current.runner ?? "session",
|
|
95
|
+
status: "canceled",
|
|
96
|
+
pending: false,
|
|
97
|
+
updatedAt: now,
|
|
98
|
+
};
|
|
99
|
+
parsed[index] = next;
|
|
100
|
+
await fs.writeFile(filePath, JSON.stringify(parsed, null, 2), "utf8");
|
|
101
|
+
return {
|
|
102
|
+
...next,
|
|
103
|
+
sessionId,
|
|
104
|
+
filePath,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
throw new Error(`session task not found: ${taskId}`);
|
|
108
|
+
}
|
|
109
|
+
export function formatSessionTaskReport(report) {
|
|
110
|
+
const lines = [
|
|
111
|
+
"📋 本地任务列表",
|
|
112
|
+
"-----------------------------------------",
|
|
113
|
+
`状态目录 : ${report.tasksDir}`,
|
|
114
|
+
`任务文件 : ${report.totalFiles}`,
|
|
115
|
+
`任务总数 : ${report.totalTasks}`,
|
|
116
|
+
`显示数量 : ${report.shownTasks}`,
|
|
117
|
+
];
|
|
118
|
+
if (report.tasks.length === 0) {
|
|
119
|
+
lines.push("(无本地任务。可在 TUI 中使用 /loop 创建。)");
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
for (const task of report.tasks) {
|
|
123
|
+
lines.push(`- [${String(task.status).toUpperCase()}] ${task.id}`);
|
|
124
|
+
lines.push(` Session : ${task.sessionId}`);
|
|
125
|
+
lines.push(` Runner : ${task.runner ?? "session"} | pending=${task.pending ? "yes" : "no"} | mode=${task.mode}`);
|
|
126
|
+
lines.push(` Interval: ${formatInterval(task.intervalMs)} | Next: ${formatTimestamp(task.nextRunAt)} | Last: ${formatTimestamp(task.lastRunAt)}`);
|
|
127
|
+
lines.push(` Updated : ${formatTimestamp(task.updatedAt)}`);
|
|
128
|
+
lines.push(` Prompt : ${summarizePrompt(task.prompt)}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
for (const warning of report.warnings) {
|
|
132
|
+
lines.push(`⚠️ ${warning}`);
|
|
133
|
+
}
|
|
134
|
+
lines.push("-----------------------------------------");
|
|
135
|
+
lines.push("说明: 只读取本地 session-tasks 元数据,不读取会话正文、不联网、不调用模型。");
|
|
136
|
+
return lines;
|
|
137
|
+
}
|
|
138
|
+
export function formatCanceledSessionTask(task) {
|
|
139
|
+
return [
|
|
140
|
+
"🛑 已取消本地任务",
|
|
141
|
+
"-----------------------------------------",
|
|
142
|
+
`任务 ID : ${task.id}`,
|
|
143
|
+
`Session : ${task.sessionId}`,
|
|
144
|
+
`状态 : ${task.status}`,
|
|
145
|
+
`Runner : ${task.runner ?? "session"}`,
|
|
146
|
+
`Updated : ${formatTimestamp(task.updatedAt)}`,
|
|
147
|
+
"-----------------------------------------",
|
|
148
|
+
"说明: 仅更新本地 session-tasks 状态文件;daemon/session 会在下一次读取时观察到取消状态。",
|
|
149
|
+
];
|
|
150
|
+
}
|
|
151
|
+
function compareTasks(a, b) {
|
|
152
|
+
const updated = (b.updatedAt ?? 0) - (a.updatedAt ?? 0);
|
|
153
|
+
if (updated !== 0)
|
|
154
|
+
return updated;
|
|
155
|
+
const created = (b.createdAt ?? 0) - (a.createdAt ?? 0);
|
|
156
|
+
if (created !== 0)
|
|
157
|
+
return created;
|
|
158
|
+
return a.id.localeCompare(b.id);
|
|
159
|
+
}
|
|
160
|
+
function formatTimestamp(ts) {
|
|
161
|
+
if (!ts)
|
|
162
|
+
return "-";
|
|
163
|
+
return new Date(ts).toLocaleString();
|
|
164
|
+
}
|
|
165
|
+
function formatInterval(ms) {
|
|
166
|
+
if (!Number.isFinite(ms) || !ms)
|
|
167
|
+
return "-";
|
|
168
|
+
if (ms % (24 * 60 * 60 * 1000) === 0)
|
|
169
|
+
return `${ms / (24 * 60 * 60 * 1000)}d`;
|
|
170
|
+
if (ms % (60 * 60 * 1000) === 0)
|
|
171
|
+
return `${ms / (60 * 60 * 1000)}h`;
|
|
172
|
+
if (ms % (60 * 1000) === 0)
|
|
173
|
+
return `${ms / (60 * 1000)}m`;
|
|
174
|
+
if (ms % 1000 === 0)
|
|
175
|
+
return `${ms / 1000}s`;
|
|
176
|
+
return `${ms}ms`;
|
|
177
|
+
}
|
|
178
|
+
function summarizePrompt(prompt) {
|
|
179
|
+
const normalized = String(prompt ?? "").replace(/\s+/g, " ").trim();
|
|
180
|
+
if (!normalized)
|
|
181
|
+
return "(空)";
|
|
182
|
+
return normalized.length <= 80 ? normalized : `${normalized.slice(0, 77)}...`;
|
|
183
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shortcuts.d.ts","sourceRoot":"","sources":["../src/shortcuts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,UA+B1B,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export const SHORTCUT_LINES = [
|
|
2
|
+
"",
|
|
3
|
+
"⌨️ 【TUI 快捷键】",
|
|
4
|
+
"-----------------------------------------",
|
|
5
|
+
"界面入口 : /help slash 查看本地命令;/privacy 查看边界;/context 查看上下文;/statusline 查看状态线;Tab agents 打开本地 agents 视图",
|
|
6
|
+
"Enter : 发送当前输入",
|
|
7
|
+
"Tab : 空输入时打开本地 /agents mission 视图;slash 前缀补全最佳命令;其他非空输入会保留草稿并提示补全未启用",
|
|
8
|
+
"Slash : 输入 / 或 /sk 显示本地命令候选,Tab 补全最佳候选,不自动执行",
|
|
9
|
+
"Ctrl+N : 插入换行,继续编辑多行 prompt",
|
|
10
|
+
"Ctrl+R : 用当前输入搜索本会话内历史;未命中会提示并保留草稿",
|
|
11
|
+
"Ctrl+A / Ctrl+E : 移动到输入开头/结尾",
|
|
12
|
+
"Alt+←/→, Alt+B/F : 按词移动;Alt+↑/↓ : 多行输入内按列上下移动(兼容常见 Ctrl+方向键序列)",
|
|
13
|
+
"Ctrl+U / Ctrl+K : 删除光标前/后的输入内容",
|
|
14
|
+
"Delete : 删除光标后的一个字符",
|
|
15
|
+
"Ctrl+W / Alt+D : 删除光标前/后的一个词(兼容常见 Ctrl+Delete 序列)",
|
|
16
|
+
"Ctrl+L : 清空当前终端视图并重绘输入栏,不丢弃正在编辑的内容",
|
|
17
|
+
"Ctrl+C : 非空输入时清空;空输入时再次 Ctrl+C 确认退出",
|
|
18
|
+
"Ctrl+Z : 恢复最近一次被 Ctrl+C 清空的本地草稿",
|
|
19
|
+
"Ctrl+D : 空输入时退出;非空输入会提示并保留草稿",
|
|
20
|
+
"/exit, /quit, /q, /退出 : 本地退出 TUI,不调用模型、不写入输入历史",
|
|
21
|
+
"Esc : 取消未完成的终端控制序列;不提交、不清空输入",
|
|
22
|
+
"Home / End : 移动到输入开头/结尾(兼容常见终端序列)",
|
|
23
|
+
"Paste : 支持终端 bracketed paste,多行粘贴先进入输入缓冲,不会自动发送",
|
|
24
|
+
"↑ / ↓ : 切换历史输入;回到底部会恢复未发送草稿",
|
|
25
|
+
"← / → : 移动光标",
|
|
26
|
+
"Ctrl+O : 切换后续长工具输出的展开/折叠显示",
|
|
27
|
+
"/queue : 立即查看本地输入队列状态,不等待当前任务完成",
|
|
28
|
+
"/queue clear, /队列 清空 : 立即清空 pending 输入,不取消正在运行任务",
|
|
29
|
+
"-----------------------------------------",
|
|
30
|
+
"说明: 这些快捷键只作用于本地 TUI 输入缓冲;历史搜索不上传、不持久化。",
|
|
31
|
+
"",
|
|
32
|
+
];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SkillMeta } from "./types.js";
|
|
2
|
+
export declare function scanSkillDirs(dirs: string[]): Promise<SkillMeta[]>;
|
|
3
|
+
export declare function listSkills(dirs: string[]): Promise<SkillMeta[]>;
|
|
4
|
+
export declare function searchSkills(query: string, dirs: string[]): Promise<SkillMeta[]>;
|
|
5
|
+
export declare function parseSkillFile(filePath: string): Promise<SkillMeta | null>;
|
|
6
|
+
export declare function parseFrontmatter(raw: string, filePath: string): SkillMeta;
|
|
7
|
+
export declare function clearSkillCache(): void;
|
|
8
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/skills/registry.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAS5C,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAYxE;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAErE;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAStF;AA+BD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAoBhF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAiCzE;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// 轻灵 - 技能注册表
|
|
3
|
+
// 扫描目录、解析 YAML frontmatter、mtime 缓存
|
|
4
|
+
// ============================================================
|
|
5
|
+
import { readdir, readFile, stat } from "fs/promises";
|
|
6
|
+
import { join, basename, extname } from "path";
|
|
7
|
+
import YAML from "yaml";
|
|
8
|
+
const cache = new Map();
|
|
9
|
+
export async function scanSkillDirs(dirs) {
|
|
10
|
+
const results = [];
|
|
11
|
+
for (const dir of dirs) {
|
|
12
|
+
try {
|
|
13
|
+
const dirStat = await stat(dir);
|
|
14
|
+
if (!dirStat.isDirectory())
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
await walkSkillDir(dir, results);
|
|
21
|
+
}
|
|
22
|
+
return results;
|
|
23
|
+
}
|
|
24
|
+
export async function listSkills(dirs) {
|
|
25
|
+
return scanSkillDirs(dirs);
|
|
26
|
+
}
|
|
27
|
+
export async function searchSkills(query, dirs) {
|
|
28
|
+
const all = await scanSkillDirs(dirs);
|
|
29
|
+
const q = query.toLowerCase();
|
|
30
|
+
return all.filter((s) => s.name.toLowerCase().includes(q) ||
|
|
31
|
+
s.description.toLowerCase().includes(q) ||
|
|
32
|
+
s.tags.some((t) => t.toLowerCase().includes(q)));
|
|
33
|
+
}
|
|
34
|
+
async function walkSkillDir(dir, results) {
|
|
35
|
+
let entries;
|
|
36
|
+
try {
|
|
37
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
const fullPath = join(dir, entry.name);
|
|
44
|
+
if (entry.isDirectory()) {
|
|
45
|
+
// Check for index.md inside directory
|
|
46
|
+
const indexPath = join(fullPath, "index.md");
|
|
47
|
+
const meta = await parseSkillFile(indexPath);
|
|
48
|
+
if (meta)
|
|
49
|
+
results.push(meta);
|
|
50
|
+
const skillPath = join(fullPath, "SKILL.md");
|
|
51
|
+
const skillMeta = await parseSkillFile(skillPath);
|
|
52
|
+
if (skillMeta)
|
|
53
|
+
results.push(skillMeta);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (entry.isFile() && extname(entry.name) === ".md") {
|
|
57
|
+
const meta = await parseSkillFile(fullPath);
|
|
58
|
+
if (meta)
|
|
59
|
+
results.push(meta);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export async function parseSkillFile(filePath) {
|
|
64
|
+
try {
|
|
65
|
+
const fileStat = await stat(filePath);
|
|
66
|
+
if (!fileStat.isFile())
|
|
67
|
+
return null;
|
|
68
|
+
// Check cache
|
|
69
|
+
const cached = cache.get(filePath);
|
|
70
|
+
if (cached && cached.mtimeMs === fileStat.mtimeMs) {
|
|
71
|
+
return cached.meta;
|
|
72
|
+
}
|
|
73
|
+
const raw = await readFile(filePath, "utf-8");
|
|
74
|
+
const meta = parseFrontmatter(raw, filePath);
|
|
75
|
+
// Update cache
|
|
76
|
+
cache.set(filePath, { meta, mtimeMs: fileStat.mtimeMs });
|
|
77
|
+
return meta;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function parseFrontmatter(raw, filePath) {
|
|
84
|
+
const fileBaseName = basename(filePath, ".md");
|
|
85
|
+
const fallbackName = fileBaseName.toLowerCase() === "skill" || fileBaseName.toLowerCase() === "index"
|
|
86
|
+
? basename(join(filePath, ".."))
|
|
87
|
+
: fileBaseName;
|
|
88
|
+
const fallback = {
|
|
89
|
+
name: fallbackName,
|
|
90
|
+
description: "",
|
|
91
|
+
tags: [],
|
|
92
|
+
path: filePath,
|
|
93
|
+
};
|
|
94
|
+
const lines = raw.split("\n");
|
|
95
|
+
const firstIdx = lines.findIndex((l) => l.trim() === "---");
|
|
96
|
+
if (firstIdx < 0)
|
|
97
|
+
return fallback;
|
|
98
|
+
const secondIdx = lines.findIndex((i, idx) => idx > firstIdx && i.trim() === "---");
|
|
99
|
+
if (secondIdx < 0)
|
|
100
|
+
return fallback;
|
|
101
|
+
const yamlBlock = lines.slice(firstIdx + 1, secondIdx).join("\n");
|
|
102
|
+
try {
|
|
103
|
+
const parsed = YAML.parse(yamlBlock);
|
|
104
|
+
if (!parsed || typeof parsed !== "object")
|
|
105
|
+
return fallback;
|
|
106
|
+
return {
|
|
107
|
+
name: typeof parsed.name === "string" && parsed.name ? parsed.name : fallbackName,
|
|
108
|
+
description: typeof parsed.description === "string" ? parsed.description : "",
|
|
109
|
+
tags: Array.isArray(parsed.tags) ? parsed.tags.map(String) : [],
|
|
110
|
+
path: filePath,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return fallback;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export function clearSkillCache() {
|
|
118
|
+
cache.clear();
|
|
119
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { SlashCommandContext } from "./commands/runtime.js";
|
|
2
|
+
export interface StatusLineSnapshot {
|
|
3
|
+
model: string;
|
|
4
|
+
sessionId: string;
|
|
5
|
+
branch: string | null;
|
|
6
|
+
permissionMode: string | null;
|
|
7
|
+
/** agent | plan */
|
|
8
|
+
sessionMode?: string | null;
|
|
9
|
+
goalStatus: string | null;
|
|
10
|
+
activeTasks: number;
|
|
11
|
+
tokens: number;
|
|
12
|
+
tokenSource?: "provider" | "estimate" | "unknown";
|
|
13
|
+
maxTokens?: number | null;
|
|
14
|
+
costPer1kTokens?: number | null;
|
|
15
|
+
inputQueue?: StatusLineInputQueueSnapshot;
|
|
16
|
+
}
|
|
17
|
+
export interface StatusLineInputQueueSnapshot {
|
|
18
|
+
pendingCount: number;
|
|
19
|
+
maxPending?: number;
|
|
20
|
+
isProcessing?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface LocalStatusLineSnapshotOptions {
|
|
23
|
+
workspaceDir?: string | null;
|
|
24
|
+
model?: string | null;
|
|
25
|
+
permissionMode?: string | null;
|
|
26
|
+
maxTokens?: number | null;
|
|
27
|
+
costPer1kTokens?: number | null;
|
|
28
|
+
}
|
|
29
|
+
export declare function resolveGitBranch(workspaceDir?: string): string | null;
|
|
30
|
+
export declare function resolveShortSessionId(sessionId: string): string;
|
|
31
|
+
export declare function formatPermissionMode(mode: string | null | undefined): string;
|
|
32
|
+
export declare function parseStatusLineCostPer1k(raw: unknown): number | null;
|
|
33
|
+
export declare function formatStatusLine(snapshot: StatusLineSnapshot): string;
|
|
34
|
+
export declare function collectLocalStatusLineSnapshot(options: LocalStatusLineSnapshotOptions): StatusLineSnapshot;
|
|
35
|
+
export declare function collectStatusLineSnapshot(context: SlashCommandContext): Promise<StatusLineSnapshot>;
|
|
36
|
+
export declare function buildStatusLine(context: SlashCommandContext): Promise<string>;
|
|
37
|
+
//# sourceMappingURL=statusline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusline.d.ts","sourceRoot":"","sources":["../src/statusline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGjE,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,4BAA4B,CAAC;CAC3C;AAED,MAAM,WAAW,4BAA4B;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,8BAA8B;IAC7C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AA4BD,wBAAgB,gBAAgB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWrE;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAa5E;AAiBD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEpE;AAmCD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAyBrE;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,8BAA8B,GAAG,kBAAkB,CAc1G;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkDzG;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnF"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "fs";
|
|
2
|
+
import { dirname, join, resolve } from "path";
|
|
3
|
+
import { getLocalizedText } from "./i18n/index.js";
|
|
4
|
+
function readText(path) {
|
|
5
|
+
try {
|
|
6
|
+
return readFileSync(path, "utf8").trim();
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function findGitDir(workspaceDir) {
|
|
13
|
+
let current = resolve(workspaceDir);
|
|
14
|
+
while (true) {
|
|
15
|
+
const dotGit = join(current, ".git");
|
|
16
|
+
if (existsSync(dotGit)) {
|
|
17
|
+
const maybeFile = readText(dotGit);
|
|
18
|
+
if (maybeFile?.startsWith("gitdir:")) {
|
|
19
|
+
const gitDir = maybeFile.slice("gitdir:".length).trim();
|
|
20
|
+
return resolve(current, gitDir);
|
|
21
|
+
}
|
|
22
|
+
return dotGit;
|
|
23
|
+
}
|
|
24
|
+
const parent = dirname(current);
|
|
25
|
+
if (parent === current)
|
|
26
|
+
return null;
|
|
27
|
+
current = parent;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function resolveGitBranch(workspaceDir) {
|
|
31
|
+
if (!workspaceDir)
|
|
32
|
+
return null;
|
|
33
|
+
const gitDir = findGitDir(workspaceDir);
|
|
34
|
+
if (!gitDir)
|
|
35
|
+
return null;
|
|
36
|
+
const head = readText(join(gitDir, "HEAD"));
|
|
37
|
+
if (!head)
|
|
38
|
+
return null;
|
|
39
|
+
const prefix = "ref: refs/heads/";
|
|
40
|
+
if (head.startsWith(prefix)) {
|
|
41
|
+
return head.slice(prefix.length);
|
|
42
|
+
}
|
|
43
|
+
return head.slice(0, 7);
|
|
44
|
+
}
|
|
45
|
+
export function resolveShortSessionId(sessionId) {
|
|
46
|
+
if (!sessionId)
|
|
47
|
+
return "-";
|
|
48
|
+
return sessionId.length > 12 ? sessionId.slice(0, 12) : sessionId;
|
|
49
|
+
}
|
|
50
|
+
export function formatPermissionMode(mode) {
|
|
51
|
+
const t = getLocalizedText();
|
|
52
|
+
const m = (mode ?? "").toLowerCase();
|
|
53
|
+
switch (m) {
|
|
54
|
+
case "allow":
|
|
55
|
+
return "允许(自动)";
|
|
56
|
+
case "ask":
|
|
57
|
+
return "询问(确认)";
|
|
58
|
+
case "deny":
|
|
59
|
+
return "拒绝";
|
|
60
|
+
default:
|
|
61
|
+
return "-(未知)";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function formatInputQueueStatus(queue) {
|
|
65
|
+
if (!queue)
|
|
66
|
+
return null;
|
|
67
|
+
const pending = Number.isFinite(queue.pendingCount) ? Math.max(0, Math.floor(queue.pendingCount)) : 0;
|
|
68
|
+
if (pending <= 0 && !queue.isProcessing)
|
|
69
|
+
return null;
|
|
70
|
+
const max = Number.isFinite(queue.maxPending) ? String(Math.max(0, Math.floor(Number(queue.maxPending)))) : "-";
|
|
71
|
+
const state = pending > 0 ? String(pending) : "run";
|
|
72
|
+
return `${state}/${max}`;
|
|
73
|
+
}
|
|
74
|
+
function normalizePositiveNumber(value) {
|
|
75
|
+
const numeric = typeof value === "number" ? value : Number(value);
|
|
76
|
+
if (!Number.isFinite(numeric) || numeric <= 0)
|
|
77
|
+
return null;
|
|
78
|
+
return numeric;
|
|
79
|
+
}
|
|
80
|
+
export function parseStatusLineCostPer1k(raw) {
|
|
81
|
+
return normalizePositiveNumber(raw);
|
|
82
|
+
}
|
|
83
|
+
function formatContextUsage(tokens, maxTokens) {
|
|
84
|
+
const used = Math.max(0, Math.floor(Number(tokens ?? 0)));
|
|
85
|
+
const max = normalizePositiveNumber(maxTokens);
|
|
86
|
+
if (!max)
|
|
87
|
+
return `${used.toLocaleString()}/-`;
|
|
88
|
+
const roundedMax = Math.floor(max);
|
|
89
|
+
const pct = Math.round((used / roundedMax) * 100);
|
|
90
|
+
return `${used.toLocaleString()}/${roundedMax.toLocaleString()}(${pct}%)`;
|
|
91
|
+
}
|
|
92
|
+
function formatCostEstimate(tokens, costPer1kTokens) {
|
|
93
|
+
const costPer1k = normalizePositiveNumber(costPer1kTokens);
|
|
94
|
+
if (!costPer1k)
|
|
95
|
+
return "-";
|
|
96
|
+
const used = Math.max(0, Number(tokens ?? 0));
|
|
97
|
+
const estimate = (used / 1000) * costPer1k;
|
|
98
|
+
return `≈$${estimate.toFixed(4)}`;
|
|
99
|
+
}
|
|
100
|
+
function normalizeTokenSource(value) {
|
|
101
|
+
return value === "provider" || value === "estimate" ? value : "unknown";
|
|
102
|
+
}
|
|
103
|
+
function resolveTokenBudgetMax(agentLoop) {
|
|
104
|
+
const value = agentLoop.getTokenBudget?.()?.maxTokens ?? agentLoop.tokenBudget?.maxTokens;
|
|
105
|
+
return normalizePositiveNumber(value);
|
|
106
|
+
}
|
|
107
|
+
function formatSessionMode(mode) {
|
|
108
|
+
const m = String(mode ?? "").trim().toLowerCase();
|
|
109
|
+
if (m === "plan")
|
|
110
|
+
return "plan";
|
|
111
|
+
if (m === "agent")
|
|
112
|
+
return "agent";
|
|
113
|
+
return m || "agent";
|
|
114
|
+
}
|
|
115
|
+
export function formatStatusLine(snapshot) {
|
|
116
|
+
const t = getLocalizedText();
|
|
117
|
+
const goal = snapshot.goalStatus || "无";
|
|
118
|
+
const branch = snapshot.branch || "-";
|
|
119
|
+
const permission = formatPermissionMode(snapshot.permissionMode);
|
|
120
|
+
const sessionMode = formatSessionMode(snapshot.sessionMode);
|
|
121
|
+
const cost = formatCostEstimate(snapshot.tokens, snapshot.costPer1kTokens);
|
|
122
|
+
const parts = [
|
|
123
|
+
`模型=${snapshot.model || "未知"}`,
|
|
124
|
+
`模式=${sessionMode}`,
|
|
125
|
+
`会话=${resolveShortSessionId(snapshot.sessionId)}`,
|
|
126
|
+
`分支=${branch}`,
|
|
127
|
+
`权限=${permission}`,
|
|
128
|
+
`目标=${goal}`,
|
|
129
|
+
`任务=${snapshot.activeTasks}`,
|
|
130
|
+
`令牌=${Number(snapshot.tokens ?? 0).toLocaleString()}`,
|
|
131
|
+
`来源=${normalizeTokenSource(snapshot.tokenSource)}`,
|
|
132
|
+
`上下文=${formatContextUsage(snapshot.tokens, snapshot.maxTokens)}`,
|
|
133
|
+
cost === "-" ? "成本=-" : `成本${cost}`,
|
|
134
|
+
];
|
|
135
|
+
const queue = formatInputQueueStatus(snapshot.inputQueue);
|
|
136
|
+
if (queue) {
|
|
137
|
+
parts.push(`队列=${queue}`);
|
|
138
|
+
}
|
|
139
|
+
return parts.join(" ");
|
|
140
|
+
}
|
|
141
|
+
export function collectLocalStatusLineSnapshot(options) {
|
|
142
|
+
return {
|
|
143
|
+
model: options.model || "unknown",
|
|
144
|
+
sessionId: "",
|
|
145
|
+
branch: resolveGitBranch(options.workspaceDir ?? undefined),
|
|
146
|
+
permissionMode: options.permissionMode ?? null,
|
|
147
|
+
sessionMode: "agent",
|
|
148
|
+
goalStatus: null,
|
|
149
|
+
activeTasks: 0,
|
|
150
|
+
tokens: 0,
|
|
151
|
+
tokenSource: "unknown",
|
|
152
|
+
maxTokens: normalizePositiveNumber(options.maxTokens),
|
|
153
|
+
costPer1kTokens: parseStatusLineCostPer1k(options.costPer1kTokens),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
export async function collectStatusLineSnapshot(context) {
|
|
157
|
+
const agentLoop = context.agentLoop;
|
|
158
|
+
const stats = typeof agentLoop.getSessionStats === "function"
|
|
159
|
+
? await agentLoop.getSessionStats()
|
|
160
|
+
: {
|
|
161
|
+
sessionId: typeof agentLoop.getSessionId === "function" ? agentLoop.getSessionId() : "",
|
|
162
|
+
tokens: agentLoop.sessionTokens ?? 0,
|
|
163
|
+
};
|
|
164
|
+
const tasks = context.scheduler && typeof context.scheduler.listTasks === "function"
|
|
165
|
+
? await context.scheduler.listTasks()
|
|
166
|
+
: [];
|
|
167
|
+
const activeTasks = Array.isArray(tasks)
|
|
168
|
+
? tasks.filter((task) => task.status !== "canceled" && task.status !== "completed").length
|
|
169
|
+
: 0;
|
|
170
|
+
const goal = context.goalController && typeof context.goalController.getGoalStatus === "function"
|
|
171
|
+
? await context.goalController.getGoalStatus()
|
|
172
|
+
: null;
|
|
173
|
+
const permissionMode = typeof agentLoop.getPermissionMode === "function"
|
|
174
|
+
? agentLoop.getPermissionMode()
|
|
175
|
+
: process.env.QLING_GUARD_PERMISSIONS_DEFAULT ?? null;
|
|
176
|
+
const sessionMode = typeof agentLoop.getSessionMode === "function"
|
|
177
|
+
? agentLoop.getSessionMode()
|
|
178
|
+
: typeof agentLoop.isPlanMode === "function" && agentLoop.isPlanMode()
|
|
179
|
+
? "plan"
|
|
180
|
+
: process.env.QLING_PLAN_MODE === "1"
|
|
181
|
+
? "plan"
|
|
182
|
+
: "agent";
|
|
183
|
+
const inputQueue = context.inputQueue
|
|
184
|
+
? {
|
|
185
|
+
pendingCount: Number(context.inputQueue.pendingCount ?? 0),
|
|
186
|
+
maxPending: context.inputQueue.maxPending,
|
|
187
|
+
isProcessing: Boolean(context.inputQueue.isProcessing),
|
|
188
|
+
}
|
|
189
|
+
: undefined;
|
|
190
|
+
return {
|
|
191
|
+
model: typeof agentLoop.getModel === "function" ? agentLoop.getModel() : "unknown",
|
|
192
|
+
sessionId: stats.sessionId ?? "",
|
|
193
|
+
branch: resolveGitBranch(context.workspaceDir),
|
|
194
|
+
permissionMode,
|
|
195
|
+
sessionMode,
|
|
196
|
+
goalStatus: goal?.status ?? null,
|
|
197
|
+
activeTasks,
|
|
198
|
+
tokens: Number(stats.tokens ?? 0),
|
|
199
|
+
tokenSource: normalizeTokenSource(stats.tokenSource),
|
|
200
|
+
maxTokens: resolveTokenBudgetMax(agentLoop),
|
|
201
|
+
costPer1kTokens: parseStatusLineCostPer1k(process.env.QLING_STATUSLINE_COST_PER_1K_TOKENS),
|
|
202
|
+
inputQueue,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
export async function buildStatusLine(context) {
|
|
206
|
+
return formatStatusLine(await collectStatusLineSnapshot(context));
|
|
207
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ToolDefinition, ToolResult } from "../types.js";
|
|
2
|
+
export declare const bashTool: ToolDefinition;
|
|
3
|
+
export declare function runBash(args: {
|
|
4
|
+
command: string;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
timeout?: number;
|
|
7
|
+
env_allowlist?: string[];
|
|
8
|
+
env_inject?: Record<string, string>;
|
|
9
|
+
}): Promise<ToolResult>;
|
|
10
|
+
//# sourceMappingURL=bash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzD,eAAO,MAAM,QAAQ,EAAE,cA+FtB,CAAC;AAEF,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,GAAG,OAAO,CAAC,UAAU,CAAC,CAyJtB"}
|