@bloxystudios/bloxycode 1.0.1 → 1.0.4
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/bin/bloxycode +11 -8
- package/package.json +16 -130
- package/postinstall.mjs +129 -0
- package/LICENSE +0 -21
- package/README.md +0 -272
- package/src/acp/README.md +0 -164
- package/src/acp/agent.ts +0 -1437
- package/src/acp/session.ts +0 -105
- package/src/acp/types.ts +0 -22
- package/src/agent/agent.ts +0 -356
- package/src/agent/generate.txt +0 -75
- package/src/agent/prompt/bloxy.txt +0 -46
- package/src/agent/prompt/compaction.txt +0 -12
- 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/auth/index.ts +0 -73
- package/src/bloxy/event.ts +0 -41
- package/src/bloxy/index.ts +0 -5
- package/src/bloxy/parser.ts +0 -263
- package/src/bloxy/prompt.ts +0 -121
- package/src/bloxy/runner.ts +0 -193
- package/src/bloxy/state.ts +0 -246
- package/src/bun/index.ts +0 -134
- package/src/bus/bus-event.ts +0 -43
- package/src/bus/global.ts +0 -10
- package/src/bus/index.ts +0 -105
- package/src/cli/bootstrap.ts +0 -17
- package/src/cli/cmd/acp.ts +0 -69
- package/src/cli/cmd/agent.ts +0 -257
- package/src/cli/cmd/auth.ts +0 -400
- package/src/cli/cmd/cmd.ts +0 -7
- package/src/cli/cmd/debug/agent.ts +0 -167
- package/src/cli/cmd/debug/config.ts +0 -16
- package/src/cli/cmd/debug/file.ts +0 -97
- package/src/cli/cmd/debug/index.ts +0 -48
- package/src/cli/cmd/debug/lsp.ts +0 -52
- package/src/cli/cmd/debug/ripgrep.ts +0 -87
- package/src/cli/cmd/debug/scrap.ts +0 -16
- package/src/cli/cmd/debug/skill.ts +0 -16
- package/src/cli/cmd/debug/snapshot.ts +0 -52
- package/src/cli/cmd/export.ts +0 -88
- package/src/cli/cmd/generate.ts +0 -38
- package/src/cli/cmd/github.ts +0 -1548
- package/src/cli/cmd/import.ts +0 -98
- package/src/cli/cmd/mcp.ts +0 -755
- package/src/cli/cmd/models.ts +0 -77
- package/src/cli/cmd/pr.ts +0 -112
- package/src/cli/cmd/run.ts +0 -395
- package/src/cli/cmd/serve.ts +0 -20
- package/src/cli/cmd/session.ts +0 -135
- package/src/cli/cmd/stats.ts +0 -402
- package/src/cli/cmd/tui/app.tsx +0 -771
- package/src/cli/cmd/tui/attach.ts +0 -39
- package/src/cli/cmd/tui/component/border.tsx +0 -21
- package/src/cli/cmd/tui/component/dialog-agent.tsx +0 -31
- package/src/cli/cmd/tui/component/dialog-command.tsx +0 -148
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +0 -86
- package/src/cli/cmd/tui/component/dialog-model.tsx +0 -234
- package/src/cli/cmd/tui/component/dialog-provider.tsx +0 -256
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +0 -114
- package/src/cli/cmd/tui/component/dialog-session-rename.tsx +0 -31
- package/src/cli/cmd/tui/component/dialog-stash.tsx +0 -87
- package/src/cli/cmd/tui/component/dialog-status.tsx +0 -164
- package/src/cli/cmd/tui/component/dialog-tag.tsx +0 -44
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +0 -50
- package/src/cli/cmd/tui/component/logo.tsx +0 -102
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +0 -653
- package/src/cli/cmd/tui/component/prompt/frecency.tsx +0 -89
- package/src/cli/cmd/tui/component/prompt/history.tsx +0 -108
- package/src/cli/cmd/tui/component/prompt/index.tsx +0 -1138
- package/src/cli/cmd/tui/component/prompt/stash.tsx +0 -101
- package/src/cli/cmd/tui/component/textarea-keybindings.ts +0 -73
- package/src/cli/cmd/tui/component/tips.tsx +0 -153
- package/src/cli/cmd/tui/component/todo-item.tsx +0 -32
- package/src/cli/cmd/tui/context/args.tsx +0 -14
- package/src/cli/cmd/tui/context/directory.ts +0 -13
- package/src/cli/cmd/tui/context/exit.tsx +0 -23
- package/src/cli/cmd/tui/context/helper.tsx +0 -25
- package/src/cli/cmd/tui/context/keybind.tsx +0 -101
- package/src/cli/cmd/tui/context/kv.tsx +0 -52
- package/src/cli/cmd/tui/context/local.tsx +0 -402
- package/src/cli/cmd/tui/context/prompt.tsx +0 -18
- package/src/cli/cmd/tui/context/route.tsx +0 -46
- package/src/cli/cmd/tui/context/sdk.tsx +0 -94
- package/src/cli/cmd/tui/context/sync.tsx +0 -470
- package/src/cli/cmd/tui/context/theme/aura.json +0 -69
- package/src/cli/cmd/tui/context/theme/ayu.json +0 -80
- package/src/cli/cmd/tui/context/theme/bloxycode.json +0 -245
- package/src/cli/cmd/tui/context/theme/carbonfox.json +0 -248
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +0 -233
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +0 -233
- package/src/cli/cmd/tui/context/theme/catppuccin.json +0 -112
- package/src/cli/cmd/tui/context/theme/cobalt2.json +0 -228
- package/src/cli/cmd/tui/context/theme/cursor.json +0 -249
- package/src/cli/cmd/tui/context/theme/dracula.json +0 -219
- package/src/cli/cmd/tui/context/theme/everforest.json +0 -241
- package/src/cli/cmd/tui/context/theme/flexoki.json +0 -237
- package/src/cli/cmd/tui/context/theme/github.json +0 -233
- package/src/cli/cmd/tui/context/theme/gruvbox.json +0 -242
- package/src/cli/cmd/tui/context/theme/kanagawa.json +0 -77
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +0 -237
- package/src/cli/cmd/tui/context/theme/material.json +0 -235
- package/src/cli/cmd/tui/context/theme/matrix.json +0 -77
- package/src/cli/cmd/tui/context/theme/mercury.json +0 -252
- package/src/cli/cmd/tui/context/theme/monokai.json +0 -221
- package/src/cli/cmd/tui/context/theme/nightowl.json +0 -221
- package/src/cli/cmd/tui/context/theme/nord.json +0 -223
- package/src/cli/cmd/tui/context/theme/one-dark.json +0 -84
- package/src/cli/cmd/tui/context/theme/orng.json +0 -249
- package/src/cli/cmd/tui/context/theme/osaka-jade.json +0 -93
- package/src/cli/cmd/tui/context/theme/palenight.json +0 -222
- package/src/cli/cmd/tui/context/theme/rosepine.json +0 -234
- package/src/cli/cmd/tui/context/theme/solarized.json +0 -223
- package/src/cli/cmd/tui/context/theme/synthwave84.json +0 -226
- package/src/cli/cmd/tui/context/theme/tokyonight.json +0 -243
- package/src/cli/cmd/tui/context/theme/vercel.json +0 -245
- package/src/cli/cmd/tui/context/theme/vesper.json +0 -218
- package/src/cli/cmd/tui/context/theme/zenburn.json +0 -223
- package/src/cli/cmd/tui/context/theme.tsx +0 -1152
- package/src/cli/cmd/tui/event.ts +0 -48
- package/src/cli/cmd/tui/routes/home.tsx +0 -140
- package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +0 -64
- package/src/cli/cmd/tui/routes/session/dialog-message.tsx +0 -109
- package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +0 -26
- package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +0 -47
- package/src/cli/cmd/tui/routes/session/footer.tsx +0 -91
- package/src/cli/cmd/tui/routes/session/header.tsx +0 -142
- package/src/cli/cmd/tui/routes/session/index.tsx +0 -2048
- package/src/cli/cmd/tui/routes/session/permission.tsx +0 -508
- package/src/cli/cmd/tui/routes/session/question.tsx +0 -453
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +0 -313
- package/src/cli/cmd/tui/thread.ts +0 -165
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +0 -57
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +0 -83
- package/src/cli/cmd/tui/ui/dialog-export-options.tsx +0 -204
- package/src/cli/cmd/tui/ui/dialog-help.tsx +0 -38
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +0 -77
- package/src/cli/cmd/tui/ui/dialog-select.tsx +0 -385
- package/src/cli/cmd/tui/ui/dialog.tsx +0 -167
- package/src/cli/cmd/tui/ui/link.tsx +0 -28
- package/src/cli/cmd/tui/ui/spinner.ts +0 -368
- package/src/cli/cmd/tui/ui/toast.tsx +0 -100
- package/src/cli/cmd/tui/util/clipboard.ts +0 -160
- package/src/cli/cmd/tui/util/editor.ts +0 -32
- package/src/cli/cmd/tui/util/signal.ts +0 -7
- package/src/cli/cmd/tui/util/terminal.ts +0 -114
- package/src/cli/cmd/tui/util/transcript.ts +0 -98
- package/src/cli/cmd/tui/worker.ts +0 -152
- package/src/cli/cmd/uninstall.ts +0 -357
- package/src/cli/cmd/upgrade.ts +0 -73
- package/src/cli/cmd/web.ts +0 -81
- package/src/cli/error.ts +0 -57
- package/src/cli/network.ts +0 -53
- package/src/cli/ui.ts +0 -86
- package/src/cli/upgrade.ts +0 -25
- package/src/command/index.ts +0 -173
- package/src/command/template/bloxy-resume.txt +0 -15
- package/src/command/template/bloxy-status.txt +0 -25
- package/src/command/template/bloxy-validate.txt +0 -22
- package/src/command/template/bloxy.txt +0 -14
- package/src/command/template/initialize.txt +0 -10
- package/src/command/template/review.txt +0 -99
- package/src/config/config.ts +0 -1367
- package/src/config/markdown.ts +0 -93
- package/src/env/index.ts +0 -26
- package/src/file/ignore.ts +0 -83
- package/src/file/index.ts +0 -415
- package/src/file/ripgrep.ts +0 -407
- package/src/file/time.ts +0 -69
- package/src/file/watcher.ts +0 -127
- package/src/flag/flag.ts +0 -79
- package/src/format/formatter.ts +0 -357
- package/src/format/index.ts +0 -137
- package/src/global/index.ts +0 -55
- package/src/id/id.ts +0 -83
- package/src/ide/index.ts +0 -76
- package/src/index.ts +0 -159
- package/src/installation/index.ts +0 -246
- package/src/lsp/client.ts +0 -252
- package/src/lsp/index.ts +0 -485
- package/src/lsp/language.ts +0 -119
- package/src/lsp/server.ts +0 -2046
- package/src/mcp/auth.ts +0 -135
- package/src/mcp/index.ts +0 -934
- package/src/mcp/oauth-callback.ts +0 -200
- package/src/mcp/oauth-provider.ts +0 -154
- package/src/patch/index.ts +0 -680
- package/src/permission/arity.ts +0 -163
- package/src/permission/index.ts +0 -210
- package/src/permission/next.ts +0 -280
- package/src/plugin/antigravity.ts +0 -378
- package/src/plugin/codex.ts +0 -506
- package/src/plugin/copilot.ts +0 -298
- package/src/plugin/index.ts +0 -136
- package/src/project/bootstrap.ts +0 -35
- package/src/project/instance.ts +0 -91
- package/src/project/project.ts +0 -371
- package/src/project/state.ts +0 -66
- package/src/project/vcs.ts +0 -76
- package/src/provider/auth.ts +0 -147
- package/src/provider/models-snapshot.ts +0 -2
- package/src/provider/models.ts +0 -133
- package/src/provider/provider.ts +0 -1241
- package/src/provider/sdk/openai-compatible/src/README.md +0 -5
- package/src/provider/sdk/openai-compatible/src/index.ts +0 -2
- package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +0 -100
- package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +0 -303
- package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +0 -22
- package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +0 -18
- package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +0 -22
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +0 -207
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +0 -1732
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +0 -177
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +0 -1
- package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +0 -88
- package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +0 -128
- package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +0 -115
- package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +0 -65
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +0 -104
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +0 -103
- package/src/provider/transform.ts +0 -741
- package/src/pty/index.ts +0 -241
- package/src/question/index.ts +0 -171
- package/src/scheduler/index.ts +0 -61
- package/src/server/error.ts +0 -36
- package/src/server/event.ts +0 -7
- package/src/server/mdns.ts +0 -59
- package/src/server/routes/config.ts +0 -92
- package/src/server/routes/experimental.ts +0 -208
- package/src/server/routes/file.ts +0 -197
- package/src/server/routes/global.ts +0 -135
- package/src/server/routes/mcp.ts +0 -225
- package/src/server/routes/permission.ts +0 -68
- package/src/server/routes/project.ts +0 -82
- package/src/server/routes/provider.ts +0 -165
- package/src/server/routes/pty.ts +0 -169
- package/src/server/routes/question.ts +0 -98
- package/src/server/routes/session.ts +0 -939
- package/src/server/routes/tui.ts +0 -379
- package/src/server/server.ts +0 -604
- package/src/session/compaction.ts +0 -225
- package/src/session/fallback.ts +0 -246
- package/src/session/index.ts +0 -498
- package/src/session/instruction.ts +0 -164
- package/src/session/llm.ts +0 -298
- package/src/session/message-v2.ts +0 -747
- package/src/session/message.ts +0 -189
- package/src/session/processor.ts +0 -450
- package/src/session/prompt/anthropic-20250930.txt +0 -166
- package/src/session/prompt/anthropic.txt +0 -105
- package/src/session/prompt/beast.txt +0 -147
- package/src/session/prompt/build-switch.txt +0 -5
- package/src/session/prompt/codex_header.txt +0 -79
- package/src/session/prompt/copilot-gpt-5.txt +0 -143
- package/src/session/prompt/gemini.txt +0 -155
- package/src/session/prompt/max-steps.txt +0 -16
- package/src/session/prompt/plan-reminder-anthropic.txt +0 -67
- package/src/session/prompt/plan.txt +0 -26
- package/src/session/prompt/qwen.txt +0 -109
- package/src/session/prompt.ts +0 -1822
- package/src/session/retry.ts +0 -99
- package/src/session/revert.ts +0 -121
- package/src/session/status.ts +0 -100
- package/src/session/summary.ts +0 -217
- package/src/session/system.ts +0 -52
- package/src/session/todo.ts +0 -37
- package/src/share/share-next.ts +0 -200
- package/src/share/share.ts +0 -92
- package/src/shell/shell.ts +0 -67
- package/src/skill/index.ts +0 -1
- package/src/skill/skill.ts +0 -135
- package/src/snapshot/index.ts +0 -236
- package/src/storage/storage.ts +0 -227
- package/src/tool/apply_patch.ts +0 -281
- package/src/tool/apply_patch.txt +0 -33
- package/src/tool/bash.ts +0 -258
- package/src/tool/bash.txt +0 -115
- package/src/tool/batch.ts +0 -175
- package/src/tool/batch.txt +0 -24
- package/src/tool/bloxy-control.ts +0 -123
- package/src/tool/bloxy-control.txt +0 -13
- package/src/tool/codesearch.ts +0 -132
- package/src/tool/codesearch.txt +0 -12
- package/src/tool/edit.ts +0 -655
- package/src/tool/edit.txt +0 -10
- package/src/tool/external-directory.ts +0 -32
- package/src/tool/glob.ts +0 -77
- package/src/tool/glob.txt +0 -6
- package/src/tool/grep.ts +0 -154
- package/src/tool/grep.txt +0 -8
- package/src/tool/invalid.ts +0 -17
- package/src/tool/ls.ts +0 -121
- package/src/tool/ls.txt +0 -1
- package/src/tool/lsp.ts +0 -96
- package/src/tool/lsp.txt +0 -19
- package/src/tool/multiedit.ts +0 -46
- package/src/tool/multiedit.txt +0 -41
- package/src/tool/plan-enter.txt +0 -14
- package/src/tool/plan-exit.txt +0 -13
- package/src/tool/plan.ts +0 -130
- package/src/tool/question.ts +0 -33
- package/src/tool/question.txt +0 -10
- package/src/tool/read.ts +0 -211
- package/src/tool/read.txt +0 -12
- package/src/tool/registry.ts +0 -161
- package/src/tool/skill.ts +0 -82
- package/src/tool/task.ts +0 -191
- package/src/tool/task.txt +0 -60
- package/src/tool/todo.ts +0 -53
- package/src/tool/todoread.txt +0 -14
- package/src/tool/todowrite.txt +0 -167
- package/src/tool/tool.ts +0 -89
- package/src/tool/truncation.ts +0 -106
- package/src/tool/webfetch.ts +0 -188
- package/src/tool/webfetch.txt +0 -13
- package/src/tool/websearch.ts +0 -150
- package/src/tool/websearch.txt +0 -14
- package/src/tool/write.ts +0 -85
- package/src/tool/write.txt +0 -8
- package/src/util/archive.ts +0 -16
- package/src/util/binary.ts +0 -41
- package/src/util/color.ts +0 -19
- package/src/util/context.ts +0 -25
- package/src/util/defer.ts +0 -12
- package/src/util/error.ts +0 -54
- package/src/util/eventloop.ts +0 -20
- package/src/util/filesystem.ts +0 -93
- package/src/util/fn.ts +0 -11
- package/src/util/format.ts +0 -20
- package/src/util/iife.ts +0 -3
- package/src/util/keybind.ts +0 -103
- package/src/util/lazy.ts +0 -23
- package/src/util/locale.ts +0 -81
- package/src/util/lock.ts +0 -98
- package/src/util/log.ts +0 -180
- package/src/util/queue.ts +0 -32
- package/src/util/rpc.ts +0 -66
- package/src/util/scrap.ts +0 -10
- package/src/util/signal.ts +0 -12
- package/src/util/slug.ts +0 -74
- package/src/util/timeout.ts +0 -14
- package/src/util/token.ts +0 -7
- package/src/util/wildcard.ts +0 -56
- package/src/worktree/index.ts +0 -549
package/src/bloxy/runner.ts
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
import { Instance } from "../project/instance"
|
|
2
|
-
import { Log } from "../util/log"
|
|
3
|
-
import { Bus } from "../bus"
|
|
4
|
-
import { BloxyState } from "./state"
|
|
5
|
-
import { BloxyParser } from "./parser"
|
|
6
|
-
import { BloxyPrompt } from "./prompt"
|
|
7
|
-
import { BloxyEvent } from "./event"
|
|
8
|
-
|
|
9
|
-
export namespace BloxyRunner {
|
|
10
|
-
const log = Log.create({ service: "bloxy.runner" })
|
|
11
|
-
|
|
12
|
-
export interface StartOptions {
|
|
13
|
-
prdPath: string
|
|
14
|
-
sessionID: string
|
|
15
|
-
config?: Partial<BloxyState.Config>
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Start a new Bloxy session by parsing the PRD and initializing state
|
|
20
|
-
*/
|
|
21
|
-
export async function start(options: StartOptions): Promise<BloxyState.Session> {
|
|
22
|
-
const worktree = Instance.worktree
|
|
23
|
-
|
|
24
|
-
// Check for existing session
|
|
25
|
-
const existing = await BloxyState.load(worktree)
|
|
26
|
-
if (existing && !BloxyState.isComplete(existing)) {
|
|
27
|
-
log.info("Resuming existing session", { tasks: existing.tasks.length, current: existing.currentTaskIndex })
|
|
28
|
-
return existing
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Parse PRD and create new session
|
|
32
|
-
const result = await BloxyParser.parse({
|
|
33
|
-
worktree,
|
|
34
|
-
prdPath: options.prdPath,
|
|
35
|
-
config: options.config,
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
if (result.tasks.length === 0) {
|
|
39
|
-
throw new Error(`No tasks found in PRD file: ${options.prdPath}`)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const session = BloxyParser.createSession(result)
|
|
43
|
-
session.status = "running"
|
|
44
|
-
session.time.started = Date.now()
|
|
45
|
-
|
|
46
|
-
await BloxyState.save(worktree, session)
|
|
47
|
-
|
|
48
|
-
// Publish start event
|
|
49
|
-
await Bus.publish(BloxyEvent.SessionStart, {
|
|
50
|
-
sessionID: options.sessionID,
|
|
51
|
-
prdPath: result.prdPath,
|
|
52
|
-
taskCount: result.tasks.length,
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
log.info("Started Bloxy session", { tasks: session.tasks.length, prdPath: result.prdPath })
|
|
56
|
-
|
|
57
|
-
return session
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Get the context message to inject for the current task
|
|
62
|
-
*/
|
|
63
|
-
export async function getTaskContext(sessionID: string): Promise<string | null> {
|
|
64
|
-
const worktree = Instance.worktree
|
|
65
|
-
const session = await BloxyState.load(worktree)
|
|
66
|
-
|
|
67
|
-
if (!session) {
|
|
68
|
-
return null
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (BloxyState.isComplete(session)) {
|
|
72
|
-
return BloxyPrompt.buildCompletionSummary(session)
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const task = BloxyState.getCurrentTask(session)
|
|
76
|
-
if (!task) {
|
|
77
|
-
return null
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Mark task as in progress if it's pending
|
|
81
|
-
if (task.status === "pending") {
|
|
82
|
-
await BloxyState.markInProgress(worktree, session, task.id)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return BloxyPrompt.buildTaskContext(session, task)
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Check if the session should continue to the next task
|
|
90
|
-
*/
|
|
91
|
-
export async function shouldContinue(): Promise<boolean> {
|
|
92
|
-
const worktree = Instance.worktree
|
|
93
|
-
const session = await BloxyState.load(worktree)
|
|
94
|
-
|
|
95
|
-
if (!session) {
|
|
96
|
-
return false
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return BloxyState.shouldContinue(session)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Complete the session and clean up
|
|
104
|
-
*/
|
|
105
|
-
export async function complete(sessionID: string): Promise<void> {
|
|
106
|
-
const worktree = Instance.worktree
|
|
107
|
-
const session = await BloxyState.load(worktree)
|
|
108
|
-
|
|
109
|
-
if (!session) {
|
|
110
|
-
return
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const completed = BloxyState.countCompleted(session)
|
|
114
|
-
const failed = BloxyState.countFailed(session)
|
|
115
|
-
const total = session.tasks.length
|
|
116
|
-
|
|
117
|
-
// Publish completion event
|
|
118
|
-
await Bus.publish(BloxyEvent.SessionComplete, {
|
|
119
|
-
sessionID,
|
|
120
|
-
completed,
|
|
121
|
-
failed,
|
|
122
|
-
total,
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
log.info("Bloxy session complete", { completed, failed, total })
|
|
126
|
-
|
|
127
|
-
// Update PRD file with completion markers
|
|
128
|
-
for (const task of session.tasks) {
|
|
129
|
-
if (task.status === "completed") {
|
|
130
|
-
await BloxyParser.markTaskInFile(session.prdPath, task.title)
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Pause the current session
|
|
137
|
-
*/
|
|
138
|
-
export async function pause(): Promise<void> {
|
|
139
|
-
const worktree = Instance.worktree
|
|
140
|
-
const session = await BloxyState.load(worktree)
|
|
141
|
-
|
|
142
|
-
if (session) {
|
|
143
|
-
await BloxyState.pause(worktree, session)
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Resume a paused session
|
|
149
|
-
*/
|
|
150
|
-
export async function resume(): Promise<void> {
|
|
151
|
-
const worktree = Instance.worktree
|
|
152
|
-
const session = await BloxyState.load(worktree)
|
|
153
|
-
|
|
154
|
-
if (session) {
|
|
155
|
-
await BloxyState.resume(worktree, session)
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Stop the session completely
|
|
161
|
-
*/
|
|
162
|
-
export async function stop(): Promise<void> {
|
|
163
|
-
const worktree = Instance.worktree
|
|
164
|
-
await BloxyState.remove(worktree)
|
|
165
|
-
log.info("Bloxy session stopped and removed")
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Get the current status for display
|
|
170
|
-
*/
|
|
171
|
-
export async function getStatus(): Promise<{
|
|
172
|
-
active: boolean
|
|
173
|
-
session: BloxyState.Session | null
|
|
174
|
-
statusLine: string
|
|
175
|
-
}> {
|
|
176
|
-
const worktree = Instance.worktree
|
|
177
|
-
const session = await BloxyState.load(worktree)
|
|
178
|
-
|
|
179
|
-
if (!session) {
|
|
180
|
-
return {
|
|
181
|
-
active: false,
|
|
182
|
-
session: null,
|
|
183
|
-
statusLine: "No active Bloxy session",
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return {
|
|
188
|
-
active: !BloxyState.isComplete(session),
|
|
189
|
-
session,
|
|
190
|
-
statusLine: BloxyPrompt.buildStatusLine(session),
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
package/src/bloxy/state.ts
DELETED
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
import z from "zod"
|
|
2
|
-
import path from "path"
|
|
3
|
-
import fs from "fs/promises"
|
|
4
|
-
import { Log } from "../util/log"
|
|
5
|
-
|
|
6
|
-
export namespace BloxyState {
|
|
7
|
-
const log = Log.create({ service: "bloxy.state" })
|
|
8
|
-
|
|
9
|
-
export const Task = z.object({
|
|
10
|
-
id: z.string(),
|
|
11
|
-
title: z.string(),
|
|
12
|
-
body: z.string().optional(),
|
|
13
|
-
status: z.enum(["pending", "in_progress", "completed", "failed", "deferred"]),
|
|
14
|
-
attempts: z.number().default(0),
|
|
15
|
-
error: z.string().optional(),
|
|
16
|
-
summary: z.string().optional(),
|
|
17
|
-
time: z.object({
|
|
18
|
-
started: z.number().optional(),
|
|
19
|
-
completed: z.number().optional(),
|
|
20
|
-
}).default({}),
|
|
21
|
-
})
|
|
22
|
-
export type Task = z.infer<typeof Task>
|
|
23
|
-
|
|
24
|
-
export const Config = z.object({
|
|
25
|
-
maxRetries: z.number().default(3),
|
|
26
|
-
retryDelay: z.number().default(5000),
|
|
27
|
-
runTests: z.boolean().default(true),
|
|
28
|
-
testCommand: z.string().optional(),
|
|
29
|
-
lintCommand: z.string().optional(),
|
|
30
|
-
stopOnError: z.boolean().default(false),
|
|
31
|
-
autoCommit: z.boolean().default(false),
|
|
32
|
-
})
|
|
33
|
-
export type Config = z.infer<typeof Config>
|
|
34
|
-
|
|
35
|
-
export const Session = z.object({
|
|
36
|
-
tasks: z.array(Task),
|
|
37
|
-
currentTaskIndex: z.number().default(0),
|
|
38
|
-
prdPath: z.string(),
|
|
39
|
-
config: Config,
|
|
40
|
-
status: z.enum(["idle", "running", "paused", "completed", "failed"]).default("idle"),
|
|
41
|
-
time: z.object({
|
|
42
|
-
started: z.number().optional(),
|
|
43
|
-
completed: z.number().optional(),
|
|
44
|
-
}).default({}),
|
|
45
|
-
})
|
|
46
|
-
export type Session = z.infer<typeof Session>
|
|
47
|
-
|
|
48
|
-
const STATE_FILE = ".bloxycode/bloxy-state.json"
|
|
49
|
-
|
|
50
|
-
function statePath(worktree: string): string {
|
|
51
|
-
return path.join(worktree, STATE_FILE)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export async function load(worktree: string): Promise<Session | null> {
|
|
55
|
-
const filepath = statePath(worktree)
|
|
56
|
-
try {
|
|
57
|
-
const content = await fs.readFile(filepath, "utf-8")
|
|
58
|
-
const data = JSON.parse(content)
|
|
59
|
-
return Session.parse(data)
|
|
60
|
-
} catch (e) {
|
|
61
|
-
if ((e as NodeJS.ErrnoException).code === "ENOENT") {
|
|
62
|
-
return null
|
|
63
|
-
}
|
|
64
|
-
log.error("Failed to load bloxy state", { error: e })
|
|
65
|
-
return null
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export async function save(worktree: string, session: Session): Promise<void> {
|
|
70
|
-
const filepath = statePath(worktree)
|
|
71
|
-
const dir = path.dirname(filepath)
|
|
72
|
-
await fs.mkdir(dir, { recursive: true })
|
|
73
|
-
await fs.writeFile(filepath, JSON.stringify(session, null, 2))
|
|
74
|
-
log.info("Saved bloxy state", { tasks: session.tasks.length, current: session.currentTaskIndex })
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export async function remove(worktree: string): Promise<void> {
|
|
78
|
-
const filepath = statePath(worktree)
|
|
79
|
-
try {
|
|
80
|
-
await fs.unlink(filepath)
|
|
81
|
-
log.info("Removed bloxy state")
|
|
82
|
-
} catch (e) {
|
|
83
|
-
if ((e as NodeJS.ErrnoException).code !== "ENOENT") {
|
|
84
|
-
log.error("Failed to remove bloxy state", { error: e })
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export function getCurrentTask(session: Session): Task | null {
|
|
90
|
-
if (session.currentTaskIndex >= session.tasks.length) {
|
|
91
|
-
return null
|
|
92
|
-
}
|
|
93
|
-
return session.tasks[session.currentTaskIndex]
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export function getNextPendingTask(session: Session): Task | null {
|
|
97
|
-
for (let i = session.currentTaskIndex; i < session.tasks.length; i++) {
|
|
98
|
-
const status = session.tasks[i].status
|
|
99
|
-
if (status === "pending" || status === "in_progress") {
|
|
100
|
-
return session.tasks[i]
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return null
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export function getNextActionableTask(session: Session, skipFailed = false): Task | null {
|
|
107
|
-
for (let i = 0; i < session.tasks.length; i++) {
|
|
108
|
-
const status = session.tasks[i].status
|
|
109
|
-
if (status === "pending" || status === "in_progress") {
|
|
110
|
-
return session.tasks[i]
|
|
111
|
-
}
|
|
112
|
-
if (!skipFailed && status === "failed") {
|
|
113
|
-
return session.tasks[i]
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
return null
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export function countRemaining(session: Session): number {
|
|
120
|
-
return session.tasks.filter(t => t.status === "pending" || t.status === "in_progress").length
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export function countCompleted(session: Session): number {
|
|
124
|
-
return session.tasks.filter(t => t.status === "completed").length
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export function countFailed(session: Session): number {
|
|
128
|
-
return session.tasks.filter(t => t.status === "failed").length
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export function countDeferred(session: Session): number {
|
|
132
|
-
return session.tasks.filter(t => t.status === "deferred").length
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
export async function markInProgress(worktree: string, session: Session, taskId: string): Promise<Session> {
|
|
136
|
-
const task = session.tasks.find(t => t.id === taskId)
|
|
137
|
-
if (task) {
|
|
138
|
-
task.status = "in_progress"
|
|
139
|
-
task.time.started = Date.now()
|
|
140
|
-
task.attempts += 1
|
|
141
|
-
}
|
|
142
|
-
session.status = "running"
|
|
143
|
-
await save(worktree, session)
|
|
144
|
-
return session
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export async function markComplete(worktree: string, session: Session, taskId: string, summary?: string): Promise<Session> {
|
|
148
|
-
const task = session.tasks.find(t => t.id === taskId)
|
|
149
|
-
if (task) {
|
|
150
|
-
task.status = "completed"
|
|
151
|
-
task.time.completed = Date.now()
|
|
152
|
-
if (summary) task.summary = summary
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Find next pending task index
|
|
156
|
-
const nextIndex = session.tasks.findIndex((t, i) =>
|
|
157
|
-
i > session.currentTaskIndex && (t.status === "pending" || t.status === "in_progress")
|
|
158
|
-
)
|
|
159
|
-
|
|
160
|
-
if (nextIndex === -1) {
|
|
161
|
-
// All tasks done
|
|
162
|
-
session.currentTaskIndex = session.tasks.length
|
|
163
|
-
const allCompleted = session.tasks.every(t => t.status === "completed")
|
|
164
|
-
session.status = allCompleted ? "completed" : "failed"
|
|
165
|
-
session.time.completed = Date.now()
|
|
166
|
-
} else {
|
|
167
|
-
session.currentTaskIndex = nextIndex
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
await save(worktree, session)
|
|
171
|
-
log.info("Task completed", { taskId, remaining: countRemaining(session) })
|
|
172
|
-
return session
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
export async function markFailed(worktree: string, session: Session, taskId: string, error?: string): Promise<Session> {
|
|
176
|
-
const task = session.tasks.find(t => t.id === taskId)
|
|
177
|
-
if (task) {
|
|
178
|
-
task.time.completed = Date.now()
|
|
179
|
-
if (error) task.error = error
|
|
180
|
-
|
|
181
|
-
// Check if we should retry
|
|
182
|
-
if (task.attempts < session.config.maxRetries) {
|
|
183
|
-
task.status = "pending" // Reset to pending for retry
|
|
184
|
-
log.info("Task failed, will retry", { taskId, attempts: task.attempts, maxRetries: session.config.maxRetries })
|
|
185
|
-
} else {
|
|
186
|
-
task.status = "failed"
|
|
187
|
-
log.error("Task failed after max retries", { taskId, error })
|
|
188
|
-
|
|
189
|
-
if (session.config.stopOnError) {
|
|
190
|
-
session.status = "failed"
|
|
191
|
-
session.time.completed = Date.now()
|
|
192
|
-
} else {
|
|
193
|
-
// Move to next task
|
|
194
|
-
const nextIndex = session.tasks.findIndex((t, i) =>
|
|
195
|
-
i > session.currentTaskIndex && t.status === "pending"
|
|
196
|
-
)
|
|
197
|
-
if (nextIndex === -1) {
|
|
198
|
-
session.status = "completed"
|
|
199
|
-
session.time.completed = Date.now()
|
|
200
|
-
} else {
|
|
201
|
-
session.currentTaskIndex = nextIndex
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
await save(worktree, session)
|
|
208
|
-
return session
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
export async function pause(worktree: string, session: Session): Promise<Session> {
|
|
212
|
-
session.status = "paused"
|
|
213
|
-
await save(worktree, session)
|
|
214
|
-
log.info("Bloxy session paused")
|
|
215
|
-
return session
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
export async function resume(worktree: string, session: Session): Promise<Session> {
|
|
219
|
-
if (session.status === "paused") {
|
|
220
|
-
session.status = "running"
|
|
221
|
-
await save(worktree, session)
|
|
222
|
-
log.info("Bloxy session resumed")
|
|
223
|
-
}
|
|
224
|
-
return session
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
export function isComplete(session: Session): boolean {
|
|
228
|
-
return session.status === "completed" || session.status === "failed"
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
export function shouldContinue(session: Session): boolean {
|
|
232
|
-
return session.status === "running" && countRemaining(session) > 0
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
export function formatProgress(session: Session): string {
|
|
236
|
-
const completed = countCompleted(session)
|
|
237
|
-
const failed = countFailed(session)
|
|
238
|
-
const total = session.tasks.length
|
|
239
|
-
const current = getCurrentTask(session)
|
|
240
|
-
|
|
241
|
-
if (current) {
|
|
242
|
-
return `Task ${completed + 1}/${total}: ${current.title}${failed > 0 ? ` (${failed} failed)` : ""}`
|
|
243
|
-
}
|
|
244
|
-
return `${completed}/${total} tasks completed${failed > 0 ? `, ${failed} failed` : ""}`
|
|
245
|
-
}
|
|
246
|
-
}
|
package/src/bun/index.ts
DELETED
|
@@ -1,134 +0,0 @@
|
|
|
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 "@/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
|
-
}
|
package/src/bus/bus-event.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
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
|
-
}
|