eve 0.48.0 → 0.49.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/dist/src/channel/channel-address.js +1 -1
- package/dist/src/channel/types.d.ts +10 -0
- package/dist/src/cli/commands/integration-setup.d.ts +1 -0
- package/dist/src/cli/commands/integration-setup.js +1 -1
- package/dist/src/cli/commands/register-integration-commands.d.ts +1 -1
- package/dist/src/cli/commands/register-integration-commands.js +1 -1
- package/dist/src/cli/commands/registry-declared-setups.d.ts +1 -0
- package/dist/src/cli/commands/registry-declared-setups.js +1 -1
- package/dist/src/cli/commands/registry-metadata.d.ts +30 -0
- package/dist/src/cli/commands/registry-metadata.js +1 -1
- package/dist/src/cli/commands/registry-package.d.ts +6 -0
- package/dist/src/cli/commands/registry-package.js +1 -1
- package/dist/src/cli/commands/registry-pnpm-build-policy-flow.d.ts +30 -0
- package/dist/src/cli/commands/registry-pnpm-build-policy-flow.js +1 -0
- package/dist/src/cli/commands/registry-pnpm-build-policy.d.ts +12 -0
- package/dist/src/cli/commands/registry-pnpm-build-policy.js +6 -0
- package/dist/src/cli/commands/registry-recovery.d.ts +4 -0
- package/dist/src/cli/commands/registry-recovery.js +1 -1
- package/dist/src/cli/commands/registry.d.ts +1 -1
- package/dist/src/cli/commands/registry.js +1 -1
- package/dist/src/cli/dev/tui/setup-commands.js +2 -2
- package/dist/src/compiled/.vendor-stamp.json +7 -7
- package/dist/src/compiled/@workflow/core/attribute-changes.d.ts +2 -4
- package/dist/src/compiled/@workflow/core/capabilities.d.ts +10 -9
- package/dist/src/compiled/@workflow/core/capture-stack.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/class-serialization.d.ts +8 -8
- package/dist/src/compiled/@workflow/core/context-violation-error.d.ts +5 -5
- package/dist/src/compiled/@workflow/core/create-hook.d.ts +2 -2
- package/dist/src/compiled/@workflow/core/describe-error.d.ts +7 -7
- package/dist/src/compiled/@workflow/core/encryption.d.ts +5 -5
- package/dist/src/compiled/@workflow/core/events-consumer.d.ts +49 -14
- package/dist/src/compiled/@workflow/core/flushable-stream.d.ts +4 -4
- package/dist/src/compiled/@workflow/core/global.d.ts +4 -2
- package/dist/src/compiled/@workflow/core/index.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/index.js +2 -2
- package/dist/src/compiled/@workflow/core/log-format.d.ts +2 -2
- package/dist/src/compiled/@workflow/core/private.d.ts +40 -78
- package/dist/src/compiled/@workflow/core/private.js +1 -1
- package/dist/src/compiled/@workflow/core/replay-payload-cache.d.ts +13 -17
- package/dist/src/compiled/@workflow/core/runtime/compute-instance.d.ts +4 -3
- package/dist/src/compiled/@workflow/core/runtime/constants.d.ts +27 -27
- package/dist/src/compiled/@workflow/core/runtime/count-step-started-events.d.ts +7 -7
- package/dist/src/compiled/@workflow/core/runtime/deployment-guard.d.ts +7 -7
- package/dist/src/compiled/@workflow/core/runtime/get-port-lazy.d.ts +2 -2
- package/dist/src/compiled/@workflow/core/runtime/get-world-lazy.d.ts +2 -2
- package/dist/src/compiled/@workflow/core/runtime/helpers.d.ts +30 -49
- package/dist/src/compiled/@workflow/core/runtime/quickjs-entrypoint.d.ts +21 -10
- package/dist/src/compiled/@workflow/core/runtime/quickjs-runtime.d.ts +31 -15
- package/dist/src/compiled/@workflow/core/runtime/quickjs-serde.d.ts +10 -10
- package/dist/src/compiled/@workflow/core/runtime/replay-budget.d.ts +4 -4
- package/dist/src/compiled/@workflow/core/runtime/replay-recovery-reporter.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/runtime/resume-hook.d.ts +20 -12
- package/dist/src/compiled/@workflow/core/runtime/resume-latency.d.ts +37 -30
- package/dist/src/compiled/@workflow/core/runtime/run-id-time.d.ts +2 -2
- package/dist/src/compiled/@workflow/core/runtime/run.d.ts +22 -5
- package/dist/src/compiled/@workflow/core/runtime/runs.d.ts +4 -4
- package/dist/src/compiled/@workflow/core/runtime/start.d.ts +3 -3
- package/dist/src/compiled/@workflow/core/runtime/step-executor.d.ts +14 -14
- package/dist/src/compiled/@workflow/core/runtime/step-latency.d.ts +42 -25
- package/dist/src/compiled/@workflow/core/runtime/step-ownership.d.ts +6 -6
- package/dist/src/compiled/@workflow/core/runtime/step-single-flight.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/runtime/suspension-handler.d.ts +38 -24
- package/dist/src/compiled/@workflow/core/runtime/unserializable-step.d.ts +34 -0
- package/dist/src/compiled/@workflow/core/runtime/vm-mode.d.ts +2 -2
- package/dist/src/compiled/@workflow/core/runtime/wait-continuation.d.ts +31 -9
- package/dist/src/compiled/@workflow/core/runtime/wait-until.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/runtime/world-compatibility.d.ts +20 -9
- package/dist/src/compiled/@workflow/core/runtime/world-init.d.ts +5 -5
- package/dist/src/compiled/@workflow/core/runtime.js +3 -3
- package/dist/src/compiled/@workflow/core/sealed-box.d.ts +7 -7
- package/dist/src/compiled/@workflow/core/serialization/codec-devalue-vm.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/serialization/codec-devalue.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/serialization/codec.d.ts +4 -4
- package/dist/src/compiled/@workflow/core/serialization/compression.d.ts +12 -11
- package/dist/src/compiled/@workflow/core/serialization/encryption.d.ts +7 -7
- package/dist/src/compiled/@workflow/core/serialization/format.d.ts +6 -6
- package/dist/src/compiled/@workflow/core/serialization/hardened.d.ts +23 -22
- package/dist/src/compiled/@workflow/core/serialization/index.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/serialization/reducers/class-vm.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/serialization/reducers/step-function-vm.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/serialization/types.d.ts +5 -5
- package/dist/src/compiled/@workflow/core/serialization/workflow-vm.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/serialization-format.d.ts +11 -11
- package/dist/src/compiled/@workflow/core/serialization.d.ts +18 -19
- package/dist/src/compiled/@workflow/core/source-map.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/step/context-storage.d.ts +5 -5
- package/dist/src/compiled/@workflow/core/step/writable-stream.d.ts +3 -3
- package/dist/src/compiled/@workflow/core/symbols.d.ts +2 -2
- package/dist/src/compiled/@workflow/core/telemetry/semantic-conventions.d.ts +71 -20
- package/dist/src/compiled/@workflow/core/telemetry.d.ts +15 -3
- package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/vm/script-cache.d.ts +9 -11
- package/dist/src/compiled/@workflow/core/workflow/abort-controller.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/workflow/set-attributes.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/workflow/world-init-stub.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/workflow.js +1 -1
- package/dist/src/compiled/@workflow/errors/index.d.ts +18 -18
- package/dist/src/compiled/@workflow/errors/index.js +1 -1
- package/dist/src/compiled/@workflow/world/analytics.d.ts +3 -2
- package/dist/src/compiled/@workflow/world/attributes-validation.d.ts +28 -0
- package/dist/src/compiled/@workflow/world/attributes.d.ts +8 -107
- package/dist/src/compiled/@workflow/world/env-config.d.ts +5 -5
- package/dist/src/compiled/@workflow/world/event-metadata.d.ts +132 -0
- package/dist/src/compiled/@workflow/world/events.d.ts +42 -96
- package/dist/src/compiled/@workflow/world/hooks.d.ts +12 -11
- package/dist/src/compiled/@workflow/world/index.d.ts +3 -3
- package/dist/src/compiled/@workflow/world/interfaces.d.ts +94 -39
- package/dist/src/compiled/@workflow/world/queue.d.ts +29 -22
- package/dist/src/compiled/@workflow/world/runs.d.ts +20 -0
- package/dist/src/compiled/@workflow/world/slot-identity.d.ts +3 -3
- package/dist/src/compiled/@workflow/world/spec-version.d.ts +82 -15
- package/dist/src/compiled/@workflow/world/ulid.d.ts +2 -2
- package/dist/src/compiled/@workflow/world-local/index.js +5 -5
- package/dist/src/compiled/@workflow/world-vercel/index.js +12 -12
- package/dist/src/compiled/_chunks/workflow/{attribute-changes-DXbpwBdw.js → attribute-changes-BwAadFfB.js} +3 -3
- package/dist/src/compiled/_chunks/workflow/debug-log-CVPstO1D.js +1 -0
- package/dist/src/compiled/_chunks/workflow/dist-CgbVZs5l.js +40 -0
- package/dist/src/compiled/_chunks/workflow/dist-DjojkP5e.js +3 -0
- package/dist/src/compiled/_chunks/workflow/frames-CZ9eHShe.js +3 -0
- package/dist/src/compiled/_chunks/workflow/global-singleton-BNinwFrL.js +1 -0
- package/dist/src/compiled/_chunks/workflow/private-CZFMABEf.js +1 -0
- package/dist/src/compiled/_chunks/workflow/resume-hook-BToMtPbH.js +1 -0
- package/dist/src/compiled/_chunks/workflow/run-DzyAoGh4.js +1 -0
- package/dist/src/compiled/_chunks/workflow/sleep-3_A5uOp-.js +1 -0
- package/dist/src/compiled/_chunks/workflow/undici-DfxNX5og.js +95 -0
- package/dist/src/compiled/_chunks/workflow/wait-until-BtySPYD0.js +15 -0
- package/dist/src/compiled/_chunks/workflow/ws-transport-PnVVxT0R.js +1 -0
- package/dist/src/eve-channel/index.js +1 -1
- package/dist/src/execution/agent-handle-dispatch.js +1 -1
- package/dist/src/execution/continuation-conflict-step.d.ts +10 -0
- package/dist/src/execution/continuation-conflict-step.js +1 -0
- package/dist/src/execution/delegated-parent-notification.js +1 -1
- package/dist/src/execution/dispatch-runtime-actions-shared.d.ts +7 -29
- package/dist/src/execution/dispatch-runtime-actions-shared.js +1 -1
- package/dist/src/execution/dispatch-runtime-actions-start.d.ts +33 -0
- package/dist/src/execution/dispatch-runtime-actions-start.js +1 -0
- package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
- package/dist/src/execution/dispatch-turn-step.js +1 -1
- package/dist/src/execution/dynamic-connections.js +1 -1
- package/dist/src/execution/inline-turn.js +1 -1
- package/dist/src/execution/next-driver-action.d.ts +5 -4
- package/dist/src/execution/proxied-deliver-step.js +1 -1
- package/dist/src/execution/runtime-errors.d.ts +0 -12
- package/dist/src/execution/runtime-errors.js +1 -1
- package/dist/src/execution/sandbox/bindings/docker-options.d.ts +1 -1
- package/dist/src/execution/sandbox/bindings/docker-options.js +1 -1
- package/dist/src/execution/sandbox/bindings/eve-image.d.ts +4 -0
- package/dist/src/execution/sandbox/bindings/eve-image.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-options.d.ts +1 -1
- package/dist/src/execution/sandbox/bindings/microsandbox-options.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel-create-sdk.js +1 -1
- package/dist/src/execution/session-timeout-steps.js +1 -1
- package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
- package/dist/src/execution/stable-workflow-names.d.ts +2 -2
- package/dist/src/execution/subagent-start-local.js +1 -1
- package/dist/src/execution/tasks/parent/dispatch-task-step.js +1 -1
- package/dist/src/execution/tasks/parent/run-parent.js +1 -1
- package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
- package/dist/src/execution/tool-run/start.js +1 -1
- package/dist/src/execution/tools/subagent/local.js +1 -1
- package/dist/src/execution/turn-workflow.js +1 -1
- package/dist/src/execution/workflow-entry.d.ts +5 -1
- package/dist/src/execution/workflow-entry.js +1 -1
- package/dist/src/execution/workflow-runtime.d.ts +12 -12
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/tool-loop.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/workflow/development-world-client.js +1 -1
- package/dist/src/packages/eve-catalog/src/index.js +1 -1
- package/dist/src/public/channels/slack/activity.d.ts +18 -0
- package/dist/src/public/channels/slack/activity.js +1 -0
- package/dist/src/public/channels/slack/api.js +1 -1
- package/dist/src/public/channels/slack/index.d.ts +1 -0
- package/dist/src/public/channels/slack/index.js +1 -1
- package/dist/src/public/channels/slack/interaction-cards.js +1 -1
- package/dist/src/public/channels/slack/interactions.js +1 -1
- package/dist/src/public/channels/slack/slackChannel.d.ts +12 -1
- package/dist/src/public/channels/slack/slackChannel.js +1 -1
- package/dist/src/public/memory/file/backends/default.js +1 -1
- package/dist/src/public/sandbox/docker-sandbox.d.ts +5 -4
- package/dist/src/public/sandbox/microsandbox-sandbox.d.ts +1 -1
- package/dist/src/public/sandbox/vercel-sandbox.d.ts +3 -1
- package/dist/src/setup/flows/registry.js +1 -1
- package/dist/src/setup/integrations/file-memory/setup.d.ts +15 -0
- package/dist/src/setup/integrations/file-memory/setup.js +2 -0
- package/dist/src/setup/integrations/file-memory/vercel.d.ts +103 -0
- package/dist/src/setup/integrations/file-memory/vercel.js +1 -0
- package/dist/src/setup/integrations/registry.js +1 -1
- package/dist/src/setup/integrations/shared/vercel-project.js +1 -1
- package/dist/src/setup/scaffold/connections/catalog.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/docs/channels/custom.mdx +4 -0
- package/docs/channels/eve.mdx +12 -8
- package/docs/channels/mcp.mdx +4 -1
- package/docs/channels/slack.mdx +1 -1
- package/docs/guides/instrumentation.md +1 -1
- package/docs/install-integrations.mdx +5 -0
- package/docs/instructions.mdx +1 -1
- package/docs/memory/custom-provider.md +214 -0
- package/docs/memory/file.md +168 -0
- package/docs/memory/meta.json +5 -0
- package/docs/memory/overview.mdx +282 -0
- package/docs/patterns/multi-tenant-memory.md +12 -20
- package/docs/reference/cli.md +28 -23
- package/docs/sandbox.mdx +5 -3
- package/package.json +8 -8
- package/dist/src/compiled/_chunks/workflow/dist-CqvWKNQv.js +0 -3
- package/dist/src/compiled/_chunks/workflow/dist-Dk0aQqFO.js +0 -40
- package/dist/src/compiled/_chunks/workflow/dist-DpYyXbJv.js +0 -1
- package/dist/src/compiled/_chunks/workflow/env-config-L94XftKz.js +0 -1
- package/dist/src/compiled/_chunks/workflow/frames-Dl2Hcma4.js +0 -3
- package/dist/src/compiled/_chunks/workflow/private-CuQ4HTFC.js +0 -1
- package/dist/src/compiled/_chunks/workflow/resume-hook-E-Nkx8q_.js +0 -1
- package/dist/src/compiled/_chunks/workflow/run-cIeex2KF.js +0 -1
- package/dist/src/compiled/_chunks/workflow/sleep-CxFsdxB_.js +0 -1
- package/dist/src/compiled/_chunks/workflow/spec-version-DBUVfF_R.js +0 -1
- package/dist/src/compiled/_chunks/workflow/undici-DznrXKcM.js +0 -95
- package/dist/src/compiled/_chunks/workflow/wait-until-BZHmJCAW.js +0 -15
- package/dist/src/compiled/_chunks/workflow/ws-transport-Ct6yyRWZ.js +0 -1
- package/docs/memory.md +0 -408
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# eve
|
|
2
2
|
|
|
3
|
+
## 0.49.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 23a4b59: Use version-matched GHCR images for Docker and microsandbox while Vercel Sandbox uses VCR. Publish each eve sandbox image version to both registries.
|
|
8
|
+
- d8c58bd: Add `memory/file` and `eve integration setup file-memory` to provision a dedicated private Vercel Blob store automatically. Deployed file memory now prefers `EVE_MEMORY_BLOB_*` credentials while retaining generic `BLOB_*` bindings as a fallback.
|
|
9
|
+
- 6a5fd36: Make `eve add --overwrite` also replace files generated by eve-owned integration setup flows, including Photon channels.
|
|
10
|
+
- 86539ee: Add an internal experimental Slack status renderer for explicit agent activity reports and delegated work lifecycle. Activity updates do not start or steer model turns.
|
|
11
|
+
- 4f29a21: Allow `EVE_SANDBOX_IMAGE_TAG` to override the version-derived tag used for eve's default sandbox images.
|
|
12
|
+
- 2ea5d60: Allow the default `fileMemory()` backend to use an attached Vercel Blob store when its OIDC token is available from the request context instead of the environment.
|
|
13
|
+
|
|
14
|
+
## 0.49.0
|
|
15
|
+
|
|
16
|
+
### Minor Changes
|
|
17
|
+
|
|
18
|
+
- 1ee8fa9: Session creation on eve, MCP, and authored channels now returns as soon as Workflow accepts the run. Concurrent first messages on one channel address are settled inside the workflow, racing `operationId` requests may return different candidate IDs that callers resolve after startup, and Workflow starts target known deployment IDs without resolving a latest-deployment sentinel.
|
|
19
|
+
|
|
20
|
+
### Patch Changes
|
|
21
|
+
|
|
22
|
+
- 68d44b5: Addressed `/add <item>` confirmations now remain responsive in the dev TUI.
|
|
23
|
+
- b20c2aa: Add Browser Use to the `eve connections add` picker. The generated MCP connection reads `BROWSER_USE_API_KEY` into Browser Use's required API-key header without adding Vercel Connect.
|
|
24
|
+
- 0172af9: Preserve parent turn identity when dispatching a subagent after a parked child resumes, preventing handle-store corruption and fatal session failures.
|
|
25
|
+
- fbc89e5: Registry items can now declare optional pnpm packages with build scripts. Before installation, eve asks whether to skip those packages, allow their scripts, or abort, and records the choice in the owning workspace policy.
|
|
26
|
+
- 3f20c80: Add optional `audience` on Slack proactive `receive` / `ctx.send` targets so webhook and schedule handoffs can pass channel visibility without an extra Slack API call.
|
|
27
|
+
- a40ebb0: Update Eve's bundled Workflow SDK packages to the latest 5.0.0 beta releases, which includes performance and stability improvements.
|
|
28
|
+
|
|
3
29
|
## 0.48.0
|
|
4
30
|
|
|
5
31
|
### Minor Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createSession,sessionCallbackToTurnCaller}from"#channel/session.js";import{copyChannelActivityPresentation}from"#channel/activity-renderer.js";import{createChannelDeliveryMetadata}from"#channel/delivery-metadata.js";import{normalizeSendInput,serializeUrlFilePartsInMessage}from"#channel/send-input.js";import{DEFAULT_TURN_POLICY}from"#channel/types.js";import{
|
|
1
|
+
import{createSession,sessionCallbackToTurnCaller}from"#channel/session.js";import{copyChannelActivityPresentation}from"#channel/activity-renderer.js";import{createChannelDeliveryMetadata}from"#channel/delivery-metadata.js";import{normalizeSendInput,serializeUrlFilePartsInMessage}from"#channel/send-input.js";import{DEFAULT_TURN_POLICY}from"#channel/types.js";import{isReservedSessionCommandToken}from"#execution/session-command-token.js";function createChannelAddress(r){let i=r.metadata??{},a=`${r.channelName}:${r.continuationToken}`;if(isReservedSessionCommandToken(a))throw Error(`Channel address "${a}" uses eve's reserved session namespace.`);return{continuationToken:r.continuationToken,async deliver(n,o){let s=i.channelKind!==void 0&&i.channelName!==void 0?createChannelDeliveryMetadata(i):void 0,c=normalizeSendInput(n),l=sessionCallbackToTurnCaller(o.callback),u={auth:o.auth,delivery:s,kind:`send`,payload:{...c,message:serializeUrlFilePartsInMessage(c.message)},requestId:i.requestId,turnPolicy:c.message===void 0?void 0:o.turnPolicy??r.turnPolicy??DEFAULT_TURN_POLICY},d=l===void 0?u:{...u,caller:l},f=await(async()=>{let t=await r.runtime.dispatchContinuation({command:d,continuationToken:a});return t.status===`accepted`?createSession(t.sessionId,r.runtime,{...i,turnPolicy:r.turnPolicy}):void 0})();if(f!==void 0)return f;if(c.inputResponses&&c.inputResponses.length>0)throw Error(`Cannot deliver inputResponses — the target session was not found via continuation token.`);let p=o.state,m=p===void 0?r.adapter:{...r.adapter,state:{...r.adapter.state,...p}};m!==r.adapter&©ChannelActivityPresentation(r.adapter,m);let h=o.mode===`task`?void 0:{requestInput:!0},g={adapter:m,auth:o.auth,capabilities:h,callback:o.callback,channelName:r.channelName,continuationConflictCommand:d,continuationToken:a,delivery:s,initiatorAuth:o.initiatorAuth,input:{context:c.context,message:serializeUrlFilePartsInMessage(c.message)??``,outputSchema:c.outputSchema},mode:o.mode??`conversation`,requestId:i.requestId,title:o.title};return createSession((await r.runtime.createSession(g)).sessionId,r.runtime,{...i,turnPolicy:r.turnPolicy})},async send(e,t){return await this.deliver({message:e},t)},async respond(e,t){if(e===void 0||e.length===0)throw Error(`respond() requires at least one input response.`);return await this.deliver({inputResponses:e},t)},async cancel(e){return await r.runtime.dispatchContinuation({command:{kind:`cancel`,turnId:e?.turnId},continuationToken:a})},async compact(){return await r.runtime.dispatchContinuation({command:{kind:`compact`},continuationToken:a})},async clear(){return await r.runtime.dispatchContinuation({command:{kind:`clear`},continuationToken:a})},async reset(e){return await r.runtime.dispatchContinuation({command:{kind:`reset`,reason:e?.reason},continuationToken:a})},async resolveSession(){let t=await r.runtime.resolveContinuation(a);return t===void 0?void 0:createSession(t.sessionId,r.runtime,{...i,turnPolicy:r.turnPolicy})}}}function createChannelAddressFn(e){return t=>createChannelAddress({...e,continuationToken:t})}export{createChannelAddress,createChannelAddressFn};
|
|
@@ -421,6 +421,16 @@ export interface RunInput {
|
|
|
421
421
|
* transports omit this field.
|
|
422
422
|
*/
|
|
423
423
|
readonly continuationToken?: string;
|
|
424
|
+
/**
|
|
425
|
+
* Framework-owned delivery to forward when another run wins the initial
|
|
426
|
+
* continuation-token claim. Channel addresses set this so concurrent cold
|
|
427
|
+
* starts preserve every distinct inbound message inside durable execution.
|
|
428
|
+
* Create-once and replay-idempotent starts omit it so losing inputs are
|
|
429
|
+
* discarded.
|
|
430
|
+
*/
|
|
431
|
+
readonly continuationConflictCommand?: Extract<SessionCommand, {
|
|
432
|
+
readonly kind: "send";
|
|
433
|
+
}>;
|
|
424
434
|
/**
|
|
425
435
|
* The original (top-level) caller's auth, forwarded down the delegation
|
|
426
436
|
* chain so the child's `session.auth.initiator` always resolves back to
|
|
@@ -4,6 +4,7 @@ import { type IntegrationSetupRunnerDeps } from "#setup/integrations/runner.js";
|
|
|
4
4
|
import type { RegistryCommandLogger } from "./registry.js";
|
|
5
5
|
export interface IntegrationSetupOptions {
|
|
6
6
|
yes?: boolean;
|
|
7
|
+
force?: boolean;
|
|
7
8
|
nonInteractive?: boolean;
|
|
8
9
|
answers?: Record<string, unknown>;
|
|
9
10
|
signal?: AbortSignal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{createPrompter}from"#setup/prompter.js";import{ensureVercelProject}from"#setup/flows/ensure-vercel-project.js";import{createHeadlessPrompter}from"#setup/headless.js";import{SetupPrerequisiteRequired}from"#setup/integrations/shared/prerequisite.js";import{createRegistrySetupClient}from"#setup/registry-setup-client.js";import{InteractionRequired,InvalidAnswerError,headlessAsker,interactiveAsker,withAnswers,withPolicy}from"#setup/ask.js";import{runIntegrationSetup}from"#setup/integrations/runner.js";import{setupQuestionToWire}from"#setup/setup-question-wire.js";const defaultIntegrationSetupDependencies={};async function runIntegrationSetupCommand(s,c,l,u={},d=defaultIntegrationSetupDependencies){let f=createRegistrySetupClient({process:d.setupProcess,signal:u.signal});try{let n=u.nonInteractive===!0,r=f?.prompter??d.createPrompter?.()??(n?createHeadlessPrompter(()=>{}):createPrompter()),i=n?headlessAsker():interactiveAsker(r),a=u.yes?withPolicy(`assume`)(i):i,o=await runIntegrationSetup(l,{appRoot:c,prompter:r,asker:withAnswers(u.answers??{})(a),resolveVercelProject:n?void 0:()=>ensureVercelProject({appRoot:c,prompter:r,signal:f?.signal??u.signal}),signal:f?.signal??u.signal,beginExternalAction:n?e=>{let t=`external-action-${crypto.randomUUID()}`;return s.log(serializeHeadlessSetupEvent({version:1,type:`external_action`,id:t,blocking:!0,...e})),{complete(){s.log(serializeHeadlessSetupEvent({version:1,type:`external_action_resolved`,id:t}))}}}:void 0},d.runnerDeps);if(o.kind===`cancelled`){f?.cancel(),process.env.EVE_SETUP===`1`?process.exitCode=130:n&&s.error(serializeHeadlessSetupEvent({version:1,type:`cancelled`,item:l}));return}r.outro(`Integration set up.`),f?.complete(o.completion),n&&f===void 0&&s.log(serializeHeadlessSetupEvent({version:1,type:`completed`,item:l}))}catch(e){if(f?.fail(e),f!==void 0)return;u.nonInteractive&&e instanceof InteractionRequired?(s.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`input_required`,question:setupQuestionToWire(e.question)})),process.exitCode=2):u.nonInteractive&&e instanceof InvalidAnswerError?(s.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`input_required`,question:setupQuestionToWire(e.question),issue:{code:`invalid_answer`,message:e.message}})),process.exitCode=2):u.nonInteractive&&e instanceof SetupPrerequisiteRequired?(s.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`prerequisite_required`,prerequisite:e.prerequisite})),process.exitCode=2):(s.error(e instanceof Error?e.message:String(e)),process.exitCode=1)}}export{runIntegrationSetupCommand};
|
|
1
|
+
import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{createPrompter}from"#setup/prompter.js";import{ensureVercelProject}from"#setup/flows/ensure-vercel-project.js";import{createHeadlessPrompter}from"#setup/headless.js";import{SetupPrerequisiteRequired}from"#setup/integrations/shared/prerequisite.js";import{createRegistrySetupClient}from"#setup/registry-setup-client.js";import{InteractionRequired,InvalidAnswerError,headlessAsker,interactiveAsker,withAnswers,withPolicy}from"#setup/ask.js";import{runIntegrationSetup}from"#setup/integrations/runner.js";import{setupQuestionToWire}from"#setup/setup-question-wire.js";const defaultIntegrationSetupDependencies={};async function runIntegrationSetupCommand(s,c,l,u={},d=defaultIntegrationSetupDependencies){let f=createRegistrySetupClient({process:d.setupProcess,signal:u.signal});try{let n=u.nonInteractive===!0,r=f?.prompter??d.createPrompter?.()??(n?createHeadlessPrompter(()=>{}):createPrompter()),i=n?headlessAsker():interactiveAsker(r),a=u.yes?withPolicy(`assume`)(i):i,o=await runIntegrationSetup(l,{appRoot:c,prompter:r,asker:withAnswers(u.answers??{})(a),force:u.force,resolveVercelProject:n?void 0:()=>ensureVercelProject({appRoot:c,prompter:r,signal:f?.signal??u.signal}),signal:f?.signal??u.signal,beginExternalAction:n?e=>{let t=`external-action-${crypto.randomUUID()}`;return s.log(serializeHeadlessSetupEvent({version:1,type:`external_action`,id:t,blocking:!0,...e})),{complete(){s.log(serializeHeadlessSetupEvent({version:1,type:`external_action_resolved`,id:t}))}}}:void 0},d.runnerDeps);if(o.kind===`cancelled`){f?.cancel(),process.env.EVE_SETUP===`1`?process.exitCode=130:n&&s.error(serializeHeadlessSetupEvent({version:1,type:`cancelled`,item:l}));return}r.outro(`Integration set up.`),f?.complete(o.completion),n&&f===void 0&&s.log(serializeHeadlessSetupEvent({version:1,type:`completed`,item:l}))}catch(e){if(f?.fail(e),f!==void 0)return;u.nonInteractive&&e instanceof InteractionRequired?(s.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`input_required`,question:setupQuestionToWire(e.question)})),process.exitCode=2):u.nonInteractive&&e instanceof InvalidAnswerError?(s.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`input_required`,question:setupQuestionToWire(e.question),issue:{code:`invalid_answer`,message:e.message}})),process.exitCode=2):u.nonInteractive&&e instanceof SetupPrerequisiteRequired?(s.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`prerequisite_required`,prerequisite:e.prerequisite})),process.exitCode=2):(s.error(e instanceof Error?e.message:String(e)),process.exitCode=1)}}export{runIntegrationSetupCommand};
|
|
@@ -6,7 +6,7 @@ interface IntegrationCommandLogger {
|
|
|
6
6
|
log(message: string): void;
|
|
7
7
|
}
|
|
8
8
|
export declare function parseConnectPrincipalType(value: string): ConnectPrincipalType;
|
|
9
|
-
/** Registers
|
|
9
|
+
/** Registers built-in integration setup commands used by trusted registry items. */
|
|
10
10
|
export declare function registerIntegrationCommands(input: {
|
|
11
11
|
program: Command;
|
|
12
12
|
logger: IntegrationCommandLogger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{parseSetupAnswer}from"./setup-answers.js";import{InvalidArgumentError}from"#compiled/commander/index.js";import{applicationCommand}from"#cli/application-command.js";function parseConnectPrincipalType(e){if(e===`app`||e===`user`)return e;throw new InvalidArgumentError(`Expected principal type "app" or "user".`)}function registerIntegrationCommands(t){let{applicationContext:r,logger:i,program:a}=t,o=a.command(`integration
|
|
1
|
+
import{parseSetupAnswer}from"./setup-answers.js";import{InvalidArgumentError}from"#compiled/commander/index.js";import{applicationCommand}from"#cli/application-command.js";function parseConnectPrincipalType(e){if(e===`app`||e===`user`)return e;throw new InvalidArgumentError(`Expected principal type "app" or "user".`)}function registerIntegrationCommands(t){let{applicationContext:r,logger:i,program:a}=t,o=a.command(`integration`).description(`Set up an eve integration`);applicationCommand(o.command(`setup <kind>`),r).description(`Run a built-in integration setup flow`).option(`-y, --yes`).option(`--force`,`Overwrite files created by setup.`).option(`--non-interactive`,`Run without interactive prompts, instead emit structured NDJSON when further input is required`).option(`--answer <key=value>`,`Answer a setup question; requires --non-interactive.`,parseSetupAnswer,{}).action(async(e,t)=>{let{runIntegrationSetupCommand:n}=await import(`./integration-setup.js`);await n(i,r.root,e,{yes:t.yes,force:t.force,nonInteractive:t.nonInteractive,answers:t.answer})}),applicationCommand(o.command(`connect <slug> <service> [canonical-name]`,{hidden:!0}),r).option(`-y, --yes`).option(`--creation-type <type>`,`Select the Vercel Connect creation type.`).option(`--connection-method <method>`,`Select the Vercel Connect connection method.`).option(`--principal-type <type>`,`Require app- or user-scoped Vercel Connect credentials.`,parseConnectPrincipalType).option(`--non-interactive`,`Run without interactive prompts, instead emit structured NDJSON when further input is required`).action(async(e,t,n,a)=>{let{runIntegrationConnectCommand:o}=await import(`./integration-connect.js`);await o(i,r.root,e,t,n,a)})}export{parseConnectPrincipalType,registerIntegrationCommands};
|
|
@@ -4,6 +4,7 @@ import type { RegistryCommandLogger, RegistrySetupDependencies } from "./registr
|
|
|
4
4
|
import type { RegistrySetupCommand } from "./registry-setup-command.js";
|
|
5
5
|
export interface DeclaredSetupOptions {
|
|
6
6
|
yes?: boolean;
|
|
7
|
+
force?: boolean;
|
|
7
8
|
nonInteractive?: boolean;
|
|
8
9
|
answers?: Record<string, unknown>;
|
|
9
10
|
silent?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{createPrompter}from"#setup/prompter.js";import{createHeadlessPrompter}from"#setup/headless.js";import{mergeRegistrySetupCompletions}from"#setup/registry-setup-completion.js";async function runDeclaredSetups(i){let a={facts:[]};if(i.setups===void 0)return a;let o=await i.dependencies.loadSetupCommandRunner(),s=i.options.prompter??(i.options.nonInteractive?createHeadlessPrompter(i.logger.log):createPrompter());try{for(let n of i.setups){let r=await o(i.appRoot,{...n,args:[...n.args,...i.options.yes?[`--yes`]:[],...i.options.nonInteractive?[`--non-interactive`]:[],...Object.entries(i.options.answers??{}).flatMap(([e,t])=>[`--answer`,`${e}=${JSON.stringify(t)}`])]},i.item,{prompter:s,signal:i.options.signal});if(r.kind===`cancelled`)return i.logger.log(i.cancelledReminder),!1;if(r.kind===`blocked`){if(!i.options.nonInteractive)throw Error(`Setup requires more input.`);return i.logger.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,item:i.item,installed:!0,completedItems:[],...r.blocker,next:headlessSetupContinuation({item:i.item,installed:!0,answers:i.options.answers,question:r.blocker.status===`input_required`?r.blocker.question:void 0})})),process.exitCode=2,!1}if(i.options.silent!==!0)for(let e of r.facts)i.logger.log(`${e.label}: ${e.value}`);a=mergeRegistrySetupCompletions(a,r)}return a}catch(n){let r=n instanceof Error?n.message:String(n);if(i.options.nonInteractive)return i.logger.error(serializeHeadlessSetupEvent({version:1,type:`failed`,item:i.item,completedItems:[],message:r,next:headlessSetupContinuation({item:i.item,installed:!0,answers:i.options.answers})})),process.exitCode=1,!1;throw Error(`${r} Try again with \`${i.resumeCommand}\`.`)}}export{runDeclaredSetups};
|
|
1
|
+
import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{createPrompter}from"#setup/prompter.js";import{createHeadlessPrompter}from"#setup/headless.js";import{mergeRegistrySetupCompletions}from"#setup/registry-setup-completion.js";async function runDeclaredSetups(i){let a={facts:[]};if(i.setups===void 0)return a;let o=await i.dependencies.loadSetupCommandRunner(),s=i.options.prompter??(i.options.nonInteractive?createHeadlessPrompter(i.logger.log):createPrompter());try{for(let n of i.setups){let r=await o(i.appRoot,{...n,args:[...n.args,...i.options.yes?[`--yes`]:[],...i.options.force&&n.package===`eve`&&n.bin===`eve`&&n.args[0]===`integration`&&n.args[1]===`setup`?[`--force`]:[],...i.options.nonInteractive?[`--non-interactive`]:[],...Object.entries(i.options.answers??{}).flatMap(([e,t])=>[`--answer`,`${e}=${JSON.stringify(t)}`])]},i.item,{prompter:s,signal:i.options.signal});if(r.kind===`cancelled`)return i.logger.log(i.cancelledReminder),!1;if(r.kind===`blocked`){if(!i.options.nonInteractive)throw Error(`Setup requires more input.`);return i.logger.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,item:i.item,installed:!0,completedItems:[],...r.blocker,next:headlessSetupContinuation({item:i.item,installed:!0,answers:i.options.answers,question:r.blocker.status===`input_required`?r.blocker.question:void 0})})),process.exitCode=2,!1}if(i.options.silent!==!0)for(let e of r.facts)i.logger.log(`${e.label}: ${e.value}`);a=mergeRegistrySetupCompletions(a,r)}return a}catch(n){let r=n instanceof Error?n.message:String(n);if(i.options.nonInteractive)return i.logger.error(serializeHeadlessSetupEvent({version:1,type:`failed`,item:i.item,completedItems:[],message:r,next:headlessSetupContinuation({item:i.item,installed:!0,answers:i.options.answers})})),process.exitCode=1,!1;throw Error(`${r} Try again with \`${i.resumeCommand}\`.`)}}export{runDeclaredSetups};
|
|
@@ -6,6 +6,16 @@ declare const EveRegistryMetadataSchema: z.ZodObject<{
|
|
|
6
6
|
"chat-sdk": "chat-sdk";
|
|
7
7
|
native: "native";
|
|
8
8
|
}>>;
|
|
9
|
+
install: z.ZodOptional<z.ZodObject<{
|
|
10
|
+
pnpm: z.ZodOptional<z.ZodObject<{
|
|
11
|
+
buildScripts: z.ZodArray<z.ZodObject<{
|
|
12
|
+
packages: z.ZodArray<z.ZodString>;
|
|
13
|
+
optional: z.ZodLiteral<true>;
|
|
14
|
+
recommendedAction: z.ZodLiteral<"ignore-optional">;
|
|
15
|
+
reason: z.ZodString;
|
|
16
|
+
}, z.core.$strip>>;
|
|
17
|
+
}, z.core.$strip>>;
|
|
18
|
+
}, z.core.$strip>>;
|
|
9
19
|
setup: z.ZodOptional<z.ZodPipe<z.ZodUnion<readonly [z.ZodObject<{
|
|
10
20
|
package: z.ZodString;
|
|
11
21
|
bin: z.ZodString;
|
|
@@ -40,6 +50,16 @@ export declare function eveMetadataFromRegistryItem(item: unknown): {
|
|
|
40
50
|
requires?: string | undefined;
|
|
41
51
|
docs?: string | undefined;
|
|
42
52
|
implementation?: "chat-sdk" | "native" | undefined;
|
|
53
|
+
install?: {
|
|
54
|
+
pnpm?: {
|
|
55
|
+
buildScripts: {
|
|
56
|
+
packages: string[];
|
|
57
|
+
optional: true;
|
|
58
|
+
recommendedAction: "ignore-optional";
|
|
59
|
+
reason: string;
|
|
60
|
+
}[];
|
|
61
|
+
} | undefined;
|
|
62
|
+
} | undefined;
|
|
43
63
|
setup?: {
|
|
44
64
|
package: string;
|
|
45
65
|
bin: string;
|
|
@@ -61,6 +81,16 @@ export declare function parseRegistryPresentationManifest(input: unknown): {
|
|
|
61
81
|
requires?: string | undefined;
|
|
62
82
|
docs?: string | undefined;
|
|
63
83
|
implementation?: "chat-sdk" | "native" | undefined;
|
|
84
|
+
install?: {
|
|
85
|
+
pnpm?: {
|
|
86
|
+
buildScripts: {
|
|
87
|
+
packages: string[];
|
|
88
|
+
optional: true;
|
|
89
|
+
recommendedAction: "ignore-optional";
|
|
90
|
+
reason: string;
|
|
91
|
+
}[];
|
|
92
|
+
} | undefined;
|
|
93
|
+
} | undefined;
|
|
64
94
|
setup?: {
|
|
65
95
|
package: string;
|
|
66
96
|
bin: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{RegistryPackageComponentSchema}from"./registry-package.js";import{z}from"#compiled/zod/index.js";const RegistrySetupSchema=z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}),EveRegistryMetadataSchema=z.object({requires:z.string().optional(),docs:z.string().min(1).optional(),implementation:z.enum([`native`,`chat-sdk`]).optional(),setup:z.union([RegistrySetupSchema,z.array(RegistrySetupSchema).min(1)]).transform(e=>Array.isArray(e)?e:[e]).optional(),components:z.array(RegistryPackageComponentSchema).min(1).optional()}),EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}),OfficialRegistryCatalogSchema=z.object({items:z.array(z.object({name:z.string().min(1),meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}))}),RegistryPresentationManifestSchema=EveRegistryItemMetadataSchema.extend({title:z.string().optional(),description:z.string().optional(),dependencies:z.array(z.string()).optional(),files:z.array(z.object({target:z.string()})).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function parseOfficialRegistrySearchMetadata(e){let{items:t}=OfficialRegistryCatalogSchema.parse(e),n=new Map;for(let e of t){let{docs:t,implementation:r}=e.meta?.eve??{};(t!==void 0||r!==void 0)&&n.set(e.name,{docs:t,implementation:r})}return n}function parseRegistryPresentationManifest(e){return RegistryPresentationManifestSchema.safeParse(e).data}export{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata,parseRegistryPresentationManifest};
|
|
1
|
+
import{RegistryPackageComponentSchema}from"./registry-package.js";import{z}from"#compiled/zod/index.js";const RegistrySetupSchema=z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}),ExactPackageNameSchema=z.string().regex(/^(?:@[a-z0-9][a-z0-9._~-]*\/)?[a-z0-9][a-z0-9._~-]*$/u),PnpmBuildScriptPolicySchema=z.object({packages:z.array(ExactPackageNameSchema).min(1),optional:z.literal(!0),recommendedAction:z.literal(`ignore-optional`),reason:z.string().min(1)}),EveRegistryMetadataSchema=z.object({requires:z.string().optional(),docs:z.string().min(1).optional(),implementation:z.enum([`native`,`chat-sdk`]).optional(),install:z.object({pnpm:z.object({buildScripts:z.array(PnpmBuildScriptPolicySchema).min(1)}).optional()}).optional(),setup:z.union([RegistrySetupSchema,z.array(RegistrySetupSchema).min(1)]).transform(e=>Array.isArray(e)?e:[e]).optional(),components:z.array(RegistryPackageComponentSchema).min(1).optional()}),EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}),OfficialRegistryCatalogSchema=z.object({items:z.array(z.object({name:z.string().min(1),meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}))}),RegistryPresentationManifestSchema=EveRegistryItemMetadataSchema.extend({title:z.string().optional(),description:z.string().optional(),dependencies:z.array(z.string()).optional(),files:z.array(z.object({target:z.string()})).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function parseOfficialRegistrySearchMetadata(e){let{items:t}=OfficialRegistryCatalogSchema.parse(e),n=new Map;for(let e of t){let{docs:t,implementation:r}=e.meta?.eve??{};(t!==void 0||r!==void 0)&&n.set(e.name,{docs:t,implementation:r})}return n}function parseRegistryPresentationManifest(e){return RegistryPresentationManifestSchema.safeParse(e).data}export{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata,parseRegistryPresentationManifest};
|
|
@@ -3,6 +3,7 @@ import { z } from "#compiled/zod/index.js";
|
|
|
3
3
|
import { type Prompter } from "#setup/prompter.js";
|
|
4
4
|
import type { RegistrySetupCompletion } from "#setup/registry-setup-protocol.js";
|
|
5
5
|
import type { AddCommandOptions, RegistryCommandLogger } from "./registry.js";
|
|
6
|
+
import { type DeclaredPnpmBuildPolicy } from "./registry-pnpm-build-policy-flow.js";
|
|
6
7
|
import type { RegistrySetupCommand } from "./registry-setup-command.js";
|
|
7
8
|
export declare const RegistryPackageComponentSchema: z.ZodObject<{
|
|
8
9
|
item: z.ZodString;
|
|
@@ -13,6 +14,11 @@ export declare const RegistryPackageComponentSchema: z.ZodObject<{
|
|
|
13
14
|
export type RegistryPackageComponent = z.infer<typeof RegistryPackageComponentSchema>;
|
|
14
15
|
interface PackageMetadata {
|
|
15
16
|
requires?: string;
|
|
17
|
+
install?: {
|
|
18
|
+
pnpm?: {
|
|
19
|
+
buildScripts: readonly DeclaredPnpmBuildPolicy[];
|
|
20
|
+
};
|
|
21
|
+
};
|
|
16
22
|
setup?: RegistrySetupCommand[];
|
|
17
23
|
}
|
|
18
24
|
export interface RegistryPackageDependencies {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasInteractiveTerminal}from"./preconditions.js";import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{z}from"#compiled/zod/index.js";import{createPrompter}from"#setup/prompter.js";import{headlessAsker,interactiveAsker,withAnswers,withPolicy}from"#setup/ask.js";import{mergeRegistrySetupCompletions}from"#setup/registry-setup-completion.js";import{addRegistryItems,getRegistryItems}from"#compiled/shadcn-registry/index.js";const RegistryPackageComponentSchema=z.object({item:z.string().min(1),label:z.string().min(1),description:z.string().optional(),default:z.boolean().default(!1)});async function selectComponents(e,r,i,
|
|
1
|
+
import{hasInteractiveTerminal}from"./preconditions.js";import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{prepareDeclaredPnpmBuildPolicy}from"./registry-pnpm-build-policy-flow.js";import{z}from"#compiled/zod/index.js";import{createPrompter}from"#setup/prompter.js";import{headlessAsker,interactiveAsker,withAnswers,withPolicy}from"#setup/ask.js";import{mergeRegistrySetupCompletions}from"#setup/registry-setup-completion.js";import{addRegistryItems,getRegistryItems}from"#compiled/shadcn-registry/index.js";const RegistryPackageComponentSchema=z.object({item:z.string().min(1),label:z.string().min(1),description:z.string().optional(),default:z.boolean().default(!1)});async function selectComponents(e,r,i,a,u,d){if(a.prompter===void 0&&!a.nonInteractive&&(a.yes===!0||!u))return i.filter(e=>e.default);let f={key:`components`,message:`Add ${r}`,required:!0,recommended:i.filter(e=>e.default),options:i.map(e=>({id:e.item,value:e,label:e.label,hint:e.description}))},p=a.nonInteractive?withAnswers(a.answers??{})(a.yes?withPolicy(`assume`)(headlessAsker()):headlessAsker()):interactiveAsker(d());try{return await p.askMany(f)}catch(i){if(!a.nonInteractive||!(i instanceof Error)||i.name!==`InteractionRequired`)throw i;let o=i.question,{setupQuestionToWire:s}=await import(`#setup/setup-question-wire.js`),c=s(o);e.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`input_required`,item:r,installed:!1,completedItems:[],question:c,next:headlessSetupContinuation({item:r,installed:!1,answers:a.answers,question:c})})),process.exitCode=2;return}}async function runRegistryPackage(t){let{logger:n,appRoot:i,item:o,components:s,config:c,options:l,dependencies:p,operations:m}=t,h=p.hasInteractiveTerminal?.()??hasInteractiveTerminal(),g=l.prompter,getPrompter=()=>g??=p.createPrompter?.()??createPrompter(),_=await selectComponents(n,o,s,l,h,getPrompter);if(_===void 0)return!1;let v=_.map(e=>m.itemAddress(e.item)),y=await getRegistryItems(v,{config:c});if(y.length!==_.length)throw Error(`Registry package "${o}" could not resolve all selected components.`);let b=y.map(e=>{let t=m.metadata(e);return m.assertCompatibleVersion(t?.requires),t});if(l.skipInstall!==!0&&!await prepareDeclaredPnpmBuildPolicy({logger:n,appRoot:i,item:o,policies:b.flatMap(e=>e?.install?.pnpm?.buildScripts??[]),options:l}))return!1;l.skipInstall!==!0&&await addRegistryItems(v,{config:c,cwd:i,overwrite:l.overwrite,silent:l.silent});let x={facts:[]};if(l.skipSetup===!0)return x;if(!l.nonInteractive&&l.yes!==!0&&l.prompter===void 0&&!h)return n.log(m.setupReminder(o)),x;for(let e of b){if(e?.setup===void 0)continue;let t=await m.runSetups({item:o,setups:e.setup,prompter:getPrompter()});if(t===!1)return!1;x=mergeRegistrySetupCompletions(x,t)}return x}export{RegistryPackageComponentSchema,runRegistryPackage};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { detectPackageManager } from "#setup/package-manager.js";
|
|
2
|
+
import { type Prompter } from "#setup/prompter.js";
|
|
3
|
+
import type { RegistryCommandLogger } from "./registry-recovery.js";
|
|
4
|
+
import { applyPnpmBuildPolicy, inspectPnpmBuildPolicy } from "./registry-pnpm-build-policy.js";
|
|
5
|
+
export interface DeclaredPnpmBuildPolicy {
|
|
6
|
+
readonly packages: readonly string[];
|
|
7
|
+
readonly optional: true;
|
|
8
|
+
readonly recommendedAction: "ignore-optional";
|
|
9
|
+
readonly reason: string;
|
|
10
|
+
}
|
|
11
|
+
interface PnpmBuildPolicyFlowDependencies {
|
|
12
|
+
readonly detectPackageManager: typeof detectPackageManager;
|
|
13
|
+
readonly inspectPnpmBuildPolicy: typeof inspectPnpmBuildPolicy;
|
|
14
|
+
readonly applyPnpmBuildPolicy: typeof applyPnpmBuildPolicy;
|
|
15
|
+
readonly createPrompter: () => Prompter;
|
|
16
|
+
}
|
|
17
|
+
/** Resolves declared pnpm build-script decisions before registry installation begins. */
|
|
18
|
+
export declare function prepareDeclaredPnpmBuildPolicy(input: {
|
|
19
|
+
readonly logger: RegistryCommandLogger;
|
|
20
|
+
readonly appRoot: string;
|
|
21
|
+
readonly item: string;
|
|
22
|
+
readonly policies: readonly DeclaredPnpmBuildPolicy[] | undefined;
|
|
23
|
+
readonly options: {
|
|
24
|
+
readonly yes?: boolean;
|
|
25
|
+
readonly nonInteractive?: boolean;
|
|
26
|
+
readonly answers?: Readonly<Record<string, unknown>>;
|
|
27
|
+
readonly prompter?: Prompter;
|
|
28
|
+
};
|
|
29
|
+
}, dependencyOverrides?: Partial<PnpmBuildPolicyFlowDependencies>): Promise<boolean>;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{applyPnpmBuildPolicy,inspectPnpmBuildPolicy}from"./registry-pnpm-build-policy.js";import{createPrompter}from"#setup/prompter.js";import{detectPackageManager}from"#setup/package-manager.js";import{WizardCancelledError}from"#setup/step.js";const PNPM_BUILD_POLICY_ANSWER_KEY=`install.pnpm.buildScripts`;function pnpmBuildPolicyChoice(e){return e===`ignore-optional`||e===`allow-builds`||e===`abort`?e:void 0}async function prepareDeclaredPnpmBuildPolicy(a,o={}){if(a.policies===void 0||a.policies.length===0)return!0;let s={detectPackageManager:o.detectPackageManager??detectPackageManager,inspectPnpmBuildPolicy:o.inspectPnpmBuildPolicy??inspectPnpmBuildPolicy,applyPnpmBuildPolicy:o.applyPnpmBuildPolicy??applyPnpmBuildPolicy,createPrompter:o.createPrompter??createPrompter};if((await s.detectPackageManager(a.appRoot)).kind!==`pnpm`)return!0;for(let t of a.policies){let n=await s.inspectPnpmBuildPolicy(a.appRoot,t.packages);if(n.satisfied)continue;let r=a.options.answers?.[PNPM_BUILD_POLICY_ANSWER_KEY],i=pnpmBuildPolicyChoice(r);if(r!==void 0&&i===void 0)throw Error(`${PNPM_BUILD_POLICY_ANSWER_KEY} must be "ignore-optional", "allow-builds", or "abort".`);if(a.options.nonInteractive&&i===void 0&&a.options.yes!==!0){let n={key:PNPM_BUILD_POLICY_ANSWER_KEY,kind:`select`,message:`How should pnpm handle these optional packages?`,required:!0,recommended:t.recommendedAction,options:[{id:`ignore-optional`,label:`Ignore optional packages`},{id:`allow-builds`,label:`Allow build scripts`},{id:`abort`,label:`Abort add`}]};return a.logger.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,item:a.item,installed:!1,completedItems:[],status:`input_required`,question:n,next:headlessSetupContinuation({item:a.item,installed:!1,question:n})})),process.exitCode=2,!1}if(i===void 0&&a.options.yes===!0&&(i=t.recommendedAction),i===void 0){let e=a.options.prompter??s.createPrompter();try{i=await e.select({message:`How should pnpm handle these optional packages?`,description:t.reason,metadata:[{label:`Packages`,value:t.packages.join(`, `)},{label:`Policy file`,value:n.filePath}],hintLayout:`inline`,initialValue:t.recommendedAction,options:[{value:`ignore-optional`,label:`Ignore optional packages (recommended)`,hint:`Add the item without installing these packages or running their build scripts.`},{value:`allow-builds`,label:`Allow build scripts`,hint:`Install these packages and allow their third-party build scripts to run.`},{value:`abort`,label:`Abort add`,hint:`Do not add this registry item.`}]})}catch(e){if(!(e instanceof WizardCancelledError))throw e;return!1}}if(i===`abort`)return a.options.nonInteractive&&a.logger.log(serializeHeadlessSetupEvent({version:1,type:`cancelled`,item:a.item,completedItems:[]})),!1;if(i===void 0)throw Error(`pnpm build policy selection is required.`);await s.applyPnpmBuildPolicy(n,i)}return!0}export{prepareDeclaredPnpmBuildPolicy};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type PnpmBuildPolicyAction = "ignore-optional" | "allow-builds";
|
|
2
|
+
export interface PnpmBuildPolicyContext {
|
|
3
|
+
readonly filePath: string;
|
|
4
|
+
readonly packages: readonly string[];
|
|
5
|
+
readonly satisfied: boolean;
|
|
6
|
+
}
|
|
7
|
+
/** Applies one explicit pnpm build policy while preserving unrelated workspace settings. */
|
|
8
|
+
export declare function withPnpmBuildPolicy(source: string, packages: readonly string[], action: PnpmBuildPolicyAction): string;
|
|
9
|
+
/** Resolves whether every package already has an explicit non-blocking pnpm policy. */
|
|
10
|
+
export declare function inspectPnpmBuildPolicy(appRoot: string, packages: readonly string[]): Promise<PnpmBuildPolicyContext>;
|
|
11
|
+
/** Persists the policy selected before the registry installation transaction begins. */
|
|
12
|
+
export declare function applyPnpmBuildPolicy(context: PnpmBuildPolicyContext, action: PnpmBuildPolicyAction): Promise<void>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{access,readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{PNPM_WORKSPACE_PATH,findClaimingAncestorPnpmWorkspaceRoot}from"#setup/primitives/pm/pnpm.js";function blockRange(e,t){let n=e.findIndex(e=>RegExp(`^${t}:`).test(e));if(n<0)return;if(!RegExp(`^${t}:\\s*(?:#.*)?$`).test(e[n]??``))throw Error(`Cannot safely update ${t} because it does not use block-style YAML in ${PNPM_WORKSPACE_PATH}.`);let r=n+1;for(;r<e.length&&!/^\S/u.test(e[r]??``);)r+=1;return{start:n,end:r}}function unquoteYamlScalar(e){let t=e.trim();if(t.startsWith(`"`)&&t.endsWith(`"`))try{let e=JSON.parse(t);if(typeof e==`string`)return e}catch{return t}return t.startsWith(`'`)&&t.endsWith(`'`)?t.slice(1,-1).replaceAll(`''`,`'`):t}function mappingEntry(e){let t=/^\s+("(?:[^"\\]|\\.)*"|'(?:[^']|'')*'|[^:#][^:]*?):\s*(true|false)\s*(?:#.*)?$/u.exec(e);if(t!==null)return{key:unquoteYamlScalar(t[1]),value:t[2]===`true`}}function sequenceEntry(e){let t=/^\s+-\s+(.*?)(?:\s+#.*)?$/u.exec(e);return t===null?void 0:unquoteYamlScalar(t[1])}function policyEntries(e,t,n){let r=blockRange(e,t),i=new Map;if(r===void 0)return i;for(let t of e.slice(r.start+1,r.end))if(n===`mapping`){let e=mappingEntry(t);e!==void 0&&i.set(e.key,e.value)}else{let e=sequenceEntry(t);e!==void 0&&i.set(e,!0)}return i}function removePolicyEntries(e,t,n,r){let i=blockRange(e,t);if(i===void 0)return;for(let t=i.end-1;t>i.start;--t){let i=n===`mapping`?mappingEntry(e[t]??``)?.key:sequenceEntry(e[t]??``);i!==void 0&&r.has(i)&&e.splice(t,1)}let a=blockRange(e,t);if(a!==void 0&&!e.slice(a.start+1,a.end).some(e=>(n===`mapping`?mappingEntry(e):sequenceEntry(e))!==void 0)){let t=e.slice(a.start+1,a.end).filter(e=>e.trimStart().startsWith(`#`));e.splice(a.start,a.end-a.start,...t)}}function appendPolicyEntries(e,t,n,r){let i=blockRange(e,t);if(i===void 0){for(;e.at(-1)===``;)e.pop();e.length>0&&e.push(``),e.push(`${t}:`),i={start:e.length-1,end:e.length}}let a=policyEntries(e,t,n),o=r.filter(e=>!a.has(e));if(o.length===0)return;let s=o.map(e=>n===`mapping`?` ${JSON.stringify(e)}: true`:` - ${JSON.stringify(e)}`);e.splice(i.end,0,...s)}function withPnpmBuildPolicy(e,t,n){let r=[...new Set(t)].sort(),i=new Set(r),a=e.replace(/\r\n/gu,`
|
|
2
|
+
`).split(`
|
|
3
|
+
`);for(removePolicyEntries(a,`allowBuilds`,`mapping`,i),removePolicyEntries(a,`ignoredOptionalDependencies`,`sequence`,i),n===`allow-builds`?appendPolicyEntries(a,`allowBuilds`,`mapping`,r):appendPolicyEntries(a,`ignoredOptionalDependencies`,`sequence`,r);a.at(-1)===``;)a.pop();return`${a.join(`
|
|
4
|
+
`)}\n`}async function readWorkspacePolicy(e){try{return await readFile(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return``;throw e}}async function owningPnpmWorkspaceRoot(t){try{return await access(join(t,PNPM_WORKSPACE_PATH)),t}catch(e){if(e.code!==`ENOENT`)throw e}return findClaimingAncestorPnpmWorkspaceRoot(t)??t}async function inspectPnpmBuildPolicy(e,t){let n=join(await owningPnpmWorkspaceRoot(e),PNPM_WORKSPACE_PATH),a=(await readWorkspacePolicy(n)).replace(/\r\n/gu,`
|
|
5
|
+
`).split(`
|
|
6
|
+
`),o=policyEntries(a,`allowBuilds`,`mapping`),s=policyEntries(a,`ignoredOptionalDependencies`,`sequence`);return{filePath:n,packages:t,satisfied:t.every(e=>o.get(e)===!0||s.has(e))}}async function applyPnpmBuildPolicy(e,t){let r=await readWorkspacePolicy(e.filePath);await writeFile(e.filePath,withPnpmBuildPolicy(r,e.packages,t),`utf8`)}export{applyPnpmBuildPolicy,inspectPnpmBuildPolicy,withPnpmBuildPolicy};
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import type { RegistrySetupCompletion } from "#setup/registry-setup-protocol.js";
|
|
1
2
|
export interface RegistryCommandLogger {
|
|
2
3
|
error(message: string): void;
|
|
3
4
|
log(message: string): void;
|
|
4
5
|
}
|
|
6
|
+
export declare function reportRegistryCompletion(logger: RegistryCommandLogger, item: string, completion: RegistrySetupCompletion | false, options: {
|
|
7
|
+
nonInteractive?: boolean;
|
|
8
|
+
}): RegistrySetupCompletion | undefined;
|
|
5
9
|
export declare function errorMessage(error: unknown): string;
|
|
6
10
|
export declare function runRegistryAction<T>(logger: RegistryCommandLogger, _appRoot: string, action: () => Promise<T>): Promise<T | undefined>;
|
|
7
11
|
export declare function resolveRegistryItemForAdd<T>(logger: RegistryCommandLogger, loadItem: () => Promise<T>, printSuggestions: () => Promise<void>): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{WizardCancelledError}from"#setup/step.js";function errorMessage(e){return e instanceof Error?e.message:String(e)}function isRegistryNotFoundError(e){return e instanceof Error&&`code`in e&&e.code===`NOT_FOUND`}async function runRegistryAction(
|
|
1
|
+
import{reportHeadlessSetupCompletion}from"./setup-headless.js";import{WizardCancelledError}from"#setup/step.js";function reportRegistryCompletion(t,n,r,i){return reportHeadlessSetupCompletion({logger:t,item:n,completion:r,nonInteractive:i.nonInteractive})}function errorMessage(e){return e instanceof Error?e.message:String(e)}function isRegistryNotFoundError(e){return e instanceof Error&&`code`in e&&e.code===`NOT_FOUND`}async function runRegistryAction(e,n,r){try{return await r()}catch(n){if(n instanceof WizardCancelledError)return;e.error(errorMessage(n)),process.exitCode=1;return}}async function resolveRegistryItemForAdd(e,t,n){try{return{found:!0,item:await t()}}catch(t){if(!isRegistryNotFoundError(t))throw t;return e.error(errorMessage(t)),await n(),process.exitCode=1,{found:!1}}}function setupResumeCommand(e){return`eve add ${/^[\w@./:-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`} --skip-install`}function setupReminder(e,t){return`${t===`cancelled`?`Setup cancelled.`:`Setup skipped.`} Run \`${setupResumeCommand(e)}\` when you're ready.`}export{errorMessage,reportRegistryCompletion,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand};
|
|
@@ -80,7 +80,7 @@ export declare function installRegistryItem(appRoot: string, item: string, optio
|
|
|
80
80
|
setup?: RegistrySetupCompletion;
|
|
81
81
|
}>;
|
|
82
82
|
/** Installs an official, configured, or URL-addressed registry item. */
|
|
83
|
-
export declare function runAddCommand(logger: RegistryCommandLogger, appRoot: string, item: string, options: RunAddCommandOptions, dependencies?: AddCommandDependencies): Promise<RegistrySetupCompletion | undefined>;
|
|
83
|
+
export declare function runAddCommand(logger: RegistryCommandLogger, appRoot: string, item: string, options: RunAddCommandOptions, dependencies?: AddCommandDependencies): Promise<RegistrySetupCompletion | false | undefined>;
|
|
84
84
|
/** Adds registry namespace mappings to the project's package.json. */
|
|
85
85
|
export declare function runRegistryAddCommand(logger: RegistryCommandLogger, appRoot: string, mappings: readonly string[]): Promise<void>;
|
|
86
86
|
/** Lists registry items from every configured source or one selected source. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasInteractiveTerminal}from"./preconditions.js";import{reportHeadlessSetupCompletion,serializeHeadlessSetupEvent}from"./setup-headless.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{installRegistryItemTransaction}from"./registry-install-transaction.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{addRegistryMappings,prepareWebRegistryProject,readRegistryConfig}from"./registry-project.js";import{errorMessage,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand,prepareWebRegistryProject};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}async function loadOfficialSearchMetadata(){let e=await fetch(OFFICIAL_CATALOG);if(!e.ok)throw Error(`Could not read the eve registry (${e.status}).`);return parseOfficialRegistrySearchMetadata(await e.json())}function searchItemAddress(e){return e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument}function enrichSearchItem(e,t){let n=searchItemAddress(e);return{item:e,address:n,...t.get(n)}}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function searchPresentationSections(e,t,n){return e.flatMap(e=>{let r=t.get(e);return r===void 0?[]:[{label:registrySourceLabel(e),items:r.items.map(e=>enrichSearchItem(e,n)),total:r.pagination.total}]})}async function printAddSuggestions(e,t,n){try{let r=n.split(`/`).at(-1)||n,{resultsBySource:i,sources:a,metadataByAddress:o}=await searchRegistryCatalog(t,{limit:5,query:r}),s=searchPresentationSections(a,i,o);if(s.every(e=>e.items.length===0))return;e.log(`Did you mean?`),printRegistrySearchResults(e,{query:r,sections:s})}catch{}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=o.has(OFFICIAL_CATALOG)?await loadOfficialSearchMetadata():new Map,l=o.get(OFFICIAL_CATALOG);l!==void 0&&l.items.sort((e,t)=>{let rank=e=>c.get(searchItemAddress(e))?.implementation===`native`?0:1;return rank(e)-rank(t)});let u=[...o.values()];return{config:n,result:{items:u.flatMap(e=>e.items),pagination:{hasMore:u.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:u.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r,metadataByAddress:c}}async function browseRegistryCatalog(e,t={}){let{result:n}=await searchRegistryCatalog(e,t);return{items:n.items.map(e=>{let t={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry};return e.title!==void 0&&(t.title=e.title),e.type!==void 0&&(t.type=e.type),e.description!==void 0&&(t.description=e.description),t}),total:n.pagination.total,errors:n.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:s,metadataByAddress:l}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),u=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...l.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(s,o,l)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of u)e.error(`${t.registry}: ${t.message}`);u.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode,c=await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes,setupAuthorized:n.prompter!==void 0},r);if(process.exitCode=s,i!==void 0)throw Error(i);let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,t,s,c,l=defaultAddCommandDependencies){return runRegistryAction(e,t,async()=>{let u=await readEveRegistryConfig(t),d=itemAddress(s);if(c.skipInstall===!0){if(c.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(c.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(d))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let f=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([d],{config:u}))[0],()=>printAddSuggestions(e,t,s));if(!f.found)return;let p=f.item,m=isOfficialItemAddress(d)?eveMetadataFromRegistryItem(p):void 0;if(assertCompatibleEveVersion(m?.requires),m?.components!==void 0){if(!isOfficialItemAddress(d))throw Error(`Registry packages require the official eve registry.`);return reportCompletion(e,s,await runRegistryPackage({logger:e,appRoot:t,item:s,components:m.components,config:u,options:c,dependencies:l,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:n,setups:i,prompter:a})=>runDeclaredSetups({logger:e,appRoot:t,item:n,setups:i,options:{yes:c.yes,nonInteractive:c.nonInteractive,answers:c.answers,prompter:a,signal:c.signal},dependencies:l,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)}),setupReminder:e=>setupReminder(e,`skipped`)}}),c)}if(c.skipInstall===!0){if(m?.setup===void 0)throw Error(`Registry item "${s}" does not declare a setup flow.`);return reportCompletion(e,s,await runDeclaredSetups({logger:e,appRoot:t,item:s,setups:m.setup,options:c,dependencies:l,cancelledReminder:setupReminder(s,`cancelled`),resumeCommand:setupResumeCommand(s)}),c)}if(d===itemAddress(`channel/web`)&&await(l.prepareWebRegistryProject??prepareWebRegistryProject)(t),await installRegistryItemTransaction({appRoot:t,item:s,registryItem:p,nonInteractive:c.nonInteractive,logger:e,install:async()=>{await addRegistryItems([d],{config:u,cwd:t,overwrite:c.overwrite,silent:c.silent})}}),m?.setup===void 0)return reportCompletion(e,s,{facts:[]},c);let h=l.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(c.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:c.skipInstall?`Setup ${s}`:`Installed ${s}`})),c.skipSetup===!0){if(c.nonInteractive)return reportCompletion(e,s,{facts:[]},c);e.log(setupReminder(s,`skipped`));return}if(!c.nonInteractive&&!c.yes&&!h&&c.setupAuthorized!==!0){e.log(setupReminder(s,`skipped`));return}if(!c.nonInteractive&&!c.yes&&c.setupAuthorized!==!0)try{if(await(c.prompter??l.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${s} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(s,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(s,`cancelled`));return}return reportCompletion(e,s,await runDeclaredSetups({logger:e,appRoot:t,item:s,setups:m.setup,options:c,dependencies:l,cancelledReminder:setupReminder(s,`cancelled`),resumeCommand:setupResumeCommand(s)}),c)})}function reportCompletion(e,n,r,i){return reportHeadlessSetupCompletion({logger:e,item:n,completion:r,nonInteractive:i.nonInteractive})}async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n,r={}){await runRegistryAction(e,t,async()=>{let i=await readEveRegistryConfig(t),a=await getRegistryItems([itemAddress(n)],{config:i}),o=a.length===1?a[0]:a;e.log(r.json?JSON.stringify(o,null,2):registryViewText(n,o))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
|
|
1
|
+
import{hasInteractiveTerminal}from"./preconditions.js";import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{installRegistryItemTransaction}from"./registry-install-transaction.js";import{prepareDeclaredPnpmBuildPolicy}from"./registry-pnpm-build-policy-flow.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{addRegistryMappings,prepareWebRegistryProject,readRegistryConfig}from"./registry-project.js";import{errorMessage,reportRegistryCompletion,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand,prepareWebRegistryProject};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}async function loadOfficialSearchMetadata(){let e=await fetch(OFFICIAL_CATALOG);if(!e.ok)throw Error(`Could not read the eve registry (${e.status}).`);return parseOfficialRegistrySearchMetadata(await e.json())}function searchItemAddress(e){return e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument}function enrichSearchItem(e,t){let n=searchItemAddress(e);return{item:e,address:n,...t.get(n)}}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function searchPresentationSections(e,t,n){return e.flatMap(e=>{let r=t.get(e);return r===void 0?[]:[{label:registrySourceLabel(e),items:r.items.map(e=>enrichSearchItem(e,n)),total:r.pagination.total}]})}async function printAddSuggestions(e,t,n){try{let r=n.split(`/`).at(-1)||n,{resultsBySource:i,sources:a,metadataByAddress:o}=await searchRegistryCatalog(t,{limit:5,query:r}),s=searchPresentationSections(a,i,o);if(s.every(e=>e.items.length===0))return;e.log(`Did you mean?`),printRegistrySearchResults(e,{query:r,sections:s})}catch{}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=o.has(OFFICIAL_CATALOG)?await loadOfficialSearchMetadata():new Map,l=o.get(OFFICIAL_CATALOG);l!==void 0&&l.items.sort((e,t)=>{let rank=e=>c.get(searchItemAddress(e))?.implementation===`native`?0:1;return rank(e)-rank(t)});let u=[...o.values()];return{config:n,result:{items:u.flatMap(e=>e.items),pagination:{hasMore:u.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:u.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r,metadataByAddress:c}}async function browseRegistryCatalog(e,t={}){let{result:n}=await searchRegistryCatalog(e,t);return{items:n.items.map(e=>{let t={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry};return e.title!==void 0&&(t.title=e.title),e.type!==void 0&&(t.type=e.type),e.description!==void 0&&(t.description=e.description),t}),total:n.pagination.total,errors:n.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:s,metadataByAddress:l}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),u=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...l.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(s,o,l)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of u)e.error(`${t.registry}: ${t.message}`);u.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode,c=await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes,setupAuthorized:n.prompter!==void 0},r);if(process.exitCode=s,i!==void 0)throw Error(i);if(c===!1)throw new WizardCancelledError;let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,s,c,l,u=defaultAddCommandDependencies){return runRegistryAction(e,s,async()=>{let d=await readEveRegistryConfig(s),f=itemAddress(c);if(l.skipInstall===!0){if(l.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(l.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(f))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let p=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([f],{config:d}))[0],()=>printAddSuggestions(e,s,c));if(!p.found)return;let m=p.item,h=isOfficialItemAddress(f)?eveMetadataFromRegistryItem(m):void 0;if(assertCompatibleEveVersion(h?.requires),h?.components!==void 0){if(!isOfficialItemAddress(f))throw Error(`Registry packages require the official eve registry.`);return reportRegistryCompletion(e,c,await runRegistryPackage({logger:e,appRoot:s,item:c,components:h.components,config:d,options:l,dependencies:u,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:t,setups:r,prompter:i})=>runDeclaredSetups({logger:e,appRoot:s,item:t,setups:r,options:{yes:l.yes,force:l.overwrite,nonInteractive:l.nonInteractive,answers:l.answers,prompter:i,signal:l.signal},dependencies:u,cancelledReminder:setupReminder(t,`cancelled`),resumeCommand:setupResumeCommand(t)}),setupReminder:e=>setupReminder(e,`skipped`)}}),l)}if(l.skipInstall===!0){if(h?.setup===void 0)throw Error(`Registry item "${c}" does not declare a setup flow.`);return reportRegistryCompletion(e,c,await runDeclaredSetups({logger:e,appRoot:s,item:c,setups:h.setup,options:l,dependencies:u,cancelledReminder:setupReminder(c,`cancelled`),resumeCommand:setupResumeCommand(c)}),l)}if(!await prepareDeclaredPnpmBuildPolicy({logger:e,appRoot:s,item:c,policies:h?.install?.pnpm?.buildScripts,options:l}))return!1;if(f===itemAddress(`channel/web`)&&await(u.prepareWebRegistryProject??prepareWebRegistryProject)(s),await installRegistryItemTransaction({appRoot:s,item:c,registryItem:m,nonInteractive:l.nonInteractive,logger:e,install:async()=>{await addRegistryItems([f],{config:d,cwd:s,overwrite:l.overwrite,silent:l.silent})}}),h?.setup===void 0)return reportRegistryCompletion(e,c,{facts:[]},l);let g=u.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(l.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:l.skipInstall?`Setup ${c}`:`Installed ${c}`})),l.skipSetup===!0){if(l.nonInteractive)return reportRegistryCompletion(e,c,{facts:[]},l);e.log(setupReminder(c,`skipped`));return}if(!l.nonInteractive&&!l.yes&&!g&&l.setupAuthorized!==!0){e.log(setupReminder(c,`skipped`));return}if(!l.nonInteractive&&!l.yes&&l.setupAuthorized!==!0)try{if(await(l.prompter??u.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${c} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(c,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(c,`cancelled`));return}return reportRegistryCompletion(e,c,await runDeclaredSetups({logger:e,appRoot:s,item:c,setups:h.setup,options:{...l,force:l.overwrite},dependencies:u,cancelledReminder:setupReminder(c,`cancelled`),resumeCommand:setupResumeCommand(c)}),l)})}async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n,r={}){await runRegistryAction(e,t,async()=>{let i=await readEveRegistryConfig(t),a=await getRegistryItems([itemAddress(n)],{config:i}),o=a.length===1?a[0]:a;e.log(r.json?JSON.stringify(o,null,2):registryViewText(n,o))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{formatRegistrySessionResult,registryItemProgress,registryResultTone}from"./registry-result-message.js";import{createTuiPrompter}from"./tui-prompter.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{WizardCancelledError}from"#setup/step.js";import{runLoginFlow}from"#setup/flows/login.js";import{HumanActionRequiredError}from"#setup/human-action.js";import{runInstallVercelCliFlow}from"#setup/flows/install-vercel-cli.js";import{runModelFlow}from"#setup/flows/model.js";import{runProviderFlow}from"#setup/flows/provider.js";import{RegistryFlowFailedError,runRegistryFlow}from"#setup/flows/registry.js";const SETUP_FLOW_CONFIG={"vc:install":{title:`Install the Vercel CLI`,indicator:`pulse`},"vc:login":{title:`Log in to Vercel`,indicator:`pulse`},model:{title:`Configure the agent model`,indicator:`pulse`},add:{title:`Add to your agent`,indicator:`pulse`},deploy:{title:`Deploy to Vercel`,indicator:`spinner`}};function muteableRenderer(e,t,n){return{readSelect:n=>t()?Promise.resolve(void 0):e.readSelect(n),readEditableSelect:n=>t()?Promise.resolve(void 0):e.readEditableSelect(n),readProviderPicker:n=>t()?Promise.resolve(void 0):e.readProviderPicker(n),readModelEditor:n=>t()?Promise.resolve(void 0):e.readModelEditor(n),readText:n=>t()?Promise.resolve(void 0):e.readText(n),readAcknowledge:n=>t()?Promise.resolve():e.readAcknowledge(n),readChoice:n=>t()?{choice:Promise.resolve(void 0),close:()=>{}}:e.readChoice(n),setNavigation:n=>{t()||e.setNavigation?.(n)},setStatus:n=>{t()||e.setStatus(n)},renderLine:(n,r)=>{(!t()||r===`warning`||r===`error`)&&e.renderLine(n,r)},replaceContent:n=>{t()||e.replaceContent?.(n)},renderOutput:n=>{t()||e.renderOutput(n)},withInheritedStdio:t=>e.withInheritedStdio(t),withExclusiveTerminal:e=>n?.(e)??e()}}async function runTuiSetupCommand(e){let{command:t}=e,n=!1,i=new AbortController,o=muteableRenderer(e.renderer,()=>n,e.withExclusiveTerminal),s=(e.createPrompter??createTuiPrompter)(o),cancelActiveRegistryItem,
|
|
2
|
-
`),preserveFlowDiagnostics:!1};return t.accessChanged&&(i.effect={kind:`model-access-changed`}),i}case`add`:{let i=await
|
|
1
|
+
import{formatRegistrySessionResult,registryItemProgress,registryResultTone}from"./registry-result-message.js";import{createTuiPrompter}from"./tui-prompter.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{WizardCancelledError}from"#setup/step.js";import{runLoginFlow}from"#setup/flows/login.js";import{HumanActionRequiredError}from"#setup/human-action.js";import{runInstallVercelCliFlow}from"#setup/flows/install-vercel-cli.js";import{runModelFlow}from"#setup/flows/model.js";import{runProviderFlow}from"#setup/flows/provider.js";import{RegistryFlowFailedError,runRegistryFlow}from"#setup/flows/registry.js";const SETUP_FLOW_CONFIG={"vc:install":{title:`Install the Vercel CLI`,indicator:`pulse`},"vc:login":{title:`Log in to Vercel`,indicator:`pulse`},model:{title:`Configure the agent model`,indicator:`pulse`},add:{title:`Add to your agent`,indicator:`pulse`},deploy:{title:`Deploy to Vercel`,indicator:`spinner`}};function muteableRenderer(e,t,n){return{readSelect:n=>t()?Promise.resolve(void 0):e.readSelect(n),readEditableSelect:n=>t()?Promise.resolve(void 0):e.readEditableSelect(n),readProviderPicker:n=>t()?Promise.resolve(void 0):e.readProviderPicker(n),readModelEditor:n=>t()?Promise.resolve(void 0):e.readModelEditor(n),readText:n=>t()?Promise.resolve(void 0):e.readText(n),readAcknowledge:n=>t()?Promise.resolve():e.readAcknowledge(n),readChoice:n=>t()?{choice:Promise.resolve(void 0),close:()=>{}}:e.readChoice(n),setNavigation:n=>{t()||e.setNavigation?.(n)},setStatus:n=>{t()||e.setStatus(n)},renderLine:(n,r)=>{(!t()||r===`warning`||r===`error`)&&e.renderLine(n,r)},replaceContent:n=>{t()||e.replaceContent?.(n)},renderOutput:n=>{t()||e.renderOutput(n)},withInheritedStdio:t=>e.withInheritedStdio(t),withExclusiveTerminal:e=>n?.(e)??e()}}async function runTuiSetupCommand(e){let{command:t}=e,n=!1,i=new AbortController,o=muteableRenderer(e.renderer,()=>n,e.withExclusiveTerminal),s=(e.createPrompter??createTuiPrompter)(o),cancelActiveRegistryItem,runRegistryItem=async e=>{let t=new AbortController;cancelActiveRegistryItem=()=>t.abort(new WizardCancelledError);try{return await e(AbortSignal.any([i.signal,t.signal]))}finally{cancelActiveRegistryItem=void 0}},c=e.renderer.waitForInterrupt(),l=executeSetupCommand(e,s,o,i.signal,runRegistryItem),u=l.then(e=>({kind:`outcome`,value:e}));try{for(;;){let r=!1;try{let e=await Promise.race([u,c.promise.then(e=>({kind:`interrupt`,interrupt:e}))]);if(e.kind===`outcome`)return e.value;if(t===`add`&&e.interrupt===`escape`&&cancelActiveRegistryItem!==void 0)cancelActiveRegistryItem(),r=!0;else{n=!0,i.abort(new WizardCancelledError);let e=await l;return e.partial===!0?e:{...e,message:`/${t} interrupted.`,tone:`error`,preserveFlowDiagnostics:!0}}}finally{c.dispose()}r&&(c=e.renderer.waitForInterrupt())}}finally{e.renderer.setStatus(void 0)}}async function executeSetupCommand(r,s,d,f,p){let{command:m,appRoot:h}=r,g={runInstallVercelCliFlow,runLoginFlow,runModelFlow,runRegistryFlow,runDeployFlow,...r.flows};try{switch(m){case`vc:install`:return installVercelCliResultMessage(await g.runInstallVercelCliFlow({appRoot:h,prompter:s,signal:f}));case`vc:login`:return loginResultMessage(await g.runLoginFlow({appRoot:h,prompter:s,signal:f}));case`model`:{let pickProvider=e=>d.readProviderPicker(e),e={appRoot:h,prompter:s,signal:f,chatGptAccountLabel:r.chatGptAccountLabel,deps:{pickModelSettings:e=>d.readModelEditor(e),runProviderFlow:e=>runProviderFlow({...e,picker:pickProvider,recoverHumanAction:e=>recoverVercelHumanAction(e,g,{appRoot:h,prompter:s,signal:f})})}};r.initialModelStep!==void 0&&(e.initialStep=r.initialModelStep),e.withExclusiveTerminal=e=>d.withInheritedStdio(()=>r.withExclusiveTerminal?.(e)??e());let t=await g.runModelFlow(e);if(t.kind===`cancelled`)return{message:t.discardedDraft===!0?`/model dismissed. Drafted changes were discarded; Done commits them.`:`/model dismissed.`,cancelled:!0,preserveFlowDiagnostics:!1};let n=[];t.modelMessage!==void 0&&n.push(t.modelMessage),t.providerSelection!==void 0&&n.push(providerSelectionMessage(t.providerSelection));let i={message:n.join(`
|
|
2
|
+
`),preserveFlowDiagnostics:!1};return t.accessChanged&&(i.effect={kind:`model-access-changed`}),i}case`add`:{let i=await g.runRegistryFlow({appRoot:h,prompter:s,signal:f,initialAddress:r.initialRegistryAddress,plannerContext:r.registryPlannerContext,onItemStart:registryItemProgress(d),runItem:p});if(i.kind===`cancelled`)return{message:`/add dismissed.`,cancelled:!0,preserveFlowDiagnostics:!0};let a=i.result,o=registryResultTone(a),c=a.items.length>0||a.failures.length>0||a.outcomes!==void 0?formatRegistrySessionResult(a):`No integrations selected.`,l={message:o===`error`?`/add failed — ${c}`:c,preserveFlowDiagnostics:!0};return a.cancelled===!0?(l.partial=!0,l.tone=`error`):o!==void 0&&(l.tone=o),a.deployed===`production`&&(l.effect={kind:`deployed`}),l}case`deploy`:{let e=await g.runDeployFlow({appRoot:h,prompter:s,interactive:!0,signal:f});return e.kind===`cancelled`?{message:`/deploy dismissed.`,preserveFlowDiagnostics:!0}:e.kind===`needs-link`?{message:`Not linked to a Vercel project — run /model to connect one first.`,preserveFlowDiagnostics:!0}:e.kind===`local-model`?{message:`ChatGPT subscription models are local-only. Switch to an AI Gateway or server-authenticated model before deploying.`,preserveFlowDiagnostics:!0}:{message:e.productionUrl===void 0?`Deployed.`:`Deployed: ${e.productionUrl}`,preserveFlowDiagnostics:!0,effect:{kind:`deployed`}}}}}catch(t){if(t instanceof WizardCancelledError)return{message:`/${m} dismissed.`,cancelled:!0,preserveFlowDiagnostics:m!==`model`};let n=t instanceof RegistryFlowFailedError?t.cause:t,r=await vercelCliUpgradeOutcome(n,m,g,{appRoot:h,prompter:s,signal:f});if(r!==void 0)return withRegistryResults(r,t);let i=vercelActionOutcome(n,m);return i===void 0?t instanceof RegistryFlowFailedError?{message:`${formatRegistrySessionResult(t.completed)}\n\n${t.message}`,partial:!0,tone:`error`,preserveFlowDiagnostics:!0}:{message:`/${m} failed: ${t instanceof Error?t.message:String(t)}`,tone:`error`,preserveFlowDiagnostics:!0}:withRegistryResults(i,t)}}async function recoverVercelHumanAction(e,t,n){let r=e.action.kind;if(r!==`vercel-cli-missing`&&r!==`vercel-cli-upgrade`&&r!==`vercel-login`&&r!==`vercel-forbidden`)throw e;let i=r===`vercel-cli-missing`?{label:`Install Vercel CLI`,message:`The Vercel CLI is required. Install it now?`}:r===`vercel-cli-upgrade`?{label:`Upgrade Vercel CLI`,message:`Your Vercel CLI needs an update. Upgrade it now?`}:{label:r===`vercel-forbidden`?`Re-authenticate with Vercel`:`Log in to Vercel`,message:r===`vercel-forbidden`?`Vercel denied access to that team. Re-authenticate and continue?`:`You need to log in to Vercel to continue.`},a;try{a=await n.prompter.select({message:i.message,options:[{value:`repair`,label:`${i.label} and continue`},{value:`cancel`,label:`Choose another option`}],initialValue:`repair`})}catch{return`cancel`}if(a===`cancel`)return`cancel`;if(r===`vercel-cli-missing`||r===`vercel-cli-upgrade`){let e=await t.runInstallVercelCliFlow({appRoot:n.appRoot,prompter:n.prompter,signal:n.signal,upgrade:r===`vercel-cli-upgrade`});return e.kind===`installed`||e.kind===`already`?`retry`:(n.prompter.log.warning(e.kind===`failed`&&e.reason!==void 0?`Couldn't ${r===`vercel-cli-upgrade`?`upgrade`:`install`} the Vercel CLI: ${e.reason}`:`Couldn't ${r===`vercel-cli-upgrade`?`upgrade`:`install`} the Vercel CLI.`),`cancel`)}let o=await t.runLoginFlow({appRoot:n.appRoot,prompter:n.prompter,signal:n.signal,force:r===`vercel-forbidden`});return n.prompter.replaceContent?.(),o.kind===`logged-in`||o.kind===`already`?`retry`:`cancel`}function withRegistryResults(t,n){return n instanceof RegistryFlowFailedError?{...t,message:`${formatRegistrySessionResult(n.completed)}\n\n${t.message}`,partial:!0,tone:`error`,preserveFlowDiagnostics:!0}:t}async function vercelCliUpgradeOutcome(e,t,n,r){if(!(e instanceof HumanActionRequiredError)||e.action.kind!==`vercel-cli-upgrade`)return;let i;try{i=await r.prompter.select({message:`Your Vercel CLI needs an update to list your teams. Upgrade now?`,options:[{value:`upgrade`,label:`Upgrade Vercel CLI`,description:`Run the Vercel CLI's native upgrader`},{value:`later`,label:`Not now`}],initialValue:`upgrade`})}catch{i=`later`}if(i===`later`)return{message:`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!0};let a;try{a=await n.runInstallVercelCliFlow({appRoot:r.appRoot,prompter:r.prompter,signal:r.signal,upgrade:!0})}catch(e){return{message:vercelCliUpgradeFailureMessage(t,errorMessage(e)),tone:`error`,preserveFlowDiagnostics:!0}}switch(a.kind){case`installed`:return{message:`Upgraded the Vercel CLI. Retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!1};case`failed`:return{message:vercelCliUpgradeFailureMessage(t,a.reason),tone:`error`,preserveFlowDiagnostics:!0};case`cancelled`:return{message:`Vercel CLI upgrade cancelled — run \`vercel upgrade\`, then retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!0};case`already`:return{message:`The Vercel CLI is already up to date. Retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!1}}}function errorMessage(e){let t=(e instanceof Error?e.message:String(e)).replace(/\s+/gu,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}function vercelCliUpgradeFailureMessage(e,t){return`Couldn't upgrade the Vercel CLI${t===void 0||t===``?``:` (${t})`} — run \`vercel upgrade\`, then retry /${e}.`}function vercelActionOutcome(e,t){if(!(e instanceof HumanActionRequiredError))return;let n=vercelActionMessage(e.action.kind,t);return n===void 0?void 0:{message:n,tone:`error`,preserveFlowDiagnostics:!0}}function vercelActionMessage(e,t){switch(e){case`vercel-login`:return`You're not logged in to Vercel — run /vc:login, then retry /${t}.`;case`vercel-forbidden`:return`Vercel denied access to that team — run /vc:login to re-authenticate (for example to complete SSO), or pick a team you can access, then retry /${t}.`;case`vercel-cli-missing`:return`The Vercel CLI isn't installed — run /vc:install to install it, then retry /${t}.`;case`vercel-cli-upgrade`:return`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`;default:return}}function installVercelCliResultMessage(e){switch(e.kind){case`cancelled`:return{message:`/vc:install dismissed.`,preserveFlowDiagnostics:!1};case`already`:return{message:`The Vercel CLI is already installed.`,preserveFlowDiagnostics:!1};case`failed`:return{message:"Couldn't install the Vercel CLI — install it manually with `npm i -g vercel@latest`.",preserveFlowDiagnostics:!0};case`installed`:return{message:`Installed the Vercel CLI. Run /vc:login next.`,preserveFlowDiagnostics:!1,effect:{kind:`refresh-identity`}}}}function loginResultMessage(e){switch(e.kind){case`cancelled`:return{message:`/vc:login dismissed.`,preserveFlowDiagnostics:!1};case`already`:return{message:`You're already logged in to Vercel.`,preserveFlowDiagnostics:!1};case`cli-missing`:return{message:`The Vercel CLI isn't installed — run /vc:install to install it, then retry /vc:login.`,preserveFlowDiagnostics:!0};case`failed`:return{message:`Vercel login didn't complete — run /vc:login to try again.`,preserveFlowDiagnostics:!0};case`logged-in`:return{message:`Logged in to Vercel.`,preserveFlowDiagnostics:!1,effect:{kind:`refresh-identity`}};case`unavailable`:return{message:`Couldn't reach Vercel — check your connection, then retry /vc:login.`,preserveFlowDiagnostics:!0}}}function providerSelectionMessage(e){return e===`chatgpt`?`ChatGPT subscription selected.`:e===`ai-gateway-project`?`AI Gateway via Project selected.`:`AI Gateway via API key selected.`}export{SETUP_FLOW_CONFIG,runTuiSetupCommand};
|
|
@@ -39,17 +39,17 @@
|
|
|
39
39
|
"@vercel/sandbox-drives": "2.10.0-beta.0",
|
|
40
40
|
"@vercel/sandbox-delete": "3.2.0",
|
|
41
41
|
"@vercel/sandbox": "2.8.0",
|
|
42
|
-
"@workflow/builders": "5.0.0-beta.
|
|
43
|
-
"@workflow/core": "5.0.0-beta.
|
|
44
|
-
"@workflow/errors": "5.0.0-beta.
|
|
42
|
+
"@workflow/builders": "5.0.0-beta.47",
|
|
43
|
+
"@workflow/core": "5.0.0-beta.47",
|
|
44
|
+
"@workflow/errors": "5.0.0-beta.19",
|
|
45
45
|
"@workflow/serde": "5.0.0-beta.2",
|
|
46
|
-
"@workflow/world": "5.0.0-beta.
|
|
47
|
-
"@workflow/world-local": "5.0.0-beta.
|
|
48
|
-
"@workflow/world-vercel": "5.0.0-beta.
|
|
46
|
+
"@workflow/world": "5.0.0-beta.32",
|
|
47
|
+
"@workflow/world-local": "5.0.0-beta.41",
|
|
48
|
+
"@workflow/world-vercel": "5.0.0-beta.43",
|
|
49
49
|
"zod": "4.5.4",
|
|
50
50
|
"zod-validation-error": "5.0.0"
|
|
51
51
|
},
|
|
52
|
-
"scriptHash": "
|
|
52
|
+
"scriptHash": "0718ea0dd9b4cc3ce00ca3de9c27fc0181f5875881bee87cd3dc0b66e5641604",
|
|
53
53
|
"toolVersions": {
|
|
54
54
|
"rolldown": "1.1.5"
|
|
55
55
|
}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { type AttributeChange } from '#compiled/@workflow/world/index.js';
|
|
2
|
-
|
|
2
|
+
export declare function normalizeAttributeChanges(attrs: Record<string, string | undefined>, options?: {
|
|
3
3
|
allowReservedAttributes?: boolean;
|
|
4
|
-
}
|
|
5
|
-
export declare function normalizeAttributeChanges(attrs: Record<string, string | undefined>, options?: AttributeChangeOptions): AttributeChange[];
|
|
6
|
-
export {};
|
|
4
|
+
}): AttributeChange[];
|
|
7
5
|
//# sourceMappingURL=attribute-changes.d.ts.map
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
*
|
|
18
18
|
* ## Adding a new non-format capability
|
|
19
19
|
*
|
|
20
|
-
* Some capabilities aren't serialization format prefixes
|
|
20
|
+
* Some capabilities aren't serialization format prefixes: e.g.
|
|
21
21
|
* byte-stream wire framing is an envelope around chunks rather than
|
|
22
22
|
* a content format. For those, add a boolean field to `RunCapabilities`
|
|
23
23
|
* and an entry in `CAPABILITY_VERSION_TABLE` below.
|
|
@@ -30,18 +30,19 @@
|
|
|
30
30
|
* - `framedByteStreams` (wire-level chunk framing for byte streams): added in `5.0.0-beta.15`
|
|
31
31
|
* - `gzip` (gzip payload compression): added in `5.0.0-beta.18`
|
|
32
32
|
* - `zstd` (zstd payload compression, preferred codec): added in `5.0.0-beta.18`
|
|
33
|
-
* alongside gzip
|
|
33
|
+
* alongside gzip; they co-ship, so any run that can read one can read both.
|
|
34
34
|
* - `encp` (X25519 sealed-box encryption for cross-run writes): added in
|
|
35
35
|
* `5.0.0-beta.37`. Note that producers do **not** gate `encp` on this table:
|
|
36
36
|
* they gate on the presence of `encryptionPublicKey` on the target run,
|
|
37
37
|
* which a run only carries if the deployment that created it could also
|
|
38
38
|
* open `encp`. The entry exists so the capability set stays a complete,
|
|
39
39
|
* auditable description of a run's decoding ability.
|
|
40
|
-
* -
|
|
41
|
-
* deliberately NOT tracked here. Rather than predict a
|
|
42
|
-
* run's creating deployment stamps an explicit
|
|
43
|
-
* execution-context marker
|
|
44
|
-
*
|
|
40
|
+
* - Hook-resume consumer protocol ("consumer re-ensures `hook_received` from
|
|
41
|
+
* `hookInput`"): deliberately NOT tracked here. Rather than predict a
|
|
42
|
+
* release cutoff, the run's creating deployment stamps an explicit
|
|
43
|
+
* `hookResumeInputVersion` execution-context marker (mirrored onto the
|
|
44
|
+
* hook's resumeContext by the server); older producers gate their lazy path
|
|
45
|
+
* on that marker.
|
|
45
46
|
*/
|
|
46
47
|
import { type SerializationFormatType } from './serialization.js';
|
|
47
48
|
/**
|
|
@@ -58,7 +59,7 @@ export interface RunCapabilities {
|
|
|
58
59
|
* Whether the target run can decode wire-framed byte streams. When true,
|
|
59
60
|
* byte streams (`type: 'bytes'` ReadableStreams passed across boundaries)
|
|
60
61
|
* are wrapped in a length-prefixed frame envelope on the wire so the
|
|
61
|
-
* reader can identify chunk boundaries
|
|
62
|
+
* reader can identify chunk boundaries, which enables auto-reconnect
|
|
62
63
|
* on transient stream errors. When false, byte streams are written as
|
|
63
64
|
* raw bytes (the legacy format) for compatibility with older runs.
|
|
64
65
|
*/
|
|
@@ -69,7 +70,7 @@ export interface RunCapabilities {
|
|
|
69
70
|
* its `@workflow/core` version string (from `executionContext.workflowCoreVersion`).
|
|
70
71
|
*
|
|
71
72
|
* When the version is `undefined`, not a string, or not a valid semver string
|
|
72
|
-
* (e.g.
|
|
73
|
+
* (e.g. older runs that predate the field, or corrupted metadata),
|
|
73
74
|
* we assume the most conservative capabilities (baseline formats only,
|
|
74
75
|
* non-format capabilities all `false`).
|
|
75
76
|
*/
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* code frame at our `throw` site inside `@workflow/core`, which is useless
|
|
6
6
|
* to the user.
|
|
7
7
|
*
|
|
8
|
-
* No-op on engines that don't expose `Error.captureStackTrace
|
|
8
|
+
* No-op on engines that don't expose `Error.captureStackTrace`: the stack
|
|
9
9
|
* degrades gracefully to the default behavior.
|
|
10
10
|
*
|
|
11
11
|
* Kept in its own tiny module so callers that can't participate in the
|
|
@@ -19,30 +19,30 @@
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function registerSerializationClass(classId: string, cls: Function): void;
|
|
21
21
|
/**
|
|
22
|
-
* Stable, well-known registry
|
|
22
|
+
* Stable, well-known registry ID for the SDK's `Run` class.
|
|
23
23
|
*
|
|
24
|
-
* The SWC plugin auto-registers `Run` under a *path-derived*
|
|
24
|
+
* The SWC plugin auto-registers `Run` under a *path-derived* ID (e.g.
|
|
25
25
|
* `class//./node_modules/@workflow/core/dist/runtime/run//Run`), which
|
|
26
26
|
* varies with the app's dependency layout and bundler. Host-side code
|
|
27
27
|
* that needs to construct `Run` instances inside the workflow VM (e.g.
|
|
28
28
|
* the hook event consumer resolving `hook.getConflict()`) cannot know
|
|
29
|
-
* that
|
|
30
|
-
* aliases the bundle's `Run` under this stable
|
|
29
|
+
* that ID statically, so the workflow-mode `create-hook` module also
|
|
30
|
+
* aliases the bundle's `Run` under this stable ID at evaluation time.
|
|
31
31
|
*
|
|
32
|
-
* The `workflow` pseudo-path cannot collide with plugin-derived
|
|
32
|
+
* The `workflow` pseudo-path cannot collide with plugin-derived IDs,
|
|
33
33
|
* which always use real relative module paths (`./…` / `../…`).
|
|
34
34
|
*/
|
|
35
35
|
export declare const RUN_CLASS_ID = "class//workflow//Run";
|
|
36
36
|
/**
|
|
37
|
-
* Register an additional registry
|
|
37
|
+
* Register an additional registry ID for a class without touching its
|
|
38
38
|
* `classId` property.
|
|
39
39
|
*
|
|
40
40
|
* Unlike {@link registerSerializationClass}, this is safe to call for a
|
|
41
41
|
* class the SWC plugin has already registered: the plugin's inlined IIFE
|
|
42
42
|
* defines `classId` as non-configurable, so a second `defineProperty`
|
|
43
|
-
* would throw. Aliasing only adds a registry entry
|
|
43
|
+
* would throw. Aliasing only adds a registry entry: the class keeps
|
|
44
44
|
* serializing under its primary (path-derived) id, while lookups succeed
|
|
45
|
-
* under both.
|
|
45
|
+
* under both IDs.
|
|
46
46
|
*
|
|
47
47
|
* Registration is per-global by construction: evaluated inside the
|
|
48
48
|
* workflow VM it registers the VM's compiled class on the VM's registry;
|