alchemylab-opencode 1.0.6 → 1.0.8
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/dist/arktype-aI7TBD0R-HX4BR3RX.js +21 -0
- package/dist/arktype-aI7TBD0R-HX4BR3RX.js.map +7 -0
- package/dist/{chunk-UWZSRZHA.js → chunk-23UYOGZG.js} +817 -315
- package/dist/chunk-23UYOGZG.js.map +7 -0
- package/dist/chunk-3AF5MXLF.js +49 -0
- package/dist/chunk-3AF5MXLF.js.map +7 -0
- package/dist/chunk-FMP3YLWX.js +30 -0
- package/dist/chunk-FMP3YLWX.js.map +7 -0
- package/dist/{chunk-ANDTK76Q.js → chunk-GSE2T5UY.js} +3 -3
- package/dist/{chunk-CYXMV3J3.js → chunk-LU5XVQUD.js} +4 -4
- package/dist/chunk-O5VWOPCL.js +106 -0
- package/dist/chunk-O5VWOPCL.js.map +7 -0
- package/dist/chunk-PWFRMDDF.js +12 -0
- package/dist/{chunk-DSPC5QIG.js → chunk-SM6WZDN6.js} +9 -9
- package/dist/{chunk-MCWTARFP.js → chunk-TASPMBUL.js} +4 -4
- package/dist/chunk-VL3RSEZ2.js +160 -0
- package/dist/chunk-VL3RSEZ2.js.map +7 -0
- package/dist/default-u_dwuiYb-WOFHQQ3K.js +22 -0
- package/dist/effect-QlVUlMFu-UERLUUQW.js +29 -0
- package/dist/effect-QlVUlMFu-UERLUUQW.js.map +7 -0
- package/dist/{mcp-VAU4RMWH.js → mcp-XFGN3FWW.js} +2 -2
- package/dist/{registry-PYMN6L3G.js → registry-W4MBVBYD.js} +3 -3
- package/dist/{run-YFVCQJQM.js → run-73HUV4H3.js} +9 -6
- package/dist/{run-YFVCQJQM.js.map → run-73HUV4H3.js.map} +1 -1
- package/dist/run.js +1 -1
- package/dist/serve.js +1 -1
- package/dist/{server-K3UGWASP.js → server-2CPOG3LS.js} +9 -6
- package/dist/{session-HJFWTM7C.js → session-M6HOZ56B.js} +3 -3
- package/dist/session-M6HOZ56B.js.map +7 -0
- package/dist/{share-next-55VCIMUH.js → share-next-QRBVSD37.js} +4 -4
- package/dist/share-next-QRBVSD37.js.map +7 -0
- package/dist/sury-CWZTCd75-XC3NCMTP.js +29 -0
- package/dist/sury-CWZTCd75-XC3NCMTP.js.map +7 -0
- package/dist/typebox-Dei93FPO-QOBKW4L7.js +21 -0
- package/dist/typebox-Dei93FPO-QOBKW4L7.js.map +7 -0
- package/dist/valibot--1zFm7rT-LHHLSLYY.js +29 -0
- package/dist/valibot--1zFm7rT-LHHLSLYY.js.map +7 -0
- package/dist/valibot-D_HTw1Gn-UR62BIDY.js +60 -0
- package/dist/valibot-D_HTw1Gn-UR62BIDY.js.map +7 -0
- package/dist/{worktree-6GGDLADY.js → worktree-3GUHT2P7.js} +5 -5
- package/dist/zod-Bwrt9trS-J2GOMA2R.js +43 -0
- package/dist/zod-Bwrt9trS-J2GOMA2R.js.map +7 -0
- package/dist/zod-DSgpEGAE-VTXQW6SB.js +56 -0
- package/dist/zod-DSgpEGAE-VTXQW6SB.js.map +7 -0
- package/package.json +2 -15
- package/build.mjs +0 -182
- package/dist/chunk-UWZSRZHA.js.map +0 -7
- package/packages/opencode/package.json +0 -138
- package/packages/opencode/src/account/account.sql.ts +0 -39
- package/packages/opencode/src/account/index.ts +0 -463
- package/packages/opencode/src/account/repo.ts +0 -163
- package/packages/opencode/src/account/schema.ts +0 -91
- package/packages/opencode/src/acp/README.md +0 -174
- package/packages/opencode/src/acp/agent.ts +0 -1847
- package/packages/opencode/src/acp/session.ts +0 -116
- package/packages/opencode/src/acp/types.ts +0 -24
- package/packages/opencode/src/agent/agent.ts +0 -420
- package/packages/opencode/src/agent/generate.txt +0 -75
- package/packages/opencode/src/agent/prompt/compaction.txt +0 -15
- package/packages/opencode/src/agent/prompt/explore.txt +0 -18
- package/packages/opencode/src/agent/prompt/summary.txt +0 -11
- package/packages/opencode/src/agent/prompt/title.txt +0 -44
- package/packages/opencode/src/auth/index.ts +0 -110
- package/packages/opencode/src/bus/bus-event.ts +0 -40
- package/packages/opencode/src/bus/global.ts +0 -10
- package/packages/opencode/src/bus/index.ts +0 -185
- package/packages/opencode/src/cli/bootstrap.ts +0 -17
- package/packages/opencode/src/cli/cmd/cmd.ts +0 -7
- package/packages/opencode/src/cli/cmd/run.ts +0 -689
- package/packages/opencode/src/cli/cmd/serve.ts +0 -24
- package/packages/opencode/src/cli/cmd/tui/event.ts +0 -49
- package/packages/opencode/src/cli/effect/prompt.ts +0 -25
- package/packages/opencode/src/cli/error.ts +0 -46
- package/packages/opencode/src/cli/heap.ts +0 -59
- package/packages/opencode/src/cli/logo.ts +0 -6
- package/packages/opencode/src/cli/network.ts +0 -60
- package/packages/opencode/src/cli/ui.ts +0 -133
- package/packages/opencode/src/cli/upgrade.ts +0 -31
- package/packages/opencode/src/command/index.ts +0 -195
- package/packages/opencode/src/command/template/initialize.txt +0 -66
- package/packages/opencode/src/command/template/review.txt +0 -101
- package/packages/opencode/src/config/config.ts +0 -1599
- package/packages/opencode/src/config/console-state.ts +0 -15
- package/packages/opencode/src/config/markdown.ts +0 -99
- package/packages/opencode/src/config/paths.ts +0 -167
- package/packages/opencode/src/config/tui-migrate.ts +0 -155
- package/packages/opencode/src/config/tui-schema.ts +0 -37
- package/packages/opencode/src/config/tui.ts +0 -179
- package/packages/opencode/src/control-plane/adaptors/index.ts +0 -20
- package/packages/opencode/src/control-plane/adaptors/worktree.ts +0 -42
- package/packages/opencode/src/control-plane/schema.ts +0 -17
- package/packages/opencode/src/control-plane/sse.ts +0 -66
- package/packages/opencode/src/control-plane/types.ts +0 -32
- package/packages/opencode/src/control-plane/workspace.sql.ts +0 -17
- package/packages/opencode/src/control-plane/workspace.ts +0 -168
- package/packages/opencode/src/effect/cross-spawn-spawner.ts +0 -502
- package/packages/opencode/src/effect/instance-ref.ts +0 -6
- package/packages/opencode/src/effect/instance-registry.ts +0 -12
- package/packages/opencode/src/effect/instance-state.ts +0 -82
- package/packages/opencode/src/effect/run-service.ts +0 -33
- package/packages/opencode/src/effect/runner.ts +0 -216
- package/packages/opencode/src/env/index.ts +0 -28
- package/packages/opencode/src/file/ignore.ts +0 -82
- package/packages/opencode/src/file/index.ts +0 -686
- package/packages/opencode/src/file/protected.ts +0 -59
- package/packages/opencode/src/file/ripgrep.ts +0 -376
- package/packages/opencode/src/file/time.ts +0 -133
- package/packages/opencode/src/file/watcher.ts +0 -173
- package/packages/opencode/src/filesystem/index.ts +0 -236
- package/packages/opencode/src/flag/flag.ts +0 -156
- package/packages/opencode/src/format/formatter.ts +0 -413
- package/packages/opencode/src/format/index.ts +0 -203
- package/packages/opencode/src/git/index.ts +0 -303
- package/packages/opencode/src/global/index.ts +0 -56
- package/packages/opencode/src/id/id.ts +0 -85
- package/packages/opencode/src/ide/index.ts +0 -74
- package/packages/opencode/src/installation/index.ts +0 -355
- package/packages/opencode/src/installation/meta.ts +0 -7
- package/packages/opencode/src/lsp/client.ts +0 -252
- package/packages/opencode/src/lsp/index.ts +0 -558
- package/packages/opencode/src/lsp/language.ts +0 -120
- package/packages/opencode/src/lsp/launch.ts +0 -21
- package/packages/opencode/src/lsp/server.ts +0 -1968
- package/packages/opencode/src/mcp/auth.ts +0 -173
- package/packages/opencode/src/mcp/index.ts +0 -931
- package/packages/opencode/src/mcp/oauth-callback.ts +0 -216
- package/packages/opencode/src/mcp/oauth-provider.ts +0 -185
- package/packages/opencode/src/node-loader.mjs +0 -104
- package/packages/opencode/src/node-preload.mjs +0 -39
- package/packages/opencode/src/node.ts +0 -1
- package/packages/opencode/src/npm/index.ts +0 -188
- package/packages/opencode/src/patch/index.ts +0 -680
- package/packages/opencode/src/permission/arity.ts +0 -163
- package/packages/opencode/src/permission/evaluate.ts +0 -15
- package/packages/opencode/src/permission/index.ts +0 -325
- package/packages/opencode/src/permission/schema.ts +0 -17
- package/packages/opencode/src/plugin/cloudflare.ts +0 -67
- package/packages/opencode/src/plugin/codex.ts +0 -608
- package/packages/opencode/src/plugin/github-copilot/copilot.ts +0 -361
- package/packages/opencode/src/plugin/github-copilot/models.ts +0 -144
- package/packages/opencode/src/plugin/index.ts +0 -299
- package/packages/opencode/src/plugin/install.ts +0 -439
- package/packages/opencode/src/plugin/loader.ts +0 -174
- package/packages/opencode/src/plugin/meta.ts +0 -188
- package/packages/opencode/src/plugin/shared.ts +0 -323
- package/packages/opencode/src/project/bootstrap.ts +0 -31
- package/packages/opencode/src/project/instance.ts +0 -175
- package/packages/opencode/src/project/project.sql.ts +0 -16
- package/packages/opencode/src/project/project.ts +0 -519
- package/packages/opencode/src/project/schema.ts +0 -16
- package/packages/opencode/src/project/state.ts +0 -70
- package/packages/opencode/src/project/vcs.ts +0 -240
- package/packages/opencode/src/provider/auth.ts +0 -253
- package/packages/opencode/src/provider/error.ts +0 -197
- package/packages/opencode/src/provider/models.ts +0 -162
- package/packages/opencode/src/provider/provider.ts +0 -1709
- package/packages/opencode/src/provider/schema.ts +0 -38
- package/packages/opencode/src/provider/sdk/copilot/README.md +0 -5
- package/packages/opencode/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +0 -170
- package/packages/opencode/src/provider/sdk/copilot/chat/get-response-metadata.ts +0 -15
- package/packages/opencode/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +0 -19
- package/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts +0 -64
- package/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts +0 -815
- package/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts +0 -28
- package/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +0 -44
- package/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts +0 -83
- package/packages/opencode/src/provider/sdk/copilot/copilot-provider.ts +0 -100
- package/packages/opencode/src/provider/sdk/copilot/index.ts +0 -2
- package/packages/opencode/src/provider/sdk/copilot/openai-compatible-error.ts +0 -27
- package/packages/opencode/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts +0 -335
- package/packages/opencode/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts +0 -22
- package/packages/opencode/src/provider/sdk/copilot/responses/openai-config.ts +0 -18
- package/packages/opencode/src/provider/sdk/copilot/responses/openai-error.ts +0 -22
- package/packages/opencode/src/provider/sdk/copilot/responses/openai-responses-api-types.ts +0 -214
- package/packages/opencode/src/provider/sdk/copilot/responses/openai-responses-language-model.ts +0 -1769
- package/packages/opencode/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts +0 -173
- package/packages/opencode/src/provider/sdk/copilot/responses/openai-responses-settings.ts +0 -1
- package/packages/opencode/src/provider/sdk/copilot/responses/tool/code-interpreter.ts +0 -87
- package/packages/opencode/src/provider/sdk/copilot/responses/tool/file-search.ts +0 -127
- package/packages/opencode/src/provider/sdk/copilot/responses/tool/image-generation.ts +0 -114
- package/packages/opencode/src/provider/sdk/copilot/responses/tool/local-shell.ts +0 -64
- package/packages/opencode/src/provider/sdk/copilot/responses/tool/web-search-preview.ts +0 -103
- package/packages/opencode/src/provider/sdk/copilot/responses/tool/web-search.ts +0 -102
- package/packages/opencode/src/provider/transform.ts +0 -1050
- package/packages/opencode/src/pty/index.ts +0 -397
- package/packages/opencode/src/pty/pty.node.ts +0 -27
- package/packages/opencode/src/pty/pty.ts +0 -25
- package/packages/opencode/src/pty/schema.ts +0 -17
- package/packages/opencode/src/question/index.ts +0 -224
- package/packages/opencode/src/question/schema.ts +0 -17
- package/packages/opencode/src/run.ts +0 -28
- package/packages/opencode/src/serve.ts +0 -45
- package/packages/opencode/src/server/error.ts +0 -36
- package/packages/opencode/src/server/event.ts +0 -7
- package/packages/opencode/src/server/instance.ts +0 -324
- package/packages/opencode/src/server/mdns.ts +0 -60
- package/packages/opencode/src/server/middleware.ts +0 -33
- package/packages/opencode/src/server/projectors.ts +0 -28
- package/packages/opencode/src/server/proxy.ts +0 -131
- package/packages/opencode/src/server/router.ts +0 -105
- package/packages/opencode/src/server/routes/config.ts +0 -92
- package/packages/opencode/src/server/routes/event.ts +0 -83
- package/packages/opencode/src/server/routes/experimental.ts +0 -374
- package/packages/opencode/src/server/routes/file.ts +0 -197
- package/packages/opencode/src/server/routes/global.ts +0 -312
- package/packages/opencode/src/server/routes/mcp.ts +0 -225
- package/packages/opencode/src/server/routes/permission.ts +0 -69
- package/packages/opencode/src/server/routes/project.ts +0 -118
- package/packages/opencode/src/server/routes/provider.ts +0 -171
- package/packages/opencode/src/server/routes/pty.ts +0 -210
- package/packages/opencode/src/server/routes/question.ts +0 -99
- package/packages/opencode/src/server/routes/session.ts +0 -1030
- package/packages/opencode/src/server/routes/tui.ts +0 -379
- package/packages/opencode/src/server/routes/workspace.ts +0 -94
- package/packages/opencode/src/server/server.ts +0 -353
- package/packages/opencode/src/session/compaction.ts +0 -428
- package/packages/opencode/src/session/index.ts +0 -887
- package/packages/opencode/src/session/instruction.ts +0 -258
- package/packages/opencode/src/session/llm.ts +0 -354
- package/packages/opencode/src/session/message-v2.ts +0 -1031
- package/packages/opencode/src/session/message.ts +0 -191
- package/packages/opencode/src/session/overflow.ts +0 -22
- package/packages/opencode/src/session/processor.ts +0 -523
- package/packages/opencode/src/session/projectors.ts +0 -135
- package/packages/opencode/src/session/prompt/anthropic.txt +0 -105
- package/packages/opencode/src/session/prompt/beast.txt +0 -147
- package/packages/opencode/src/session/prompt/build-switch.txt +0 -5
- package/packages/opencode/src/session/prompt/codex.txt +0 -79
- package/packages/opencode/src/session/prompt/copilot-gpt-5.txt +0 -143
- package/packages/opencode/src/session/prompt/default.txt +0 -105
- package/packages/opencode/src/session/prompt/gemini.txt +0 -155
- package/packages/opencode/src/session/prompt/gpt.txt +0 -107
- package/packages/opencode/src/session/prompt/kimi.txt +0 -95
- package/packages/opencode/src/session/prompt/max-steps.txt +0 -16
- package/packages/opencode/src/session/prompt/plan-reminder-anthropic.txt +0 -67
- package/packages/opencode/src/session/prompt/plan.txt +0 -26
- package/packages/opencode/src/session/prompt/trinity.txt +0 -97
- package/packages/opencode/src/session/prompt.ts +0 -1911
- package/packages/opencode/src/session/retry.ts +0 -106
- package/packages/opencode/src/session/revert.ts +0 -176
- package/packages/opencode/src/session/schema.ts +0 -38
- package/packages/opencode/src/session/session.sql.ts +0 -103
- package/packages/opencode/src/session/status.ts +0 -102
- package/packages/opencode/src/session/summary.ts +0 -177
- package/packages/opencode/src/session/system.ts +0 -76
- package/packages/opencode/src/session/todo.ts +0 -95
- package/packages/opencode/src/share/share-next.ts +0 -369
- package/packages/opencode/src/share/share.sql.ts +0 -13
- package/packages/opencode/src/shell/shell.ts +0 -110
- package/packages/opencode/src/skill/discovery.ts +0 -116
- package/packages/opencode/src/skill/index.ts +0 -277
- package/packages/opencode/src/snapshot/index.ts +0 -726
- package/packages/opencode/src/sql.d.ts +0 -4
- package/packages/opencode/src/storage/db.node.ts +0 -8
- package/packages/opencode/src/storage/db.ts +0 -177
- package/packages/opencode/src/storage/json-migration.ts +0 -425
- package/packages/opencode/src/storage/schema.sql.ts +0 -10
- package/packages/opencode/src/storage/schema.ts +0 -5
- package/packages/opencode/src/storage/storage.ts +0 -353
- package/packages/opencode/src/sync/README.md +0 -179
- package/packages/opencode/src/sync/event.sql.ts +0 -16
- package/packages/opencode/src/sync/index.ts +0 -263
- package/packages/opencode/src/sync/schema.ts +0 -14
- package/packages/opencode/src/tool/apply_patch.ts +0 -281
- package/packages/opencode/src/tool/apply_patch.txt +0 -33
- package/packages/opencode/src/tool/bash.ts +0 -496
- package/packages/opencode/src/tool/bash.txt +0 -117
- package/packages/opencode/src/tool/batch.ts +0 -183
- package/packages/opencode/src/tool/batch.txt +0 -24
- package/packages/opencode/src/tool/codesearch.ts +0 -132
- package/packages/opencode/src/tool/codesearch.txt +0 -12
- package/packages/opencode/src/tool/edit.ts +0 -667
- package/packages/opencode/src/tool/edit.txt +0 -10
- package/packages/opencode/src/tool/external-directory.ts +0 -46
- package/packages/opencode/src/tool/glob.ts +0 -78
- package/packages/opencode/src/tool/glob.txt +0 -6
- package/packages/opencode/src/tool/grep.ts +0 -156
- package/packages/opencode/src/tool/grep.txt +0 -8
- package/packages/opencode/src/tool/invalid.ts +0 -17
- package/packages/opencode/src/tool/ls.ts +0 -121
- package/packages/opencode/src/tool/ls.txt +0 -1
- package/packages/opencode/src/tool/lsp.ts +0 -97
- package/packages/opencode/src/tool/lsp.txt +0 -19
- package/packages/opencode/src/tool/multiedit.ts +0 -46
- package/packages/opencode/src/tool/multiedit.txt +0 -41
- package/packages/opencode/src/tool/plan-enter.txt +0 -14
- package/packages/opencode/src/tool/plan-exit.txt +0 -13
- package/packages/opencode/src/tool/plan.ts +0 -131
- package/packages/opencode/src/tool/question.ts +0 -46
- package/packages/opencode/src/tool/question.txt +0 -10
- package/packages/opencode/src/tool/read.ts +0 -332
- package/packages/opencode/src/tool/read.txt +0 -14
- package/packages/opencode/src/tool/registry.ts +0 -265
- package/packages/opencode/src/tool/schema.ts +0 -17
- package/packages/opencode/src/tool/skill.ts +0 -105
- package/packages/opencode/src/tool/task.ts +0 -166
- package/packages/opencode/src/tool/task.txt +0 -60
- package/packages/opencode/src/tool/todo.ts +0 -48
- package/packages/opencode/src/tool/todowrite.txt +0 -167
- package/packages/opencode/src/tool/tool.ts +0 -112
- package/packages/opencode/src/tool/truncate.ts +0 -144
- package/packages/opencode/src/tool/truncation-dir.ts +0 -4
- package/packages/opencode/src/tool/webfetch.ts +0 -206
- package/packages/opencode/src/tool/webfetch.txt +0 -13
- package/packages/opencode/src/tool/websearch.ts +0 -150
- package/packages/opencode/src/tool/websearch.txt +0 -14
- package/packages/opencode/src/tool/write.ts +0 -84
- package/packages/opencode/src/tool/write.txt +0 -8
- package/packages/opencode/src/util/abort.ts +0 -35
- package/packages/opencode/src/util/archive.ts +0 -17
- package/packages/opencode/src/util/color.ts +0 -19
- package/packages/opencode/src/util/context.ts +0 -25
- package/packages/opencode/src/util/data-url.ts +0 -9
- package/packages/opencode/src/util/defer.ts +0 -12
- package/packages/opencode/src/util/effect-http-client.ts +0 -11
- package/packages/opencode/src/util/effect-zod.ts +0 -98
- package/packages/opencode/src/util/error.ts +0 -77
- package/packages/opencode/src/util/filesystem.ts +0 -245
- package/packages/opencode/src/util/flock.ts +0 -333
- package/packages/opencode/src/util/fn.ts +0 -21
- package/packages/opencode/src/util/format.ts +0 -20
- package/packages/opencode/src/util/glob.ts +0 -34
- package/packages/opencode/src/util/hash.ts +0 -7
- package/packages/opencode/src/util/iife.ts +0 -3
- package/packages/opencode/src/util/keybind.ts +0 -103
- package/packages/opencode/src/util/lazy.ts +0 -23
- package/packages/opencode/src/util/locale.ts +0 -81
- package/packages/opencode/src/util/lock.ts +0 -98
- package/packages/opencode/src/util/log.ts +0 -182
- package/packages/opencode/src/util/network.ts +0 -9
- package/packages/opencode/src/util/process.ts +0 -176
- package/packages/opencode/src/util/queue.ts +0 -32
- package/packages/opencode/src/util/record.ts +0 -3
- package/packages/opencode/src/util/rpc.ts +0 -66
- package/packages/opencode/src/util/schema.ts +0 -53
- package/packages/opencode/src/util/scrap.ts +0 -10
- package/packages/opencode/src/util/signal.ts +0 -12
- package/packages/opencode/src/util/timeout.ts +0 -14
- package/packages/opencode/src/util/token.ts +0 -7
- package/packages/opencode/src/util/update-schema.ts +0 -13
- package/packages/opencode/src/util/which.ts +0 -14
- package/packages/opencode/src/util/wildcard.ts +0 -59
- package/packages/opencode/src/worktree/index.ts +0 -612
- package/packages/plugin/package.json +0 -38
- package/packages/plugin/src/example.ts +0 -18
- package/packages/plugin/src/index.ts +0 -282
- package/packages/plugin/src/shell.ts +0 -136
- package/packages/plugin/src/tool.ts +0 -38
- package/packages/plugin/src/tui.ts +0 -508
- package/packages/script/package.json +0 -16
- package/packages/script/src/index.ts +0 -77
- package/packages/sdk/package.json +0 -33
- package/packages/sdk/src/client.ts +0 -55
- package/packages/sdk/src/gen/client/client.gen.ts +0 -212
- package/packages/sdk/src/gen/client/index.ts +0 -25
- package/packages/sdk/src/gen/client/types.gen.ts +0 -222
- package/packages/sdk/src/gen/client/utils.gen.ts +0 -287
- package/packages/sdk/src/gen/client.gen.ts +0 -22
- package/packages/sdk/src/gen/core/auth.gen.ts +0 -41
- package/packages/sdk/src/gen/core/bodySerializer.gen.ts +0 -74
- package/packages/sdk/src/gen/core/params.gen.ts +0 -144
- package/packages/sdk/src/gen/core/pathSerializer.gen.ts +0 -167
- package/packages/sdk/src/gen/core/queryKeySerializer.gen.ts +0 -111
- package/packages/sdk/src/gen/core/serverSentEvents.gen.ts +0 -210
- package/packages/sdk/src/gen/core/types.gen.ts +0 -91
- package/packages/sdk/src/gen/core/utils.gen.ts +0 -109
- package/packages/sdk/src/gen/sdk.gen.ts +0 -1197
- package/packages/sdk/src/gen/types.gen.ts +0 -3904
- package/packages/sdk/src/index.ts +0 -21
- package/packages/sdk/src/process.ts +0 -31
- package/packages/sdk/src/server.ts +0 -134
- package/packages/sdk/src/v2/client.ts +0 -81
- package/packages/sdk/src/v2/gen/client/client.gen.ts +0 -285
- package/packages/sdk/src/v2/gen/client/index.ts +0 -25
- package/packages/sdk/src/v2/gen/client/types.gen.ts +0 -202
- package/packages/sdk/src/v2/gen/client/utils.gen.ts +0 -289
- package/packages/sdk/src/v2/gen/client.gen.ts +0 -18
- package/packages/sdk/src/v2/gen/core/auth.gen.ts +0 -41
- package/packages/sdk/src/v2/gen/core/bodySerializer.gen.ts +0 -82
- package/packages/sdk/src/v2/gen/core/params.gen.ts +0 -169
- package/packages/sdk/src/v2/gen/core/pathSerializer.gen.ts +0 -167
- package/packages/sdk/src/v2/gen/core/queryKeySerializer.gen.ts +0 -111
- package/packages/sdk/src/v2/gen/core/serverSentEvents.gen.ts +0 -239
- package/packages/sdk/src/v2/gen/core/types.gen.ts +0 -86
- package/packages/sdk/src/v2/gen/core/utils.gen.ts +0 -137
- package/packages/sdk/src/v2/gen/sdk.gen.ts +0 -4223
- package/packages/sdk/src/v2/gen/types.gen.ts +0 -5265
- package/packages/sdk/src/v2/index.ts +0 -21
- package/packages/sdk/src/v2/server.ts +0 -134
- package/packages/util/package.json +0 -20
- package/packages/util/src/array.ts +0 -10
- package/packages/util/src/binary.ts +0 -41
- package/packages/util/src/encode.ts +0 -51
- package/packages/util/src/error.ts +0 -54
- package/packages/util/src/fn.ts +0 -11
- package/packages/util/src/identifier.ts +0 -48
- package/packages/util/src/iife.ts +0 -3
- package/packages/util/src/lazy.ts +0 -11
- package/packages/util/src/module.ts +0 -10
- package/packages/util/src/path.ts +0 -37
- package/packages/util/src/retry.ts +0 -41
- package/packages/util/src/slug.ts +0 -74
- package/postinstall.cjs +0 -55
- /package/dist/{chunk-ANDTK76Q.js.map → chunk-GSE2T5UY.js.map} +0 -0
- /package/dist/{chunk-CYXMV3J3.js.map → chunk-LU5XVQUD.js.map} +0 -0
- /package/dist/{mcp-VAU4RMWH.js.map → chunk-PWFRMDDF.js.map} +0 -0
- /package/dist/{chunk-DSPC5QIG.js.map → chunk-SM6WZDN6.js.map} +0 -0
- /package/dist/{chunk-MCWTARFP.js.map → chunk-TASPMBUL.js.map} +0 -0
- /package/dist/{registry-PYMN6L3G.js.map → default-u_dwuiYb-WOFHQQ3K.js.map} +0 -0
- /package/dist/{server-K3UGWASP.js.map → mcp-XFGN3FWW.js.map} +0 -0
- /package/dist/{session-HJFWTM7C.js.map → registry-W4MBVBYD.js.map} +0 -0
- /package/dist/{share-next-55VCIMUH.js.map → server-2CPOG3LS.js.map} +0 -0
- /package/dist/{worktree-6GGDLADY.js.map → worktree-3GUHT2P7.js.map} +0 -0
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
import { chmod, mkdir, readFile, stat as statFile, writeFile } from "fs/promises"
|
|
2
|
-
import { createWriteStream, existsSync, statSync } from "fs"
|
|
3
|
-
import { lookup } from "mime-types"
|
|
4
|
-
import { realpathSync } from "fs"
|
|
5
|
-
import { dirname, join, relative, resolve as pathResolve, win32 } from "path"
|
|
6
|
-
import { Readable } from "stream"
|
|
7
|
-
import { pipeline } from "stream/promises"
|
|
8
|
-
import { Glob } from "./glob"
|
|
9
|
-
|
|
10
|
-
export namespace Filesystem {
|
|
11
|
-
// Fast sync version for metadata checks
|
|
12
|
-
export async function exists(p: string): Promise<boolean> {
|
|
13
|
-
return existsSync(p)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export async function isDir(p: string): Promise<boolean> {
|
|
17
|
-
try {
|
|
18
|
-
return statSync(p).isDirectory()
|
|
19
|
-
} catch {
|
|
20
|
-
return false
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function stat(p: string): ReturnType<typeof statSync> | undefined {
|
|
25
|
-
return statSync(p, { throwIfNoEntry: false }) ?? undefined
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export async function statAsync(p: string): Promise<ReturnType<typeof statSync> | undefined> {
|
|
29
|
-
return statFile(p).catch((e) => {
|
|
30
|
-
if (isEnoent(e)) return undefined
|
|
31
|
-
throw e
|
|
32
|
-
})
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export async function size(p: string): Promise<number> {
|
|
36
|
-
const s = stat(p)?.size ?? 0
|
|
37
|
-
return typeof s === "bigint" ? Number(s) : s
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export async function readText(p: string): Promise<string> {
|
|
41
|
-
return readFile(p, "utf-8")
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export async function readJson<T = any>(p: string): Promise<T> {
|
|
45
|
-
return JSON.parse(await readFile(p, "utf-8"))
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export async function readBytes(p: string): Promise<Buffer> {
|
|
49
|
-
return readFile(p)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export async function readArrayBuffer(p: string): Promise<ArrayBuffer> {
|
|
53
|
-
const buf = await readFile(p)
|
|
54
|
-
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function isEnoent(e: unknown): e is { code: "ENOENT" } {
|
|
58
|
-
return typeof e === "object" && e !== null && "code" in e && (e as { code: string }).code === "ENOENT"
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export async function write(p: string, content: string | Buffer | Uint8Array, mode?: number): Promise<void> {
|
|
62
|
-
try {
|
|
63
|
-
if (mode) {
|
|
64
|
-
await writeFile(p, content, { mode })
|
|
65
|
-
} else {
|
|
66
|
-
await writeFile(p, content)
|
|
67
|
-
}
|
|
68
|
-
} catch (e) {
|
|
69
|
-
if (isEnoent(e)) {
|
|
70
|
-
await mkdir(dirname(p), { recursive: true })
|
|
71
|
-
if (mode) {
|
|
72
|
-
await writeFile(p, content, { mode })
|
|
73
|
-
} else {
|
|
74
|
-
await writeFile(p, content)
|
|
75
|
-
}
|
|
76
|
-
return
|
|
77
|
-
}
|
|
78
|
-
throw e
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export async function writeJson(p: string, data: unknown, mode?: number): Promise<void> {
|
|
83
|
-
return write(p, JSON.stringify(data, null, 2), mode)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export async function writeStream(
|
|
87
|
-
p: string,
|
|
88
|
-
stream: ReadableStream<Uint8Array> | Readable,
|
|
89
|
-
mode?: number,
|
|
90
|
-
): Promise<void> {
|
|
91
|
-
const dir = dirname(p)
|
|
92
|
-
if (!existsSync(dir)) {
|
|
93
|
-
await mkdir(dir, { recursive: true })
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const nodeStream = stream instanceof ReadableStream ? Readable.fromWeb(stream as any) : stream
|
|
97
|
-
const writeStream = createWriteStream(p)
|
|
98
|
-
await pipeline(nodeStream, writeStream)
|
|
99
|
-
|
|
100
|
-
if (mode) {
|
|
101
|
-
await chmod(p, mode)
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export function mimeType(p: string): string {
|
|
106
|
-
return lookup(p) || "application/octet-stream"
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* On Windows, normalize a path to its canonical casing using the filesystem.
|
|
111
|
-
* This is needed because Windows paths are case-insensitive but LSP servers
|
|
112
|
-
* may return paths with different casing than what we send them.
|
|
113
|
-
*/
|
|
114
|
-
export function normalizePath(p: string): string {
|
|
115
|
-
if (process.platform !== "win32") return p
|
|
116
|
-
const resolved = win32.normalize(win32.resolve(windowsPath(p)))
|
|
117
|
-
try {
|
|
118
|
-
return realpathSync.native(resolved)
|
|
119
|
-
} catch {
|
|
120
|
-
return resolved
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export function normalizePathPattern(p: string): string {
|
|
125
|
-
if (process.platform !== "win32") return p
|
|
126
|
-
if (p === "*") return p
|
|
127
|
-
const match = p.match(/^(.*)[\\/]\*$/)
|
|
128
|
-
if (!match) return normalizePath(p)
|
|
129
|
-
const dir = /^[A-Za-z]:$/.test(match[1]) ? match[1] + "\\" : match[1]
|
|
130
|
-
return join(normalizePath(dir), "*")
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// We cannot rely on path.resolve() here because git.exe may come from Git Bash, Cygwin, or MSYS2, so we need to translate these paths at the boundary.
|
|
134
|
-
// Also resolves symlinks so that callers using the result as a cache key
|
|
135
|
-
// always get the same canonical path for a given physical directory.
|
|
136
|
-
export function resolve(p: string): string {
|
|
137
|
-
const resolved = pathResolve(windowsPath(p))
|
|
138
|
-
try {
|
|
139
|
-
return normalizePath(realpathSync(resolved))
|
|
140
|
-
} catch (e) {
|
|
141
|
-
if (isEnoent(e)) return normalizePath(resolved)
|
|
142
|
-
throw e
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
export function windowsPath(p: string): string {
|
|
147
|
-
if (process.platform !== "win32") return p
|
|
148
|
-
return (
|
|
149
|
-
p
|
|
150
|
-
.replace(/^\/([a-zA-Z]):(?:[\\/]|$)/, (_, drive) => `${drive.toUpperCase()}:/`)
|
|
151
|
-
// Git Bash for Windows paths are typically /<drive>/...
|
|
152
|
-
.replace(/^\/([a-zA-Z])(?:\/|$)/, (_, drive) => `${drive.toUpperCase()}:/`)
|
|
153
|
-
// Cygwin git paths are typically /cygdrive/<drive>/...
|
|
154
|
-
.replace(/^\/cygdrive\/([a-zA-Z])(?:\/|$)/, (_, drive) => `${drive.toUpperCase()}:/`)
|
|
155
|
-
// WSL paths are typically /mnt/<drive>/...
|
|
156
|
-
.replace(/^\/mnt\/([a-zA-Z])(?:\/|$)/, (_, drive) => `${drive.toUpperCase()}:/`)
|
|
157
|
-
)
|
|
158
|
-
}
|
|
159
|
-
export function overlaps(a: string, b: string) {
|
|
160
|
-
const relA = relative(a, b)
|
|
161
|
-
const relB = relative(b, a)
|
|
162
|
-
return !relA || !relA.startsWith("..") || !relB || !relB.startsWith("..")
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
export function contains(parent: string, child: string) {
|
|
166
|
-
return !relative(parent, child).startsWith("..")
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
export async function findUp(
|
|
170
|
-
target: string,
|
|
171
|
-
start: string,
|
|
172
|
-
stop?: string,
|
|
173
|
-
options?: { rootFirst?: boolean },
|
|
174
|
-
): Promise<string[]>
|
|
175
|
-
export async function findUp(
|
|
176
|
-
target: string[],
|
|
177
|
-
start: string,
|
|
178
|
-
stop?: string,
|
|
179
|
-
options?: { rootFirst?: boolean },
|
|
180
|
-
): Promise<string[]>
|
|
181
|
-
export async function findUp(
|
|
182
|
-
target: string | string[],
|
|
183
|
-
start: string,
|
|
184
|
-
stop?: string,
|
|
185
|
-
options?: { rootFirst?: boolean },
|
|
186
|
-
) {
|
|
187
|
-
const dirs = [start]
|
|
188
|
-
let current = start
|
|
189
|
-
while (true) {
|
|
190
|
-
if (stop === current) break
|
|
191
|
-
const parent = dirname(current)
|
|
192
|
-
if (parent === current) break
|
|
193
|
-
dirs.push(parent)
|
|
194
|
-
current = parent
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
const targets = Array.isArray(target) ? target : [target]
|
|
198
|
-
const result = []
|
|
199
|
-
for (const dir of options?.rootFirst ? dirs.toReversed() : dirs) {
|
|
200
|
-
for (const item of targets) {
|
|
201
|
-
const search = join(dir, item)
|
|
202
|
-
if (await exists(search)) result.push(search)
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
return result
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
export async function* up(options: { targets: string[]; start: string; stop?: string }) {
|
|
209
|
-
const { targets, start, stop } = options
|
|
210
|
-
let current = start
|
|
211
|
-
while (true) {
|
|
212
|
-
for (const target of targets) {
|
|
213
|
-
const search = join(current, target)
|
|
214
|
-
if (await exists(search)) yield search
|
|
215
|
-
}
|
|
216
|
-
if (stop === current) break
|
|
217
|
-
const parent = dirname(current)
|
|
218
|
-
if (parent === current) break
|
|
219
|
-
current = parent
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
export async function globUp(pattern: string, start: string, stop?: string) {
|
|
224
|
-
let current = start
|
|
225
|
-
const result = []
|
|
226
|
-
while (true) {
|
|
227
|
-
try {
|
|
228
|
-
const matches = await Glob.scan(pattern, {
|
|
229
|
-
cwd: current,
|
|
230
|
-
absolute: true,
|
|
231
|
-
include: "file",
|
|
232
|
-
dot: true,
|
|
233
|
-
})
|
|
234
|
-
result.push(...matches)
|
|
235
|
-
} catch {
|
|
236
|
-
// Skip invalid glob patterns
|
|
237
|
-
}
|
|
238
|
-
if (stop === current) break
|
|
239
|
-
const parent = dirname(current)
|
|
240
|
-
if (parent === current) break
|
|
241
|
-
current = parent
|
|
242
|
-
}
|
|
243
|
-
return result
|
|
244
|
-
}
|
|
245
|
-
}
|
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
import path from "path"
|
|
2
|
-
import os from "os"
|
|
3
|
-
import { randomBytes, randomUUID } from "crypto"
|
|
4
|
-
import { mkdir, readFile, rm, stat, utimes, writeFile } from "fs/promises"
|
|
5
|
-
import { Global } from "@/global"
|
|
6
|
-
import { Hash } from "@/util/hash"
|
|
7
|
-
|
|
8
|
-
export namespace Flock {
|
|
9
|
-
const root = path.join(Global.Path.state, "locks")
|
|
10
|
-
// Defaults for callers that do not provide timing options.
|
|
11
|
-
const defaultOpts = {
|
|
12
|
-
staleMs: 60_000,
|
|
13
|
-
timeoutMs: 5 * 60_000,
|
|
14
|
-
baseDelayMs: 100,
|
|
15
|
-
maxDelayMs: 2_000,
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface WaitEvent {
|
|
19
|
-
key: string
|
|
20
|
-
attempt: number
|
|
21
|
-
delay: number
|
|
22
|
-
waited: number
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export type Wait = (input: WaitEvent) => void | Promise<void>
|
|
26
|
-
|
|
27
|
-
export interface Options {
|
|
28
|
-
dir?: string
|
|
29
|
-
signal?: AbortSignal
|
|
30
|
-
staleMs?: number
|
|
31
|
-
timeoutMs?: number
|
|
32
|
-
baseDelayMs?: number
|
|
33
|
-
maxDelayMs?: number
|
|
34
|
-
onWait?: Wait
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
type Opts = {
|
|
38
|
-
staleMs: number
|
|
39
|
-
timeoutMs: number
|
|
40
|
-
baseDelayMs: number
|
|
41
|
-
maxDelayMs: number
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
type Owned = {
|
|
45
|
-
acquired: true
|
|
46
|
-
startHeartbeat: (intervalMs?: number) => void
|
|
47
|
-
release: () => Promise<void>
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export interface Lease {
|
|
51
|
-
release: () => Promise<void>
|
|
52
|
-
[Symbol.asyncDispose]: () => Promise<void>
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function code(err: unknown) {
|
|
56
|
-
if (typeof err !== "object" || err === null || !("code" in err)) return
|
|
57
|
-
const value = err.code
|
|
58
|
-
if (typeof value !== "string") return
|
|
59
|
-
return value
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function sleep(ms: number, signal?: AbortSignal) {
|
|
63
|
-
return new Promise<void>((resolve, reject) => {
|
|
64
|
-
if (signal?.aborted) {
|
|
65
|
-
reject(signal.reason ?? new Error("Aborted"))
|
|
66
|
-
return
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
let timer: NodeJS.Timeout | undefined
|
|
70
|
-
|
|
71
|
-
const done = () => {
|
|
72
|
-
signal?.removeEventListener("abort", abort)
|
|
73
|
-
resolve()
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const abort = () => {
|
|
77
|
-
if (timer) {
|
|
78
|
-
clearTimeout(timer)
|
|
79
|
-
}
|
|
80
|
-
signal?.removeEventListener("abort", abort)
|
|
81
|
-
reject(signal?.reason ?? new Error("Aborted"))
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
signal?.addEventListener("abort", abort, { once: true })
|
|
85
|
-
timer = setTimeout(done, ms)
|
|
86
|
-
})
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function jitter(ms: number) {
|
|
90
|
-
const j = Math.floor(ms * 0.3)
|
|
91
|
-
const d = Math.floor(Math.random() * (2 * j + 1)) - j
|
|
92
|
-
return Math.max(0, ms + d)
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function mono() {
|
|
96
|
-
return performance.now()
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function wall() {
|
|
100
|
-
return performance.timeOrigin + mono()
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
async function stats(file: string) {
|
|
104
|
-
try {
|
|
105
|
-
return await stat(file)
|
|
106
|
-
} catch (err) {
|
|
107
|
-
const errCode = code(err)
|
|
108
|
-
if (errCode === "ENOENT" || errCode === "ENOTDIR") return
|
|
109
|
-
throw err
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async function stale(lockDir: string, heartbeatPath: string, metaPath: string, staleMs: number) {
|
|
114
|
-
// Stale detection allows automatic recovery after crashed owners.
|
|
115
|
-
const now = wall()
|
|
116
|
-
const heartbeat = await stats(heartbeatPath)
|
|
117
|
-
if (heartbeat) {
|
|
118
|
-
return now - heartbeat.mtimeMs > staleMs
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const meta = await stats(metaPath)
|
|
122
|
-
if (meta) {
|
|
123
|
-
return now - meta.mtimeMs > staleMs
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const dir = await stats(lockDir)
|
|
127
|
-
if (!dir) {
|
|
128
|
-
return false
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return now - dir.mtimeMs > staleMs
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
async function tryAcquireLockDir(lockDir: string, opts: Opts): Promise<Owned | { acquired: false }> {
|
|
135
|
-
const token = randomUUID?.() ?? randomBytes(16).toString("hex")
|
|
136
|
-
const metaPath = path.join(lockDir, "meta.json")
|
|
137
|
-
const heartbeatPath = path.join(lockDir, "heartbeat")
|
|
138
|
-
|
|
139
|
-
try {
|
|
140
|
-
await mkdir(lockDir, { mode: 0o700 })
|
|
141
|
-
} catch (err) {
|
|
142
|
-
if (code(err) !== "EEXIST") {
|
|
143
|
-
throw err
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (!(await stale(lockDir, heartbeatPath, metaPath, opts.staleMs))) {
|
|
147
|
-
return { acquired: false }
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const breakerPath = lockDir + ".breaker"
|
|
151
|
-
try {
|
|
152
|
-
await mkdir(breakerPath, { mode: 0o700 })
|
|
153
|
-
} catch (claimErr) {
|
|
154
|
-
const errCode = code(claimErr)
|
|
155
|
-
if (errCode === "EEXIST") {
|
|
156
|
-
const breaker = await stats(breakerPath)
|
|
157
|
-
if (breaker && wall() - breaker.mtimeMs > opts.staleMs) {
|
|
158
|
-
await rm(breakerPath, { recursive: true, force: true }).catch(() => undefined)
|
|
159
|
-
}
|
|
160
|
-
return { acquired: false }
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
if (errCode === "ENOENT" || errCode === "ENOTDIR") {
|
|
164
|
-
return { acquired: false }
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
throw claimErr
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
try {
|
|
171
|
-
// Breaker ownership ensures only one contender performs stale cleanup.
|
|
172
|
-
if (!(await stale(lockDir, heartbeatPath, metaPath, opts.staleMs))) {
|
|
173
|
-
return { acquired: false }
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
await rm(lockDir, { recursive: true, force: true })
|
|
177
|
-
|
|
178
|
-
try {
|
|
179
|
-
await mkdir(lockDir, { mode: 0o700 })
|
|
180
|
-
} catch (retryErr) {
|
|
181
|
-
const errCode = code(retryErr)
|
|
182
|
-
if (errCode === "EEXIST" || errCode === "ENOTEMPTY") {
|
|
183
|
-
return { acquired: false }
|
|
184
|
-
}
|
|
185
|
-
throw retryErr
|
|
186
|
-
}
|
|
187
|
-
} finally {
|
|
188
|
-
await rm(breakerPath, { recursive: true, force: true }).catch(() => undefined)
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
const meta = {
|
|
193
|
-
token,
|
|
194
|
-
pid: process.pid,
|
|
195
|
-
hostname: os.hostname(),
|
|
196
|
-
createdAt: new Date().toISOString(),
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
await writeFile(heartbeatPath, "", { flag: "wx" }).catch(async () => {
|
|
200
|
-
await rm(lockDir, { recursive: true, force: true })
|
|
201
|
-
throw new Error("Lock acquired but heartbeat already existed (possible compromise).")
|
|
202
|
-
})
|
|
203
|
-
|
|
204
|
-
await writeFile(metaPath, JSON.stringify(meta, null, 2), { flag: "wx" }).catch(async () => {
|
|
205
|
-
await rm(lockDir, { recursive: true, force: true })
|
|
206
|
-
throw new Error("Lock acquired but meta.json already existed (possible compromise).")
|
|
207
|
-
})
|
|
208
|
-
|
|
209
|
-
let timer: NodeJS.Timeout | undefined
|
|
210
|
-
|
|
211
|
-
const startHeartbeat = (intervalMs = Math.max(100, Math.floor(opts.staleMs / 3))) => {
|
|
212
|
-
if (timer) return
|
|
213
|
-
// Heartbeat prevents long critical sections from being evicted as stale.
|
|
214
|
-
timer = setInterval(() => {
|
|
215
|
-
const t = new Date()
|
|
216
|
-
void utimes(heartbeatPath, t, t).catch(() => undefined)
|
|
217
|
-
}, intervalMs)
|
|
218
|
-
timer.unref?.()
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
const release = async () => {
|
|
222
|
-
if (timer) {
|
|
223
|
-
clearInterval(timer)
|
|
224
|
-
timer = undefined
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
const current = await readFile(metaPath, "utf8")
|
|
228
|
-
.then((raw) => {
|
|
229
|
-
const parsed = JSON.parse(raw)
|
|
230
|
-
if (!parsed || typeof parsed !== "object") return {}
|
|
231
|
-
return {
|
|
232
|
-
token: "token" in parsed && typeof parsed.token === "string" ? parsed.token : undefined,
|
|
233
|
-
}
|
|
234
|
-
})
|
|
235
|
-
.catch((err) => {
|
|
236
|
-
const errCode = code(err)
|
|
237
|
-
if (errCode === "ENOENT" || errCode === "ENOTDIR") {
|
|
238
|
-
throw new Error("Refusing to release: lock is compromised (metadata missing).")
|
|
239
|
-
}
|
|
240
|
-
if (err instanceof SyntaxError) {
|
|
241
|
-
throw new Error("Refusing to release: lock is compromised (metadata invalid).")
|
|
242
|
-
}
|
|
243
|
-
throw err
|
|
244
|
-
})
|
|
245
|
-
// Token check prevents deleting a lock that was re-acquired by another process.
|
|
246
|
-
if (current.token !== token) {
|
|
247
|
-
throw new Error("Refusing to release: lock token mismatch (not the owner).")
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
await rm(lockDir, { recursive: true, force: true })
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return {
|
|
254
|
-
acquired: true,
|
|
255
|
-
startHeartbeat,
|
|
256
|
-
release,
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
async function acquireLockDir(
|
|
261
|
-
lockDir: string,
|
|
262
|
-
input: { key: string; onWait?: Wait; signal?: AbortSignal },
|
|
263
|
-
opts: Opts,
|
|
264
|
-
) {
|
|
265
|
-
const stop = mono() + opts.timeoutMs
|
|
266
|
-
let attempt = 0
|
|
267
|
-
let waited = 0
|
|
268
|
-
let delay = opts.baseDelayMs
|
|
269
|
-
|
|
270
|
-
while (true) {
|
|
271
|
-
input.signal?.throwIfAborted()
|
|
272
|
-
|
|
273
|
-
const res = await tryAcquireLockDir(lockDir, opts)
|
|
274
|
-
if (res.acquired) {
|
|
275
|
-
return res
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
if (mono() > stop) {
|
|
279
|
-
throw new Error(`Timed out waiting for lock: ${input.key}`)
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
attempt += 1
|
|
283
|
-
const ms = jitter(delay)
|
|
284
|
-
await input.onWait?.({
|
|
285
|
-
key: input.key,
|
|
286
|
-
attempt,
|
|
287
|
-
delay: ms,
|
|
288
|
-
waited,
|
|
289
|
-
})
|
|
290
|
-
await sleep(ms, input.signal)
|
|
291
|
-
waited += ms
|
|
292
|
-
delay = Math.min(opts.maxDelayMs, Math.floor(delay * 1.7))
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
export async function acquire(key: string, input: Options = {}): Promise<Lease> {
|
|
297
|
-
input.signal?.throwIfAborted()
|
|
298
|
-
const cfg: Opts = {
|
|
299
|
-
staleMs: input.staleMs ?? defaultOpts.staleMs,
|
|
300
|
-
timeoutMs: input.timeoutMs ?? defaultOpts.timeoutMs,
|
|
301
|
-
baseDelayMs: input.baseDelayMs ?? defaultOpts.baseDelayMs,
|
|
302
|
-
maxDelayMs: input.maxDelayMs ?? defaultOpts.maxDelayMs,
|
|
303
|
-
}
|
|
304
|
-
const dir = input.dir ?? root
|
|
305
|
-
|
|
306
|
-
await mkdir(dir, { recursive: true })
|
|
307
|
-
const lockfile = path.join(dir, Hash.fast(key) + ".lock")
|
|
308
|
-
const lock = await acquireLockDir(
|
|
309
|
-
lockfile,
|
|
310
|
-
{
|
|
311
|
-
key,
|
|
312
|
-
onWait: input.onWait,
|
|
313
|
-
signal: input.signal,
|
|
314
|
-
},
|
|
315
|
-
cfg,
|
|
316
|
-
)
|
|
317
|
-
lock.startHeartbeat()
|
|
318
|
-
|
|
319
|
-
const release = () => lock.release()
|
|
320
|
-
return {
|
|
321
|
-
release,
|
|
322
|
-
[Symbol.asyncDispose]() {
|
|
323
|
-
return release()
|
|
324
|
-
},
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
export async function withLock<T>(key: string, fn: () => Promise<T>, input: Options = {}) {
|
|
329
|
-
await using _ = await acquire(key, input)
|
|
330
|
-
input.signal?.throwIfAborted()
|
|
331
|
-
return await fn()
|
|
332
|
-
}
|
|
333
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { z } from "zod"
|
|
2
|
-
|
|
3
|
-
export function fn<T extends z.ZodType, Result>(schema: T, cb: (input: z.infer<T>) => Result) {
|
|
4
|
-
const result = (input: z.infer<T>) => {
|
|
5
|
-
let parsed
|
|
6
|
-
try {
|
|
7
|
-
parsed = schema.parse(input)
|
|
8
|
-
} catch (e) {
|
|
9
|
-
console.trace("schema validation failure stack trace:")
|
|
10
|
-
if (e instanceof z.ZodError) {
|
|
11
|
-
console.error("schema validation issues:", JSON.stringify(e.issues, null, 2))
|
|
12
|
-
}
|
|
13
|
-
throw e
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return cb(parsed)
|
|
17
|
-
}
|
|
18
|
-
result.force = (input: z.infer<T>) => cb(input)
|
|
19
|
-
result.schema = schema
|
|
20
|
-
return result
|
|
21
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export function formatDuration(secs: number) {
|
|
2
|
-
if (secs <= 0) return ""
|
|
3
|
-
if (secs < 60) return `${secs}s`
|
|
4
|
-
if (secs < 3600) {
|
|
5
|
-
const mins = Math.floor(secs / 60)
|
|
6
|
-
const remaining = secs % 60
|
|
7
|
-
return remaining > 0 ? `${mins}m ${remaining}s` : `${mins}m`
|
|
8
|
-
}
|
|
9
|
-
if (secs < 86400) {
|
|
10
|
-
const hours = Math.floor(secs / 3600)
|
|
11
|
-
const remaining = Math.floor((secs % 3600) / 60)
|
|
12
|
-
return remaining > 0 ? `${hours}h ${remaining}m` : `${hours}h`
|
|
13
|
-
}
|
|
14
|
-
if (secs < 604800) {
|
|
15
|
-
const days = Math.floor(secs / 86400)
|
|
16
|
-
return days === 1 ? "~1 day" : `~${days} days`
|
|
17
|
-
}
|
|
18
|
-
const weeks = Math.floor(secs / 604800)
|
|
19
|
-
return weeks === 1 ? "~1 week" : `~${weeks} weeks`
|
|
20
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { glob, globSync, type GlobOptions } from "glob"
|
|
2
|
-
import { minimatch } from "minimatch"
|
|
3
|
-
|
|
4
|
-
export namespace Glob {
|
|
5
|
-
export interface Options {
|
|
6
|
-
cwd?: string
|
|
7
|
-
absolute?: boolean
|
|
8
|
-
include?: "file" | "all"
|
|
9
|
-
dot?: boolean
|
|
10
|
-
symlink?: boolean
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function toGlobOptions(options: Options): GlobOptions {
|
|
14
|
-
return {
|
|
15
|
-
cwd: options.cwd,
|
|
16
|
-
absolute: options.absolute,
|
|
17
|
-
dot: options.dot,
|
|
18
|
-
follow: options.symlink ?? false,
|
|
19
|
-
nodir: options.include !== "all",
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export async function scan(pattern: string, options: Options = {}): Promise<string[]> {
|
|
24
|
-
return glob(pattern, toGlobOptions(options)) as Promise<string[]>
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function scanSync(pattern: string, options: Options = {}): string[] {
|
|
28
|
-
return globSync(pattern, toGlobOptions(options)) as string[]
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function match(pattern: string, filepath: string): boolean {
|
|
32
|
-
return minimatch(filepath, pattern, { dot: true })
|
|
33
|
-
}
|
|
34
|
-
}
|