soraacode 0.2.0 → 0.2.1
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/LICENSE +21 -0
- package/bin/soraacode.exe +10 -0
- package/package.json +17 -25
- package/{script/postinstall.mjs → postinstall.mjs} +5 -5
- package/AGENTS.md +0 -131
- package/Dockerfile +0 -18
- package/README.md +0 -15
- package/bin/opencode +0 -199
- package/bin/soraacode +0 -199
- package/bunfig.toml +0 -7
- package/git +0 -0
- package/migration/20260511173437_session-metadata/migration.sql +0 -1
- package/migration/20260511173437_session-metadata/snapshot.json +0 -1500
- package/parsers-config.ts +0 -1
- package/script/bench-search.ts +0 -94
- package/script/bench-test-suite.ts +0 -52
- package/script/build-headless.ts +0 -51
- package/script/build.ts +0 -245
- package/script/generate.ts +0 -14
- package/script/httpapi-exercise.ts +0 -1
- package/script/profile-test-files.ts +0 -42
- package/script/publish.ts +0 -213
- package/script/run-workspace-server +0 -106
- package/script/schema.ts +0 -77
- package/script/time.ts +0 -6
- package/script/trace-imports.ts +0 -153
- package/soraacode-0.1.7.tgz +0 -0
- package/specs/effect/error-boundaries-plan.md +0 -235
- package/specs/effect/errors.md +0 -207
- package/specs/effect/facades.md +0 -218
- package/specs/effect/guide.md +0 -247
- package/specs/effect/instance-context.md +0 -13
- package/specs/effect/loose-ends.md +0 -30
- package/specs/effect/migration.md +0 -62
- package/specs/effect/routes.md +0 -61
- package/specs/effect/schema.md +0 -88
- package/specs/effect/server-package.md +0 -58
- package/specs/effect/todo.md +0 -241
- package/specs/effect/tools.md +0 -88
- package/specs/openapi-translation-cleanup.md +0 -204
- package/specs/tui-plugins.md +0 -544
- package/specs/v2/api.ts +0 -67
- package/specs/v2/message-shape.md +0 -136
- package/specs/v2/notifications.md +0 -13
- package/specs/v2/tui-command-shim.md +0 -67
- package/src/account/account.ts +0 -481
- package/src/account/repo.ts +0 -171
- package/src/account/schema.ts +0 -99
- package/src/account/url.ts +0 -8
- package/src/acp/agent.ts +0 -95
- package/src/acp/config-option.ts +0 -206
- package/src/acp/content.ts +0 -269
- package/src/acp/directory.ts +0 -212
- package/src/acp/error.ts +0 -97
- package/src/acp/event.ts +0 -421
- package/src/acp/permission.ts +0 -254
- package/src/acp/profile.ts +0 -42
- package/src/acp/service.ts +0 -1226
- package/src/acp/session.ts +0 -232
- package/src/acp/tool.ts +0 -364
- package/src/acp/usage.ts +0 -243
- package/src/agent/agent.ts +0 -450
- package/src/agent/generate.txt +0 -75
- package/src/agent/prompt/compaction.txt +0 -5
- package/src/agent/prompt/explore.txt +0 -18
- package/src/agent/prompt/summary.txt +0 -11
- package/src/agent/prompt/title.txt +0 -44
- package/src/agent/subagent-permissions.ts +0 -27
- package/src/audio.d.ts +0 -14
- package/src/auth/index.ts +0 -97
- package/src/background/job.ts +0 -37
- package/src/bus/global.ts +0 -22
- package/src/cli/bootstrap.ts +0 -11
- package/src/cli/cmd/cmd.ts +0 -7
- package/src/cli/cmd/serve.ts +0 -24
- package/src/cli/effect/prompt.ts +0 -37
- package/src/cli/effect-cmd.ts +0 -96
- package/src/cli/error.ts +0 -130
- package/src/cli/heap.ts +0 -45
- package/src/cli/logo.ts +0 -2
- package/src/cli/network.ts +0 -80
- package/src/cli/ui.ts +0 -132
- package/src/command/index.ts +0 -177
- package/src/command/template/initialize.txt +0 -66
- package/src/command/template/review.txt +0 -101
- package/src/config/agent.ts +0 -59
- package/src/config/command.ts +0 -39
- package/src/config/config.ts +0 -707
- package/src/config/entry-name.ts +0 -19
- package/src/config/managed.ts +0 -69
- package/src/config/markdown.ts +0 -36
- package/src/config/parse.ts +0 -61
- package/src/config/paths.ts +0 -45
- package/src/config/plugin.ts +0 -79
- package/src/config/v2-compat.ts +0 -449
- package/src/config/variable.ts +0 -91
- package/src/control-plane/adapters/index.ts +0 -41
- package/src/control-plane/adapters/worktree.ts +0 -96
- package/src/control-plane/dev/README.md +0 -19
- package/src/control-plane/dev/debug-workspace-plugin.ts +0 -73
- package/src/control-plane/types.ts +0 -59
- package/src/control-plane/util.ts +0 -39
- package/src/control-plane/workspace-adapter-runtime.ts +0 -51
- package/src/control-plane/workspace-context.ts +0 -26
- package/src/control-plane/workspace.ts +0 -966
- package/src/effect/app-node-builder-v1.ts +0 -12
- package/src/effect/app-runtime.ts +0 -135
- package/src/effect/bootstrap-runtime.ts +0 -19
- package/src/effect/bridge.ts +0 -84
- package/src/effect/config-service.ts +0 -67
- package/src/effect/instance-ref.ts +0 -11
- package/src/effect/instance-registry.ts +0 -12
- package/src/effect/instance-state.ts +0 -69
- package/src/effect/promise.ts +0 -17
- package/src/effect/run-service.ts +0 -47
- package/src/effect/runner.ts +0 -217
- package/src/effect/runtime-flags.ts +0 -78
- package/src/env/index.ts +0 -41
- package/src/event-manifest.ts +0 -3
- package/src/event-v2-bridge.ts +0 -71
- package/src/format/formatter.ts +0 -404
- package/src/format/index.ts +0 -203
- package/src/git/index.ts +0 -348
- package/src/id/id.ts +0 -80
- package/src/ide/index.ts +0 -54
- package/src/image/image.ts +0 -172
- package/src/index-headless.ts +0 -89
- package/src/index.ts +0 -93
- package/src/installation/index.ts +0 -336
- package/src/lsp/client.ts +0 -650
- package/src/lsp/diagnostic.ts +0 -29
- package/src/lsp/language.ts +0 -121
- package/src/lsp/launch.ts +0 -21
- package/src/lsp/lsp.ts +0 -507
- package/src/lsp/server.ts +0 -1983
- package/src/markdown.d.ts +0 -4
- package/src/mcp/auth.ts +0 -163
- package/src/mcp/browser.ts +0 -37
- package/src/mcp/catalog.ts +0 -170
- package/src/mcp/index.ts +0 -1004
- package/src/mcp/oauth-callback.ts +0 -194
- package/src/mcp/oauth-provider.ts +0 -259
- package/src/node.ts +0 -4
- package/src/patch/index.ts +0 -686
- package/src/permission/arity.ts +0 -163
- package/src/permission/evaluate.ts +0 -1
- package/src/permission/index.ts +0 -223
- package/src/plugin/github-copilot/copilot.ts +0 -415
- package/src/plugin/github-copilot/models.ts +0 -261
- package/src/plugin/index.ts +0 -298
- package/src/plugin/install.ts +0 -439
- package/src/plugin/loader.ts +0 -237
- package/src/plugin/meta.ts +0 -188
- package/src/plugin/openai/README.md +0 -31
- package/src/plugin/openai/codex.ts +0 -575
- package/src/plugin/openai/ws-pool.ts +0 -271
- package/src/plugin/openai/ws.ts +0 -383
- package/src/plugin/pty-environment.ts +0 -24
- package/src/plugin/shared.ts +0 -323
- package/src/project/bootstrap-service.ts +0 -9
- package/src/project/bootstrap.ts +0 -58
- package/src/project/instance-context.ts +0 -24
- package/src/project/instance-runtime.ts +0 -16
- package/src/project/instance-store.ts +0 -213
- package/src/project/project.ts +0 -483
- package/src/project/vcs.ts +0 -423
- package/src/provider/auth.ts +0 -229
- package/src/provider/error.ts +0 -195
- package/src/provider/model-status.ts +0 -8
- package/src/provider/provider.ts +0 -1955
- package/src/provider/transform.ts +0 -1923
- package/src/question/index.ts +0 -161
- package/src/question/schema.ts +0 -4
- package/src/server/auth.ts +0 -48
- package/src/server/event.ts +0 -10
- package/src/server/global-lifecycle.ts +0 -28
- package/src/server/mdns.ts +0 -47
- package/src/server/proxy-util.ts +0 -48
- package/src/server/routes/instance/httpapi/AGENTS.md +0 -39
- package/src/server/routes/instance/httpapi/api.ts +0 -97
- package/src/server/routes/instance/httpapi/errors.ts +0 -193
- package/src/server/routes/instance/httpapi/groups/config.ts +0 -65
- package/src/server/routes/instance/httpapi/groups/control-plane.ts +0 -35
- package/src/server/routes/instance/httpapi/groups/control.ts +0 -76
- package/src/server/routes/instance/httpapi/groups/event.ts +0 -29
- package/src/server/routes/instance/httpapi/groups/experimental.ts +0 -275
- package/src/server/routes/instance/httpapi/groups/file.ts +0 -185
- package/src/server/routes/instance/httpapi/groups/global.ts +0 -139
- package/src/server/routes/instance/httpapi/groups/instance.ts +0 -206
- package/src/server/routes/instance/httpapi/groups/mcp.ts +0 -156
- package/src/server/routes/instance/httpapi/groups/metadata.ts +0 -18
- package/src/server/routes/instance/httpapi/groups/permission.ts +0 -61
- package/src/server/routes/instance/httpapi/groups/project-copy.ts +0 -32
- package/src/server/routes/instance/httpapi/groups/project.ts +0 -93
- package/src/server/routes/instance/httpapi/groups/provider.ts +0 -101
- package/src/server/routes/instance/httpapi/groups/pty.ts +0 -172
- package/src/server/routes/instance/httpapi/groups/query.ts +0 -12
- package/src/server/routes/instance/httpapi/groups/question.ts +0 -74
- package/src/server/routes/instance/httpapi/groups/session.ts +0 -462
- package/src/server/routes/instance/httpapi/groups/sync.ts +0 -113
- package/src/server/routes/instance/httpapi/groups/tui.ts +0 -208
- package/src/server/routes/instance/httpapi/groups/workspace.ts +0 -141
- package/src/server/routes/instance/httpapi/handlers/config.ts +0 -34
- package/src/server/routes/instance/httpapi/handlers/control-plane.ts +0 -37
- package/src/server/routes/instance/httpapi/handlers/control.ts +0 -43
- package/src/server/routes/instance/httpapi/handlers/event.ts +0 -99
- package/src/server/routes/instance/httpapi/handlers/experimental.ts +0 -193
- package/src/server/routes/instance/httpapi/handlers/file.ts +0 -139
- package/src/server/routes/instance/httpapi/handlers/global.ts +0 -126
- package/src/server/routes/instance/httpapi/handlers/instance.ts +0 -110
- package/src/server/routes/instance/httpapi/handlers/mcp.ts +0 -111
- package/src/server/routes/instance/httpapi/handlers/permission.ts +0 -41
- package/src/server/routes/instance/httpapi/handlers/project-copy.ts +0 -83
- package/src/server/routes/instance/httpapi/handlers/project.ts +0 -63
- package/src/server/routes/instance/httpapi/handlers/provider.ts +0 -116
- package/src/server/routes/instance/httpapi/handlers/pty.ts +0 -273
- package/src/server/routes/instance/httpapi/handlers/question.ts +0 -54
- package/src/server/routes/instance/httpapi/handlers/session-errors.ts +0 -21
- package/src/server/routes/instance/httpapi/handlers/session.ts +0 -442
- package/src/server/routes/instance/httpapi/handlers/sync.ts +0 -89
- package/src/server/routes/instance/httpapi/handlers/tui.ts +0 -131
- package/src/server/routes/instance/httpapi/handlers/workspace.ts +0 -102
- package/src/server/routes/instance/httpapi/lifecycle.ts +0 -54
- package/src/server/routes/instance/httpapi/middleware/authorization.ts +0 -150
- package/src/server/routes/instance/httpapi/middleware/compression.ts +0 -64
- package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +0 -29
- package/src/server/routes/instance/httpapi/middleware/error.ts +0 -44
- package/src/server/routes/instance/httpapi/middleware/fence.ts +0 -25
- package/src/server/routes/instance/httpapi/middleware/instance-context.ts +0 -43
- package/src/server/routes/instance/httpapi/middleware/proxy.ts +0 -131
- package/src/server/routes/instance/httpapi/middleware/schema-error.ts +0 -41
- package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +0 -250
- package/src/server/routes/instance/httpapi/public.ts +0 -537
- package/src/server/routes/instance/httpapi/server.ts +0 -325
- package/src/server/routes/instance/httpapi/websocket-tracker.ts +0 -60
- package/src/server/server.ts +0 -224
- package/src/server/shared/fence.ts +0 -60
- package/src/server/shared/pty-ticket.ts +0 -15
- package/src/server/shared/public-ui.ts +0 -12
- package/src/server/shared/tui-control.ts +0 -28
- package/src/server/shared/ui.ts +0 -108
- package/src/server/shared/workspace-routing.ts +0 -45
- package/src/server/tui-event.ts +0 -1
- package/src/session/compaction.ts +0 -608
- package/src/session/instruction.ts +0 -237
- package/src/session/llm/AGENTS.md +0 -90
- package/src/session/llm/ai-sdk.ts +0 -291
- package/src/session/llm/native-request.ts +0 -196
- package/src/session/llm/native-runtime.ts +0 -195
- package/src/session/llm/request.ts +0 -226
- package/src/session/llm.ts +0 -390
- package/src/session/message-error.ts +0 -14
- package/src/session/message-v2.ts +0 -742
- package/src/session/message.ts +0 -148
- package/src/session/overflow.ts +0 -34
- package/src/session/processor.ts +0 -732
- package/src/session/prompt/build-switch.txt +0 -5
- package/src/session/prompt/default.txt +0 -35
- package/src/session/prompt/plan-mode.txt +0 -70
- package/src/session/prompt/plan.txt +0 -26
- package/src/session/prompt.ts +0 -1631
- package/src/session/reminders.ts +0 -92
- package/src/session/retry.ts +0 -209
- package/src/session/revert.ts +0 -136
- package/src/session/run-state.ts +0 -151
- package/src/session/schema.ts +0 -26
- package/src/session/session.ts +0 -1016
- package/src/session/status.ts +0 -56
- package/src/session/summary.ts +0 -160
- package/src/session/system.ts +0 -123
- package/src/session/todo.ts +0 -74
- package/src/session/tools.ts +0 -590
- package/src/share/session.ts +0 -58
- package/src/share/share-next.ts +0 -371
- package/src/skill/discovery.ts +0 -140
- package/src/skill/index.ts +0 -354
- package/src/snapshot/index.ts +0 -807
- package/src/sql.d.ts +0 -4
- package/src/storage/schema.ts +0 -5
- package/src/storage/storage.ts +0 -327
- package/src/sync/README.md +0 -179
- package/src/sync/schema.ts +0 -11
- package/src/temporary.ts +0 -31
- package/src/tool/apply_patch.ts +0 -313
- package/src/tool/apply_patch.txt +0 -14
- package/src/tool/code-mode.ts +0 -310
- package/src/tool/edit.ts +0 -737
- package/src/tool/edit.txt +0 -13
- package/src/tool/external-directory.ts +0 -49
- package/src/tool/glob.ts +0 -76
- package/src/tool/glob.txt +0 -7
- package/src/tool/grep.ts +0 -115
- package/src/tool/grep.txt +0 -7
- package/src/tool/invalid.ts +0 -21
- package/src/tool/json-schema.ts +0 -164
- package/src/tool/lsp.ts +0 -113
- package/src/tool/lsp.txt +0 -1
- package/src/tool/mcp-websearch.ts +0 -96
- package/src/tool/plan-enter.txt +0 -1
- package/src/tool/plan-exit.txt +0 -1
- package/src/tool/plan.ts +0 -79
- package/src/tool/question.ts +0 -44
- package/src/tool/question.txt +0 -1
- package/src/tool/read.ts +0 -386
- package/src/tool/read.txt +0 -13
- package/src/tool/registry.ts +0 -455
- package/src/tool/schema.ts +0 -14
- package/src/tool/shell/id.ts +0 -19
- package/src/tool/shell/prompt.ts +0 -293
- package/src/tool/shell/shell.txt +0 -21
- package/src/tool/shell.ts +0 -645
- package/src/tool/skill.ts +0 -70
- package/src/tool/skill.txt +0 -1
- package/src/tool/task.ts +0 -371
- package/src/tool/task.txt +0 -11
- package/src/tool/todo.ts +0 -46
- package/src/tool/todowrite.txt +0 -11
- package/src/tool/tool.ts +0 -183
- package/src/tool/truncate.ts +0 -156
- package/src/tool/truncation-dir.ts +0 -4
- package/src/tool/webfetch.ts +0 -192
- package/src/tool/webfetch.txt +0 -9
- package/src/tool/websearch.ts +0 -143
- package/src/tool/websearch.txt +0 -9
- package/src/tool/write.ts +0 -104
- package/src/tool/write.txt +0 -11
- package/src/util/archive.ts +0 -17
- package/src/util/bom.ts +0 -27
- package/src/util/data-url.ts +0 -9
- package/src/util/defer.ts +0 -10
- package/src/util/effect-http-client.ts +0 -11
- package/src/util/error.ts +0 -16
- package/src/util/filesystem.ts +0 -251
- package/src/util/html.ts +0 -8
- package/src/util/iife.ts +0 -3
- package/src/util/lazy.ts +0 -20
- package/src/util/local-context.ts +0 -25
- package/src/util/locale.ts +0 -4
- package/src/util/media.ts +0 -26
- package/src/util/process.ts +0 -177
- package/src/util/proxy-env.ts +0 -72
- package/src/util/queue.ts +0 -32
- package/src/util/record.ts +0 -3
- package/src/util/repository.ts +0 -232
- package/src/util/rpc.ts +0 -66
- package/src/util/signal.ts +0 -12
- package/src/util/timeout.ts +0 -13
- package/src/util/token.ts +0 -1
- package/src/util/wildcard.ts +0 -59
- package/src/worktree/index.ts +0 -623
- package/sst-env.d.ts +0 -10
- package/tsconfig.headless.json +0 -13
- package/tsconfig.json +0 -16
package/src/util/repository.ts
DELETED
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
import path from "path"
|
|
2
|
-
import { fileURLToPath } from "url"
|
|
3
|
-
import { Schema } from "effect"
|
|
4
|
-
import { Global } from "@soraacode/core/global"
|
|
5
|
-
|
|
6
|
-
type BaseReference = {
|
|
7
|
-
host: string
|
|
8
|
-
path: string
|
|
9
|
-
segments: string[]
|
|
10
|
-
owner?: string
|
|
11
|
-
repo: string
|
|
12
|
-
remote: string
|
|
13
|
-
label: string
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export type RemoteReference = BaseReference & {
|
|
17
|
-
protocol?: string
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export type FileReference = BaseReference & {
|
|
21
|
-
host: "file"
|
|
22
|
-
protocol: "file:"
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export type Reference = RemoteReference | FileReference
|
|
26
|
-
|
|
27
|
-
export class InvalidRepositoryReferenceError extends Schema.TaggedErrorClass<InvalidRepositoryReferenceError>()(
|
|
28
|
-
"RepositoryInvalidReferenceError",
|
|
29
|
-
{
|
|
30
|
-
repository: Schema.String,
|
|
31
|
-
message: Schema.String,
|
|
32
|
-
},
|
|
33
|
-
) {}
|
|
34
|
-
|
|
35
|
-
export class UnsupportedLocalRepositoryError extends Schema.TaggedErrorClass<UnsupportedLocalRepositoryError>()(
|
|
36
|
-
"RepositoryUnsupportedLocalRepositoryError",
|
|
37
|
-
{
|
|
38
|
-
repository: Schema.String,
|
|
39
|
-
message: Schema.String,
|
|
40
|
-
},
|
|
41
|
-
) {}
|
|
42
|
-
|
|
43
|
-
export class InvalidRepositoryBranchError extends Schema.TaggedErrorClass<InvalidRepositoryBranchError>()(
|
|
44
|
-
"RepositoryInvalidBranchError",
|
|
45
|
-
{
|
|
46
|
-
branch: Schema.String,
|
|
47
|
-
message: Schema.String,
|
|
48
|
-
},
|
|
49
|
-
) {}
|
|
50
|
-
|
|
51
|
-
export type RepositoryError =
|
|
52
|
-
| InvalidRepositoryReferenceError
|
|
53
|
-
| UnsupportedLocalRepositoryError
|
|
54
|
-
| InvalidRepositoryBranchError
|
|
55
|
-
|
|
56
|
-
export function isRepositoryError(error: unknown): error is RepositoryError {
|
|
57
|
-
return (
|
|
58
|
-
error instanceof InvalidRepositoryReferenceError ||
|
|
59
|
-
error instanceof UnsupportedLocalRepositoryError ||
|
|
60
|
-
error instanceof InvalidRepositoryBranchError
|
|
61
|
-
)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function normalizeRepositoryInput(input: string) {
|
|
65
|
-
return input
|
|
66
|
-
.trim()
|
|
67
|
-
.replace(/^git\+/, "")
|
|
68
|
-
.replace(/#.*$/, "")
|
|
69
|
-
.replace(/\/+$/, "")
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function trimGitSuffix(input: string) {
|
|
73
|
-
return input.replace(/\.git$/, "")
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function parts(input: string) {
|
|
77
|
-
return input
|
|
78
|
-
.split("/")
|
|
79
|
-
.map((item) => trimGitSuffix(item.trim()))
|
|
80
|
-
.filter(Boolean)
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function safeHost(input: string) {
|
|
84
|
-
return Boolean(input) && !input.startsWith("-") && !/[\s/\\]/.test(input)
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function safeSegment(input: string) {
|
|
88
|
-
return input !== "." && input !== ".." && !input.includes(":") && !/[\s/\\]/.test(input)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function hostLike(input: string) {
|
|
92
|
-
return input.includes(".") || input.includes(":") || input === "localhost"
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function withSlash(input: string) {
|
|
96
|
-
return input.endsWith("/") ? input : `${input}/`
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function githubRemote(pathname: string) {
|
|
100
|
-
const base = process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL
|
|
101
|
-
if (!base) return `https://github.com/${pathname}.git`
|
|
102
|
-
return new URL(`${pathname}.git`, withSlash(base)).href
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function buildRemoteReference(input: { host: string; segments: string[]; remote?: string; protocol?: string }) {
|
|
106
|
-
const segments = input.segments.map(trimGitSuffix).filter(Boolean)
|
|
107
|
-
if (!safeHost(input.host) || !segments.length || segments.some((segment) => !safeSegment(segment))) return null
|
|
108
|
-
const pathname = segments.join("/")
|
|
109
|
-
const repo = segments[segments.length - 1]
|
|
110
|
-
const host = input.host.toLowerCase()
|
|
111
|
-
return {
|
|
112
|
-
host,
|
|
113
|
-
path: pathname,
|
|
114
|
-
segments,
|
|
115
|
-
owner: segments.length === 2 ? segments[0] : undefined,
|
|
116
|
-
repo,
|
|
117
|
-
remote: input.remote ?? (host === "github.com" ? githubRemote(pathname) : `https://${host}/${pathname}.git`),
|
|
118
|
-
label: host === "github.com" && segments.length === 2 ? pathname : `${host}/${pathname}`,
|
|
119
|
-
protocol: input.protocol,
|
|
120
|
-
} satisfies RemoteReference
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
function buildFileReference(input: { url: URL; remote: string }) {
|
|
124
|
-
const filePath = path.normalize(fileURLToPath(input.url))
|
|
125
|
-
const segments = filePath.split(/[\\/]+/).filter(Boolean)
|
|
126
|
-
if (!segments.length) return null
|
|
127
|
-
return {
|
|
128
|
-
host: "file",
|
|
129
|
-
path: filePath,
|
|
130
|
-
segments: segments.map((segment) => segment.replace(/:$/, "")),
|
|
131
|
-
owner: undefined,
|
|
132
|
-
repo: trimGitSuffix(segments[segments.length - 1]),
|
|
133
|
-
remote: input.remote,
|
|
134
|
-
label: filePath,
|
|
135
|
-
protocol: "file:",
|
|
136
|
-
} satisfies FileReference
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
export function parseRepositoryReference(input: string) {
|
|
140
|
-
const cleaned = normalizeRepositoryInput(input)
|
|
141
|
-
if (!cleaned) return null
|
|
142
|
-
|
|
143
|
-
const githubPrefixed = cleaned.match(/^github:([^/\s]+)\/([^/\s]+)$/)
|
|
144
|
-
if (githubPrefixed) {
|
|
145
|
-
return buildRemoteReference({ host: "github.com", segments: [githubPrefixed[1], githubPrefixed[2]] })
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (!cleaned.includes("://")) {
|
|
149
|
-
const scp = cleaned.match(/^(?:[^@/\s]+@)?([^:/\s]+):(.+)$/)
|
|
150
|
-
if (scp) return buildRemoteReference({ host: scp[1], segments: parts(scp[2]), remote: cleaned })
|
|
151
|
-
|
|
152
|
-
const direct = parts(cleaned)
|
|
153
|
-
if (direct.length >= 2 && hostLike(direct[0])) {
|
|
154
|
-
return buildRemoteReference({ host: direct[0], segments: direct.slice(1) })
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
if (direct.length === 2) {
|
|
158
|
-
return buildRemoteReference({ host: "github.com", segments: direct })
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
try {
|
|
163
|
-
const url = new URL(cleaned)
|
|
164
|
-
if (url.protocol === "file:") return buildFileReference({ url, remote: cleaned })
|
|
165
|
-
const pathname = parts(url.pathname)
|
|
166
|
-
const host = url.host
|
|
167
|
-
return buildRemoteReference({
|
|
168
|
-
host,
|
|
169
|
-
segments: pathname,
|
|
170
|
-
remote: host === "github.com" ? githubRemote(pathname.join("/")) : cleaned,
|
|
171
|
-
protocol: url.protocol,
|
|
172
|
-
})
|
|
173
|
-
} catch {
|
|
174
|
-
return null
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
export function isFileRepositoryReference(reference: Reference): reference is FileReference {
|
|
179
|
-
return reference.protocol === "file:"
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
export function isRemoteRepositoryReference(reference: Reference): reference is RemoteReference {
|
|
183
|
-
return !isFileRepositoryReference(reference)
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
export function parseRemoteRepositoryReference(input: string) {
|
|
187
|
-
const reference = parseRepositoryReference(input)
|
|
188
|
-
if (!reference) {
|
|
189
|
-
throw new InvalidRepositoryReferenceError({
|
|
190
|
-
repository: input,
|
|
191
|
-
message: "Repository must be a git URL, host/path reference, or GitHub owner/repo shorthand",
|
|
192
|
-
})
|
|
193
|
-
}
|
|
194
|
-
if (!isRemoteRepositoryReference(reference)) {
|
|
195
|
-
throw new UnsupportedLocalRepositoryError({
|
|
196
|
-
repository: input,
|
|
197
|
-
message: "Local file repositories are not supported",
|
|
198
|
-
})
|
|
199
|
-
}
|
|
200
|
-
return reference
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
export function validateRepositoryBranch(branch: string) {
|
|
204
|
-
if (!/^[A-Za-z0-9/_.-]+$/.test(branch) || branch.startsWith("-") || branch.includes("..")) {
|
|
205
|
-
throw new InvalidRepositoryBranchError({
|
|
206
|
-
branch,
|
|
207
|
-
message:
|
|
208
|
-
"Branch must contain only alphanumeric characters, /, _, ., and -, and cannot start with - or contain ..",
|
|
209
|
-
})
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
export function parseGitHubRemote(input: string) {
|
|
214
|
-
const cleaned = normalizeRepositoryInput(input)
|
|
215
|
-
if (!cleaned.includes("://") && !cleaned.match(/^(?:[^@/\s]+@)?github\.com:/)) return null
|
|
216
|
-
|
|
217
|
-
const parsed = parseRepositoryReference(cleaned)
|
|
218
|
-
if (!parsed || parsed.host !== "github.com" || !parsed.owner || parsed.segments.length !== 2) return null
|
|
219
|
-
return { owner: parsed.owner, repo: parsed.repo }
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
export function repositoryCachePath(input: Reference) {
|
|
223
|
-
return path.join(Global.Path.repos, ...input.host.split(":"), ...input.segments)
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
export function repositoryCacheIdentity(input: Reference) {
|
|
227
|
-
return `${input.host}/${input.path}`
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
export function sameRepositoryReference(left: Reference, right: Reference) {
|
|
231
|
-
return repositoryCacheIdentity(left) === repositoryCacheIdentity(right)
|
|
232
|
-
}
|
package/src/util/rpc.ts
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
type Definition = {
|
|
2
|
-
[method: string]: (input: any) => any
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
export function listen(rpc: Definition) {
|
|
6
|
-
onmessage = async (evt) => {
|
|
7
|
-
const parsed = JSON.parse(evt.data)
|
|
8
|
-
if (parsed.type === "rpc.request") {
|
|
9
|
-
const result = await rpc[parsed.method](parsed.input)
|
|
10
|
-
postMessage(JSON.stringify({ type: "rpc.result", result, id: parsed.id }))
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function emit(event: string, data: unknown) {
|
|
16
|
-
postMessage(JSON.stringify({ type: "rpc.event", event, data }))
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function client<T extends Definition>(target: {
|
|
20
|
-
postMessage: (data: string) => void | null
|
|
21
|
-
onmessage: ((this: Worker, ev: MessageEvent<any>) => any) | null
|
|
22
|
-
}) {
|
|
23
|
-
const pending = new Map<number, (result: any) => void>()
|
|
24
|
-
const listeners = new Map<string, Set<(data: any) => void>>()
|
|
25
|
-
let id = 0
|
|
26
|
-
target.onmessage = async (evt) => {
|
|
27
|
-
const parsed = JSON.parse(evt.data)
|
|
28
|
-
if (parsed.type === "rpc.result") {
|
|
29
|
-
const resolve = pending.get(parsed.id)
|
|
30
|
-
if (resolve) {
|
|
31
|
-
resolve(parsed.result)
|
|
32
|
-
pending.delete(parsed.id)
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
if (parsed.type === "rpc.event") {
|
|
36
|
-
const handlers = listeners.get(parsed.event)
|
|
37
|
-
if (handlers) {
|
|
38
|
-
for (const handler of handlers) {
|
|
39
|
-
handler(parsed.data)
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return {
|
|
45
|
-
call<Method extends keyof T>(method: Method, input: Parameters<T[Method]>[0]): Promise<ReturnType<T[Method]>> {
|
|
46
|
-
const requestId = id++
|
|
47
|
-
return new Promise((resolve) => {
|
|
48
|
-
pending.set(requestId, resolve)
|
|
49
|
-
target.postMessage(JSON.stringify({ type: "rpc.request", method, input, id: requestId }))
|
|
50
|
-
})
|
|
51
|
-
},
|
|
52
|
-
on<Data>(event: string, handler: (data: Data) => void) {
|
|
53
|
-
let handlers = listeners.get(event)
|
|
54
|
-
if (!handlers) {
|
|
55
|
-
handlers = new Set()
|
|
56
|
-
listeners.set(event, handlers)
|
|
57
|
-
}
|
|
58
|
-
handlers.add(handler)
|
|
59
|
-
return () => {
|
|
60
|
-
handlers!.delete(handler)
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export * as Rpc from "./rpc"
|
package/src/util/signal.ts
DELETED
package/src/util/timeout.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export function withTimeout<T>(promise: Promise<T>, ms: number, label?: string): Promise<T> {
|
|
2
|
-
let timeout: NodeJS.Timeout
|
|
3
|
-
return Promise.race([
|
|
4
|
-
promise.finally(() => {
|
|
5
|
-
clearTimeout(timeout)
|
|
6
|
-
}),
|
|
7
|
-
new Promise<never>((_, reject) => {
|
|
8
|
-
timeout = setTimeout(() => {
|
|
9
|
-
reject(new Error(label ?? `Operation timed out after ${ms}ms`))
|
|
10
|
-
}, ms)
|
|
11
|
-
}),
|
|
12
|
-
])
|
|
13
|
-
}
|
package/src/util/token.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { Token, estimate } from "@soraacode/core/util/token"
|
package/src/util/wildcard.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { sortBy, pipe } from "remeda"
|
|
2
|
-
|
|
3
|
-
export function match(str: string, pattern: string) {
|
|
4
|
-
if (str) str = str.replaceAll("\\", "/")
|
|
5
|
-
if (pattern) pattern = pattern.replaceAll("\\", "/")
|
|
6
|
-
let escaped = pattern
|
|
7
|
-
.replace(/[.+^${}()|[\]\\]/g, "\\$&") // escape special regex chars
|
|
8
|
-
.replace(/\*/g, ".*") // * becomes .*
|
|
9
|
-
.replace(/\?/g, ".") // ? becomes .
|
|
10
|
-
|
|
11
|
-
// If pattern ends with " *" (space + wildcard), make the trailing part optional
|
|
12
|
-
// This allows "ls *" to match both "ls" and "ls -la"
|
|
13
|
-
if (escaped.endsWith(" .*")) {
|
|
14
|
-
escaped = escaped.slice(0, -3) + "( .*)?"
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const flags = process.platform === "win32" ? "si" : "s"
|
|
18
|
-
return new RegExp("^" + escaped + "$", flags).test(str)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function all(input: string, patterns: Record<string, any>) {
|
|
22
|
-
const sorted = pipe(patterns, Object.entries, sortBy([([key]) => key.length, "asc"], [([key]) => key, "asc"]))
|
|
23
|
-
let result = undefined
|
|
24
|
-
for (const [pattern, value] of sorted) {
|
|
25
|
-
if (match(input, pattern)) {
|
|
26
|
-
result = value
|
|
27
|
-
continue
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return result
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function allStructured(input: { head: string; tail: string[] }, patterns: Record<string, any>) {
|
|
34
|
-
const sorted = pipe(patterns, Object.entries, sortBy([([key]) => key.length, "asc"], [([key]) => key, "asc"]))
|
|
35
|
-
let result = undefined
|
|
36
|
-
for (const [pattern, value] of sorted) {
|
|
37
|
-
const parts = pattern.split(/\s+/)
|
|
38
|
-
if (!match(input.head, parts[0])) continue
|
|
39
|
-
if (parts.length === 1 || matchSequence(input.tail, parts.slice(1))) {
|
|
40
|
-
result = value
|
|
41
|
-
continue
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return result
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function matchSequence(items: string[], patterns: string[]): boolean {
|
|
48
|
-
if (patterns.length === 0) return true
|
|
49
|
-
const [pattern, ...rest] = patterns
|
|
50
|
-
if (pattern === "*") return matchSequence(items, rest)
|
|
51
|
-
for (let i = 0; i < items.length; i++) {
|
|
52
|
-
if (match(items[i], pattern) && matchSequence(items.slice(i + 1), rest)) {
|
|
53
|
-
return true
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return false
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export * as Wildcard from "./wildcard"
|