@nghyane/arcane 0.1.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 +3 -0
- package/README.md +12 -0
- package/examples/README.md +21 -0
- package/examples/custom-tools/README.md +109 -0
- package/examples/custom-tools/hello/index.ts +20 -0
- package/examples/custom-tools/todo/index.ts +206 -0
- package/examples/extensions/README.md +143 -0
- package/examples/extensions/api-demo.ts +89 -0
- package/examples/extensions/chalk-logger.ts +25 -0
- package/examples/extensions/hello.ts +32 -0
- package/examples/extensions/pirate.ts +43 -0
- package/examples/extensions/plan-mode.ts +550 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/todo.ts +296 -0
- package/examples/extensions/tools.ts +144 -0
- package/examples/extensions/with-deps/index.ts +35 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +16 -0
- package/examples/hooks/README.md +56 -0
- package/examples/hooks/auto-commit-on-exit.ts +48 -0
- package/examples/hooks/confirm-destructive.ts +58 -0
- package/examples/hooks/custom-compaction.ts +116 -0
- package/examples/hooks/dirty-repo-guard.ts +51 -0
- package/examples/hooks/file-trigger.ts +40 -0
- package/examples/hooks/git-checkpoint.ts +52 -0
- package/examples/hooks/handoff.ts +150 -0
- package/examples/hooks/permission-gate.ts +33 -0
- package/examples/hooks/protected-paths.ts +29 -0
- package/examples/hooks/qna.ts +119 -0
- package/examples/hooks/status-line.ts +39 -0
- package/examples/sdk/01-minimal.ts +21 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +43 -0
- package/examples/sdk/04-skills.ts +43 -0
- package/examples/sdk/06-extensions.ts +80 -0
- package/examples/sdk/06-hooks.ts +61 -0
- package/examples/sdk/07-context-files.ts +35 -0
- package/examples/sdk/08-prompt-templates.ts +36 -0
- package/examples/sdk/08-slash-commands.ts +41 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
- package/examples/sdk/11-sessions.ts +47 -0
- package/examples/sdk/README.md +150 -0
- package/package.json +464 -0
- package/scripts/format-prompts.ts +184 -0
- package/scripts/generate-docs-index.ts +40 -0
- package/scripts/generate-template.ts +32 -0
- package/src/bun-imports.d.ts +22 -0
- package/src/capability/context-file.ts +39 -0
- package/src/capability/extension-module.ts +33 -0
- package/src/capability/extension.ts +47 -0
- package/src/capability/fs.ts +89 -0
- package/src/capability/hook.ts +39 -0
- package/src/capability/index.ts +432 -0
- package/src/capability/instruction.ts +36 -0
- package/src/capability/mcp.ts +60 -0
- package/src/capability/prompt.ts +34 -0
- package/src/capability/rule.ts +223 -0
- package/src/capability/settings.ts +34 -0
- package/src/capability/skill.ts +48 -0
- package/src/capability/slash-command.ts +39 -0
- package/src/capability/ssh.ts +41 -0
- package/src/capability/system-prompt.ts +34 -0
- package/src/capability/tool.ts +37 -0
- package/src/capability/types.ts +156 -0
- package/src/cli/args.ts +259 -0
- package/src/cli/config-cli.ts +357 -0
- package/src/cli/file-processor.ts +124 -0
- package/src/cli/grep-cli.ts +152 -0
- package/src/cli/jupyter-cli.ts +106 -0
- package/src/cli/list-models.ts +103 -0
- package/src/cli/plugin-cli.ts +661 -0
- package/src/cli/session-picker.ts +42 -0
- package/src/cli/setup-cli.ts +376 -0
- package/src/cli/shell-cli.ts +174 -0
- package/src/cli/ssh-cli.ts +179 -0
- package/src/cli/stats-cli.ts +197 -0
- package/src/cli/update-cli.ts +286 -0
- package/src/cli/web-search-cli.ts +143 -0
- package/src/cli.ts +65 -0
- package/src/commands/commit.ts +36 -0
- package/src/commands/config.ts +51 -0
- package/src/commands/grep.ts +41 -0
- package/src/commands/jupyter.ts +32 -0
- package/src/commands/launch.ts +139 -0
- package/src/commands/plugin.ts +70 -0
- package/src/commands/setup.ts +42 -0
- package/src/commands/shell.ts +29 -0
- package/src/commands/ssh.ts +60 -0
- package/src/commands/stats.ts +29 -0
- package/src/commands/update.ts +21 -0
- package/src/commands/web-search.ts +42 -0
- package/src/commit/agentic/agent.ts +311 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +359 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +25 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +38 -0
- package/src/commit/agentic/state.ts +69 -0
- package/src/commit/agentic/tools/analyze-file.ts +118 -0
- package/src/commit/agentic/tools/git-file-diff.ts +194 -0
- package/src/commit/agentic/tools/git-hunk.ts +50 -0
- package/src/commit/agentic/tools/git-overview.ts +84 -0
- package/src/commit/agentic/tools/index.ts +56 -0
- package/src/commit/agentic/tools/propose-changelog.ts +128 -0
- package/src/commit/agentic/tools/propose-commit.ts +154 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/split-commit.ts +280 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +200 -0
- package/src/commit/analysis/conventional.ts +165 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +112 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +37 -0
- package/src/commit/changelog/generate.ts +110 -0
- package/src/commit/changelog/index.ts +234 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +93 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/git/errors.ts +9 -0
- package/src/commit/git/index.ts +211 -0
- package/src/commit/git/operations.ts +54 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +64 -0
- package/src/commit/map-reduce/map-phase.ts +178 -0
- package/src/commit/map-reduce/reduce-phase.ts +145 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +69 -0
- package/src/commit/pipeline.ts +243 -0
- package/src/commit/prompts/analysis-system.md +148 -0
- package/src/commit/prompts/analysis-user.md +38 -0
- package/src/commit/prompts/changelog-system.md +50 -0
- package/src/commit/prompts/changelog-user.md +18 -0
- package/src/commit/prompts/file-observer-system.md +24 -0
- package/src/commit/prompts/file-observer-user.md +8 -0
- package/src/commit/prompts/reduce-system.md +50 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +3 -0
- package/src/commit/prompts/summary-system.md +38 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/types.ts +109 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/config/file-lock.ts +121 -0
- package/src/config/keybindings.ts +280 -0
- package/src/config/model-registry.ts +1140 -0
- package/src/config/model-resolver.ts +812 -0
- package/src/config/prompt-templates.ts +526 -0
- package/src/config/resolve-config-value.ts +92 -0
- package/src/config/settings-schema.ts +1236 -0
- package/src/config/settings.ts +706 -0
- package/src/config.ts +414 -0
- package/src/cursor.ts +239 -0
- package/src/debug/index.ts +431 -0
- package/src/debug/log-formatting.ts +60 -0
- package/src/debug/log-viewer.ts +903 -0
- package/src/debug/profiler.ts +158 -0
- package/src/debug/report-bundle.ts +366 -0
- package/src/debug/system-info.ts +112 -0
- package/src/discovery/agents-md.ts +68 -0
- package/src/discovery/agents.ts +199 -0
- package/src/discovery/builtin.ts +815 -0
- package/src/discovery/claude-plugins.ts +205 -0
- package/src/discovery/claude.ts +506 -0
- package/src/discovery/cline.ts +83 -0
- package/src/discovery/codex.ts +532 -0
- package/src/discovery/cursor.ts +218 -0
- package/src/discovery/gemini.ts +395 -0
- package/src/discovery/github.ts +117 -0
- package/src/discovery/helpers.ts +698 -0
- package/src/discovery/index.ts +89 -0
- package/src/discovery/mcp-json.ts +156 -0
- package/src/discovery/opencode.ts +394 -0
- package/src/discovery/ssh.ts +160 -0
- package/src/discovery/vscode.ts +103 -0
- package/src/discovery/windsurf.ts +145 -0
- package/src/exa/company.ts +57 -0
- package/src/exa/index.ts +62 -0
- package/src/exa/linkedin.ts +57 -0
- package/src/exa/mcp-client.ts +289 -0
- package/src/exa/render.ts +244 -0
- package/src/exa/researcher.ts +89 -0
- package/src/exa/search.ts +330 -0
- package/src/exa/types.ts +166 -0
- package/src/exa/websets.ts +247 -0
- package/src/exec/bash-executor.ts +184 -0
- package/src/exec/exec.ts +53 -0
- package/src/export/custom-share.ts +65 -0
- package/src/export/html/index.ts +162 -0
- package/src/export/html/template.css +889 -0
- package/src/export/html/template.generated.ts +2 -0
- package/src/export/html/template.html +45 -0
- package/src/export/html/template.js +1329 -0
- package/src/export/html/template.macro.ts +24 -0
- package/src/export/html/vendor/highlight.min.js +1213 -0
- package/src/export/html/vendor/marked.min.js +6 -0
- package/src/export/ttsr.ts +434 -0
- package/src/extensibility/custom-commands/bundled/review/index.ts +433 -0
- package/src/extensibility/custom-commands/index.ts +15 -0
- package/src/extensibility/custom-commands/loader.ts +231 -0
- package/src/extensibility/custom-commands/types.ts +111 -0
- package/src/extensibility/custom-tools/index.ts +22 -0
- package/src/extensibility/custom-tools/loader.ts +235 -0
- package/src/extensibility/custom-tools/types.ts +226 -0
- package/src/extensibility/custom-tools/wrapper.ts +45 -0
- package/src/extensibility/extensions/index.ts +136 -0
- package/src/extensibility/extensions/loader.ts +520 -0
- package/src/extensibility/extensions/runner.ts +774 -0
- package/src/extensibility/extensions/types.ts +1293 -0
- package/src/extensibility/extensions/wrapper.ts +188 -0
- package/src/extensibility/hooks/index.ts +16 -0
- package/src/extensibility/hooks/loader.ts +273 -0
- package/src/extensibility/hooks/runner.ts +441 -0
- package/src/extensibility/hooks/tool-wrapper.ts +106 -0
- package/src/extensibility/hooks/types.ts +817 -0
- package/src/extensibility/plugins/doctor.ts +65 -0
- package/src/extensibility/plugins/git-url.ts +281 -0
- package/src/extensibility/plugins/index.ts +33 -0
- package/src/extensibility/plugins/installer.ts +192 -0
- package/src/extensibility/plugins/loader.ts +338 -0
- package/src/extensibility/plugins/manager.ts +716 -0
- package/src/extensibility/plugins/parser.ts +105 -0
- package/src/extensibility/plugins/types.ts +190 -0
- package/src/extensibility/skills.ts +385 -0
- package/src/extensibility/slash-commands.ts +287 -0
- package/src/extensibility/tool-proxy.ts +25 -0
- package/src/index.ts +275 -0
- package/src/internal-urls/agent-protocol.ts +136 -0
- package/src/internal-urls/artifact-protocol.ts +97 -0
- package/src/internal-urls/docs-index.generated.ts +54 -0
- package/src/internal-urls/docs-protocol.ts +84 -0
- package/src/internal-urls/index.ts +31 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/memory-protocol.ts +133 -0
- package/src/internal-urls/router.ts +70 -0
- package/src/internal-urls/rule-protocol.ts +55 -0
- package/src/internal-urls/skill-protocol.ts +111 -0
- package/src/internal-urls/types.ts +52 -0
- package/src/ipy/executor.ts +556 -0
- package/src/ipy/gateway-coordinator.ts +426 -0
- package/src/ipy/kernel.ts +892 -0
- package/src/ipy/modules.ts +109 -0
- package/src/ipy/prelude.py +831 -0
- package/src/ipy/prelude.ts +3 -0
- package/src/ipy/runtime.ts +222 -0
- package/src/lsp/client.ts +867 -0
- package/src/lsp/clients/biome-client.ts +202 -0
- package/src/lsp/clients/index.ts +50 -0
- package/src/lsp/clients/lsp-linter-client.ts +93 -0
- package/src/lsp/clients/swiftlint-client.ts +120 -0
- package/src/lsp/config.ts +397 -0
- package/src/lsp/defaults.json +464 -0
- package/src/lsp/edits.ts +109 -0
- package/src/lsp/index.ts +1268 -0
- package/src/lsp/lspmux.ts +250 -0
- package/src/lsp/render.ts +689 -0
- package/src/lsp/types.ts +414 -0
- package/src/lsp/utils.ts +549 -0
- package/src/main.ts +773 -0
- package/src/mcp/client.ts +239 -0
- package/src/mcp/config-writer.ts +215 -0
- package/src/mcp/config.ts +363 -0
- package/src/mcp/index.ts +55 -0
- package/src/mcp/json-rpc.ts +84 -0
- package/src/mcp/loader.ts +124 -0
- package/src/mcp/manager.ts +490 -0
- package/src/mcp/oauth-discovery.ts +274 -0
- package/src/mcp/oauth-flow.ts +229 -0
- package/src/mcp/render.ts +123 -0
- package/src/mcp/tool-bridge.ts +372 -0
- package/src/mcp/tool-cache.ts +121 -0
- package/src/mcp/transports/http.ts +332 -0
- package/src/mcp/transports/index.ts +6 -0
- package/src/mcp/transports/stdio.ts +281 -0
- package/src/mcp/types.ts +248 -0
- package/src/memories/index.ts +1099 -0
- package/src/memories/storage.ts +563 -0
- package/src/modes/components/agent-dashboard.ts +1130 -0
- package/src/modes/components/assistant-message.ts +144 -0
- package/src/modes/components/bash-execution.ts +218 -0
- package/src/modes/components/bordered-loader.ts +41 -0
- package/src/modes/components/branch-summary-message.ts +45 -0
- package/src/modes/components/codemode-group.ts +369 -0
- package/src/modes/components/compaction-summary-message.ts +51 -0
- package/src/modes/components/countdown-timer.ts +46 -0
- package/src/modes/components/custom-editor.ts +181 -0
- package/src/modes/components/custom-message.ts +91 -0
- package/src/modes/components/diff.ts +186 -0
- package/src/modes/components/dynamic-border.ts +25 -0
- package/src/modes/components/extensions/extension-dashboard.ts +325 -0
- package/src/modes/components/extensions/extension-list.ts +484 -0
- package/src/modes/components/extensions/index.ts +9 -0
- package/src/modes/components/extensions/inspector-panel.ts +321 -0
- package/src/modes/components/extensions/state-manager.ts +586 -0
- package/src/modes/components/extensions/types.ts +191 -0
- package/src/modes/components/footer.ts +315 -0
- package/src/modes/components/history-search.ts +157 -0
- package/src/modes/components/hook-editor.ts +101 -0
- package/src/modes/components/hook-input.ts +72 -0
- package/src/modes/components/hook-message.ts +100 -0
- package/src/modes/components/hook-selector.ts +155 -0
- package/src/modes/components/index.ts +41 -0
- package/src/modes/components/keybinding-hints.ts +65 -0
- package/src/modes/components/login-dialog.ts +164 -0
- package/src/modes/components/mcp-add-wizard.ts +1295 -0
- package/src/modes/components/model-selector.ts +625 -0
- package/src/modes/components/oauth-selector.ts +210 -0
- package/src/modes/components/plugin-settings.ts +477 -0
- package/src/modes/components/python-execution.ts +196 -0
- package/src/modes/components/queue-mode-selector.ts +56 -0
- package/src/modes/components/read-tool-group.ts +119 -0
- package/src/modes/components/session-selector.ts +242 -0
- package/src/modes/components/settings-defs.ts +340 -0
- package/src/modes/components/settings-selector.ts +529 -0
- package/src/modes/components/show-images-selector.ts +45 -0
- package/src/modes/components/skill-message.ts +90 -0
- package/src/modes/components/status-line/index.ts +4 -0
- package/src/modes/components/status-line/presets.ts +94 -0
- package/src/modes/components/status-line/segments.ts +352 -0
- package/src/modes/components/status-line/separators.ts +55 -0
- package/src/modes/components/status-line/types.ts +75 -0
- package/src/modes/components/status-line-segment-editor.ts +354 -0
- package/src/modes/components/status-line.ts +421 -0
- package/src/modes/components/theme-selector.ts +63 -0
- package/src/modes/components/thinking-selector.ts +64 -0
- package/src/modes/components/todo-display.ts +115 -0
- package/src/modes/components/todo-reminder.ts +40 -0
- package/src/modes/components/tool-execution.ts +703 -0
- package/src/modes/components/tree-selector.ts +904 -0
- package/src/modes/components/ttsr-notification.ts +80 -0
- package/src/modes/components/user-message-selector.ts +146 -0
- package/src/modes/components/user-message.ts +22 -0
- package/src/modes/components/visual-truncate.ts +63 -0
- package/src/modes/components/welcome.ts +247 -0
- package/src/modes/controllers/command-controller.ts +1120 -0
- package/src/modes/controllers/event-controller.ts +479 -0
- package/src/modes/controllers/extension-ui-controller.ts +778 -0
- package/src/modes/controllers/input-controller.ts +671 -0
- package/src/modes/controllers/mcp-command-controller.ts +1315 -0
- package/src/modes/controllers/selector-controller.ts +712 -0
- package/src/modes/controllers/ssh-command-controller.ts +452 -0
- package/src/modes/index.ts +15 -0
- package/src/modes/interactive-mode.ts +1027 -0
- package/src/modes/print-mode.ts +191 -0
- package/src/modes/rpc/rpc-client.ts +583 -0
- package/src/modes/rpc/rpc-mode.ts +700 -0
- package/src/modes/rpc/rpc-types.ts +236 -0
- package/src/modes/theme/dark.json +95 -0
- package/src/modes/theme/defaults/alabaster.json +93 -0
- package/src/modes/theme/defaults/amethyst.json +96 -0
- package/src/modes/theme/defaults/anthracite.json +93 -0
- package/src/modes/theme/defaults/basalt.json +91 -0
- package/src/modes/theme/defaults/birch.json +95 -0
- package/src/modes/theme/defaults/dark-abyss.json +91 -0
- package/src/modes/theme/defaults/dark-arctic.json +104 -0
- package/src/modes/theme/defaults/dark-aurora.json +95 -0
- package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
- package/src/modes/theme/defaults/dark-cavern.json +91 -0
- package/src/modes/theme/defaults/dark-copper.json +95 -0
- package/src/modes/theme/defaults/dark-cosmos.json +90 -0
- package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
- package/src/modes/theme/defaults/dark-dracula.json +98 -0
- package/src/modes/theme/defaults/dark-eclipse.json +91 -0
- package/src/modes/theme/defaults/dark-ember.json +95 -0
- package/src/modes/theme/defaults/dark-equinox.json +90 -0
- package/src/modes/theme/defaults/dark-forest.json +96 -0
- package/src/modes/theme/defaults/dark-github.json +105 -0
- package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
- package/src/modes/theme/defaults/dark-lavender.json +95 -0
- package/src/modes/theme/defaults/dark-lunar.json +89 -0
- package/src/modes/theme/defaults/dark-midnight.json +95 -0
- package/src/modes/theme/defaults/dark-monochrome.json +94 -0
- package/src/modes/theme/defaults/dark-monokai.json +98 -0
- package/src/modes/theme/defaults/dark-nebula.json +90 -0
- package/src/modes/theme/defaults/dark-nord.json +97 -0
- package/src/modes/theme/defaults/dark-ocean.json +101 -0
- package/src/modes/theme/defaults/dark-one.json +100 -0
- package/src/modes/theme/defaults/dark-rainforest.json +91 -0
- package/src/modes/theme/defaults/dark-reef.json +91 -0
- package/src/modes/theme/defaults/dark-retro.json +92 -0
- package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
- package/src/modes/theme/defaults/dark-sakura.json +95 -0
- package/src/modes/theme/defaults/dark-slate.json +95 -0
- package/src/modes/theme/defaults/dark-solarized.json +97 -0
- package/src/modes/theme/defaults/dark-solstice.json +90 -0
- package/src/modes/theme/defaults/dark-starfall.json +91 -0
- package/src/modes/theme/defaults/dark-sunset.json +99 -0
- package/src/modes/theme/defaults/dark-swamp.json +90 -0
- package/src/modes/theme/defaults/dark-synthwave.json +103 -0
- package/src/modes/theme/defaults/dark-taiga.json +91 -0
- package/src/modes/theme/defaults/dark-terminal.json +95 -0
- package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
- package/src/modes/theme/defaults/dark-tundra.json +91 -0
- package/src/modes/theme/defaults/dark-twilight.json +91 -0
- package/src/modes/theme/defaults/dark-volcanic.json +91 -0
- package/src/modes/theme/defaults/graphite.json +92 -0
- package/src/modes/theme/defaults/index.ts +195 -0
- package/src/modes/theme/defaults/light-arctic.json +107 -0
- package/src/modes/theme/defaults/light-aurora-day.json +91 -0
- package/src/modes/theme/defaults/light-canyon.json +91 -0
- package/src/modes/theme/defaults/light-catppuccin.json +106 -0
- package/src/modes/theme/defaults/light-cirrus.json +90 -0
- package/src/modes/theme/defaults/light-coral.json +95 -0
- package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
- package/src/modes/theme/defaults/light-dawn.json +90 -0
- package/src/modes/theme/defaults/light-dunes.json +91 -0
- package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
- package/src/modes/theme/defaults/light-forest.json +100 -0
- package/src/modes/theme/defaults/light-frost.json +95 -0
- package/src/modes/theme/defaults/light-github.json +115 -0
- package/src/modes/theme/defaults/light-glacier.json +91 -0
- package/src/modes/theme/defaults/light-gruvbox.json +108 -0
- package/src/modes/theme/defaults/light-haze.json +90 -0
- package/src/modes/theme/defaults/light-honeycomb.json +95 -0
- package/src/modes/theme/defaults/light-lagoon.json +91 -0
- package/src/modes/theme/defaults/light-lavender.json +95 -0
- package/src/modes/theme/defaults/light-meadow.json +91 -0
- package/src/modes/theme/defaults/light-mint.json +95 -0
- package/src/modes/theme/defaults/light-monochrome.json +101 -0
- package/src/modes/theme/defaults/light-ocean.json +99 -0
- package/src/modes/theme/defaults/light-one.json +99 -0
- package/src/modes/theme/defaults/light-opal.json +91 -0
- package/src/modes/theme/defaults/light-orchard.json +91 -0
- package/src/modes/theme/defaults/light-paper.json +95 -0
- package/src/modes/theme/defaults/light-prism.json +90 -0
- package/src/modes/theme/defaults/light-retro.json +98 -0
- package/src/modes/theme/defaults/light-sand.json +95 -0
- package/src/modes/theme/defaults/light-savanna.json +91 -0
- package/src/modes/theme/defaults/light-solarized.json +102 -0
- package/src/modes/theme/defaults/light-soleil.json +90 -0
- package/src/modes/theme/defaults/light-sunset.json +99 -0
- package/src/modes/theme/defaults/light-synthwave.json +98 -0
- package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
- package/src/modes/theme/defaults/light-wetland.json +91 -0
- package/src/modes/theme/defaults/light-zenith.json +89 -0
- package/src/modes/theme/defaults/limestone.json +94 -0
- package/src/modes/theme/defaults/mahogany.json +97 -0
- package/src/modes/theme/defaults/marble.json +93 -0
- package/src/modes/theme/defaults/obsidian.json +91 -0
- package/src/modes/theme/defaults/onyx.json +91 -0
- package/src/modes/theme/defaults/pearl.json +93 -0
- package/src/modes/theme/defaults/porcelain.json +91 -0
- package/src/modes/theme/defaults/quartz.json +96 -0
- package/src/modes/theme/defaults/sandstone.json +95 -0
- package/src/modes/theme/defaults/titanium.json +90 -0
- package/src/modes/theme/light.json +93 -0
- package/src/modes/theme/mermaid-cache.ts +111 -0
- package/src/modes/theme/theme-schema.json +429 -0
- package/src/modes/theme/theme.ts +2333 -0
- package/src/modes/types.ts +216 -0
- package/src/modes/utils/ui-helpers.ts +529 -0
- package/src/patch/applicator.ts +1482 -0
- package/src/patch/diff.ts +425 -0
- package/src/patch/fuzzy.ts +784 -0
- package/src/patch/hashline.ts +972 -0
- package/src/patch/index.ts +964 -0
- package/src/patch/normalize.ts +397 -0
- package/src/patch/normative.ts +72 -0
- package/src/patch/parser.ts +532 -0
- package/src/patch/shared.ts +400 -0
- package/src/patch/types.ts +292 -0
- package/src/priority.json +35 -0
- package/src/prompts/agents/explore.md +48 -0
- package/src/prompts/agents/frontmatter.md +9 -0
- package/src/prompts/agents/init.md +36 -0
- package/src/prompts/agents/librarian.md +53 -0
- package/src/prompts/agents/oracle.md +51 -0
- package/src/prompts/agents/reviewer.md +70 -0
- package/src/prompts/agents/task.md +14 -0
- package/src/prompts/compaction/branch-summary-context.md +5 -0
- package/src/prompts/compaction/branch-summary-preamble.md +2 -0
- package/src/prompts/compaction/branch-summary.md +30 -0
- package/src/prompts/compaction/compaction-short-summary.md +9 -0
- package/src/prompts/compaction/compaction-summary-context.md +5 -0
- package/src/prompts/compaction/compaction-summary.md +38 -0
- package/src/prompts/compaction/compaction-turn-prefix.md +17 -0
- package/src/prompts/compaction/compaction-update-summary.md +45 -0
- package/src/prompts/memories/consolidation.md +30 -0
- package/src/prompts/memories/read_path.md +11 -0
- package/src/prompts/memories/stage_one_input.md +6 -0
- package/src/prompts/memories/stage_one_system.md +21 -0
- package/src/prompts/review-request.md +64 -0
- package/src/prompts/system/agent-creation-architect.md +65 -0
- package/src/prompts/system/agent-creation-user.md +6 -0
- package/src/prompts/system/custom-system-prompt.md +68 -0
- package/src/prompts/system/file-operations.md +10 -0
- package/src/prompts/system/subagent-submit-reminder.md +11 -0
- package/src/prompts/system/subagent-system-prompt.md +31 -0
- package/src/prompts/system/subagent-user-prompt.md +8 -0
- package/src/prompts/system/summarization-system.md +3 -0
- package/src/prompts/system/system-prompt.md +300 -0
- package/src/prompts/system/title-system.md +2 -0
- package/src/prompts/system/ttsr-interrupt.md +7 -0
- package/src/prompts/system/web-search.md +28 -0
- package/src/prompts/tools/ask.md +44 -0
- package/src/prompts/tools/bash.md +24 -0
- package/src/prompts/tools/browser.md +33 -0
- package/src/prompts/tools/calculator.md +12 -0
- package/src/prompts/tools/explore.md +29 -0
- package/src/prompts/tools/fetch.md +16 -0
- package/src/prompts/tools/find.md +18 -0
- package/src/prompts/tools/gemini-image.md +23 -0
- package/src/prompts/tools/grep.md +28 -0
- package/src/prompts/tools/hashline.md +232 -0
- package/src/prompts/tools/librarian.md +24 -0
- package/src/prompts/tools/lsp.md +28 -0
- package/src/prompts/tools/oracle.md +26 -0
- package/src/prompts/tools/patch.md +74 -0
- package/src/prompts/tools/python.md +66 -0
- package/src/prompts/tools/read.md +36 -0
- package/src/prompts/tools/replace.md +38 -0
- package/src/prompts/tools/reviewer.md +41 -0
- package/src/prompts/tools/ssh.md +51 -0
- package/src/prompts/tools/task-summary.md +28 -0
- package/src/prompts/tools/task.md +275 -0
- package/src/prompts/tools/todo-write.md +65 -0
- package/src/prompts/tools/undo-edit.md +7 -0
- package/src/prompts/tools/web-search.md +19 -0
- package/src/prompts/tools/write.md +18 -0
- package/src/sdk.ts +1287 -0
- package/src/secrets/index.ts +116 -0
- package/src/secrets/obfuscator.ts +269 -0
- package/src/secrets/regex.ts +21 -0
- package/src/session/agent-session.ts +4669 -0
- package/src/session/agent-storage.ts +621 -0
- package/src/session/artifacts.ts +132 -0
- package/src/session/auth-storage.ts +1433 -0
- package/src/session/blob-store.ts +103 -0
- package/src/session/compaction/branch-summarization.ts +315 -0
- package/src/session/compaction/compaction.ts +864 -0
- package/src/session/compaction/index.ts +7 -0
- package/src/session/compaction/pruning.ts +91 -0
- package/src/session/compaction/utils.ts +171 -0
- package/src/session/history-storage.ts +170 -0
- package/src/session/messages.ts +317 -0
- package/src/session/session-manager.ts +2276 -0
- package/src/session/session-storage.ts +342 -0
- package/src/session/streaming-output.ts +565 -0
- package/src/slash-commands/builtin-registry.ts +439 -0
- package/src/ssh/config-writer.ts +183 -0
- package/src/ssh/connection-manager.ts +444 -0
- package/src/ssh/ssh-executor.ts +127 -0
- package/src/ssh/sshfs-mount.ts +135 -0
- package/src/stt/downloader.ts +71 -0
- package/src/stt/index.ts +3 -0
- package/src/stt/recorder.ts +351 -0
- package/src/stt/setup.ts +52 -0
- package/src/stt/stt-controller.ts +160 -0
- package/src/stt/transcribe.py +70 -0
- package/src/stt/transcriber.ts +91 -0
- package/src/system-prompt.ts +685 -0
- package/src/task/agents.ts +155 -0
- package/src/task/batch.ts +102 -0
- package/src/task/commands.ts +134 -0
- package/src/task/discovery.ts +126 -0
- package/src/task/executor.ts +908 -0
- package/src/task/index.ts +223 -0
- package/src/task/output-manager.ts +107 -0
- package/src/task/parallel.ts +84 -0
- package/src/task/render.ts +326 -0
- package/src/task/subprocess-tool-registry.ts +88 -0
- package/src/task/template.ts +32 -0
- package/src/task/types.ts +144 -0
- package/src/tools/ask.ts +523 -0
- package/src/tools/bash-interactive.ts +419 -0
- package/src/tools/bash-interceptor.ts +105 -0
- package/src/tools/bash-normalize.ts +107 -0
- package/src/tools/bash-skill-urls.ts +177 -0
- package/src/tools/bash.ts +347 -0
- package/src/tools/browser.ts +1374 -0
- package/src/tools/calculator.ts +537 -0
- package/src/tools/context.ts +39 -0
- package/src/tools/explore.ts +23 -0
- package/src/tools/fetch.ts +1091 -0
- package/src/tools/find.ts +540 -0
- package/src/tools/fs-cache-invalidation.ts +28 -0
- package/src/tools/gemini-image.ts +907 -0
- package/src/tools/grep.ts +489 -0
- package/src/tools/index.ts +337 -0
- package/src/tools/json-tree.ts +231 -0
- package/src/tools/jtd-to-json-schema.ts +247 -0
- package/src/tools/jtd-to-typescript.ts +198 -0
- package/src/tools/librarian.ts +33 -0
- package/src/tools/list-limit.ts +40 -0
- package/src/tools/notebook.ts +287 -0
- package/src/tools/oracle.ts +40 -0
- package/src/tools/output-meta.ts +459 -0
- package/src/tools/output-utils.ts +63 -0
- package/src/tools/path-utils.ts +116 -0
- package/src/tools/puppeteer/00_stealth_tampering.txt +63 -0
- package/src/tools/puppeteer/01_stealth_activity.txt +20 -0
- package/src/tools/puppeteer/02_stealth_hairline.txt +11 -0
- package/src/tools/puppeteer/03_stealth_botd.txt +384 -0
- package/src/tools/puppeteer/04_stealth_iframe.txt +81 -0
- package/src/tools/puppeteer/05_stealth_webgl.txt +75 -0
- package/src/tools/puppeteer/06_stealth_screen.txt +72 -0
- package/src/tools/puppeteer/07_stealth_fonts.txt +97 -0
- package/src/tools/puppeteer/08_stealth_audio.txt +51 -0
- package/src/tools/puppeteer/09_stealth_locale.txt +46 -0
- package/src/tools/puppeteer/10_stealth_plugins.txt +206 -0
- package/src/tools/puppeteer/11_stealth_hardware.txt +8 -0
- package/src/tools/puppeteer/12_stealth_codecs.txt +40 -0
- package/src/tools/puppeteer/13_stealth_worker.txt +74 -0
- package/src/tools/python.ts +1118 -0
- package/src/tools/read.ts +1193 -0
- package/src/tools/render-utils.ts +680 -0
- package/src/tools/renderers.ts +60 -0
- package/src/tools/reviewer-tool.ts +41 -0
- package/src/tools/ssh.ts +326 -0
- package/src/tools/subagent-tool.ts +169 -0
- package/src/tools/submit-result.ts +152 -0
- package/src/tools/todo-write.ts +255 -0
- package/src/tools/tool-errors.ts +92 -0
- package/src/tools/tool-result.ts +86 -0
- package/src/tools/undo-edit.ts +145 -0
- package/src/tools/undo-history.ts +22 -0
- package/src/tools/write.ts +274 -0
- package/src/tui/code-cell.ts +108 -0
- package/src/tui/file-list.ts +47 -0
- package/src/tui/index.ts +11 -0
- package/src/tui/output-block.ts +144 -0
- package/src/tui/status-line.ts +39 -0
- package/src/tui/tree-list.ts +53 -0
- package/src/tui/types.ts +16 -0
- package/src/tui/utils.ts +116 -0
- package/src/utils/changelog.ts +98 -0
- package/src/utils/event-bus.ts +33 -0
- package/src/utils/external-editor.ts +59 -0
- package/src/utils/file-display-mode.ts +36 -0
- package/src/utils/file-mentions.ts +384 -0
- package/src/utils/frontmatter.ts +101 -0
- package/src/utils/fuzzy.ts +108 -0
- package/src/utils/ignore-files.ts +119 -0
- package/src/utils/image-convert.ts +27 -0
- package/src/utils/image-resize.ts +236 -0
- package/src/utils/mime.ts +30 -0
- package/src/utils/open.ts +20 -0
- package/src/utils/shell-snapshot.ts +199 -0
- package/src/utils/timings.ts +26 -0
- package/src/utils/title-generator.ts +167 -0
- package/src/utils/tools-manager.ts +362 -0
- package/src/web/scrapers/artifacthub.ts +215 -0
- package/src/web/scrapers/arxiv.ts +88 -0
- package/src/web/scrapers/aur.ts +175 -0
- package/src/web/scrapers/biorxiv.ts +141 -0
- package/src/web/scrapers/bluesky.ts +284 -0
- package/src/web/scrapers/brew.ts +177 -0
- package/src/web/scrapers/cheatsh.ts +78 -0
- package/src/web/scrapers/chocolatey.ts +158 -0
- package/src/web/scrapers/choosealicense.ts +110 -0
- package/src/web/scrapers/cisa-kev.ts +100 -0
- package/src/web/scrapers/clojars.ts +180 -0
- package/src/web/scrapers/coingecko.ts +184 -0
- package/src/web/scrapers/crates-io.ts +128 -0
- package/src/web/scrapers/crossref.ts +149 -0
- package/src/web/scrapers/devto.ts +177 -0
- package/src/web/scrapers/discogs.ts +307 -0
- package/src/web/scrapers/discourse.ts +221 -0
- package/src/web/scrapers/dockerhub.ts +160 -0
- package/src/web/scrapers/fdroid.ts +158 -0
- package/src/web/scrapers/firefox-addons.ts +214 -0
- package/src/web/scrapers/flathub.ts +239 -0
- package/src/web/scrapers/github-gist.ts +68 -0
- package/src/web/scrapers/github.ts +490 -0
- package/src/web/scrapers/gitlab.ts +456 -0
- package/src/web/scrapers/go-pkg.ts +275 -0
- package/src/web/scrapers/hackage.ts +94 -0
- package/src/web/scrapers/hackernews.ts +208 -0
- package/src/web/scrapers/hex.ts +121 -0
- package/src/web/scrapers/huggingface.ts +385 -0
- package/src/web/scrapers/iacr.ts +86 -0
- package/src/web/scrapers/index.ts +249 -0
- package/src/web/scrapers/jetbrains-marketplace.ts +169 -0
- package/src/web/scrapers/lemmy.ts +220 -0
- package/src/web/scrapers/lobsters.ts +186 -0
- package/src/web/scrapers/mastodon.ts +310 -0
- package/src/web/scrapers/maven.ts +152 -0
- package/src/web/scrapers/mdn.ts +172 -0
- package/src/web/scrapers/metacpan.ts +253 -0
- package/src/web/scrapers/musicbrainz.ts +272 -0
- package/src/web/scrapers/npm.ts +114 -0
- package/src/web/scrapers/nuget.ts +205 -0
- package/src/web/scrapers/nvd.ts +243 -0
- package/src/web/scrapers/ollama.ts +265 -0
- package/src/web/scrapers/open-vsx.ts +119 -0
- package/src/web/scrapers/opencorporates.ts +275 -0
- package/src/web/scrapers/openlibrary.ts +319 -0
- package/src/web/scrapers/orcid.ts +298 -0
- package/src/web/scrapers/osv.ts +192 -0
- package/src/web/scrapers/packagist.ts +174 -0
- package/src/web/scrapers/pub-dev.ts +185 -0
- package/src/web/scrapers/pubmed.ts +177 -0
- package/src/web/scrapers/pypi.ts +129 -0
- package/src/web/scrapers/rawg.ts +124 -0
- package/src/web/scrapers/readthedocs.ts +125 -0
- package/src/web/scrapers/reddit.ts +104 -0
- package/src/web/scrapers/repology.ts +262 -0
- package/src/web/scrapers/rfc.ts +209 -0
- package/src/web/scrapers/rubygems.ts +117 -0
- package/src/web/scrapers/searchcode.ts +217 -0
- package/src/web/scrapers/sec-edgar.ts +274 -0
- package/src/web/scrapers/semantic-scholar.ts +190 -0
- package/src/web/scrapers/snapcraft.ts +200 -0
- package/src/web/scrapers/sourcegraph.ts +373 -0
- package/src/web/scrapers/spdx.ts +121 -0
- package/src/web/scrapers/spotify.ts +217 -0
- package/src/web/scrapers/stackoverflow.ts +124 -0
- package/src/web/scrapers/terraform.ts +304 -0
- package/src/web/scrapers/tldr.ts +51 -0
- package/src/web/scrapers/twitter.ts +97 -0
- package/src/web/scrapers/types.ts +200 -0
- package/src/web/scrapers/utils.ts +142 -0
- package/src/web/scrapers/vimeo.ts +152 -0
- package/src/web/scrapers/vscode-marketplace.ts +195 -0
- package/src/web/scrapers/w3c.ts +163 -0
- package/src/web/scrapers/wikidata.ts +357 -0
- package/src/web/scrapers/wikipedia.ts +95 -0
- package/src/web/scrapers/youtube.ts +312 -0
- package/src/web/search/auth.ts +178 -0
- package/src/web/search/index.ts +598 -0
- package/src/web/search/provider.ts +77 -0
- package/src/web/search/providers/anthropic.ts +284 -0
- package/src/web/search/providers/base.ts +22 -0
- package/src/web/search/providers/brave.ts +165 -0
- package/src/web/search/providers/codex.ts +377 -0
- package/src/web/search/providers/exa.ts +158 -0
- package/src/web/search/providers/gemini.ts +437 -0
- package/src/web/search/providers/jina.ts +99 -0
- package/src/web/search/providers/kimi.ts +196 -0
- package/src/web/search/providers/perplexity.ts +546 -0
- package/src/web/search/providers/synthetic.ts +136 -0
- package/src/web/search/providers/zai.ts +352 -0
- package/src/web/search/render.ts +299 -0
- package/src/web/search/types.ts +437 -0
package/CHANGELOG.md
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# @nghyane/arcane
|
|
2
|
+
|
|
3
|
+
Core implementation package for the \`arc\` coding agent in the `arcane` monorepo.
|
|
4
|
+
|
|
5
|
+
For installation, setup, provider configuration, model roles, slash commands, and full CLI reference, see:
|
|
6
|
+
- [Monorepo README (local)](../../README.md)
|
|
7
|
+
- [Monorepo README (GitHub)](https://github.com/nghyane/arcane#readme)
|
|
8
|
+
|
|
9
|
+
Package-specific references:
|
|
10
|
+
- [CHANGELOG](./CHANGELOG.md)
|
|
11
|
+
- [Documentation](./docs/)
|
|
12
|
+
- [DEVELOPMENT](./DEVELOPMENT.md)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Examples
|
|
2
|
+
|
|
3
|
+
Example code for arc-coding-agent SDK, hooks, and custom tools.
|
|
4
|
+
|
|
5
|
+
## Directories
|
|
6
|
+
|
|
7
|
+
### [sdk/](sdk/)
|
|
8
|
+
Programmatic usage via `createAgentSession()`. Shows how to customize models, prompts, tools, hooks, and session management.
|
|
9
|
+
|
|
10
|
+
### [hooks/](hooks/)
|
|
11
|
+
Example hooks for intercepting tool calls, adding safety gates, and integrating with external systems.
|
|
12
|
+
|
|
13
|
+
### [custom-tools/](custom-tools/)
|
|
14
|
+
Example custom tools that extend the agent's capabilities.
|
|
15
|
+
|
|
16
|
+
## Documentation
|
|
17
|
+
|
|
18
|
+
- [SDK Reference](sdk/README.md)
|
|
19
|
+
- [Hooks Documentation](../docs/hooks.md)
|
|
20
|
+
- [Custom Tools Documentation](../docs/custom-tools.md)
|
|
21
|
+
- [Skills Documentation](../docs/skills.md)
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Custom Tools Examples
|
|
2
|
+
|
|
3
|
+
Example custom tools for arc-coding-agent.
|
|
4
|
+
|
|
5
|
+
## Examples
|
|
6
|
+
|
|
7
|
+
Each example uses the `subdirectory/index.ts` structure required for tool discovery.
|
|
8
|
+
|
|
9
|
+
### hello/
|
|
10
|
+
|
|
11
|
+
Minimal example showing the basic structure of a custom tool.
|
|
12
|
+
|
|
13
|
+
### todo/
|
|
14
|
+
|
|
15
|
+
Full-featured example demonstrating:
|
|
16
|
+
|
|
17
|
+
- `onSession` for state reconstruction from session history
|
|
18
|
+
- Custom `renderCall` and `renderResult`
|
|
19
|
+
- Proper branching support via details storage
|
|
20
|
+
- State management without external files
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Test directly (can point to any .ts file)
|
|
26
|
+
arc --tool examples/custom-tools/todo/index.ts
|
|
27
|
+
|
|
28
|
+
# Or copy entire folder to tools directory for persistent use
|
|
29
|
+
cp -r todo ~/.arcane/agent/tools/
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Then in arc:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
> add a todo "test custom tools"
|
|
36
|
+
> list todos
|
|
37
|
+
> toggle todo #1
|
|
38
|
+
> clear todos
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Writing Custom Tools
|
|
42
|
+
|
|
43
|
+
See [docs/custom-tools.md](../../docs/custom-tools.md) for full documentation.
|
|
44
|
+
|
|
45
|
+
### Key Points
|
|
46
|
+
|
|
47
|
+
**Factory pattern:**
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { Type } from "@sinclair/typebox";
|
|
51
|
+
import { StringEnum } from "@nghyane/arcane-ai";
|
|
52
|
+
import { Text } from "@nghyane/arcane-tui";
|
|
53
|
+
import type { CustomToolFactory } from "@nghyane/arcane";
|
|
54
|
+
|
|
55
|
+
const factory: CustomToolFactory = (pi) => ({
|
|
56
|
+
name: "my_tool",
|
|
57
|
+
label: "My Tool",
|
|
58
|
+
description: "Tool description for LLM",
|
|
59
|
+
parameters: Type.Object({
|
|
60
|
+
action: StringEnum(["list", "add"] as const),
|
|
61
|
+
}),
|
|
62
|
+
|
|
63
|
+
// Called on session start/switch/branch/clear
|
|
64
|
+
onSession(event) {
|
|
65
|
+
// Reconstruct state from event.entries
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
async execute(toolCallId, params) {
|
|
69
|
+
return {
|
|
70
|
+
content: [{ type: "text", text: "Result" }],
|
|
71
|
+
details: {
|
|
72
|
+
/* for rendering and state reconstruction */
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
export default factory;
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Custom rendering:**
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
renderCall(args, theme) {
|
|
85
|
+
return new Text(
|
|
86
|
+
theme.fg("toolTitle", theme.bold("my_tool ")) + args.action,
|
|
87
|
+
0, 0 // No padding - Box handles it
|
|
88
|
+
);
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
renderResult(result, { expanded, isPartial }, theme) {
|
|
92
|
+
if (isPartial) {
|
|
93
|
+
return new Text(theme.fg("warning", "Working..."), 0, 0);
|
|
94
|
+
}
|
|
95
|
+
return new Text(theme.fg("success", "✓ Done"), 0, 0);
|
|
96
|
+
},
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Use StringEnum for string parameters** (required for Google API compatibility):
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { StringEnum } from "@nghyane/arcane-ai";
|
|
103
|
+
|
|
104
|
+
// Good
|
|
105
|
+
action: StringEnum(["list", "add"] as const);
|
|
106
|
+
|
|
107
|
+
// Bad - doesn't work with Google
|
|
108
|
+
action: Type.Union([Type.Literal("list"), Type.Literal("add")]);
|
|
109
|
+
```
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CustomToolFactory } from "@nghyane/arcane";
|
|
2
|
+
|
|
3
|
+
const factory: CustomToolFactory = pi => ({
|
|
4
|
+
name: "hello",
|
|
5
|
+
label: "Hello",
|
|
6
|
+
description: "A simple greeting tool",
|
|
7
|
+
parameters: pi.typebox.Type.Object({
|
|
8
|
+
name: pi.typebox.Type.String({ description: "Name to greet" }),
|
|
9
|
+
}),
|
|
10
|
+
|
|
11
|
+
async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
|
|
12
|
+
const { name } = params;
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: "text", text: `Hello, ${name}!` }],
|
|
15
|
+
details: { greeted: name },
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export default factory;
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Todo Tool - Demonstrates state management via session entries
|
|
3
|
+
*
|
|
4
|
+
* This tool stores state in tool result details (not external files),
|
|
5
|
+
* which allows proper branching - when you branch, the todo state
|
|
6
|
+
* is automatically correct for that point in history.
|
|
7
|
+
*
|
|
8
|
+
* The onSession callback reconstructs state by scanning past tool results.
|
|
9
|
+
*/
|
|
10
|
+
import type { CustomTool, CustomToolContext, CustomToolFactory, CustomToolSessionEvent } from "@nghyane/arcane";
|
|
11
|
+
|
|
12
|
+
interface Todo {
|
|
13
|
+
id: number;
|
|
14
|
+
text: string;
|
|
15
|
+
done: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// State stored in tool result details
|
|
19
|
+
interface TodoDetails {
|
|
20
|
+
action: "list" | "add" | "toggle" | "clear";
|
|
21
|
+
todos: Todo[];
|
|
22
|
+
nextId: number;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const factory: CustomToolFactory = pi => {
|
|
27
|
+
const { Type } = pi.typebox;
|
|
28
|
+
const { StringEnum, Text } = pi.pi;
|
|
29
|
+
|
|
30
|
+
// Define schema separately for proper type inference
|
|
31
|
+
const TodoParams = Type.Object({
|
|
32
|
+
action: StringEnum(["list", "add", "toggle", "clear"] as const),
|
|
33
|
+
text: Type.Optional(Type.String({ description: "Todo text (for add)" })),
|
|
34
|
+
id: Type.Optional(Type.Number({ description: "Todo ID (for toggle)" })),
|
|
35
|
+
});
|
|
36
|
+
// In-memory state (reconstructed from session on load)
|
|
37
|
+
let todos: Todo[] = [];
|
|
38
|
+
let nextId = 1;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Reconstruct state from session entries.
|
|
42
|
+
* Scans tool results for this tool and applies them in order.
|
|
43
|
+
*/
|
|
44
|
+
const reconstructState = (_event: CustomToolSessionEvent, ctx: CustomToolContext) => {
|
|
45
|
+
todos = [];
|
|
46
|
+
nextId = 1;
|
|
47
|
+
|
|
48
|
+
// Use getBranch() to get entries on the current branch
|
|
49
|
+
for (const entry of ctx.sessionManager.getBranch()) {
|
|
50
|
+
if (entry.type !== "message") continue;
|
|
51
|
+
const msg = entry.message;
|
|
52
|
+
|
|
53
|
+
// Tool results have role "toolResult"
|
|
54
|
+
if (msg.role !== "toolResult") continue;
|
|
55
|
+
if (msg.toolName !== "todo") continue;
|
|
56
|
+
|
|
57
|
+
const details = msg.details as TodoDetails | undefined;
|
|
58
|
+
if (details) {
|
|
59
|
+
todos = details.todos;
|
|
60
|
+
nextId = details.nextId;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const tool: CustomTool<typeof TodoParams, TodoDetails> = {
|
|
66
|
+
name: "todo",
|
|
67
|
+
label: "Todo",
|
|
68
|
+
description: "Manage a todo list. Actions: list, add (text), toggle (id), clear",
|
|
69
|
+
parameters: TodoParams,
|
|
70
|
+
|
|
71
|
+
// Called on session start/switch/branch/clear
|
|
72
|
+
onSession: reconstructState,
|
|
73
|
+
|
|
74
|
+
async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
|
|
75
|
+
switch (params.action) {
|
|
76
|
+
case "list":
|
|
77
|
+
return {
|
|
78
|
+
content: [
|
|
79
|
+
{
|
|
80
|
+
type: "text",
|
|
81
|
+
text: todos.length
|
|
82
|
+
? todos.map(t => `[${t.done ? "x" : " "}] #${t.id}: ${t.text}`).join("\n")
|
|
83
|
+
: "No todos",
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
details: { action: "list", todos: [...todos], nextId },
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
case "add": {
|
|
90
|
+
if (!params.text) {
|
|
91
|
+
return {
|
|
92
|
+
content: [{ type: "text", text: "Error: text required for add" }],
|
|
93
|
+
details: { action: "add", todos: [...todos], nextId, error: "text required" },
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const newTodo: Todo = { id: nextId++, text: params.text, done: false };
|
|
97
|
+
todos.push(newTodo);
|
|
98
|
+
return {
|
|
99
|
+
content: [{ type: "text", text: `Added todo #${newTodo.id}: ${newTodo.text}` }],
|
|
100
|
+
details: { action: "add", todos: [...todos], nextId },
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
case "toggle": {
|
|
105
|
+
if (params.id === undefined) {
|
|
106
|
+
return {
|
|
107
|
+
content: [{ type: "text", text: "Error: id required for toggle" }],
|
|
108
|
+
details: { action: "toggle", todos: [...todos], nextId, error: "id required" },
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const todo = todos.find(t => t.id === params.id);
|
|
112
|
+
if (!todo) {
|
|
113
|
+
return {
|
|
114
|
+
content: [{ type: "text", text: `Todo #${params.id} not found` }],
|
|
115
|
+
details: { action: "toggle", todos: [...todos], nextId, error: `#${params.id} not found` },
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
todo.done = !todo.done;
|
|
119
|
+
return {
|
|
120
|
+
content: [{ type: "text", text: `Todo #${todo.id} ${todo.done ? "completed" : "uncompleted"}` }],
|
|
121
|
+
details: { action: "toggle", todos: [...todos], nextId },
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
case "clear": {
|
|
126
|
+
const count = todos.length;
|
|
127
|
+
todos = [];
|
|
128
|
+
nextId = 1;
|
|
129
|
+
return {
|
|
130
|
+
content: [{ type: "text", text: `Cleared ${count} todos` }],
|
|
131
|
+
details: { action: "clear", todos: [], nextId: 1 },
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
default:
|
|
136
|
+
return {
|
|
137
|
+
content: [{ type: "text", text: `Unknown action: ${params.action}` }],
|
|
138
|
+
details: { action: "list", todos: [...todos], nextId, error: `unknown action: ${params.action}` },
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
renderCall(args, theme) {
|
|
144
|
+
let text = theme.fg("toolTitle", theme.bold("todo ")) + theme.fg("muted", String(args.action));
|
|
145
|
+
if (args.text) text += ` ${theme.fg("dim", `"${args.text}"`)}`;
|
|
146
|
+
if (args.id !== undefined) text += ` ${theme.fg("accent", `#${args.id}`)}`;
|
|
147
|
+
return new Text(text, 0, 0);
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
renderResult(result, { expanded }, theme) {
|
|
151
|
+
const { details } = result;
|
|
152
|
+
if (!details) {
|
|
153
|
+
const text = result.content[0];
|
|
154
|
+
return new Text(text?.type === "text" ? text.text : "", 0, 0);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Error
|
|
158
|
+
if (details.error) {
|
|
159
|
+
return new Text(theme.fg("error", `Error: ${details.error}`), 0, 0);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const todoList = details.todos;
|
|
163
|
+
|
|
164
|
+
switch (details.action) {
|
|
165
|
+
case "list": {
|
|
166
|
+
if (todoList.length === 0) {
|
|
167
|
+
return new Text(theme.fg("dim", "No todos"), 0, 0);
|
|
168
|
+
}
|
|
169
|
+
let listText = theme.fg("muted", `${todoList.length} todo(s):`);
|
|
170
|
+
const display = expanded ? todoList : todoList.slice(0, 5);
|
|
171
|
+
for (const t of display) {
|
|
172
|
+
const check = t.done ? theme.fg("success", "✓") : theme.fg("dim", "○");
|
|
173
|
+
const itemText = t.done ? theme.fg("dim", t.text) : theme.fg("muted", t.text);
|
|
174
|
+
listText += `\n${check} ${theme.fg("accent", `#${t.id}`)} ${itemText}`;
|
|
175
|
+
}
|
|
176
|
+
if (!expanded && todoList.length > 5) {
|
|
177
|
+
listText += `\n${theme.fg("dim", `... ${todoList.length - 5} more`)}`;
|
|
178
|
+
}
|
|
179
|
+
return new Text(listText, 0, 0);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
case "add": {
|
|
183
|
+
const added = todoList[todoList.length - 1];
|
|
184
|
+
return new Text(
|
|
185
|
+
`${theme.fg("success", "✓ Added ") + theme.fg("accent", `#${added.id}`)} ${theme.fg("muted", added.text)}`,
|
|
186
|
+
0,
|
|
187
|
+
0,
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
case "toggle": {
|
|
192
|
+
const text = result.content[0];
|
|
193
|
+
const msg = text?.type === "text" ? text.text : "";
|
|
194
|
+
return new Text(theme.fg("success", "✓ ") + theme.fg("muted", msg), 0, 0);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
case "clear":
|
|
198
|
+
return new Text(theme.fg("success", "✓ ") + theme.fg("muted", "Cleared all todos"), 0, 0);
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
return tool;
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
export default factory;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Extension Examples
|
|
2
|
+
|
|
3
|
+
Example extensions for pi-coding-agent.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Load an extension with --extension flag
|
|
9
|
+
pi --extension examples/extensions/permission-gate.ts
|
|
10
|
+
|
|
11
|
+
# Or copy to extensions directory for auto-discovery
|
|
12
|
+
cp permission-gate.ts ~/.arcane/agent/extensions/
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Examples
|
|
16
|
+
|
|
17
|
+
### Lifecycle & Safety
|
|
18
|
+
|
|
19
|
+
| Extension | Description |
|
|
20
|
+
| ------------------------ | ---------------------------------------------------------------------------- |
|
|
21
|
+
| `permission-gate.ts` | Prompts for confirmation before dangerous bash commands (rm -rf, sudo, etc.) |
|
|
22
|
+
| `protected-paths.ts` | Blocks writes to protected paths (.env, .git/, node_modules/) |
|
|
23
|
+
| `confirm-destructive.ts` | Confirms before destructive session actions (clear, switch, branch) |
|
|
24
|
+
| `dirty-repo-guard.ts` | Prevents session changes with uncommitted git changes |
|
|
25
|
+
|
|
26
|
+
### Custom Tools
|
|
27
|
+
|
|
28
|
+
| Extension | Description |
|
|
29
|
+
| ------------- | ----------------------------------------------------------------------------- |
|
|
30
|
+
| `todo.ts` | Todo list tool + `/todos` command with custom rendering and state persistence |
|
|
31
|
+
| `hello.ts` | Minimal custom tool example |
|
|
32
|
+
| `question.ts` | Demonstrates `ctx.ui.select()` for asking the user questions |
|
|
33
|
+
| `subagent/` | Delegate tasks to specialized subagents with isolated context windows |
|
|
34
|
+
|
|
35
|
+
### Commands & UI
|
|
36
|
+
|
|
37
|
+
| Extension | Description |
|
|
38
|
+
| ---------------- | ------------------------------------------------------------------------------ |
|
|
39
|
+
| `plan-mode.ts` | Claude Code-style plan mode for read-only exploration with `/plan` command |
|
|
40
|
+
| `tools.ts` | Interactive `/tools` command to enable/disable tools with session persistence |
|
|
41
|
+
| `handoff.ts` | Transfer context to a new focused session via `/handoff <goal>` |
|
|
42
|
+
| `qna.ts` | Extracts questions from last response into editor via `ctx.ui.setEditorText()` |
|
|
43
|
+
| `status-line.ts` | Shows turn progress in footer via `ctx.ui.setStatus()` with themed colors |
|
|
44
|
+
| `snake.ts` | Snake game with custom UI, keyboard handling, and session persistence |
|
|
45
|
+
|
|
46
|
+
### Git Integration
|
|
47
|
+
|
|
48
|
+
| Extension | Description |
|
|
49
|
+
| ------------------------ | ------------------------------------------------------------------------- |
|
|
50
|
+
| `git-checkpoint.ts` | Creates git stash checkpoints at each turn for code restoration on branch |
|
|
51
|
+
| `auto-commit-on-exit.ts` | Auto-commits on exit using last assistant message for commit message |
|
|
52
|
+
|
|
53
|
+
### System Prompt & Compaction
|
|
54
|
+
|
|
55
|
+
| Extension | Description |
|
|
56
|
+
| ---------------------- | --------------------------------------------------------------------- |
|
|
57
|
+
| `pirate.ts` | Demonstrates `systemPromptAppend` to dynamically modify system prompt |
|
|
58
|
+
| `custom-compaction.ts` | Custom compaction that summarizes entire conversation |
|
|
59
|
+
|
|
60
|
+
### External Dependencies
|
|
61
|
+
|
|
62
|
+
| Extension | Description |
|
|
63
|
+
| ----------------- | ------------------------------------------------------------------------- |
|
|
64
|
+
| `chalk-logger.ts` | Uses chalk from parent node_modules (demonstrates jiti module resolution) |
|
|
65
|
+
| `with-deps/` | Extension with its own package.json and dependencies |
|
|
66
|
+
| `file-trigger.ts` | Watches a trigger file and injects contents into conversation |
|
|
67
|
+
|
|
68
|
+
## Writing Extensions
|
|
69
|
+
|
|
70
|
+
See [docs/extensions.md](../../docs/extensions.md) for full documentation.
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
import type { ExtensionAPI } from "@nghyane/arcane";
|
|
74
|
+
import { Type } from "@sinclair/typebox";
|
|
75
|
+
|
|
76
|
+
export default function (pi: ExtensionAPI) {
|
|
77
|
+
// Subscribe to lifecycle events
|
|
78
|
+
pi.on("tool_call", async (event, ctx) => {
|
|
79
|
+
if (event.toolName === "bash" && event.input.command?.includes("rm -rf")) {
|
|
80
|
+
const ok = await ctx.ui.confirm("Dangerous!", "Allow rm -rf?");
|
|
81
|
+
if (!ok) return { block: true, reason: "Blocked by user" };
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Register custom tools
|
|
86
|
+
pi.registerTool({
|
|
87
|
+
name: "greet",
|
|
88
|
+
label: "Greeting",
|
|
89
|
+
description: "Generate a greeting",
|
|
90
|
+
parameters: Type.Object({
|
|
91
|
+
name: Type.String({ description: "Name to greet" }),
|
|
92
|
+
}),
|
|
93
|
+
async execute(toolCallId, params, onUpdate, ctx, signal) {
|
|
94
|
+
return {
|
|
95
|
+
content: [{ type: "text", text: `Hello, ${params.name}!` }],
|
|
96
|
+
details: {},
|
|
97
|
+
};
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Register commands
|
|
102
|
+
pi.registerCommand("hello", {
|
|
103
|
+
description: "Say hello",
|
|
104
|
+
handler: async (args, ctx) => {
|
|
105
|
+
ctx.ui.notify("Hello!", "info");
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Key Patterns
|
|
112
|
+
|
|
113
|
+
**Use StringEnum for string parameters** (required for Google API compatibility):
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
import { StringEnum } from "@nghyane/arcane-ai";
|
|
117
|
+
|
|
118
|
+
// Good
|
|
119
|
+
action: StringEnum(["list", "add"] as const);
|
|
120
|
+
|
|
121
|
+
// Bad - doesn't work with Google
|
|
122
|
+
action: Type.Union([Type.Literal("list"), Type.Literal("add")]);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**State persistence via details:**
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
// Store state in tool result details for proper branching support
|
|
129
|
+
return {
|
|
130
|
+
content: [{ type: "text", text: "Done" }],
|
|
131
|
+
details: { todos: [...todos], nextId }, // Persisted in session
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// Reconstruct on session events
|
|
135
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
136
|
+
for (const entry of ctx.sessionManager.getBranch()) {
|
|
137
|
+
if (entry.type === "message" && entry.message.toolName === "my_tool") {
|
|
138
|
+
const details = entry.message.details;
|
|
139
|
+
// Reconstruct state from details
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
```
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Demo Extension
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates using ExtensionAPI's logger, typebox, and pi module access.
|
|
5
|
+
* These features are now exposed directly on the ExtensionAPI, matching
|
|
6
|
+
* the CustomToolAPI interface.
|
|
7
|
+
*/
|
|
8
|
+
import type { ExtensionAPI } from "@nghyane/arcane";
|
|
9
|
+
|
|
10
|
+
export default function (pi: ExtensionAPI) {
|
|
11
|
+
// 1. Access TypeBox directly from pi.typebox (no separate import needed)
|
|
12
|
+
const { Type } = pi.typebox;
|
|
13
|
+
|
|
14
|
+
// 2. Access the logger for debugging
|
|
15
|
+
pi.logger.debug("API demo extension loaded");
|
|
16
|
+
|
|
17
|
+
// 3. Register a tool that uses all three API features
|
|
18
|
+
// Import StringEnum from typebox helpers
|
|
19
|
+
const { StringEnum } = pi.pi;
|
|
20
|
+
|
|
21
|
+
pi.registerTool({
|
|
22
|
+
name: "api_demo",
|
|
23
|
+
label: "API Demo",
|
|
24
|
+
description: "Demonstrates ExtensionAPI capabilities: logger, typebox, and pi module access",
|
|
25
|
+
parameters: Type.Object({
|
|
26
|
+
message: Type.String({ description: "Test message" }),
|
|
27
|
+
logLevel: Type.Optional(
|
|
28
|
+
StringEnum(["error", "warn", "debug"], {
|
|
29
|
+
description: "Log level to use",
|
|
30
|
+
default: "debug",
|
|
31
|
+
}),
|
|
32
|
+
),
|
|
33
|
+
}),
|
|
34
|
+
|
|
35
|
+
async execute(_toolCallId, params, _onUpdate, ctx, _signal) {
|
|
36
|
+
const { message, logLevel = "debug" } = params as { message: string; logLevel?: "error" | "warn" | "debug" };
|
|
37
|
+
|
|
38
|
+
// Use logger at specified level
|
|
39
|
+
pi.logger[logLevel]("API demo tool executed", { message, logLevel });
|
|
40
|
+
|
|
41
|
+
// Access pi module utilities
|
|
42
|
+
const { logger: piLogger } = pi.pi;
|
|
43
|
+
piLogger.debug("Accessed pi module from extension", { sessionFile: ctx.sessionManager.getSessionFile() });
|
|
44
|
+
|
|
45
|
+
// Get session information
|
|
46
|
+
const sessionInfo = `Session: ${ctx.sessionManager.getSessionFile()}`;
|
|
47
|
+
const modelInfo = ctx.model ? `Model: ${ctx.model.id}` : "Model: none";
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
content: [
|
|
51
|
+
{
|
|
52
|
+
type: "text",
|
|
53
|
+
text: [
|
|
54
|
+
`API Demo Tool executed successfully!`,
|
|
55
|
+
``,
|
|
56
|
+
`Message: ${message}`,
|
|
57
|
+
`Log Level: ${logLevel}`,
|
|
58
|
+
``,
|
|
59
|
+
`Features demonstrated:`,
|
|
60
|
+
`1. ✓ Logger access via pi.logger`,
|
|
61
|
+
`2. ✓ TypeBox access via pi.typebox`,
|
|
62
|
+
`3. ✓ Pi module access via pi.pi`,
|
|
63
|
+
``,
|
|
64
|
+
`Context:`,
|
|
65
|
+
`- ${sessionInfo}`,
|
|
66
|
+
`- ${modelInfo}`,
|
|
67
|
+
`- CWD: ${ctx.cwd}`,
|
|
68
|
+
].join("\n"),
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
details: {
|
|
72
|
+
message,
|
|
73
|
+
logLevel,
|
|
74
|
+
sessionFile: ctx.sessionManager.getSessionFile(),
|
|
75
|
+
modelId: ctx.model?.id,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Demonstrate event handling with logger
|
|
82
|
+
pi.on("session_start", async () => {
|
|
83
|
+
pi.logger.debug("Session started", { extension: "api-demo" });
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
pi.on("agent_start", async () => {
|
|
87
|
+
pi.logger.debug("Agent started", { extension: "api-demo" });
|
|
88
|
+
});
|
|
89
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example extension that uses a 3rd party dependency (chalk).
|
|
3
|
+
* Tests that jiti can resolve npm modules correctly.
|
|
4
|
+
*/
|
|
5
|
+
import type { ExtensionAPI } from "@nghyane/arcane";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
|
|
8
|
+
export default function (pi: ExtensionAPI) {
|
|
9
|
+
// Log with colors using chalk
|
|
10
|
+
console.log(`${chalk.green("✓")} ${chalk.bold("chalk-logger extension loaded")}`);
|
|
11
|
+
|
|
12
|
+
pi.on("agent_start", async () => {
|
|
13
|
+
console.log(`${chalk.blue("[chalk-logger]")} Agent starting`);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
pi.on("tool_call", async event => {
|
|
17
|
+
console.log(`${chalk.yellow("[chalk-logger]")} Tool: ${chalk.cyan(event.toolName)}`);
|
|
18
|
+
return undefined;
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
pi.on("agent_end", async event => {
|
|
22
|
+
const count = event.messages.length;
|
|
23
|
+
console.log(`${chalk.green("[chalk-logger]")} Done with ${chalk.bold(String(count))} messages`);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hello Tool - Minimal custom tool example
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates using ExtensionAPI's logger, typebox, and pi module access.
|
|
5
|
+
*/
|
|
6
|
+
import type { ExtensionAPI } from "@nghyane/arcane";
|
|
7
|
+
|
|
8
|
+
export default function (pi: ExtensionAPI) {
|
|
9
|
+
// Access TypeBox via pi.typebox (no need to import separately)
|
|
10
|
+
const { Type } = pi.typebox;
|
|
11
|
+
|
|
12
|
+
pi.registerTool({
|
|
13
|
+
name: "hello",
|
|
14
|
+
label: "Hello",
|
|
15
|
+
description: "A simple greeting tool",
|
|
16
|
+
parameters: Type.Object({
|
|
17
|
+
name: Type.String({ description: "Name to greet" }),
|
|
18
|
+
}),
|
|
19
|
+
|
|
20
|
+
async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
|
|
21
|
+
const { name } = params as { name: string };
|
|
22
|
+
|
|
23
|
+
// Use logger for debugging
|
|
24
|
+
pi.logger.debug("Hello tool executed", { name });
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
content: [{ type: "text", text: `Hello, ${name}!` }],
|
|
28
|
+
details: { greeted: name },
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
}
|