easc-cli 1.1.28
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/AGENTS.md +27 -0
- package/Dockerfile +18 -0
- package/README.md +15 -0
- package/bin/opencode +108 -0
- package/bunfig.toml +7 -0
- package/package.json +132 -0
- package/parsers-config.ts +253 -0
- package/script/build.ts +172 -0
- package/script/deploy.ts +64 -0
- package/script/postinstall.mjs +125 -0
- package/script/publish-registries.ts +187 -0
- package/script/publish.ts +70 -0
- package/script/schema.ts +47 -0
- package/script/seed-e2e.ts +50 -0
- package/src/acp/README.md +164 -0
- package/src/acp/agent.ts +1285 -0
- package/src/acp/session.ts +105 -0
- package/src/acp/types.ts +22 -0
- package/src/agent/agent.ts +332 -0
- package/src/agent/generate.txt +75 -0
- package/src/agent/prompt/compaction.txt +12 -0
- package/src/agent/prompt/explore.txt +18 -0
- package/src/agent/prompt/summary.txt +11 -0
- package/src/agent/prompt/title.txt +43 -0
- package/src/auth/eliseart.ts +76 -0
- package/src/auth/index.ts +73 -0
- package/src/bun/index.ts +134 -0
- package/src/bus/bus-event.ts +43 -0
- package/src/bus/global.ts +10 -0
- package/src/bus/index.ts +105 -0
- package/src/cli/bootstrap.ts +17 -0
- package/src/cli/cmd/account.ts +81 -0
- package/src/cli/cmd/acp.ts +69 -0
- package/src/cli/cmd/agent.ts +257 -0
- package/src/cli/cmd/auth.ts +427 -0
- package/src/cli/cmd/cmd.ts +7 -0
- package/src/cli/cmd/debug/agent.ts +166 -0
- package/src/cli/cmd/debug/config.ts +16 -0
- package/src/cli/cmd/debug/file.ts +97 -0
- package/src/cli/cmd/debug/index.ts +48 -0
- package/src/cli/cmd/debug/lsp.ts +52 -0
- package/src/cli/cmd/debug/ripgrep.ts +87 -0
- package/src/cli/cmd/debug/scrap.ts +16 -0
- package/src/cli/cmd/debug/skill.ts +16 -0
- package/src/cli/cmd/debug/snapshot.ts +52 -0
- package/src/cli/cmd/export.ts +88 -0
- package/src/cli/cmd/generate.ts +38 -0
- package/src/cli/cmd/github.ts +1548 -0
- package/src/cli/cmd/import.ts +98 -0
- package/src/cli/cmd/mcp.ts +827 -0
- package/src/cli/cmd/models.ts +77 -0
- package/src/cli/cmd/pr.ts +112 -0
- package/src/cli/cmd/run.ts +407 -0
- package/src/cli/cmd/serve.ts +20 -0
- package/src/cli/cmd/session.ts +135 -0
- package/src/cli/cmd/stats.ts +402 -0
- package/src/cli/cmd/tui/app.tsx +774 -0
- package/src/cli/cmd/tui/attach.ts +31 -0
- package/src/cli/cmd/tui/component/border.tsx +21 -0
- package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-command.tsx +148 -0
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
- package/src/cli/cmd/tui/component/dialog-model.tsx +234 -0
- package/src/cli/cmd/tui/component/dialog-provider.tsx +256 -0
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +114 -0
- package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
- package/src/cli/cmd/tui/component/dialog-status.tsx +164 -0
- package/src/cli/cmd/tui/component/dialog-supabase.tsx +102 -0
- package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
- package/src/cli/cmd/tui/component/logo.tsx +88 -0
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +653 -0
- package/src/cli/cmd/tui/component/prompt/frecency.tsx +89 -0
- package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
- package/src/cli/cmd/tui/component/prompt/index.tsx +1182 -0
- package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
- package/src/cli/cmd/tui/component/spinner.tsx +16 -0
- package/src/cli/cmd/tui/component/textarea-keybindings.ts +73 -0
- package/src/cli/cmd/tui/component/tips.tsx +153 -0
- package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
- package/src/cli/cmd/tui/context/args.tsx +14 -0
- package/src/cli/cmd/tui/context/directory.ts +13 -0
- package/src/cli/cmd/tui/context/exit.tsx +23 -0
- package/src/cli/cmd/tui/context/helper.tsx +25 -0
- package/src/cli/cmd/tui/context/keybind.tsx +101 -0
- package/src/cli/cmd/tui/context/kv.tsx +52 -0
- package/src/cli/cmd/tui/context/local.tsx +402 -0
- package/src/cli/cmd/tui/context/prompt.tsx +18 -0
- package/src/cli/cmd/tui/context/route.tsx +46 -0
- package/src/cli/cmd/tui/context/sdk.tsx +94 -0
- package/src/cli/cmd/tui/context/sync.tsx +445 -0
- package/src/cli/cmd/tui/context/theme/aura.json +69 -0
- package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
- package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
- package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
- package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
- package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
- package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
- package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
- package/src/cli/cmd/tui/context/theme/github.json +233 -0
- package/src/cli/cmd/tui/context/theme/gruvbox.json +95 -0
- package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +237 -0
- package/src/cli/cmd/tui/context/theme/material.json +235 -0
- package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
- package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
- package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
- package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
- package/src/cli/cmd/tui/context/theme/nord.json +223 -0
- package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
- package/src/cli/cmd/tui/context/theme/orng.json +249 -0
- package/src/cli/cmd/tui/context/theme/osaka-jade.json +93 -0
- package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
- package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
- package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
- package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
- package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
- package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
- package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
- package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
- package/src/cli/cmd/tui/context/theme.tsx +1152 -0
- package/src/cli/cmd/tui/event.ts +48 -0
- package/src/cli/cmd/tui/routes/home.tsx +140 -0
- package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +64 -0
- package/src/cli/cmd/tui/routes/session/dialog-message.tsx +109 -0
- package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
- package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
- package/src/cli/cmd/tui/routes/session/dialog-tool.tsx +63 -0
- package/src/cli/cmd/tui/routes/session/footer.tsx +129 -0
- package/src/cli/cmd/tui/routes/session/header.tsx +136 -0
- package/src/cli/cmd/tui/routes/session/index.tsx +2132 -0
- package/src/cli/cmd/tui/routes/session/permission.tsx +495 -0
- package/src/cli/cmd/tui/routes/session/question.tsx +435 -0
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +313 -0
- package/src/cli/cmd/tui/thread.ts +165 -0
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +57 -0
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
- package/src/cli/cmd/tui/ui/dialog-export-options.tsx +204 -0
- package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +77 -0
- package/src/cli/cmd/tui/ui/dialog-select.tsx +376 -0
- package/src/cli/cmd/tui/ui/dialog.tsx +167 -0
- package/src/cli/cmd/tui/ui/link.tsx +28 -0
- package/src/cli/cmd/tui/ui/spinner.ts +368 -0
- package/src/cli/cmd/tui/ui/toast.tsx +100 -0
- package/src/cli/cmd/tui/util/clipboard.ts +160 -0
- package/src/cli/cmd/tui/util/editor.ts +32 -0
- package/src/cli/cmd/tui/util/signal.ts +7 -0
- package/src/cli/cmd/tui/util/terminal.ts +114 -0
- package/src/cli/cmd/tui/util/transcript.ts +98 -0
- package/src/cli/cmd/tui/worker.ts +152 -0
- package/src/cli/cmd/uninstall.ts +357 -0
- package/src/cli/cmd/upgrade.ts +73 -0
- package/src/cli/cmd/web.ts +81 -0
- package/src/cli/error.ts +57 -0
- package/src/cli/network.ts +53 -0
- package/src/cli/ui.ts +84 -0
- package/src/cli/upgrade.ts +25 -0
- package/src/command/index.ts +131 -0
- package/src/command/template/initialize.txt +10 -0
- package/src/command/template/review.txt +99 -0
- package/src/config/config.ts +1361 -0
- package/src/config/markdown.ts +93 -0
- package/src/env/index.ts +26 -0
- package/src/file/ignore.ts +83 -0
- package/src/file/index.ts +411 -0
- package/src/file/ripgrep.ts +407 -0
- package/src/file/time.ts +64 -0
- package/src/file/watcher.ts +127 -0
- package/src/flag/flag.ts +54 -0
- package/src/format/formatter.ts +342 -0
- package/src/format/index.ts +137 -0
- package/src/global/index.ts +55 -0
- package/src/id/id.ts +83 -0
- package/src/ide/index.ts +76 -0
- package/src/index.ts +162 -0
- package/src/installation/index.ts +246 -0
- package/src/lsp/client.ts +252 -0
- package/src/lsp/index.ts +485 -0
- package/src/lsp/language.ts +119 -0
- package/src/lsp/server.ts +2046 -0
- package/src/mcp/auth.ts +135 -0
- package/src/mcp/index.ts +931 -0
- package/src/mcp/oauth-callback.ts +200 -0
- package/src/mcp/oauth-provider.ts +154 -0
- package/src/patch/index.ts +680 -0
- package/src/permission/arity.ts +163 -0
- package/src/permission/index.ts +210 -0
- package/src/permission/next.ts +269 -0
- package/src/plugin/codex.ts +493 -0
- package/src/plugin/copilot.ts +269 -0
- package/src/plugin/index.ts +135 -0
- package/src/project/bootstrap.ts +35 -0
- package/src/project/instance.ts +91 -0
- package/src/project/project.ts +339 -0
- package/src/project/state.ts +66 -0
- package/src/project/vcs.ts +76 -0
- package/src/provider/auth.ts +147 -0
- package/src/provider/models-macro.ts +11 -0
- package/src/provider/models.ts +112 -0
- package/src/provider/provider.ts +1391 -0
- package/src/provider/sdk/openai-compatible/src/README.md +5 -0
- package/src/provider/sdk/openai-compatible/src/index.ts +2 -0
- package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +100 -0
- package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +303 -0
- package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +22 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +18 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +22 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +207 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +1732 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +177 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +1 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +88 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +128 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +115 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +65 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +104 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +103 -0
- package/src/provider/transform.ts +733 -0
- package/src/pty/index.ts +232 -0
- package/src/question/index.ts +171 -0
- package/src/scheduler/index.ts +61 -0
- package/src/server/error.ts +36 -0
- package/src/server/event.ts +7 -0
- package/src/server/mdns.ts +59 -0
- package/src/server/routes/config.ts +92 -0
- package/src/server/routes/experimental.ts +208 -0
- package/src/server/routes/file.ts +197 -0
- package/src/server/routes/global.ts +135 -0
- package/src/server/routes/mcp.ts +361 -0
- package/src/server/routes/permission.ts +68 -0
- package/src/server/routes/project.ts +82 -0
- package/src/server/routes/provider.ts +165 -0
- package/src/server/routes/pty.ts +169 -0
- package/src/server/routes/question.ts +98 -0
- package/src/server/routes/session.ts +935 -0
- package/src/server/routes/tui.ts +379 -0
- package/src/server/server.ts +573 -0
- package/src/session/compaction.ts +225 -0
- package/src/session/index.ts +488 -0
- package/src/session/llm.ts +279 -0
- package/src/session/message-v2.ts +702 -0
- package/src/session/message.ts +189 -0
- package/src/session/processor.ts +406 -0
- package/src/session/prompt/anthropic-20250930.txt +166 -0
- package/src/session/prompt/anthropic.txt +105 -0
- package/src/session/prompt/anthropic_spoof.txt +1 -0
- package/src/session/prompt/beast.txt +147 -0
- package/src/session/prompt/build-switch.txt +5 -0
- package/src/session/prompt/codex_header.txt +79 -0
- package/src/session/prompt/copilot-gpt-5.txt +143 -0
- package/src/session/prompt/gemini.txt +155 -0
- package/src/session/prompt/max-steps.txt +16 -0
- package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
- package/src/session/prompt/plan.txt +26 -0
- package/src/session/prompt/qwen.txt +109 -0
- package/src/session/prompt.ts +1820 -0
- package/src/session/retry.ts +90 -0
- package/src/session/revert.ts +108 -0
- package/src/session/status.ts +76 -0
- package/src/session/summary.ts +150 -0
- package/src/session/system.ts +152 -0
- package/src/session/todo.ts +37 -0
- package/src/share/share-next.ts +200 -0
- package/src/share/share.ts +92 -0
- package/src/shell/shell.ts +67 -0
- package/src/skill/index.ts +1 -0
- package/src/skill/skill.ts +136 -0
- package/src/snapshot/index.ts +236 -0
- package/src/storage/storage.ts +227 -0
- package/src/tool/apply_patch.ts +269 -0
- package/src/tool/apply_patch.txt +33 -0
- package/src/tool/bash.ts +259 -0
- package/src/tool/bash.txt +115 -0
- package/src/tool/batch.ts +175 -0
- package/src/tool/batch.txt +24 -0
- package/src/tool/codesearch.ts +132 -0
- package/src/tool/codesearch.txt +12 -0
- package/src/tool/edit.ts +645 -0
- package/src/tool/edit.txt +10 -0
- package/src/tool/external-directory.ts +32 -0
- package/src/tool/glob.ts +77 -0
- package/src/tool/glob.txt +6 -0
- package/src/tool/grep.ts +154 -0
- package/src/tool/grep.txt +8 -0
- package/src/tool/invalid.ts +17 -0
- package/src/tool/ls.ts +121 -0
- package/src/tool/ls.txt +1 -0
- package/src/tool/lsp.ts +96 -0
- package/src/tool/lsp.txt +19 -0
- package/src/tool/multiedit.ts +46 -0
- package/src/tool/multiedit.txt +41 -0
- package/src/tool/plan-enter.txt +14 -0
- package/src/tool/plan-exit.txt +13 -0
- package/src/tool/plan.ts +130 -0
- package/src/tool/question.ts +33 -0
- package/src/tool/question.txt +10 -0
- package/src/tool/read.ts +202 -0
- package/src/tool/read.txt +12 -0
- package/src/tool/registry.ts +163 -0
- package/src/tool/skill.ts +75 -0
- package/src/tool/task.ts +188 -0
- package/src/tool/task.txt +60 -0
- package/src/tool/todo.ts +53 -0
- package/src/tool/todoread.txt +14 -0
- package/src/tool/todowrite.txt +167 -0
- package/src/tool/tool.ts +88 -0
- package/src/tool/truncation.ts +106 -0
- package/src/tool/webfetch.ts +182 -0
- package/src/tool/webfetch.txt +13 -0
- package/src/tool/websearch.ts +150 -0
- package/src/tool/websearch.txt +14 -0
- package/src/tool/write.ts +80 -0
- package/src/tool/write.txt +8 -0
- package/src/util/archive.ts +16 -0
- package/src/util/color.ts +19 -0
- package/src/util/context.ts +25 -0
- package/src/util/defer.ts +12 -0
- package/src/util/eventloop.ts +20 -0
- package/src/util/filesystem.ts +93 -0
- package/src/util/fn.ts +11 -0
- package/src/util/format.ts +20 -0
- package/src/util/iife.ts +3 -0
- package/src/util/keybind.ts +103 -0
- package/src/util/lazy.ts +18 -0
- package/src/util/locale.ts +81 -0
- package/src/util/lock.ts +98 -0
- package/src/util/log.ts +180 -0
- package/src/util/queue.ts +32 -0
- package/src/util/rpc.ts +66 -0
- package/src/util/scrap.ts +10 -0
- package/src/util/signal.ts +12 -0
- package/src/util/timeout.ts +14 -0
- package/src/util/token.ts +7 -0
- package/src/util/wildcard.ts +56 -0
- package/src/worktree/index.ts +424 -0
- package/sst-env.d.ts +9 -0
- package/test/acp/event-subscription.test.ts +436 -0
- package/test/agent/agent.test.ts +638 -0
- package/test/bun.test.ts +53 -0
- package/test/cli/github-action.test.ts +129 -0
- package/test/cli/github-remote.test.ts +80 -0
- package/test/cli/tui/transcript.test.ts +297 -0
- package/test/config/agent-color.test.ts +66 -0
- package/test/config/config.test.ts +1414 -0
- package/test/config/fixtures/empty-frontmatter.md +4 -0
- package/test/config/fixtures/frontmatter.md +28 -0
- package/test/config/fixtures/no-frontmatter.md +1 -0
- package/test/config/markdown.test.ts +192 -0
- package/test/file/ignore.test.ts +10 -0
- package/test/file/path-traversal.test.ts +198 -0
- package/test/fixture/fixture.ts +45 -0
- package/test/fixture/lsp/fake-lsp-server.js +77 -0
- package/test/ide/ide.test.ts +82 -0
- package/test/keybind.test.ts +421 -0
- package/test/lsp/client.test.ts +95 -0
- package/test/mcp/headers.test.ts +153 -0
- package/test/mcp/oauth-browser.test.ts +261 -0
- package/test/patch/patch.test.ts +348 -0
- package/test/permission/arity.test.ts +33 -0
- package/test/permission/next.test.ts +652 -0
- package/test/permission-task.test.ts +319 -0
- package/test/plugin/codex.test.ts +123 -0
- package/test/preload.ts +65 -0
- package/test/project/project.test.ts +120 -0
- package/test/provider/amazon-bedrock.test.ts +268 -0
- package/test/provider/gitlab-duo.test.ts +286 -0
- package/test/provider/provider.test.ts +2149 -0
- package/test/provider/transform.test.ts +1596 -0
- package/test/question/question.test.ts +300 -0
- package/test/scheduler.test.ts +73 -0
- package/test/server/session-list.test.ts +39 -0
- package/test/server/session-select.test.ts +78 -0
- package/test/session/compaction.test.ts +293 -0
- package/test/session/llm.test.ts +90 -0
- package/test/session/message-v2.test.ts +662 -0
- package/test/session/retry.test.ts +131 -0
- package/test/session/revert-compact.test.ts +285 -0
- package/test/session/session.test.ts +71 -0
- package/test/skill/skill.test.ts +185 -0
- package/test/snapshot/snapshot.test.ts +939 -0
- package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
- package/test/tool/apply_patch.test.ts +499 -0
- package/test/tool/bash.test.ts +320 -0
- package/test/tool/external-directory.test.ts +126 -0
- package/test/tool/fixtures/large-image.png +0 -0
- package/test/tool/fixtures/models-api.json +33453 -0
- package/test/tool/grep.test.ts +109 -0
- package/test/tool/question.test.ts +105 -0
- package/test/tool/read.test.ts +332 -0
- package/test/tool/registry.test.ts +76 -0
- package/test/tool/truncation.test.ts +159 -0
- package/test/util/filesystem.test.ts +39 -0
- package/test/util/format.test.ts +59 -0
- package/test/util/iife.test.ts +36 -0
- package/test/util/lazy.test.ts +50 -0
- package/test/util/lock.test.ts +72 -0
- package/test/util/timeout.test.ts +21 -0
- package/test/util/wildcard.test.ts +75 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Auth } from "./index"
|
|
2
|
+
|
|
3
|
+
export const ELISEART_SUPABASE_URL = "https://ageywitwxbvartiphlrl.supabase.co";
|
|
4
|
+
export const ELISEART_SUPABASE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImFnZXl3aXR3eGJ2YXJ0aXBobHJsIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTIxNTQ2MjEsImV4cCI6MjA2NzczMDYyMX0.GWqBU9Ywj-td67BDf6TgxN4ZDPLuQb8-jx3qV7n-rkY";
|
|
5
|
+
|
|
6
|
+
export namespace EliseArtAuth {
|
|
7
|
+
export async function login(email: string, password: string) {
|
|
8
|
+
const response = await fetch(`${ELISEART_SUPABASE_URL}/auth/v1/token?grant_type=password`, {
|
|
9
|
+
method: "POST",
|
|
10
|
+
headers: {
|
|
11
|
+
"apikey": ELISEART_SUPABASE_KEY,
|
|
12
|
+
"Content-Type": "application/json",
|
|
13
|
+
},
|
|
14
|
+
body: JSON.stringify({ email, password }),
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
if (!response.ok) {
|
|
18
|
+
const error = await response.json();
|
|
19
|
+
throw new Error(error.error_description || error.msg || "Login failed");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const data = await response.json();
|
|
23
|
+
|
|
24
|
+
// Save to opencode auth system
|
|
25
|
+
await Auth.set("eliseart", {
|
|
26
|
+
type: "oauth",
|
|
27
|
+
access: data.access_token,
|
|
28
|
+
refresh: data.refresh_token,
|
|
29
|
+
expires: Date.now() + (data.expires_in * 1000),
|
|
30
|
+
accountId: data.user.id
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function loginWithToken(accessToken: string, refreshToken: string = "") {
|
|
37
|
+
// Validate token by fetching user
|
|
38
|
+
const response = await fetch(`${ELISEART_SUPABASE_URL}/auth/v1/user`, {
|
|
39
|
+
method: "GET",
|
|
40
|
+
headers: {
|
|
41
|
+
"apikey": ELISEART_SUPABASE_KEY,
|
|
42
|
+
"Authorization": `Bearer ${accessToken}`,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
throw new Error("Invalid access token");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const user = await response.json();
|
|
51
|
+
|
|
52
|
+
// Save to opencode auth system
|
|
53
|
+
await Auth.set("eliseart", {
|
|
54
|
+
type: "oauth",
|
|
55
|
+
access: accessToken,
|
|
56
|
+
refresh: refreshToken, // Might be empty, meaning no refresh capability
|
|
57
|
+
accountId: user.id,
|
|
58
|
+
expires: Date.now() + (3600 * 1000), // Assume 1 hour validity if unknown
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
return { user, access_token: accessToken, refresh_token: refreshToken };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export async function getSession() {
|
|
65
|
+
return await Auth.get("eliseart");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export async function getAuthHeaders(): Promise<Record<string, string>> {
|
|
69
|
+
const session = await getSession();
|
|
70
|
+
const headers: Record<string, string> = { "apikey": ELISEART_SUPABASE_KEY };
|
|
71
|
+
if (session?.type === "oauth") {
|
|
72
|
+
headers["Authorization"] = `Bearer ${session.access}`;
|
|
73
|
+
}
|
|
74
|
+
return headers;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import path from "path"
|
|
2
|
+
import { Global } from "../global"
|
|
3
|
+
import fs from "fs/promises"
|
|
4
|
+
import z from "zod"
|
|
5
|
+
|
|
6
|
+
export const OAUTH_DUMMY_KEY = "opencode-oauth-dummy-key"
|
|
7
|
+
|
|
8
|
+
export namespace Auth {
|
|
9
|
+
export const Oauth = z
|
|
10
|
+
.object({
|
|
11
|
+
type: z.literal("oauth"),
|
|
12
|
+
refresh: z.string(),
|
|
13
|
+
access: z.string(),
|
|
14
|
+
expires: z.number(),
|
|
15
|
+
accountId: z.string().optional(),
|
|
16
|
+
enterpriseUrl: z.string().optional(),
|
|
17
|
+
})
|
|
18
|
+
.meta({ ref: "OAuth" })
|
|
19
|
+
|
|
20
|
+
export const Api = z
|
|
21
|
+
.object({
|
|
22
|
+
type: z.literal("api"),
|
|
23
|
+
key: z.string(),
|
|
24
|
+
})
|
|
25
|
+
.meta({ ref: "ApiAuth" })
|
|
26
|
+
|
|
27
|
+
export const WellKnown = z
|
|
28
|
+
.object({
|
|
29
|
+
type: z.literal("wellknown"),
|
|
30
|
+
key: z.string(),
|
|
31
|
+
token: z.string(),
|
|
32
|
+
})
|
|
33
|
+
.meta({ ref: "WellKnownAuth" })
|
|
34
|
+
|
|
35
|
+
export const Info = z.discriminatedUnion("type", [Oauth, Api, WellKnown]).meta({ ref: "Auth" })
|
|
36
|
+
export type Info = z.infer<typeof Info>
|
|
37
|
+
|
|
38
|
+
const filepath = path.join(Global.Path.data, "auth.json")
|
|
39
|
+
|
|
40
|
+
export async function get(providerID: string) {
|
|
41
|
+
const auth = await all()
|
|
42
|
+
return auth[providerID]
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export async function all(): Promise<Record<string, Info>> {
|
|
46
|
+
const file = Bun.file(filepath)
|
|
47
|
+
const data = await file.json().catch(() => ({}) as Record<string, unknown>)
|
|
48
|
+
return Object.entries(data).reduce(
|
|
49
|
+
(acc, [key, value]) => {
|
|
50
|
+
const parsed = Info.safeParse(value)
|
|
51
|
+
if (!parsed.success) return acc
|
|
52
|
+
acc[key] = parsed.data
|
|
53
|
+
return acc
|
|
54
|
+
},
|
|
55
|
+
{} as Record<string, Info>,
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function set(key: string, info: Info) {
|
|
60
|
+
const file = Bun.file(filepath)
|
|
61
|
+
const data = await all()
|
|
62
|
+
await Bun.write(file, JSON.stringify({ ...data, [key]: info }, null, 2))
|
|
63
|
+
await fs.chmod(file.name!, 0o600)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function remove(key: string) {
|
|
67
|
+
const file = Bun.file(filepath)
|
|
68
|
+
const data = await all()
|
|
69
|
+
delete data[key]
|
|
70
|
+
await Bun.write(file, JSON.stringify(data, null, 2))
|
|
71
|
+
await fs.chmod(file.name!, 0o600)
|
|
72
|
+
}
|
|
73
|
+
}
|
package/src/bun/index.ts
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Global } from "../global"
|
|
3
|
+
import { Log } from "../util/log"
|
|
4
|
+
import path from "path"
|
|
5
|
+
import { Filesystem } from "../util/filesystem"
|
|
6
|
+
import { NamedError } from "@eliseart.ai/util/error"
|
|
7
|
+
import { readableStreamToText } from "bun"
|
|
8
|
+
import { createRequire } from "module"
|
|
9
|
+
import { Lock } from "../util/lock"
|
|
10
|
+
|
|
11
|
+
export namespace BunProc {
|
|
12
|
+
const log = Log.create({ service: "bun" })
|
|
13
|
+
const req = createRequire(import.meta.url)
|
|
14
|
+
|
|
15
|
+
export async function run(cmd: string[], options?: Bun.SpawnOptions.OptionsObject<any, any, any>) {
|
|
16
|
+
log.info("running", {
|
|
17
|
+
cmd: [which(), ...cmd],
|
|
18
|
+
...options,
|
|
19
|
+
})
|
|
20
|
+
const result = Bun.spawn([which(), ...cmd], {
|
|
21
|
+
...options,
|
|
22
|
+
stdout: "pipe",
|
|
23
|
+
stderr: "pipe",
|
|
24
|
+
env: {
|
|
25
|
+
...process.env,
|
|
26
|
+
...options?.env,
|
|
27
|
+
BUN_BE_BUN: "1",
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
const code = await result.exited
|
|
31
|
+
const stdout = result.stdout
|
|
32
|
+
? typeof result.stdout === "number"
|
|
33
|
+
? result.stdout
|
|
34
|
+
: await readableStreamToText(result.stdout)
|
|
35
|
+
: undefined
|
|
36
|
+
const stderr = result.stderr
|
|
37
|
+
? typeof result.stderr === "number"
|
|
38
|
+
? result.stderr
|
|
39
|
+
: await readableStreamToText(result.stderr)
|
|
40
|
+
: undefined
|
|
41
|
+
log.info("done", {
|
|
42
|
+
code,
|
|
43
|
+
stdout,
|
|
44
|
+
stderr,
|
|
45
|
+
})
|
|
46
|
+
if (code !== 0) {
|
|
47
|
+
throw new Error(`Command failed with exit code ${result.exitCode}`)
|
|
48
|
+
}
|
|
49
|
+
return result
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function which() {
|
|
53
|
+
return process.execPath
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const InstallFailedError = NamedError.create(
|
|
57
|
+
"BunInstallFailedError",
|
|
58
|
+
z.object({
|
|
59
|
+
pkg: z.string(),
|
|
60
|
+
version: z.string(),
|
|
61
|
+
}),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
export async function install(pkg: string, version = "latest") {
|
|
65
|
+
// Use lock to ensure only one install at a time
|
|
66
|
+
using _ = await Lock.write("bun-install")
|
|
67
|
+
|
|
68
|
+
const mod = path.join(Global.Path.cache, "node_modules", pkg)
|
|
69
|
+
const pkgjson = Bun.file(path.join(Global.Path.cache, "package.json"))
|
|
70
|
+
const parsed = await pkgjson.json().catch(async () => {
|
|
71
|
+
const result = { dependencies: {} }
|
|
72
|
+
await Bun.write(pkgjson.name!, JSON.stringify(result, null, 2))
|
|
73
|
+
return result
|
|
74
|
+
})
|
|
75
|
+
const dependencies = parsed.dependencies ?? {}
|
|
76
|
+
if (!parsed.dependencies) parsed.dependencies = dependencies
|
|
77
|
+
const modExists = await Filesystem.exists(mod)
|
|
78
|
+
if (dependencies[pkg] === version && modExists) return mod
|
|
79
|
+
|
|
80
|
+
const proxied = !!(
|
|
81
|
+
process.env.HTTP_PROXY ||
|
|
82
|
+
process.env.HTTPS_PROXY ||
|
|
83
|
+
process.env.http_proxy ||
|
|
84
|
+
process.env.https_proxy
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
// Build command arguments
|
|
88
|
+
const args = [
|
|
89
|
+
"add",
|
|
90
|
+
"--force",
|
|
91
|
+
"--exact",
|
|
92
|
+
// TODO: get rid of this case (see: https://github.com/oven-sh/bun/issues/19936)
|
|
93
|
+
...(proxied ? ["--no-cache"] : []),
|
|
94
|
+
"--cwd",
|
|
95
|
+
Global.Path.cache,
|
|
96
|
+
pkg + "@" + version,
|
|
97
|
+
]
|
|
98
|
+
|
|
99
|
+
// Let Bun handle registry resolution:
|
|
100
|
+
// - If .npmrc files exist, Bun will use them automatically
|
|
101
|
+
// - If no .npmrc files exist, Bun will default to https://registry.npmjs.org
|
|
102
|
+
// - No need to pass --registry flag
|
|
103
|
+
log.info("installing package using Bun's default registry resolution", {
|
|
104
|
+
pkg,
|
|
105
|
+
version,
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
await BunProc.run(args, {
|
|
109
|
+
cwd: Global.Path.cache,
|
|
110
|
+
}).catch((e) => {
|
|
111
|
+
throw new InstallFailedError(
|
|
112
|
+
{ pkg, version },
|
|
113
|
+
{
|
|
114
|
+
cause: e,
|
|
115
|
+
},
|
|
116
|
+
)
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
// Resolve actual version from installed package when using "latest"
|
|
120
|
+
// This ensures subsequent starts use the cached version until explicitly updated
|
|
121
|
+
let resolvedVersion = version
|
|
122
|
+
if (version === "latest") {
|
|
123
|
+
const installedPkgJson = Bun.file(path.join(mod, "package.json"))
|
|
124
|
+
const installedPkg = await installedPkgJson.json().catch(() => null)
|
|
125
|
+
if (installedPkg?.version) {
|
|
126
|
+
resolvedVersion = installedPkg.version
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
parsed.dependencies[pkg] = resolvedVersion
|
|
131
|
+
await Bun.write(pkgjson.name!, JSON.stringify(parsed, null, 2))
|
|
132
|
+
return mod
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import type { ZodType } from "zod"
|
|
3
|
+
import { Log } from "../util/log"
|
|
4
|
+
|
|
5
|
+
export namespace BusEvent {
|
|
6
|
+
const log = Log.create({ service: "event" })
|
|
7
|
+
|
|
8
|
+
export type Definition = ReturnType<typeof define>
|
|
9
|
+
|
|
10
|
+
const registry = new Map<string, Definition>()
|
|
11
|
+
|
|
12
|
+
export function define<Type extends string, Properties extends ZodType>(type: Type, properties: Properties) {
|
|
13
|
+
const result = {
|
|
14
|
+
type,
|
|
15
|
+
properties,
|
|
16
|
+
}
|
|
17
|
+
registry.set(type, result)
|
|
18
|
+
return result
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function payloads() {
|
|
22
|
+
return z
|
|
23
|
+
.discriminatedUnion(
|
|
24
|
+
"type",
|
|
25
|
+
registry
|
|
26
|
+
.entries()
|
|
27
|
+
.map(([type, def]) => {
|
|
28
|
+
return z
|
|
29
|
+
.object({
|
|
30
|
+
type: z.literal(type),
|
|
31
|
+
properties: def.properties,
|
|
32
|
+
})
|
|
33
|
+
.meta({
|
|
34
|
+
ref: "Event" + "." + def.type,
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
.toArray() as any,
|
|
38
|
+
)
|
|
39
|
+
.meta({
|
|
40
|
+
ref: "Event",
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
}
|
package/src/bus/index.ts
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Log } from "../util/log"
|
|
3
|
+
import { Instance } from "../project/instance"
|
|
4
|
+
import { BusEvent } from "./bus-event"
|
|
5
|
+
import { GlobalBus } from "./global"
|
|
6
|
+
|
|
7
|
+
export namespace Bus {
|
|
8
|
+
const log = Log.create({ service: "bus" })
|
|
9
|
+
type Subscription = (event: any) => void
|
|
10
|
+
|
|
11
|
+
export const InstanceDisposed = BusEvent.define(
|
|
12
|
+
"server.instance.disposed",
|
|
13
|
+
z.object({
|
|
14
|
+
directory: z.string(),
|
|
15
|
+
}),
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
const state = Instance.state(
|
|
19
|
+
() => {
|
|
20
|
+
const subscriptions = new Map<any, Subscription[]>()
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
subscriptions,
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
async (entry) => {
|
|
27
|
+
const wildcard = entry.subscriptions.get("*")
|
|
28
|
+
if (!wildcard) return
|
|
29
|
+
const event = {
|
|
30
|
+
type: InstanceDisposed.type,
|
|
31
|
+
properties: {
|
|
32
|
+
directory: Instance.directory,
|
|
33
|
+
},
|
|
34
|
+
}
|
|
35
|
+
for (const sub of [...wildcard]) {
|
|
36
|
+
sub(event)
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
export async function publish<Definition extends BusEvent.Definition>(
|
|
42
|
+
def: Definition,
|
|
43
|
+
properties: z.output<Definition["properties"]>,
|
|
44
|
+
) {
|
|
45
|
+
const payload = {
|
|
46
|
+
type: def.type,
|
|
47
|
+
properties,
|
|
48
|
+
}
|
|
49
|
+
log.info("publishing", {
|
|
50
|
+
type: def.type,
|
|
51
|
+
})
|
|
52
|
+
const pending = []
|
|
53
|
+
for (const key of [def.type, "*"]) {
|
|
54
|
+
const match = state().subscriptions.get(key)
|
|
55
|
+
for (const sub of match ?? []) {
|
|
56
|
+
pending.push(sub(payload))
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
GlobalBus.emit("event", {
|
|
60
|
+
directory: Instance.directory,
|
|
61
|
+
payload,
|
|
62
|
+
})
|
|
63
|
+
return Promise.all(pending)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function subscribe<Definition extends BusEvent.Definition>(
|
|
67
|
+
def: Definition,
|
|
68
|
+
callback: (event: { type: Definition["type"]; properties: z.infer<Definition["properties"]> }) => void,
|
|
69
|
+
) {
|
|
70
|
+
return raw(def.type, callback)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function once<Definition extends BusEvent.Definition>(
|
|
74
|
+
def: Definition,
|
|
75
|
+
callback: (event: {
|
|
76
|
+
type: Definition["type"]
|
|
77
|
+
properties: z.infer<Definition["properties"]>
|
|
78
|
+
}) => "done" | undefined,
|
|
79
|
+
) {
|
|
80
|
+
const unsub = subscribe(def, (event) => {
|
|
81
|
+
if (callback(event)) unsub()
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function subscribeAll(callback: (event: any) => void) {
|
|
86
|
+
return raw("*", callback)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function raw(type: string, callback: (event: any) => void) {
|
|
90
|
+
log.info("subscribing", { type })
|
|
91
|
+
const subscriptions = state().subscriptions
|
|
92
|
+
let match = subscriptions.get(type) ?? []
|
|
93
|
+
match.push(callback)
|
|
94
|
+
subscriptions.set(type, match)
|
|
95
|
+
|
|
96
|
+
return () => {
|
|
97
|
+
log.info("unsubscribing", { type })
|
|
98
|
+
const match = subscriptions.get(type)
|
|
99
|
+
if (!match) return
|
|
100
|
+
const index = match.indexOf(callback)
|
|
101
|
+
if (index === -1) return
|
|
102
|
+
match.splice(index, 1)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { InstanceBootstrap } from "../project/bootstrap"
|
|
2
|
+
import { Instance } from "../project/instance"
|
|
3
|
+
|
|
4
|
+
export async function bootstrap<T>(directory: string, cb: () => Promise<T>) {
|
|
5
|
+
return Instance.provide({
|
|
6
|
+
directory,
|
|
7
|
+
init: InstanceBootstrap,
|
|
8
|
+
fn: async () => {
|
|
9
|
+
try {
|
|
10
|
+
const result = await cb()
|
|
11
|
+
return result
|
|
12
|
+
} finally {
|
|
13
|
+
await Instance.dispose()
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
})
|
|
17
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { cmd } from "./cmd"
|
|
2
|
+
import * as prompts from "@clack/prompts"
|
|
3
|
+
import { UI } from "../ui"
|
|
4
|
+
import { EliseArtAuth, ELISEART_SUPABASE_URL } from "../../auth/eliseart"
|
|
5
|
+
|
|
6
|
+
export const AccountCommand = cmd({
|
|
7
|
+
command: "account",
|
|
8
|
+
describe: "view EliseArt account info, plan & AI credits",
|
|
9
|
+
async handler() {
|
|
10
|
+
UI.empty()
|
|
11
|
+
const session = await EliseArtAuth.getSession()
|
|
12
|
+
if (!session || session.type !== "oauth") {
|
|
13
|
+
prompts.log.error("Not logged in to EliseArt. Run 'easc auth login' and select 'eliseart'.")
|
|
14
|
+
return
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const headers = await EliseArtAuth.getAuthHeaders()
|
|
18
|
+
const spinner = prompts.spinner()
|
|
19
|
+
spinner.start("Fetching account details...")
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
// Fetch AI credits
|
|
23
|
+
const creditsResponse = await fetch(
|
|
24
|
+
`${ELISEART_SUPABASE_URL}/rest/v1/ai_credits?user_id=eq.${session.accountId}&select=balance,last_reset_at`,
|
|
25
|
+
{
|
|
26
|
+
method: "GET",
|
|
27
|
+
headers: {
|
|
28
|
+
...headers,
|
|
29
|
+
"Content-Type": "application/json",
|
|
30
|
+
},
|
|
31
|
+
}
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
let aiCredits = 0
|
|
35
|
+
if (creditsResponse.ok) {
|
|
36
|
+
const creditsData = await creditsResponse.json() as any[]
|
|
37
|
+
if (creditsData && creditsData.length > 0) {
|
|
38
|
+
aiCredits = creditsData[0].balance || 0
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Fetch plan
|
|
43
|
+
const subResponse = await fetch(
|
|
44
|
+
`${ELISEART_SUPABASE_URL}/rest/v1/user_subscriptions?user_id=eq.${session.accountId}&select=*,plan:subscription_plans(name)&status=eq.active`,
|
|
45
|
+
{
|
|
46
|
+
method: "GET",
|
|
47
|
+
headers: {
|
|
48
|
+
...headers,
|
|
49
|
+
"Content-Type": "application/json",
|
|
50
|
+
},
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
let plan = "free"
|
|
55
|
+
let planExpiresAt: string | null = null
|
|
56
|
+
if (subResponse.ok) {
|
|
57
|
+
const subData = await subResponse.json() as any[]
|
|
58
|
+
if (subData && subData.length > 0) {
|
|
59
|
+
plan = subData[0].plan?.name || "premium"
|
|
60
|
+
planExpiresAt = subData[0].current_period_end || subData[0].ends_at
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
spinner.stop("Account details loaded")
|
|
65
|
+
|
|
66
|
+
console.log("\n\x1b[36m╭─────────────────────────────────────╮\x1b[0m")
|
|
67
|
+
console.log("\x1b[36m│\x1b[0m \x1b[1m🎨 EliseArt Account\x1b[0m \x1b[36m│\x1b[0m")
|
|
68
|
+
console.log("\x1b[36m├─────────────────────────────────────┤\x1b[0m")
|
|
69
|
+
console.log(`\x1b[36m│\x1b[0m Plan: ${plan.toUpperCase().padEnd(22)} \x1b[36m│\x1b[0m`)
|
|
70
|
+
console.log(`\x1b[36m│\x1b[0m AI Credits: ${String(aiCredits).padEnd(22)} \x1b[36m│\x1b[0m`)
|
|
71
|
+
if (planExpiresAt) {
|
|
72
|
+
const expires = new Date(planExpiresAt).toLocaleDateString()
|
|
73
|
+
console.log(`\x1b[36m│\x1b[0m Renews: ${expires.padEnd(22)} \x1b[36m│\x1b[0m`)
|
|
74
|
+
}
|
|
75
|
+
console.log("\x1b[36m╰─────────────────────────────────────╯\x1b[0m\n")
|
|
76
|
+
|
|
77
|
+
} catch (e: any) {
|
|
78
|
+
spinner.stop("Failed to fetch account info: " + e.message, 1)
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
})
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Log } from "@/util/log"
|
|
2
|
+
import { bootstrap } from "../bootstrap"
|
|
3
|
+
import { cmd } from "./cmd"
|
|
4
|
+
import { AgentSideConnection, ndJsonStream } from "@agentclientprotocol/sdk"
|
|
5
|
+
import { ACP } from "@/acp/agent"
|
|
6
|
+
import { Server } from "@/server/server"
|
|
7
|
+
import { createOpencodeClient } from "@eliseart.ai/sdk/v2"
|
|
8
|
+
import { withNetworkOptions, resolveNetworkOptions } from "../network"
|
|
9
|
+
|
|
10
|
+
const log = Log.create({ service: "acp-command" })
|
|
11
|
+
|
|
12
|
+
export const AcpCommand = cmd({
|
|
13
|
+
command: "acp",
|
|
14
|
+
describe: "start ACP (Agent Client Protocol) server",
|
|
15
|
+
builder: (yargs) => {
|
|
16
|
+
return withNetworkOptions(yargs).option("cwd", {
|
|
17
|
+
describe: "working directory",
|
|
18
|
+
type: "string",
|
|
19
|
+
default: process.cwd(),
|
|
20
|
+
})
|
|
21
|
+
},
|
|
22
|
+
handler: async (args) => {
|
|
23
|
+
await bootstrap(process.cwd(), async () => {
|
|
24
|
+
const opts = await resolveNetworkOptions(args)
|
|
25
|
+
const server = Server.listen(opts)
|
|
26
|
+
|
|
27
|
+
const sdk = createOpencodeClient({
|
|
28
|
+
baseUrl: `http://${server.hostname}:${server.port}`,
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
const input = new WritableStream<Uint8Array>({
|
|
32
|
+
write(chunk) {
|
|
33
|
+
return new Promise<void>((resolve, reject) => {
|
|
34
|
+
process.stdout.write(chunk, (err) => {
|
|
35
|
+
if (err) {
|
|
36
|
+
reject(err)
|
|
37
|
+
} else {
|
|
38
|
+
resolve()
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
},
|
|
43
|
+
})
|
|
44
|
+
const output = new ReadableStream<Uint8Array>({
|
|
45
|
+
start(controller) {
|
|
46
|
+
process.stdin.on("data", (chunk: Buffer) => {
|
|
47
|
+
controller.enqueue(new Uint8Array(chunk))
|
|
48
|
+
})
|
|
49
|
+
process.stdin.on("end", () => controller.close())
|
|
50
|
+
process.stdin.on("error", (err) => controller.error(err))
|
|
51
|
+
},
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
const stream = ndJsonStream(input, output)
|
|
55
|
+
const agent = await ACP.init({ sdk })
|
|
56
|
+
|
|
57
|
+
new AgentSideConnection((conn) => {
|
|
58
|
+
return agent.create(conn, { sdk })
|
|
59
|
+
}, stream)
|
|
60
|
+
|
|
61
|
+
log.info("setup connection")
|
|
62
|
+
process.stdin.resume()
|
|
63
|
+
await new Promise((resolve, reject) => {
|
|
64
|
+
process.stdin.on("end", resolve)
|
|
65
|
+
process.stdin.on("error", reject)
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
},
|
|
69
|
+
})
|