@code-yeongyu/senpi 2026.8.16 → 2026.8.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/dist/bun/cli.js +1 -0
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/register-cursor-agent.d.ts +2 -0
- package/dist/bun/register-cursor-agent.d.ts.map +1 -0
- package/dist/bun/register-cursor-agent.js +4 -0
- package/dist/bun/register-cursor-agent.js.map +1 -0
- package/dist/core/agent-session-services.js +2 -2
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +48 -5
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +239 -61
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/cursor-exec-bridge-session.d.ts +11 -0
- package/dist/core/cursor-exec-bridge-session.d.ts.map +1 -0
- package/dist/core/cursor-exec-bridge-session.js +17 -0
- package/dist/core/cursor-exec-bridge-session.js.map +1 -0
- package/dist/core/cursor-exec-bridge.d.ts +52 -0
- package/dist/core/cursor-exec-bridge.d.ts.map +1 -0
- package/dist/core/cursor-exec-bridge.js +196 -0
- package/dist/core/cursor-exec-bridge.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.d.ts +28 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js +278 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.d.ts +38 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.js +75 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/affinity.d.ts +24 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/affinity.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/affinity.js +64 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/affinity.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/diagnostics.d.ts +139 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/diagnostics.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/diagnostics.js +362 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/diagnostics.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/errors.d.ts +19 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/errors.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/errors.js +122 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/errors.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts +30 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js +117 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/failover.d.ts +39 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/failover.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/failover.js +155 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/failover.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/guardrails.d.ts +89 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/guardrails.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/guardrails.js +147 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/guardrails.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/home-store.d.ts +20 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/home-store.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/home-store.js +99 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/home-store.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.d.ts +25 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.js +67 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts +27 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +242 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.d.ts +73 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js +330 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/session-router.d.ts +94 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/session-router.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/session-router.js +248 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/session-router.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/settings.d.ts +35 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/settings.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/settings.js +186 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/settings.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/spawn-args.d.ts +11 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/spawn-args.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/spawn-args.js +17 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/spawn-args.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream-parser.d.ts +104 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream-parser.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream-parser.js +301 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream-parser.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream.d.ts +26 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js +587 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/transport.d.ts +43 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/transport.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/transport.js +196 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/transport.js.map +1 -0
- package/dist/core/extensions/builtin/goal/channel-state-subscriptions.d.ts +9 -0
- package/dist/core/extensions/builtin/goal/channel-state-subscriptions.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/channel-state-subscriptions.js +18 -0
- package/dist/core/extensions/builtin/goal/channel-state-subscriptions.js.map +1 -0
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +10 -9
- package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +5 -2
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/detectors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/detectors.js +21 -3
- package/dist/core/extensions/builtin/loop-guard/detectors.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/escalation.d.ts +24 -0
- package/dist/core/extensions/builtin/loop-guard/escalation.d.ts.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/escalation.js +77 -0
- package/dist/core/extensions/builtin/loop-guard/escalation.js.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/index.js +98 -3
- package/dist/core/extensions/builtin/loop-guard/index.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/notice.d.ts +9 -0
- package/dist/core/extensions/builtin/loop-guard/notice.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/notice.js +17 -0
- package/dist/core/extensions/builtin/loop-guard/notice.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/policy.d.ts +4 -0
- package/dist/core/extensions/builtin/loop-guard/policy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/policy.js +4 -0
- package/dist/core/extensions/builtin/loop-guard/policy.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/renderer.d.ts +2 -0
- package/dist/core/extensions/builtin/loop-guard/renderer.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/renderer.js +11 -0
- package/dist/core/extensions/builtin/loop-guard/renderer.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/tracker.d.ts +1 -1
- package/dist/core/extensions/builtin/loop-guard/tracker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/tracker.js +3 -1
- package/dist/core/extensions/builtin/loop-guard/tracker.js.map +1 -1
- package/dist/core/extensions/builtin/monitor-state-event.d.ts +6 -0
- package/dist/core/extensions/builtin/monitor-state-event.d.ts.map +1 -1
- package/dist/core/extensions/builtin/monitor-state-event.js +10 -0
- package/dist/core/extensions/builtin/monitor-state-event.js.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +7 -2
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +14 -2
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/prompt-templates.d.ts +5 -0
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +8 -9
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +6 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/modes/interactive/editor-paste-transfer.d.ts +10 -0
- package/dist/modes/interactive/editor-paste-transfer.d.ts.map +1 -1
- package/dist/modes/interactive/editor-paste-transfer.js +16 -0
- package/dist/modes/interactive/editor-paste-transfer.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +2 -2
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +32 -27
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts +6 -1
- package/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/dist/modes/rpc/jsonl.js +47 -14
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +26 -4
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-command-invocation.d.ts +5 -0
- package/dist/modes/rpc/rpc-command-invocation.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-command-invocation.js +2 -0
- package/dist/modes/rpc/rpc-command-invocation.js.map +1 -0
- package/dist/modes/rpc/rpc-command-surface.d.ts +49 -0
- package/dist/modes/rpc/rpc-command-surface.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-command-surface.js +40 -0
- package/dist/modes/rpc/rpc-command-surface.js.map +1 -0
- package/dist/modes/rpc/rpc-input-validation.d.ts +4 -0
- package/dist/modes/rpc/rpc-input-validation.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-input-validation.js +20 -0
- package/dist/modes/rpc/rpc-input-validation.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +12 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +12 -12
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/docs/providers.md +50 -1
- package/docs/rpc.md +78 -6
- package/docs/skills.md +14 -3
- package/node_modules/@bufbuild/protobuf/README.md +44 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/clone.d.ts +6 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/clone.js +66 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/boot.d.ts +1 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/boot.js +18 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/enum.d.ts +10 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/enum.js +31 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/extension.d.ts +9 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/extension.js +28 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/file.d.ts +1 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/file.js +18 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/index.d.ts +10 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/index.js +39 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/message.d.ts +10 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/message.js +24 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/service.d.ts +8 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/service.js +27 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/symbols.d.ts +140 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/symbols.js +43 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/types.d.ts +79 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv1/types.js +15 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/boot.d.ts +63 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/boot.js +105 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/embed.d.ts +43 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/embed.js +244 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/enum.d.ts +29 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/enum.js +58 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/extension.d.ts +9 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/extension.js +28 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/file.d.ts +7 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/file.js +35 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/index.d.ts +10 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/index.js +39 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/message.d.ts +15 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/message.js +24 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/restore-json-names.d.ts +5 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/restore-json-names.js +29 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/scalar.d.ts +9 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/scalar.js +67 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/service.d.ts +8 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/service.js +27 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/symbols.d.ts +145 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/symbols.js +74 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/types.d.ts +85 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/codegenv2/types.js +15 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/create.d.ts +9 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/create.js +259 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/descriptors.d.ts +634 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/descriptors.js +53 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/equals.d.ts +46 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/equals.js +209 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/extensions.d.ts +60 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/extensions.js +168 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/fields.d.ts +23 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/fields.js +45 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/from-binary.d.ts +48 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/from-binary.js +247 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/from-json.d.ts +73 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/from-json.js +739 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/index.d.ts +19 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/index.js +55 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/is-message.d.ts +7 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/is-message.js +33 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/json-value.d.ts +16 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/json-value.js +15 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/merge.d.ts +13 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/merge.js +70 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/package.json +4 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/proto-int64.d.ts +98 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/proto-int64.js +131 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/error.d.ts +9 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/error.js +36 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/guard.d.ts +20 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/guard.js +78 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/index.d.ts +8 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/index.js +41 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/names.d.ts +30 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/names.js +115 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/nested-types.d.ts +35 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/nested-types.js +110 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/path.d.ts +107 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/path.js +376 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/reflect-check.d.ts +19 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/reflect-check.js +268 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/reflect-types.d.ts +217 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/reflect-types.js +16 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/reflect.d.ts +43 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/reflect.js +546 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/scalar.d.ts +43 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/scalar.js +129 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/unsafe.d.ts +39 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/reflect/unsafe.js +149 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/registry.d.ts +98 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/registry.js +945 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/to-binary.d.ts +24 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/to-binary.js +199 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/to-json.d.ts +67 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/to-json.js +391 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/txtpb/from-text.d.ts +35 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/txtpb/from-text.js +684 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/txtpb/index.d.ts +4 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/txtpb/index.js +21 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/txtpb/is-group-like.d.ts +19 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/txtpb/is-group-like.js +47 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/txtpb/reader.d.ts +91 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/txtpb/reader.js +481 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/txtpb/to-text.d.ts +34 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/txtpb/to-text.js +358 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/txtpb/writer.d.ts +76 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/txtpb/writer.js +220 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/types.d.ts +135 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/types.js +15 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/unknown-enum.d.ts +10 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/unknown-enum.js +26 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/base64-encoding.d.ts +23 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/base64-encoding.js +156 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/binary-encoding.d.ts +268 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/binary-encoding.js +530 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/index.d.ts +5 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/index.js +34 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/size-delimited.d.ts +69 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/size-delimited.js +191 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/text-encoding.d.ts +28 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/text-encoding.js +61 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/text-format.d.ts +13 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/text-format.js +199 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/varint.d.ts +70 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wire/varint.js +322 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/any.d.ts +38 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/any.js +75 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/duration.d.ts +9 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/duration.js +39 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/any_pb.d.ts +238 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/any_pb.js +27 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/api_pb.d.ts +537 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/api_pb.js +39 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +490 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/compiler/plugin_pb.js +68 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/cpp_features_pb.d.ts +91 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/cpp_features_pb.js +60 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/descriptor_pb.d.ts +4143 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/descriptor_pb.js +892 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/duration_pb.d.ts +161 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/duration_pb.js +27 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/empty_pb.d.ts +39 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/empty_pb.js +27 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/field_mask_pb.d.ts +424 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/field_mask_pb.js +27 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/go_features_pb.d.ts +189 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/go_features_pb.js +126 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/java_features_pb.d.ts +194 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/java_features_pb.js +106 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/source_context_pb.d.ts +43 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/source_context_pb.js +27 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/struct_pb.d.ts +195 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/struct_pb.js +59 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/timestamp_pb.d.ts +222 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/timestamp_pb.js +27 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/type_pb.d.ts +722 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/type_pb.js +242 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/wrappers_pb.d.ts +330 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/gen/google/protobuf/wrappers_pb.js +67 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/index.d.ts +19 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/index.js +48 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/timestamp.d.ts +21 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/timestamp.js +57 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/wrappers.d.ts +25 -0
- package/node_modules/@bufbuild/protobuf/dist/commonjs/wkt/wrappers.js +66 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/clone.d.ts +6 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/clone.js +63 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/boot.d.ts +1 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/boot.js +14 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/enum.d.ts +10 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/enum.js +26 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/extension.d.ts +9 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/extension.js +25 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/file.d.ts +1 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/file.js +14 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/index.d.ts +10 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/index.js +23 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/message.d.ts +10 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/message.js +21 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/service.d.ts +8 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/service.js +24 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/symbols.d.ts +140 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/symbols.js +40 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/types.d.ts +79 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/types.js +14 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/boot.d.ts +63 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/boot.js +101 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/embed.d.ts +43 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/embed.js +239 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/enum.d.ts +29 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/enum.js +53 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/extension.d.ts +9 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/extension.js +25 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/file.d.ts +7 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/file.js +32 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/index.d.ts +10 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/index.js +23 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/message.d.ts +15 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/message.js +21 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/restore-json-names.d.ts +5 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/restore-json-names.js +26 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/scalar.d.ts +9 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/scalar.js +63 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/service.d.ts +8 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/service.js +24 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/symbols.d.ts +145 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/symbols.js +71 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/types.d.ts +85 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/types.js +14 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/create.d.ts +9 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/create.js +256 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/descriptors.d.ts +634 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/descriptors.js +50 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/equals.d.ts +46 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/equals.js +206 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/extensions.d.ts +60 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/extensions.js +159 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/fields.d.ts +23 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/fields.js +41 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/from-binary.d.ts +48 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/from-binary.js +241 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/from-json.d.ts +73 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/from-json.js +731 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/index.d.ts +19 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/index.js +29 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/is-message.d.ts +7 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/is-message.js +30 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/json-value.d.ts +16 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/json-value.js +14 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/merge.d.ts +13 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/merge.js +67 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/package.json +4 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/proto-int64.d.ts +98 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/proto-int64.js +128 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/error.d.ts +9 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/error.js +31 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/guard.d.ts +20 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/guard.js +71 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/index.d.ts +8 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/index.js +21 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/names.d.ts +30 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/names.js +109 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/nested-types.d.ts +35 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/nested-types.js +105 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/path.d.ts +107 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/path.js +369 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/reflect-check.d.ts +19 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/reflect-check.js +262 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/reflect-types.d.ts +217 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/reflect-types.js +14 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/reflect.d.ts +43 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/reflect.js +541 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/scalar.d.ts +43 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/scalar.js +124 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/unsafe.d.ts +39 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/unsafe.js +140 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/registry.d.ts +98 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/registry.js +939 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/to-binary.d.ts +24 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/to-binary.js +195 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/to-json.d.ts +67 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/to-json.js +386 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/txtpb/from-text.d.ts +35 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/txtpb/from-text.js +680 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/txtpb/index.d.ts +4 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/txtpb/index.js +15 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/txtpb/is-group-like.d.ts +19 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/txtpb/is-group-like.js +44 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/txtpb/reader.d.ts +91 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/txtpb/reader.js +477 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/txtpb/to-text.d.ts +34 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/txtpb/to-text.js +355 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/txtpb/writer.d.ts +76 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/txtpb/writer.js +214 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/types.d.ts +135 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/types.js +14 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/unknown-enum.d.ts +10 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/unknown-enum.js +23 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/base64-encoding.d.ts +23 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/base64-encoding.js +152 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.d.ts +268 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.js +525 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/index.d.ts +5 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/index.js +18 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/size-delimited.d.ts +69 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/size-delimited.js +186 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.d.ts +28 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.js +57 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/text-format.d.ts +13 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/text-format.js +195 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/varint.d.ts +70 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/varint.js +313 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/any.d.ts +38 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/any.js +69 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/duration.d.ts +9 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/duration.js +35 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/any_pb.d.ts +238 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/any_pb.js +24 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/api_pb.d.ts +537 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/api_pb.js +36 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +490 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.js +65 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/cpp_features_pb.d.ts +91 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/cpp_features_pb.js +57 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/descriptor_pb.d.ts +4143 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/descriptor_pb.js +888 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/duration_pb.d.ts +161 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/duration_pb.js +24 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/empty_pb.d.ts +39 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/empty_pb.js +24 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/field_mask_pb.d.ts +424 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/field_mask_pb.js +24 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/go_features_pb.d.ts +189 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/go_features_pb.js +123 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/java_features_pb.d.ts +194 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/java_features_pb.js +103 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/source_context_pb.d.ts +43 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/source_context_pb.js +24 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/struct_pb.d.ts +195 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/struct_pb.js +56 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/timestamp_pb.d.ts +222 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/timestamp_pb.js +24 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/type_pb.d.ts +722 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/type_pb.js +239 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/wrappers_pb.d.ts +330 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/wrappers_pb.js +64 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/index.d.ts +19 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/index.js +32 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/timestamp.d.ts +21 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/timestamp.js +50 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/wrappers.d.ts +25 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/wrappers.js +61 -0
- package/node_modules/@bufbuild/protobuf/package.json +147 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +14 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +43 -6
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +4 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +59 -17
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +14 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +14 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +12 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/README.md +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/deterministic-id.d.ts +17 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/deterministic-id.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/deterministic-id.js +14 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/deterministic-id.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/exec-lifecycle.d.ts +13 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/exec-lifecycle.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/exec-lifecycle.js +33 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/exec-lifecycle.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/exec-modern.d.ts +79 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/exec-modern.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/exec-modern.js +360 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/exec-modern.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/gen/agent_pb.d.ts +16797 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/gen/agent_pb.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/gen/agent_pb.js +3828 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/gen/agent_pb.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/pi-args.d.ts +55 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/pi-args.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/pi-args.js +76 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/pi-args.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/types.d.ts +116 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/types.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/types.js +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/types.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +191 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +3316 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.lazy.d.ts +29 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.lazy.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.lazy.js +33 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.lazy.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor-agent-provider.d.ts +11 -0
- package/node_modules/@earendil-works/pi-ai/dist/cursor-agent-provider.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/cursor-agent-provider.js +11 -0
- package/node_modules/@earendil-works/pi-ai/dist/cursor-agent-provider.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +6 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts +6 -9
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js +42 -9
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cerebras.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +3 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/block-symbols.d.ts +57 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/block-symbols.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/block-symbols.js +57 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/block-symbols.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.d.ts +10 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js +22 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +3 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +21 -0
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.d.ts +9 -0
- package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.js +82 -0
- package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.js.map +1 -0
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +11 -8
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { execFile as nodeExecFile } from "node:child_process";
|
|
2
|
+
import { accessSync, constants, readdirSync, statSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { delimiter, join } from "node:path";
|
|
5
|
+
export class CursorAgentNotInstalledError extends Error {
|
|
6
|
+
constructor() {
|
|
7
|
+
super("Cursor CLI is not installed. Install it with `curl https://cursor.com/install -fsS | bash`, " +
|
|
8
|
+
"then ensure ~/.local/bin is on your PATH.");
|
|
9
|
+
this.kind = "binary_missing";
|
|
10
|
+
this.name = "CursorAgentNotInstalledError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function executableCandidate(candidate, deps) {
|
|
14
|
+
if (!candidate)
|
|
15
|
+
return undefined;
|
|
16
|
+
try {
|
|
17
|
+
return deps.isExecutableFile(candidate) ? candidate : undefined;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function resolveFromPath(deps) {
|
|
24
|
+
const pathValue = deps.env("PATH");
|
|
25
|
+
if (!pathValue)
|
|
26
|
+
return undefined;
|
|
27
|
+
for (const directory of pathValue.split(deps.pathDelimiter)) {
|
|
28
|
+
if (!directory)
|
|
29
|
+
continue;
|
|
30
|
+
const candidate = executableCandidate(join(directory, "cursor-agent"), deps);
|
|
31
|
+
if (candidate)
|
|
32
|
+
return candidate;
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
function resolveFromInstalledVersions(deps) {
|
|
37
|
+
const versionsDirectory = join(deps.homeDirectory, ".local", "share", "cursor-agent", "versions");
|
|
38
|
+
let entries;
|
|
39
|
+
try {
|
|
40
|
+
entries = deps.readDirectory(versionsDirectory);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const directoryNames = entries
|
|
46
|
+
.filter((entry) => entry.isDirectory)
|
|
47
|
+
.map((entry) => entry.name)
|
|
48
|
+
.sort()
|
|
49
|
+
.reverse();
|
|
50
|
+
for (const directoryName of directoryNames) {
|
|
51
|
+
const candidate = executableCandidate(join(versionsDirectory, directoryName, "cursor-agent"), deps);
|
|
52
|
+
if (candidate)
|
|
53
|
+
return candidate;
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
export function resolveCursorAgentExecutable(deps) {
|
|
58
|
+
const orderedCandidates = [
|
|
59
|
+
deps.env("SENPI_CURSOR_CLI_OAUTH_EXECUTABLE"),
|
|
60
|
+
deps.env("CURSOR_AGENT_EXECUTABLE"),
|
|
61
|
+
deps.settings.executablePath,
|
|
62
|
+
];
|
|
63
|
+
for (const candidate of orderedCandidates) {
|
|
64
|
+
const executable = executableCandidate(candidate, deps);
|
|
65
|
+
if (executable)
|
|
66
|
+
return executable;
|
|
67
|
+
}
|
|
68
|
+
const pathExecutable = resolveFromPath(deps);
|
|
69
|
+
if (pathExecutable)
|
|
70
|
+
return pathExecutable;
|
|
71
|
+
const installedExecutable = resolveFromInstalledVersions(deps);
|
|
72
|
+
if (installedExecutable)
|
|
73
|
+
return installedExecutable;
|
|
74
|
+
throw new CursorAgentNotInstalledError();
|
|
75
|
+
}
|
|
76
|
+
const defaultVersionProbeDeps = {
|
|
77
|
+
execFile: (file, args, options, callback) => {
|
|
78
|
+
nodeExecFile(file, args, options, (error, stdout, stderr) => {
|
|
79
|
+
callback(error, stdout, stderr);
|
|
80
|
+
});
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
export function probeCursorAgentVersion(executable, deps = defaultVersionProbeDeps) {
|
|
84
|
+
return new Promise((resolve, reject) => {
|
|
85
|
+
deps.execFile(executable, ["--version"], { encoding: "utf8", timeout: 10_000 }, (error, stdout) => {
|
|
86
|
+
if (error) {
|
|
87
|
+
reject(error);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
resolve(stdout.trim());
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export function defaultCursorAgentExecutableDeps() {
|
|
95
|
+
return {
|
|
96
|
+
env: (name) => process.env[name],
|
|
97
|
+
settings: {},
|
|
98
|
+
homeDirectory: homedir(),
|
|
99
|
+
pathDelimiter: delimiter,
|
|
100
|
+
isExecutableFile: (candidate) => {
|
|
101
|
+
try {
|
|
102
|
+
if (!statSync(candidate).isFile())
|
|
103
|
+
return false;
|
|
104
|
+
accessSync(candidate, constants.X_OK);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
readDirectory: (directory) => readdirSync(directory, { withFileTypes: true }).map((entry) => ({
|
|
112
|
+
name: entry.name,
|
|
113
|
+
isDirectory: entry.isDirectory(),
|
|
114
|
+
})),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=executable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executable.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/executable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA2B5C,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAGtD;QACC,KAAK,CACJ,8FAA8F;YAC7F,2CAA2C,CAC5C,CAAC;QANM,SAAI,GAAG,gBAAgB,CAAC;QAOhC,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC5C,CAAC;CACD;AAED,SAAS,mBAAmB,CAAC,SAA6B,EAAE,IAA+B;IAC1F,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,SAAS,eAAe,CAAC,IAA+B;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7E,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,4BAA4B,CAAC,IAA+B;IACpE,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;IAClG,IAAI,OAAoC,CAAC;IACzC,IAAI,CAAC;QACJ,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,cAAc,GAAG,OAAO;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC;SACpC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,EAAE;SACN,OAAO,EAAE,CAAC;IAEZ,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;QACpG,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAA+B;IAC3E,MAAM,iBAAiB,GAAG;QACzB,IAAI,CAAC,GAAG,CAAC,mCAAmC,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,cAAc;KAC5B,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;IACnC,CAAC;IAED,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,MAAM,mBAAmB,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IAC/D,IAAI,mBAAmB;QAAE,OAAO,mBAAmB,CAAC;IAEpD,MAAM,IAAI,4BAA4B,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,uBAAuB,GAAqB;IACjD,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QAC3C,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACJ,CAAC;CACD,CAAC;AAEF,MAAM,UAAU,uBAAuB,CACtC,UAAkB,EAClB,OAAyB,uBAAuB;IAEhD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACjG,IAAI,KAAK,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACR,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC;IAC/C,OAAO;QACN,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,QAAQ,EAAE,EAAE;QACZ,aAAa,EAAE,OAAO,EAAE;QACxB,aAAa,EAAE,SAAS;QACxB,gBAAgB,EAAE,CAAC,SAAS,EAAE,EAAE;YAC/B,IAAI,CAAC;gBACJ,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;oBAAE,OAAO,KAAK,CAAC;gBAChD,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBACtC,OAAO,IAAI,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,KAAK,CAAC;YACd,CAAC;QACF,CAAC;QACD,aAAa,EAAE,CAAC,SAAS,EAAE,EAAE,CAC5B,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC/D,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE;SAChC,CAAC,CAAC;KACJ,CAAC;AACH,CAAC","sourcesContent":["import { execFile as nodeExecFile } from \"node:child_process\";\nimport { accessSync, constants, readdirSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { delimiter, join } from \"node:path\";\n\nexport type CursorAgentDirectoryEntry = {\n\tname: string;\n\tisDirectory: boolean;\n};\n\nexport type CursorAgentExecutableDeps = {\n\tenv: (name: string) => string | undefined;\n\tsettings: { executablePath?: string };\n\thomeDirectory: string;\n\tpathDelimiter: string;\n\tisExecutableFile: (candidate: string) => boolean;\n\treadDirectory: (directory: string) => CursorAgentDirectoryEntry[];\n};\n\nexport type VersionProbeOptions = {\n\tencoding: \"utf8\";\n\ttimeout: number;\n};\n\nexport type VersionProbeCallback = (error: Error | null, stdout: string, stderr: string) => void;\n\nexport type VersionProbeDeps = {\n\texecFile: (file: string, args: string[], options: VersionProbeOptions, callback: VersionProbeCallback) => void;\n};\n\nexport class CursorAgentNotInstalledError extends Error {\n\treadonly kind = \"binary_missing\";\n\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"Cursor CLI is not installed. Install it with `curl https://cursor.com/install -fsS | bash`, \" +\n\t\t\t\t\"then ensure ~/.local/bin is on your PATH.\",\n\t\t);\n\t\tthis.name = \"CursorAgentNotInstalledError\";\n\t}\n}\n\nfunction executableCandidate(candidate: string | undefined, deps: CursorAgentExecutableDeps): string | undefined {\n\tif (!candidate) return undefined;\n\ttry {\n\t\treturn deps.isExecutableFile(candidate) ? candidate : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction resolveFromPath(deps: CursorAgentExecutableDeps): string | undefined {\n\tconst pathValue = deps.env(\"PATH\");\n\tif (!pathValue) return undefined;\n\n\tfor (const directory of pathValue.split(deps.pathDelimiter)) {\n\t\tif (!directory) continue;\n\t\tconst candidate = executableCandidate(join(directory, \"cursor-agent\"), deps);\n\t\tif (candidate) return candidate;\n\t}\n\treturn undefined;\n}\n\nfunction resolveFromInstalledVersions(deps: CursorAgentExecutableDeps): string | undefined {\n\tconst versionsDirectory = join(deps.homeDirectory, \".local\", \"share\", \"cursor-agent\", \"versions\");\n\tlet entries: CursorAgentDirectoryEntry[];\n\ttry {\n\t\tentries = deps.readDirectory(versionsDirectory);\n\t} catch {\n\t\treturn undefined;\n\t}\n\n\tconst directoryNames = entries\n\t\t.filter((entry) => entry.isDirectory)\n\t\t.map((entry) => entry.name)\n\t\t.sort()\n\t\t.reverse();\n\n\tfor (const directoryName of directoryNames) {\n\t\tconst candidate = executableCandidate(join(versionsDirectory, directoryName, \"cursor-agent\"), deps);\n\t\tif (candidate) return candidate;\n\t}\n\treturn undefined;\n}\n\nexport function resolveCursorAgentExecutable(deps: CursorAgentExecutableDeps): string {\n\tconst orderedCandidates = [\n\t\tdeps.env(\"SENPI_CURSOR_CLI_OAUTH_EXECUTABLE\"),\n\t\tdeps.env(\"CURSOR_AGENT_EXECUTABLE\"),\n\t\tdeps.settings.executablePath,\n\t];\n\tfor (const candidate of orderedCandidates) {\n\t\tconst executable = executableCandidate(candidate, deps);\n\t\tif (executable) return executable;\n\t}\n\n\tconst pathExecutable = resolveFromPath(deps);\n\tif (pathExecutable) return pathExecutable;\n\n\tconst installedExecutable = resolveFromInstalledVersions(deps);\n\tif (installedExecutable) return installedExecutable;\n\n\tthrow new CursorAgentNotInstalledError();\n}\n\nconst defaultVersionProbeDeps: VersionProbeDeps = {\n\texecFile: (file, args, options, callback) => {\n\t\tnodeExecFile(file, args, options, (error, stdout, stderr) => {\n\t\t\tcallback(error, stdout, stderr);\n\t\t});\n\t},\n};\n\nexport function probeCursorAgentVersion(\n\texecutable: string,\n\tdeps: VersionProbeDeps = defaultVersionProbeDeps,\n): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tdeps.execFile(executable, [\"--version\"], { encoding: \"utf8\", timeout: 10_000 }, (error, stdout) => {\n\t\t\tif (error) {\n\t\t\t\treject(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolve(stdout.trim());\n\t\t});\n\t});\n}\n\nexport function defaultCursorAgentExecutableDeps(): CursorAgentExecutableDeps {\n\treturn {\n\t\tenv: (name) => process.env[name],\n\t\tsettings: {},\n\t\thomeDirectory: homedir(),\n\t\tpathDelimiter: delimiter,\n\t\tisExecutableFile: (candidate) => {\n\t\t\ttry {\n\t\t\t\tif (!statSync(candidate).isFile()) return false;\n\t\t\t\taccessSync(candidate, constants.X_OK);\n\t\t\t\treturn true;\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\treadDirectory: (directory) =>\n\t\t\treaddirSync(directory, { withFileTypes: true }).map((entry) => ({\n\t\t\t\tname: entry.name,\n\t\t\t\tisDirectory: entry.isDirectory(),\n\t\t\t})),\n\t};\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { CredentialStore } from "@earendil-works/pi-ai";
|
|
2
|
+
import { type CursorCliAccountSlot } from "./accounts.ts";
|
|
3
|
+
import { type CursorAffinityOptions } from "./affinity.ts";
|
|
4
|
+
import { type CursorCliErrorClassification, type CursorCliErrorInput } from "./errors.ts";
|
|
5
|
+
export type CursorCliFailoverNotice = {
|
|
6
|
+
type: "cursor_account_changed";
|
|
7
|
+
message: string;
|
|
8
|
+
fromAccount: string;
|
|
9
|
+
toAccount: string;
|
|
10
|
+
freshChat: true;
|
|
11
|
+
priorContextCarriedOver: false;
|
|
12
|
+
};
|
|
13
|
+
export type CursorCliAttemptOptions = {
|
|
14
|
+
/** Cross-account Cursor chats cannot be resumed because each account has its own HOME. */
|
|
15
|
+
freshChat: boolean;
|
|
16
|
+
};
|
|
17
|
+
export type CursorCliFailoverOptions<TEvent> = {
|
|
18
|
+
store: CredentialStore;
|
|
19
|
+
providerId: string;
|
|
20
|
+
affinity?: CursorAffinityOptions;
|
|
21
|
+
runAttempt: (account: CursorCliAccountSlot, options: CursorCliAttemptOptions) => AsyncIterable<TEvent> | Promise<AsyncIterable<TEvent>>;
|
|
22
|
+
now?: () => number;
|
|
23
|
+
classify?: (input: CursorCliErrorInput) => CursorCliErrorClassification;
|
|
24
|
+
errorFromEvent?: (event: TEvent) => CursorCliErrorInput | undefined;
|
|
25
|
+
isVisibleAssistantDelta?: (event: TEvent) => boolean;
|
|
26
|
+
};
|
|
27
|
+
export declare class CursorCliFailoverError extends Error {
|
|
28
|
+
readonly classification: CursorCliErrorClassification;
|
|
29
|
+
readonly original: unknown;
|
|
30
|
+
readonly visibleAssistantDeltaEmitted: boolean;
|
|
31
|
+
constructor(classification: CursorCliErrorClassification, original: unknown, visibleAssistantDeltaEmitted: boolean);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Runs one Cursor CLI stream at a time and rotates accounts only before any
|
|
35
|
+
* assistant text is visible. Replacement accounts always start a fresh chat;
|
|
36
|
+
* this module never accepts or transfers a chat id or transcript context.
|
|
37
|
+
*/
|
|
38
|
+
export declare function runCursorCliFailover<TEvent>(options: CursorCliFailoverOptions<TEvent>): AsyncGenerator<TEvent | CursorCliFailoverNotice>;
|
|
39
|
+
//# sourceMappingURL=failover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failover.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/failover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,KAAK,oBAAoB,EAA+C,MAAM,eAAe,CAAC;AACvG,OAAO,EAAE,KAAK,qBAAqB,EAAiB,MAAM,eAAe,CAAC;AAC1E,OAAO,EACN,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EAIxB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,uBAAuB,GAAG;IACrC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,uBAAuB,EAAE,KAAK,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,0FAA0F;IAC1F,SAAS,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,MAAM,IAAI;IAC9C,KAAK,EAAE,eAAe,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,UAAU,EAAE,CACX,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,uBAAuB,KAC5B,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,4BAA4B,CAAC;IACxE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,mBAAmB,GAAG,SAAS,CAAC;IACpE,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CACrD,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,KAAK;IAChD,QAAQ,CAAC,cAAc,EAAE,4BAA4B,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,4BAA4B,EAAE,OAAO,CAAC;gBAEnC,cAAc,EAAE,4BAA4B,EAAE,QAAQ,EAAE,OAAO,EAAE,4BAA4B,EAAE,OAAO;CAOlH;AAyHD;;;;GAIG;AACH,wBAAuB,oBAAoB,CAAC,MAAM,EACjD,OAAO,EAAE,wBAAwB,CAAC,MAAM,CAAC,GACvC,cAAc,CAAC,MAAM,GAAG,uBAAuB,CAAC,CAmClD"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { listAccounts } from "./accounts.js";
|
|
2
|
+
import { selectAccount } from "./affinity.js";
|
|
3
|
+
import { classifyCursorCliError, DEFAULT_RATE_LIMIT_BLOCK_MS, MAX_RATE_LIMIT_BLOCK_MS, } from "./errors.js";
|
|
4
|
+
export class CursorCliFailoverError extends Error {
|
|
5
|
+
constructor(classification, original, visibleAssistantDeltaEmitted) {
|
|
6
|
+
super(errorMessage(original));
|
|
7
|
+
this.name = "CursorCliFailoverError";
|
|
8
|
+
this.classification = classification;
|
|
9
|
+
this.original = original;
|
|
10
|
+
this.visibleAssistantDeltaEmitted = visibleAssistantDeltaEmitted;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
class CursorCliNoAssistantOutputError extends Error {
|
|
14
|
+
constructor() {
|
|
15
|
+
super("Cursor CLI attempt completed without visible assistant text");
|
|
16
|
+
this.name = "CursorCliNoAssistantOutputError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function record(value) {
|
|
20
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
21
|
+
? value
|
|
22
|
+
: undefined;
|
|
23
|
+
}
|
|
24
|
+
function errorMessage(error) {
|
|
25
|
+
if (error instanceof Error)
|
|
26
|
+
return error.message;
|
|
27
|
+
if (typeof error === "string")
|
|
28
|
+
return error;
|
|
29
|
+
const message = record(error)?.message;
|
|
30
|
+
return typeof message === "string" ? message : "Cursor CLI attempt failed";
|
|
31
|
+
}
|
|
32
|
+
function errorInput(error) {
|
|
33
|
+
const value = record(error);
|
|
34
|
+
if (value && ("exitCode" in value || "stderr" in value || "resultEvent" in value || "thrown" in value)) {
|
|
35
|
+
return error;
|
|
36
|
+
}
|
|
37
|
+
return { thrown: error };
|
|
38
|
+
}
|
|
39
|
+
function defaultErrorFromEvent(event) {
|
|
40
|
+
const value = record(event);
|
|
41
|
+
if (value?.type === "malformed_stream")
|
|
42
|
+
return { thrown: event };
|
|
43
|
+
if (value?.type === "result" && (value.is_error === true || value.subtype === "error")) {
|
|
44
|
+
return { resultEvent: event };
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
function defaultIsVisibleAssistantDelta(event) {
|
|
49
|
+
const value = record(event);
|
|
50
|
+
if (!value)
|
|
51
|
+
return false;
|
|
52
|
+
if (value.type === "assistant") {
|
|
53
|
+
const message = record(value.message);
|
|
54
|
+
if (!Array.isArray(message?.content))
|
|
55
|
+
return false;
|
|
56
|
+
return message.content.some((item) => {
|
|
57
|
+
const block = record(item);
|
|
58
|
+
return block?.type === "text" && typeof block.text === "string" && block.text.length > 0;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return ((value.type === "assistant_delta" || value.type === "text_delta") &&
|
|
62
|
+
typeof value.delta === "string" &&
|
|
63
|
+
value.delta.length > 0);
|
|
64
|
+
}
|
|
65
|
+
function notice(fromAccount, toAccount) {
|
|
66
|
+
return {
|
|
67
|
+
type: "cursor_account_changed",
|
|
68
|
+
message: `Cursor account changed from '${fromAccount}' to '${toAccount}'; a fresh chat was started and prior context was not carried over.`,
|
|
69
|
+
fromAccount,
|
|
70
|
+
toAccount,
|
|
71
|
+
freshChat: true,
|
|
72
|
+
priorContextCarriedOver: false,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async function readCredential(store, providerId) {
|
|
76
|
+
const current = await store.read(providerId);
|
|
77
|
+
return current?.type === "oauth" ? current : undefined;
|
|
78
|
+
}
|
|
79
|
+
async function selectStoredAccount(options, now) {
|
|
80
|
+
const credential = await readCredential(options.store, options.providerId);
|
|
81
|
+
const accounts = credential ? listAccounts(credential) : [];
|
|
82
|
+
return selectAccount(accounts, {
|
|
83
|
+
...options.affinity,
|
|
84
|
+
pinnedAccount: options.affinity?.pinnedAccount ?? credential?.pinned,
|
|
85
|
+
now,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function blockedAccount(account, classification, now) {
|
|
89
|
+
if (classification.kind === "auth_error") {
|
|
90
|
+
const { blockedUntil: _blockedUntil, ...withoutExpiry } = account;
|
|
91
|
+
return { ...withoutExpiry, blockReason: "auth_error" };
|
|
92
|
+
}
|
|
93
|
+
const duration = Math.min(MAX_RATE_LIMIT_BLOCK_MS, classification.blockMs ?? DEFAULT_RATE_LIMIT_BLOCK_MS);
|
|
94
|
+
return { ...account, blockedUntil: now + duration, blockReason: "rate_limit" };
|
|
95
|
+
}
|
|
96
|
+
async function persistBlock(store, providerId, account) {
|
|
97
|
+
await store.modify(providerId, async (current) => {
|
|
98
|
+
if (current?.type !== "oauth")
|
|
99
|
+
return current;
|
|
100
|
+
const credential = current;
|
|
101
|
+
return {
|
|
102
|
+
...credential,
|
|
103
|
+
accounts: (credential.accounts ?? []).map((existing) => existing.name === account.name
|
|
104
|
+
? { ...existing, blockedUntil: account.blockedUntil, blockReason: account.blockReason }
|
|
105
|
+
: existing),
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function isFailoverKind(classification) {
|
|
110
|
+
return classification.kind === "rate_limit" || classification.kind === "auth_error";
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Runs one Cursor CLI stream at a time and rotates accounts only before any
|
|
114
|
+
* assistant text is visible. Replacement accounts always start a fresh chat;
|
|
115
|
+
* this module never accepts or transfers a chat id or transcript context.
|
|
116
|
+
*/
|
|
117
|
+
export async function* runCursorCliFailover(options) {
|
|
118
|
+
const now = options.now ?? Date.now;
|
|
119
|
+
const classify = options.classify ?? classifyCursorCliError;
|
|
120
|
+
const errorFromEvent = options.errorFromEvent ?? defaultErrorFromEvent;
|
|
121
|
+
const isVisibleAssistantDelta = options.isVisibleAssistantDelta ?? defaultIsVisibleAssistantDelta;
|
|
122
|
+
let account = await selectStoredAccount(options, now());
|
|
123
|
+
let freshChat = false;
|
|
124
|
+
while (true) {
|
|
125
|
+
let visibleAssistantDeltaEmitted = false;
|
|
126
|
+
try {
|
|
127
|
+
const attemptStream = await options.runAttempt(account, { freshChat });
|
|
128
|
+
for await (const event of attemptStream) {
|
|
129
|
+
const failure = errorFromEvent(event);
|
|
130
|
+
if (failure !== undefined)
|
|
131
|
+
throw failure;
|
|
132
|
+
visibleAssistantDeltaEmitted ||= isVisibleAssistantDelta(event);
|
|
133
|
+
yield event;
|
|
134
|
+
}
|
|
135
|
+
if (!visibleAssistantDeltaEmitted)
|
|
136
|
+
throw new CursorCliNoAssistantOutputError();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const classification = classify(errorInput(error));
|
|
141
|
+
const surfaced = new CursorCliFailoverError(classification, error, visibleAssistantDeltaEmitted);
|
|
142
|
+
if (!isFailoverKind(classification))
|
|
143
|
+
throw surfaced;
|
|
144
|
+
const blocked = blockedAccount(account, classification, now());
|
|
145
|
+
await persistBlock(options.store, options.providerId, blocked);
|
|
146
|
+
if (visibleAssistantDeltaEmitted)
|
|
147
|
+
throw surfaced;
|
|
148
|
+
const nextAccount = await selectStoredAccount(options, now());
|
|
149
|
+
yield notice(account.name, nextAccount.name);
|
|
150
|
+
account = nextAccount;
|
|
151
|
+
freshChat = true;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=failover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failover.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/failover.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CredentialStore } from \"@earendil-works/pi-ai\";\nimport { type CursorCliAccountSlot, type CursorCliOauthCredential, listAccounts } from \"./accounts.ts\";\nimport { type CursorAffinityOptions, selectAccount } from \"./affinity.ts\";\nimport {\n\ttype CursorCliErrorClassification,\n\ttype CursorCliErrorInput,\n\tclassifyCursorCliError,\n\tDEFAULT_RATE_LIMIT_BLOCK_MS,\n\tMAX_RATE_LIMIT_BLOCK_MS,\n} from \"./errors.ts\";\n\nexport type CursorCliFailoverNotice = {\n\ttype: \"cursor_account_changed\";\n\tmessage: string;\n\tfromAccount: string;\n\ttoAccount: string;\n\tfreshChat: true;\n\tpriorContextCarriedOver: false;\n};\n\nexport type CursorCliAttemptOptions = {\n\t/** Cross-account Cursor chats cannot be resumed because each account has its own HOME. */\n\tfreshChat: boolean;\n};\n\nexport type CursorCliFailoverOptions<TEvent> = {\n\tstore: CredentialStore;\n\tproviderId: string;\n\taffinity?: CursorAffinityOptions;\n\trunAttempt: (\n\t\taccount: CursorCliAccountSlot,\n\t\toptions: CursorCliAttemptOptions,\n\t) => AsyncIterable<TEvent> | Promise<AsyncIterable<TEvent>>;\n\tnow?: () => number;\n\tclassify?: (input: CursorCliErrorInput) => CursorCliErrorClassification;\n\terrorFromEvent?: (event: TEvent) => CursorCliErrorInput | undefined;\n\tisVisibleAssistantDelta?: (event: TEvent) => boolean;\n};\n\nexport class CursorCliFailoverError extends Error {\n\treadonly classification: CursorCliErrorClassification;\n\treadonly original: unknown;\n\treadonly visibleAssistantDeltaEmitted: boolean;\n\n\tconstructor(classification: CursorCliErrorClassification, original: unknown, visibleAssistantDeltaEmitted: boolean) {\n\t\tsuper(errorMessage(original));\n\t\tthis.name = \"CursorCliFailoverError\";\n\t\tthis.classification = classification;\n\t\tthis.original = original;\n\t\tthis.visibleAssistantDeltaEmitted = visibleAssistantDeltaEmitted;\n\t}\n}\n\nclass CursorCliNoAssistantOutputError extends Error {\n\tconstructor() {\n\t\tsuper(\"Cursor CLI attempt completed without visible assistant text\");\n\t\tthis.name = \"CursorCliNoAssistantOutputError\";\n\t}\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction errorMessage(error: unknown): string {\n\tif (error instanceof Error) return error.message;\n\tif (typeof error === \"string\") return error;\n\tconst message = record(error)?.message;\n\treturn typeof message === \"string\" ? message : \"Cursor CLI attempt failed\";\n}\n\nfunction errorInput(error: unknown): CursorCliErrorInput {\n\tconst value = record(error);\n\tif (value && (\"exitCode\" in value || \"stderr\" in value || \"resultEvent\" in value || \"thrown\" in value)) {\n\t\treturn error as CursorCliErrorInput;\n\t}\n\treturn { thrown: error };\n}\n\nfunction defaultErrorFromEvent<TEvent>(event: TEvent): CursorCliErrorInput | undefined {\n\tconst value = record(event);\n\tif (value?.type === \"malformed_stream\") return { thrown: event };\n\tif (value?.type === \"result\" && (value.is_error === true || value.subtype === \"error\")) {\n\t\treturn { resultEvent: event };\n\t}\n\treturn undefined;\n}\n\nfunction defaultIsVisibleAssistantDelta<TEvent>(event: TEvent): boolean {\n\tconst value = record(event);\n\tif (!value) return false;\n\tif (value.type === \"assistant\") {\n\t\tconst message = record(value.message);\n\t\tif (!Array.isArray(message?.content)) return false;\n\t\treturn message.content.some((item) => {\n\t\t\tconst block = record(item);\n\t\t\treturn block?.type === \"text\" && typeof block.text === \"string\" && block.text.length > 0;\n\t\t});\n\t}\n\treturn (\n\t\t(value.type === \"assistant_delta\" || value.type === \"text_delta\") &&\n\t\ttypeof value.delta === \"string\" &&\n\t\tvalue.delta.length > 0\n\t);\n}\n\nfunction notice(fromAccount: string, toAccount: string): CursorCliFailoverNotice {\n\treturn {\n\t\ttype: \"cursor_account_changed\",\n\t\tmessage: `Cursor account changed from '${fromAccount}' to '${toAccount}'; a fresh chat was started and prior context was not carried over.`,\n\t\tfromAccount,\n\t\ttoAccount,\n\t\tfreshChat: true,\n\t\tpriorContextCarriedOver: false,\n\t};\n}\n\nasync function readCredential(\n\tstore: CredentialStore,\n\tproviderId: string,\n): Promise<CursorCliOauthCredential | undefined> {\n\tconst current = await store.read(providerId);\n\treturn current?.type === \"oauth\" ? (current as CursorCliOauthCredential) : undefined;\n}\n\nasync function selectStoredAccount(\n\toptions: Pick<CursorCliFailoverOptions<never>, \"store\" | \"providerId\" | \"affinity\">,\n\tnow: number,\n): Promise<CursorCliAccountSlot> {\n\tconst credential = await readCredential(options.store, options.providerId);\n\tconst accounts = credential ? listAccounts(credential) : [];\n\treturn selectAccount(accounts, {\n\t\t...options.affinity,\n\t\tpinnedAccount: options.affinity?.pinnedAccount ?? credential?.pinned,\n\t\tnow,\n\t});\n}\n\nfunction blockedAccount(\n\taccount: CursorCliAccountSlot,\n\tclassification: CursorCliErrorClassification,\n\tnow: number,\n): CursorCliAccountSlot {\n\tif (classification.kind === \"auth_error\") {\n\t\tconst { blockedUntil: _blockedUntil, ...withoutExpiry } = account;\n\t\treturn { ...withoutExpiry, blockReason: \"auth_error\" };\n\t}\n\tconst duration = Math.min(MAX_RATE_LIMIT_BLOCK_MS, classification.blockMs ?? DEFAULT_RATE_LIMIT_BLOCK_MS);\n\treturn { ...account, blockedUntil: now + duration, blockReason: \"rate_limit\" };\n}\n\nasync function persistBlock(store: CredentialStore, providerId: string, account: CursorCliAccountSlot): Promise<void> {\n\tawait store.modify(providerId, async (current) => {\n\t\tif (current?.type !== \"oauth\") return current;\n\t\tconst credential = current as CursorCliOauthCredential;\n\t\treturn {\n\t\t\t...credential,\n\t\t\taccounts: (credential.accounts ?? []).map((existing) =>\n\t\t\t\texisting.name === account.name\n\t\t\t\t\t? { ...existing, blockedUntil: account.blockedUntil, blockReason: account.blockReason }\n\t\t\t\t\t: existing,\n\t\t\t),\n\t\t};\n\t});\n}\n\nfunction isFailoverKind(classification: CursorCliErrorClassification): boolean {\n\treturn classification.kind === \"rate_limit\" || classification.kind === \"auth_error\";\n}\n\n/**\n * Runs one Cursor CLI stream at a time and rotates accounts only before any\n * assistant text is visible. Replacement accounts always start a fresh chat;\n * this module never accepts or transfers a chat id or transcript context.\n */\nexport async function* runCursorCliFailover<TEvent>(\n\toptions: CursorCliFailoverOptions<TEvent>,\n): AsyncGenerator<TEvent | CursorCliFailoverNotice> {\n\tconst now = options.now ?? Date.now;\n\tconst classify = options.classify ?? classifyCursorCliError;\n\tconst errorFromEvent = options.errorFromEvent ?? defaultErrorFromEvent;\n\tconst isVisibleAssistantDelta = options.isVisibleAssistantDelta ?? defaultIsVisibleAssistantDelta;\n\tlet account = await selectStoredAccount(options, now());\n\tlet freshChat = false;\n\n\twhile (true) {\n\t\tlet visibleAssistantDeltaEmitted = false;\n\t\ttry {\n\t\t\tconst attemptStream = await options.runAttempt(account, { freshChat });\n\t\t\tfor await (const event of attemptStream) {\n\t\t\t\tconst failure = errorFromEvent(event);\n\t\t\t\tif (failure !== undefined) throw failure;\n\t\t\t\tvisibleAssistantDeltaEmitted ||= isVisibleAssistantDelta(event);\n\t\t\t\tyield event;\n\t\t\t}\n\t\t\tif (!visibleAssistantDeltaEmitted) throw new CursorCliNoAssistantOutputError();\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tconst classification = classify(errorInput(error));\n\t\t\tconst surfaced = new CursorCliFailoverError(classification, error, visibleAssistantDeltaEmitted);\n\t\t\tif (!isFailoverKind(classification)) throw surfaced;\n\n\t\t\tconst blocked = blockedAccount(account, classification, now());\n\t\t\tawait persistBlock(options.store, options.providerId, blocked);\n\t\t\tif (visibleAssistantDeltaEmitted) throw surfaced;\n\n\t\t\tconst nextAccount = await selectStoredAccount(options, now());\n\t\t\tyield notice(account.name, nextAccount.name);\n\t\t\taccount = nextAccount;\n\t\t\tfreshChat = true;\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { type CursorCliOauthExecutionMode } from "./settings.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Guardrails for unattended Cursor CLI execution.
|
|
4
|
+
*
|
|
5
|
+
* The Cursor CLI runs its own tools the moment `--force` is on the argv, so
|
|
6
|
+
* that decision is never implicit: it requires the explicit
|
|
7
|
+
* `noApprovalAcknowledgedAt` acknowledgement, plan mode never forces, and a
|
|
8
|
+
* disabled force merely warns. Command denylists ride along through the
|
|
9
|
+
* per-account HOME's `cli-config.json`, strictly in the probe-proven shape
|
|
10
|
+
* (task 2: `permissions.deny` with exact full-command `Shell(...)` entries).
|
|
11
|
+
*/
|
|
12
|
+
/** Sandbox modes the installed CLI accepts (task 2 probe: allowed choices are exactly these). */
|
|
13
|
+
export declare const CURSOR_CLI_OAUTH_SANDBOX_MODES: readonly ["enabled", "disabled"];
|
|
14
|
+
export declare const CURSOR_CLI_OAUTH_NO_APPROVAL_EXPLANATION = "The Cursor CLI executes its own tools autonomously: with --force there is no senpi approval, no senpi sandboxing, and no tool-level audit for what it runs.";
|
|
15
|
+
export declare const CURSOR_CLI_OAUTH_ACKNOWLEDGEMENT_STEP = "Set \"cursorCliOauthProvider.noApprovalAcknowledgedAt\" to the current ISO-8601 timestamp (for example \"2026-08-17T12:00:00.000Z\") in senpi settings to acknowledge this once.";
|
|
16
|
+
/** One warning per session when force is disabled in agent mode (contracts block, task 18). */
|
|
17
|
+
export declare const CURSOR_CLI_OAUTH_FORCE_DISABLED_WARNING = "cursor-cli-oauth: forceExecution is disabled in agent mode, so the Cursor CLI will auto-reject every tool call; set executionMode to \"plan\" for planning turns that do not need execution.";
|
|
18
|
+
export type CursorCliGuardrailWarningCode = "force_execution_disabled" | "sandbox_mode_ignored" | "deny_command_rejected";
|
|
19
|
+
export type CursorCliGuardrailWarning = {
|
|
20
|
+
readonly kind: "warning";
|
|
21
|
+
readonly code: CursorCliGuardrailWarningCode;
|
|
22
|
+
readonly message: string;
|
|
23
|
+
};
|
|
24
|
+
export type CursorCliExecutionRefusal = {
|
|
25
|
+
readonly kind: "refusal";
|
|
26
|
+
readonly code: "no_approval_acknowledgement_required";
|
|
27
|
+
readonly message: string;
|
|
28
|
+
readonly acknowledgementStep: string;
|
|
29
|
+
};
|
|
30
|
+
export type CursorCliGuardrailSession = {
|
|
31
|
+
/** Every warning emitted so far in this session; one-time gates live here. */
|
|
32
|
+
readonly warnings: readonly CursorCliGuardrailWarning[];
|
|
33
|
+
/** Emit a warning once per deduplication key; returns whether it was emitted. */
|
|
34
|
+
warn(code: CursorCliGuardrailWarningCode, message: string, key?: string): boolean;
|
|
35
|
+
/** Validate a sandbox mode against the probe-proven allowlist, warning once per rejected value. */
|
|
36
|
+
validateSandboxMode(value: string | undefined): string | undefined;
|
|
37
|
+
};
|
|
38
|
+
export declare function createCursorCliGuardrailSession(): CursorCliGuardrailSession;
|
|
39
|
+
export type CursorCliExecutionPolicyInput = {
|
|
40
|
+
readonly forceExecution: boolean;
|
|
41
|
+
readonly noApprovalAcknowledgedAt: string | undefined;
|
|
42
|
+
readonly executionMode: CursorCliOauthExecutionMode;
|
|
43
|
+
readonly sandboxMode: string | undefined;
|
|
44
|
+
};
|
|
45
|
+
export type CursorCliExecutionDecision = {
|
|
46
|
+
readonly status: "refused";
|
|
47
|
+
readonly refusal: CursorCliExecutionRefusal;
|
|
48
|
+
} | {
|
|
49
|
+
readonly status: "allowed";
|
|
50
|
+
readonly force: boolean;
|
|
51
|
+
readonly executionMode: CursorCliOauthExecutionMode;
|
|
52
|
+
readonly sandboxMode: string | undefined;
|
|
53
|
+
readonly denyCommands: readonly string[];
|
|
54
|
+
/** Warnings accumulated in the session so far (not only this decision). */
|
|
55
|
+
readonly warnings: readonly CursorCliGuardrailWarning[];
|
|
56
|
+
};
|
|
57
|
+
/** Typed refusal for an unacknowledged force attempt; never confused with a warning. */
|
|
58
|
+
export declare class CursorCliExecutionRefusalError extends Error {
|
|
59
|
+
readonly code: "no_approval_acknowledgement_required";
|
|
60
|
+
readonly refusal: CursorCliExecutionRefusal;
|
|
61
|
+
constructor(refusal: CursorCliExecutionRefusal);
|
|
62
|
+
}
|
|
63
|
+
export declare function sanitizeCursorCliDenyCommands(entries: readonly string[], warn?: (message: string) => void): readonly string[];
|
|
64
|
+
/**
|
|
65
|
+
* Decide whether a turn may run unattended.
|
|
66
|
+
*
|
|
67
|
+
* - `--force` is emitted only in agent mode, only when force is requested, and
|
|
68
|
+
* only after `noApprovalAcknowledgedAt` is set; otherwise the decision is a
|
|
69
|
+
* typed refusal naming the acknowledgement step.
|
|
70
|
+
* - Plan mode never emits `--force` (the CLI only plans), so it needs no
|
|
71
|
+
* acknowledgement.
|
|
72
|
+
* - Force disabled in agent mode is allowed but warns once per session.
|
|
73
|
+
* - Unproven sandbox modes are ignored with one warning per distinct value.
|
|
74
|
+
*/
|
|
75
|
+
export declare function resolveCursorCliExecutionPolicy(input: CursorCliExecutionPolicyInput, session: CursorCliGuardrailSession, denyCommands?: readonly string[]): CursorCliExecutionDecision;
|
|
76
|
+
/**
|
|
77
|
+
* Pre-spawn hook: (re-)apply the deny list to the sandbox HOME's
|
|
78
|
+
* `cli-config.json`.
|
|
79
|
+
*
|
|
80
|
+
* The CLI rewrites this file during every invocation (task 2 observed its own
|
|
81
|
+
* keys appearing and `cli-config.json.bad` sidecars for malformed content), so
|
|
82
|
+
* this must run immediately before each spawn, composing with the home-store
|
|
83
|
+
* prepare pass that re-writes `auth.json` on the same cadence. Writes only the
|
|
84
|
+
* probe-proven shape (`permissions.deny` with exact `Shell(<full command>)`
|
|
85
|
+
* entries) and preserves every CLI-owned key already present. Writes nothing
|
|
86
|
+
* when no deny commands are configured.
|
|
87
|
+
*/
|
|
88
|
+
export declare function applyCursorCliDenyConfig(home: string, denyCommands: readonly string[]): void;
|
|
89
|
+
//# sourceMappingURL=guardrails.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/guardrails.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { createCursorCliOauthSandboxModeValidator } from "./settings.js";
|
|
4
|
+
/**
|
|
5
|
+
* Guardrails for unattended Cursor CLI execution.
|
|
6
|
+
*
|
|
7
|
+
* The Cursor CLI runs its own tools the moment `--force` is on the argv, so
|
|
8
|
+
* that decision is never implicit: it requires the explicit
|
|
9
|
+
* `noApprovalAcknowledgedAt` acknowledgement, plan mode never forces, and a
|
|
10
|
+
* disabled force merely warns. Command denylists ride along through the
|
|
11
|
+
* per-account HOME's `cli-config.json`, strictly in the probe-proven shape
|
|
12
|
+
* (task 2: `permissions.deny` with exact full-command `Shell(...)` entries).
|
|
13
|
+
*/
|
|
14
|
+
/** Sandbox modes the installed CLI accepts (task 2 probe: allowed choices are exactly these). */
|
|
15
|
+
export const CURSOR_CLI_OAUTH_SANDBOX_MODES = ["enabled", "disabled"];
|
|
16
|
+
export const CURSOR_CLI_OAUTH_NO_APPROVAL_EXPLANATION = "The Cursor CLI executes its own tools autonomously: with --force there is no senpi approval, no senpi sandboxing, and no tool-level audit for what it runs.";
|
|
17
|
+
export const CURSOR_CLI_OAUTH_ACKNOWLEDGEMENT_STEP = 'Set "cursorCliOauthProvider.noApprovalAcknowledgedAt" to the current ISO-8601 timestamp (for example "2026-08-17T12:00:00.000Z") in senpi settings to acknowledge this once.';
|
|
18
|
+
/** One warning per session when force is disabled in agent mode (contracts block, task 18). */
|
|
19
|
+
export const CURSOR_CLI_OAUTH_FORCE_DISABLED_WARNING = 'cursor-cli-oauth: forceExecution is disabled in agent mode, so the Cursor CLI will auto-reject every tool call; set executionMode to "plan" for planning turns that do not need execution.';
|
|
20
|
+
export function createCursorCliGuardrailSession() {
|
|
21
|
+
const warnings = [];
|
|
22
|
+
const emitted = new Set();
|
|
23
|
+
const warn = (code, message, key = code) => {
|
|
24
|
+
if (emitted.has(key))
|
|
25
|
+
return false;
|
|
26
|
+
emitted.add(key);
|
|
27
|
+
warnings.push({ kind: "warning", code, message });
|
|
28
|
+
return true;
|
|
29
|
+
};
|
|
30
|
+
const validateSandboxMode = createCursorCliOauthSandboxModeValidator(new Set(CURSOR_CLI_OAUTH_SANDBOX_MODES), (message) => {
|
|
31
|
+
warn("sandbox_mode_ignored", message, `sandbox_mode_ignored:${message}`);
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
warnings,
|
|
35
|
+
warn,
|
|
36
|
+
validateSandboxMode,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Typed refusal for an unacknowledged force attempt; never confused with a warning. */
|
|
40
|
+
export class CursorCliExecutionRefusalError extends Error {
|
|
41
|
+
constructor(refusal) {
|
|
42
|
+
super(refusal.message);
|
|
43
|
+
this.code = "no_approval_acknowledgement_required";
|
|
44
|
+
this.name = "CursorCliExecutionRefusalError";
|
|
45
|
+
this.refusal = refusal;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Glob breadth is unproven (task 2 probed exact full commands only), so glob-bearing entries are dropped. */
|
|
49
|
+
const GLOB_METACHARACTERS = /[*?[]/u;
|
|
50
|
+
export function sanitizeCursorCliDenyCommands(entries, warn) {
|
|
51
|
+
const kept = [];
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
const command = entry.trim();
|
|
54
|
+
if (command.length === 0) {
|
|
55
|
+
warn?.("Ignoring an empty Cursor CLI deny command entry (exact full commands only)");
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (GLOB_METACHARACTERS.test(command)) {
|
|
59
|
+
warn?.(`Ignoring glob-bearing Cursor CLI deny command (exact full commands only; glob support is unproven): ${command}`);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
kept.push(command);
|
|
63
|
+
}
|
|
64
|
+
return kept;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Decide whether a turn may run unattended.
|
|
68
|
+
*
|
|
69
|
+
* - `--force` is emitted only in agent mode, only when force is requested, and
|
|
70
|
+
* only after `noApprovalAcknowledgedAt` is set; otherwise the decision is a
|
|
71
|
+
* typed refusal naming the acknowledgement step.
|
|
72
|
+
* - Plan mode never emits `--force` (the CLI only plans), so it needs no
|
|
73
|
+
* acknowledgement.
|
|
74
|
+
* - Force disabled in agent mode is allowed but warns once per session.
|
|
75
|
+
* - Unproven sandbox modes are ignored with one warning per distinct value.
|
|
76
|
+
*/
|
|
77
|
+
export function resolveCursorCliExecutionPolicy(input, session, denyCommands = []) {
|
|
78
|
+
const planMode = input.executionMode === "plan";
|
|
79
|
+
const wantsForce = !planMode && input.forceExecution;
|
|
80
|
+
if (wantsForce && input.noApprovalAcknowledgedAt === undefined) {
|
|
81
|
+
const refusal = {
|
|
82
|
+
kind: "refusal",
|
|
83
|
+
code: "no_approval_acknowledgement_required",
|
|
84
|
+
message: `${CURSOR_CLI_OAUTH_NO_APPROVAL_EXPLANATION} ${CURSOR_CLI_OAUTH_ACKNOWLEDGEMENT_STEP}`,
|
|
85
|
+
acknowledgementStep: CURSOR_CLI_OAUTH_ACKNOWLEDGEMENT_STEP,
|
|
86
|
+
};
|
|
87
|
+
return { status: "refused", refusal };
|
|
88
|
+
}
|
|
89
|
+
if (!planMode && !input.forceExecution) {
|
|
90
|
+
session.warn("force_execution_disabled", CURSOR_CLI_OAUTH_FORCE_DISABLED_WARNING);
|
|
91
|
+
}
|
|
92
|
+
const sandboxMode = session.validateSandboxMode(input.sandboxMode);
|
|
93
|
+
const sanitizedDenyCommands = sanitizeCursorCliDenyCommands(denyCommands, (message) => {
|
|
94
|
+
session.warn("deny_command_rejected", message, `deny_command_rejected:${message}`);
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
status: "allowed",
|
|
98
|
+
force: wantsForce,
|
|
99
|
+
executionMode: input.executionMode,
|
|
100
|
+
sandboxMode,
|
|
101
|
+
denyCommands: sanitizedDenyCommands,
|
|
102
|
+
warnings: [...session.warnings],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const CLI_CONFIG_RELATIVE_PATH = join(".cursor", "cli-config.json");
|
|
106
|
+
function isRecord(value) {
|
|
107
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
108
|
+
}
|
|
109
|
+
function shellDenyEntry(command) {
|
|
110
|
+
return `Shell(${command})`;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Pre-spawn hook: (re-)apply the deny list to the sandbox HOME's
|
|
114
|
+
* `cli-config.json`.
|
|
115
|
+
*
|
|
116
|
+
* The CLI rewrites this file during every invocation (task 2 observed its own
|
|
117
|
+
* keys appearing and `cli-config.json.bad` sidecars for malformed content), so
|
|
118
|
+
* this must run immediately before each spawn, composing with the home-store
|
|
119
|
+
* prepare pass that re-writes `auth.json` on the same cadence. Writes only the
|
|
120
|
+
* probe-proven shape (`permissions.deny` with exact `Shell(<full command>)`
|
|
121
|
+
* entries) and preserves every CLI-owned key already present. Writes nothing
|
|
122
|
+
* when no deny commands are configured.
|
|
123
|
+
*/
|
|
124
|
+
export function applyCursorCliDenyConfig(home, denyCommands) {
|
|
125
|
+
if (denyCommands.length === 0)
|
|
126
|
+
return;
|
|
127
|
+
const configPath = join(home, CLI_CONFIG_RELATIVE_PATH);
|
|
128
|
+
let existing = {};
|
|
129
|
+
if (existsSync(configPath)) {
|
|
130
|
+
try {
|
|
131
|
+
const parsed = JSON.parse(readFileSync(configPath, "utf8"));
|
|
132
|
+
if (isRecord(parsed))
|
|
133
|
+
existing = parsed;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// The CLI quarantines unparseable config as cli-config.json.bad and
|
|
137
|
+
// proceeds with defaults; start from the proven minimal shape.
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const permissions = isRecord(existing.permissions) ? { ...existing.permissions } : {};
|
|
141
|
+
const config = {
|
|
142
|
+
...existing,
|
|
143
|
+
permissions: { ...permissions, deny: denyCommands.map(shellDenyEntry) },
|
|
144
|
+
};
|
|
145
|
+
writeFileSync(configPath, `${JSON.stringify(config, null, "\t")}\n`, "utf8");
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=guardrails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/guardrails.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type CursorCliOauthExecutionMode, createCursorCliOauthSandboxModeValidator } from \"./settings.ts\";\n\n/**\n * Guardrails for unattended Cursor CLI execution.\n *\n * The Cursor CLI runs its own tools the moment `--force` is on the argv, so\n * that decision is never implicit: it requires the explicit\n * `noApprovalAcknowledgedAt` acknowledgement, plan mode never forces, and a\n * disabled force merely warns. Command denylists ride along through the\n * per-account HOME's `cli-config.json`, strictly in the probe-proven shape\n * (task 2: `permissions.deny` with exact full-command `Shell(...)` entries).\n */\n\n/** Sandbox modes the installed CLI accepts (task 2 probe: allowed choices are exactly these). */\nexport const CURSOR_CLI_OAUTH_SANDBOX_MODES: readonly [\"enabled\", \"disabled\"] = [\"enabled\", \"disabled\"];\n\nexport const CURSOR_CLI_OAUTH_NO_APPROVAL_EXPLANATION =\n\t\"The Cursor CLI executes its own tools autonomously: with --force there is no senpi approval, no senpi sandboxing, and no tool-level audit for what it runs.\";\n\nexport const CURSOR_CLI_OAUTH_ACKNOWLEDGEMENT_STEP =\n\t'Set \"cursorCliOauthProvider.noApprovalAcknowledgedAt\" to the current ISO-8601 timestamp (for example \"2026-08-17T12:00:00.000Z\") in senpi settings to acknowledge this once.';\n\n/** One warning per session when force is disabled in agent mode (contracts block, task 18). */\nexport const CURSOR_CLI_OAUTH_FORCE_DISABLED_WARNING =\n\t'cursor-cli-oauth: forceExecution is disabled in agent mode, so the Cursor CLI will auto-reject every tool call; set executionMode to \"plan\" for planning turns that do not need execution.';\n\nexport type CursorCliGuardrailWarningCode =\n\t| \"force_execution_disabled\"\n\t| \"sandbox_mode_ignored\"\n\t| \"deny_command_rejected\";\n\nexport type CursorCliGuardrailWarning = {\n\treadonly kind: \"warning\";\n\treadonly code: CursorCliGuardrailWarningCode;\n\treadonly message: string;\n};\n\nexport type CursorCliExecutionRefusal = {\n\treadonly kind: \"refusal\";\n\treadonly code: \"no_approval_acknowledgement_required\";\n\treadonly message: string;\n\treadonly acknowledgementStep: string;\n};\n\nexport type CursorCliGuardrailSession = {\n\t/** Every warning emitted so far in this session; one-time gates live here. */\n\treadonly warnings: readonly CursorCliGuardrailWarning[];\n\t/** Emit a warning once per deduplication key; returns whether it was emitted. */\n\twarn(code: CursorCliGuardrailWarningCode, message: string, key?: string): boolean;\n\t/** Validate a sandbox mode against the probe-proven allowlist, warning once per rejected value. */\n\tvalidateSandboxMode(value: string | undefined): string | undefined;\n};\n\nexport function createCursorCliGuardrailSession(): CursorCliGuardrailSession {\n\tconst warnings: CursorCliGuardrailWarning[] = [];\n\tconst emitted = new Set<string>();\n\tconst warn = (code: CursorCliGuardrailWarningCode, message: string, key: string = code): boolean => {\n\t\tif (emitted.has(key)) return false;\n\t\temitted.add(key);\n\t\twarnings.push({ kind: \"warning\", code, message });\n\t\treturn true;\n\t};\n\tconst validateSandboxMode = createCursorCliOauthSandboxModeValidator(\n\t\tnew Set(CURSOR_CLI_OAUTH_SANDBOX_MODES),\n\t\t(message) => {\n\t\t\twarn(\"sandbox_mode_ignored\", message, `sandbox_mode_ignored:${message}`);\n\t\t},\n\t);\n\treturn {\n\t\twarnings,\n\t\twarn,\n\t\tvalidateSandboxMode,\n\t};\n}\n\nexport type CursorCliExecutionPolicyInput = {\n\treadonly forceExecution: boolean;\n\treadonly noApprovalAcknowledgedAt: string | undefined;\n\treadonly executionMode: CursorCliOauthExecutionMode;\n\treadonly sandboxMode: string | undefined;\n};\n\nexport type CursorCliExecutionDecision =\n\t| { readonly status: \"refused\"; readonly refusal: CursorCliExecutionRefusal }\n\t| {\n\t\t\treadonly status: \"allowed\";\n\t\t\treadonly force: boolean;\n\t\t\treadonly executionMode: CursorCliOauthExecutionMode;\n\t\t\treadonly sandboxMode: string | undefined;\n\t\t\treadonly denyCommands: readonly string[];\n\t\t\t/** Warnings accumulated in the session so far (not only this decision). */\n\t\t\treadonly warnings: readonly CursorCliGuardrailWarning[];\n\t };\n\n/** Typed refusal for an unacknowledged force attempt; never confused with a warning. */\nexport class CursorCliExecutionRefusalError extends Error {\n\treadonly code = \"no_approval_acknowledgement_required\" as const;\n\treadonly refusal: CursorCliExecutionRefusal;\n\n\tconstructor(refusal: CursorCliExecutionRefusal) {\n\t\tsuper(refusal.message);\n\t\tthis.name = \"CursorCliExecutionRefusalError\";\n\t\tthis.refusal = refusal;\n\t}\n}\n\n/** Glob breadth is unproven (task 2 probed exact full commands only), so glob-bearing entries are dropped. */\nconst GLOB_METACHARACTERS = /[*?[]/u;\n\nexport function sanitizeCursorCliDenyCommands(\n\tentries: readonly string[],\n\twarn?: (message: string) => void,\n): readonly string[] {\n\tconst kept: string[] = [];\n\tfor (const entry of entries) {\n\t\tconst command = entry.trim();\n\t\tif (command.length === 0) {\n\t\t\twarn?.(\"Ignoring an empty Cursor CLI deny command entry (exact full commands only)\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (GLOB_METACHARACTERS.test(command)) {\n\t\t\twarn?.(\n\t\t\t\t`Ignoring glob-bearing Cursor CLI deny command (exact full commands only; glob support is unproven): ${command}`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tkept.push(command);\n\t}\n\treturn kept;\n}\n\n/**\n * Decide whether a turn may run unattended.\n *\n * - `--force` is emitted only in agent mode, only when force is requested, and\n * only after `noApprovalAcknowledgedAt` is set; otherwise the decision is a\n * typed refusal naming the acknowledgement step.\n * - Plan mode never emits `--force` (the CLI only plans), so it needs no\n * acknowledgement.\n * - Force disabled in agent mode is allowed but warns once per session.\n * - Unproven sandbox modes are ignored with one warning per distinct value.\n */\nexport function resolveCursorCliExecutionPolicy(\n\tinput: CursorCliExecutionPolicyInput,\n\tsession: CursorCliGuardrailSession,\n\tdenyCommands: readonly string[] = [],\n): CursorCliExecutionDecision {\n\tconst planMode = input.executionMode === \"plan\";\n\tconst wantsForce = !planMode && input.forceExecution;\n\tif (wantsForce && input.noApprovalAcknowledgedAt === undefined) {\n\t\tconst refusal: CursorCliExecutionRefusal = {\n\t\t\tkind: \"refusal\",\n\t\t\tcode: \"no_approval_acknowledgement_required\",\n\t\t\tmessage: `${CURSOR_CLI_OAUTH_NO_APPROVAL_EXPLANATION} ${CURSOR_CLI_OAUTH_ACKNOWLEDGEMENT_STEP}`,\n\t\t\tacknowledgementStep: CURSOR_CLI_OAUTH_ACKNOWLEDGEMENT_STEP,\n\t\t};\n\t\treturn { status: \"refused\", refusal };\n\t}\n\tif (!planMode && !input.forceExecution) {\n\t\tsession.warn(\"force_execution_disabled\", CURSOR_CLI_OAUTH_FORCE_DISABLED_WARNING);\n\t}\n\tconst sandboxMode = session.validateSandboxMode(input.sandboxMode);\n\tconst sanitizedDenyCommands = sanitizeCursorCliDenyCommands(denyCommands, (message) => {\n\t\tsession.warn(\"deny_command_rejected\", message, `deny_command_rejected:${message}`);\n\t});\n\treturn {\n\t\tstatus: \"allowed\",\n\t\tforce: wantsForce,\n\t\texecutionMode: input.executionMode,\n\t\tsandboxMode,\n\t\tdenyCommands: sanitizedDenyCommands,\n\t\twarnings: [...session.warnings],\n\t};\n}\n\nconst CLI_CONFIG_RELATIVE_PATH = join(\".cursor\", \"cli-config.json\");\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction shellDenyEntry(command: string): string {\n\treturn `Shell(${command})`;\n}\n\n/**\n * Pre-spawn hook: (re-)apply the deny list to the sandbox HOME's\n * `cli-config.json`.\n *\n * The CLI rewrites this file during every invocation (task 2 observed its own\n * keys appearing and `cli-config.json.bad` sidecars for malformed content), so\n * this must run immediately before each spawn, composing with the home-store\n * prepare pass that re-writes `auth.json` on the same cadence. Writes only the\n * probe-proven shape (`permissions.deny` with exact `Shell(<full command>)`\n * entries) and preserves every CLI-owned key already present. Writes nothing\n * when no deny commands are configured.\n */\nexport function applyCursorCliDenyConfig(home: string, denyCommands: readonly string[]): void {\n\tif (denyCommands.length === 0) return;\n\tconst configPath = join(home, CLI_CONFIG_RELATIVE_PATH);\n\tlet existing: Record<string, unknown> = {};\n\tif (existsSync(configPath)) {\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(readFileSync(configPath, \"utf8\"));\n\t\t\tif (isRecord(parsed)) existing = parsed;\n\t\t} catch {\n\t\t\t// The CLI quarantines unparseable config as cli-config.json.bad and\n\t\t\t// proceeds with defaults; start from the proven minimal shape.\n\t\t}\n\t}\n\tconst permissions = isRecord(existing.permissions) ? { ...existing.permissions } : {};\n\tconst config: Record<string, unknown> = {\n\t\t...existing,\n\t\tpermissions: { ...permissions, deny: denyCommands.map(shellDenyEntry) },\n\t};\n\twriteFileSync(configPath, `${JSON.stringify(config, null, \"\\t\")}\\n`, \"utf8\");\n}\n"]}
|