@procedures/client 0.0.0-stage → 0.1.0
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 +16 -0
- package/LICENSE +21 -0
- package/README.md +832 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/adapters/http/client/index.d.ts +11 -0
- package/dist/adapters/http/client/index.d.ts.map +1 -0
- package/dist/adapters/http/client/index.js +18 -0
- package/dist/adapters/http/client/index.js.map +1 -0
- package/dist/adapters/http/client/transport.d.ts +72 -0
- package/dist/adapters/http/client/transport.d.ts.map +1 -0
- package/dist/adapters/http/client/transport.js +282 -0
- package/dist/adapters/http/client/transport.js.map +1 -0
- package/dist/adapters/http/client/types.d.ts +27 -0
- package/dist/adapters/http/client/types.d.ts.map +1 -0
- package/dist/adapters/http/client/types.js +8 -0
- package/dist/adapters/http/client/types.js.map +1 -0
- package/dist/adapters/http/index.d.ts +7 -0
- package/dist/adapters/http/index.d.ts.map +1 -0
- package/dist/adapters/http/index.js +7 -0
- package/dist/adapters/http/index.js.map +1 -0
- package/dist/adapters/http/server/index.d.ts +9 -0
- package/dist/adapters/http/server/index.d.ts.map +1 -0
- package/dist/adapters/http/server/index.js +10 -0
- package/dist/adapters/http/server/index.js.map +1 -0
- package/dist/adapters/http/server/strategies.d.ts +39 -0
- package/dist/adapters/http/server/strategies.d.ts.map +1 -0
- package/dist/adapters/http/server/strategies.js +90 -0
- package/dist/adapters/http/server/strategies.js.map +1 -0
- package/dist/adapters/http/server/transport.d.ts +66 -0
- package/dist/adapters/http/server/transport.d.ts.map +1 -0
- package/dist/adapters/http/server/transport.js +561 -0
- package/dist/adapters/http/server/transport.js.map +1 -0
- package/dist/adapters/http/server/types.d.ts +71 -0
- package/dist/adapters/http/server/types.d.ts.map +1 -0
- package/dist/adapters/http/server/types.js +7 -0
- package/dist/adapters/http/server/types.js.map +1 -0
- package/dist/adapters/http/shared/constants.d.ts +95 -0
- package/dist/adapters/http/shared/constants.d.ts.map +1 -0
- package/dist/adapters/http/shared/constants.js +102 -0
- package/dist/adapters/http/shared/constants.js.map +1 -0
- package/dist/adapters/http/shared/errors.d.ts +78 -0
- package/dist/adapters/http/shared/errors.d.ts.map +1 -0
- package/dist/adapters/http/shared/errors.js +151 -0
- package/dist/adapters/http/shared/errors.js.map +1 -0
- package/dist/adapters/http/shared/headers.d.ts +122 -0
- package/dist/adapters/http/shared/headers.d.ts.map +1 -0
- package/dist/adapters/http/shared/headers.js +216 -0
- package/dist/adapters/http/shared/headers.js.map +1 -0
- package/dist/adapters/http/shared/index.d.ts +12 -0
- package/dist/adapters/http/shared/index.d.ts.map +1 -0
- package/dist/adapters/http/shared/index.js +17 -0
- package/dist/adapters/http/shared/index.js.map +1 -0
- package/dist/adapters/http/shared/status-codes.d.ts +92 -0
- package/dist/adapters/http/shared/status-codes.d.ts.map +1 -0
- package/dist/adapters/http/shared/status-codes.js +189 -0
- package/dist/adapters/http/shared/status-codes.js.map +1 -0
- package/dist/adapters/http/shared/strategies.d.ts +90 -0
- package/dist/adapters/http/shared/strategies.d.ts.map +1 -0
- package/dist/adapters/http/shared/strategies.js +180 -0
- package/dist/adapters/http/shared/strategies.js.map +1 -0
- package/dist/adapters/local/client/index.d.ts +8 -0
- package/dist/adapters/local/client/index.d.ts.map +1 -0
- package/dist/adapters/local/client/index.js +8 -0
- package/dist/adapters/local/client/index.js.map +1 -0
- package/dist/adapters/local/client/transport.d.ts +81 -0
- package/dist/adapters/local/client/transport.d.ts.map +1 -0
- package/dist/adapters/local/client/transport.js +172 -0
- package/dist/adapters/local/client/transport.js.map +1 -0
- package/dist/adapters/local/client/types.d.ts +39 -0
- package/dist/adapters/local/client/types.d.ts.map +1 -0
- package/dist/adapters/local/client/types.js +13 -0
- package/dist/adapters/local/client/types.js.map +1 -0
- package/dist/adapters/metadata.d.ts +10 -0
- package/dist/adapters/metadata.d.ts.map +1 -0
- package/dist/adapters/metadata.js +19 -0
- package/dist/adapters/metadata.js.map +1 -0
- package/dist/adapters/mock/client/builder.d.ts +35 -0
- package/dist/adapters/mock/client/builder.d.ts.map +1 -0
- package/dist/adapters/mock/client/builder.js +58 -0
- package/dist/adapters/mock/client/builder.js.map +1 -0
- package/dist/adapters/mock/client/index.d.ts +9 -0
- package/dist/adapters/mock/client/index.d.ts.map +1 -0
- package/dist/adapters/mock/client/index.js +10 -0
- package/dist/adapters/mock/client/index.js.map +1 -0
- package/dist/adapters/mock/client/transport.d.ts +149 -0
- package/dist/adapters/mock/client/transport.d.ts.map +1 -0
- package/dist/adapters/mock/client/transport.js +289 -0
- package/dist/adapters/mock/client/transport.js.map +1 -0
- package/dist/adapters/mock/client/types.d.ts +86 -0
- package/dist/adapters/mock/client/types.d.ts.map +1 -0
- package/dist/adapters/mock/client/types.js +7 -0
- package/dist/adapters/mock/client/types.js.map +1 -0
- package/dist/adapters/websocket/client/index.d.ts +9 -0
- package/dist/adapters/websocket/client/index.d.ts.map +1 -0
- package/dist/adapters/websocket/client/index.js +9 -0
- package/dist/adapters/websocket/client/index.js.map +1 -0
- package/dist/adapters/websocket/client/transport.d.ts +106 -0
- package/dist/adapters/websocket/client/transport.d.ts.map +1 -0
- package/dist/adapters/websocket/client/transport.js +647 -0
- package/dist/adapters/websocket/client/transport.js.map +1 -0
- package/dist/adapters/websocket/client/types.d.ts +192 -0
- package/dist/adapters/websocket/client/types.d.ts.map +1 -0
- package/dist/adapters/websocket/client/types.js +17 -0
- package/dist/adapters/websocket/client/types.js.map +1 -0
- package/dist/adapters/websocket/index.d.ts +8 -0
- package/dist/adapters/websocket/index.d.ts.map +1 -0
- package/dist/adapters/websocket/index.js +8 -0
- package/dist/adapters/websocket/index.js.map +1 -0
- package/dist/adapters/websocket/server/index.d.ts +8 -0
- package/dist/adapters/websocket/server/index.d.ts.map +1 -0
- package/dist/adapters/websocket/server/index.js +8 -0
- package/dist/adapters/websocket/server/index.js.map +1 -0
- package/dist/adapters/websocket/server/transport.d.ts +112 -0
- package/dist/adapters/websocket/server/transport.d.ts.map +1 -0
- package/dist/adapters/websocket/server/transport.js +619 -0
- package/dist/adapters/websocket/server/transport.js.map +1 -0
- package/dist/adapters/websocket/server/types.d.ts +140 -0
- package/dist/adapters/websocket/server/types.d.ts.map +1 -0
- package/dist/adapters/websocket/server/types.js +7 -0
- package/dist/adapters/websocket/server/types.js.map +1 -0
- package/dist/browser.d.ts +48 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +86 -0
- package/dist/browser.js.map +1 -0
- package/dist/client/batch-executor.d.ts +160 -0
- package/dist/client/batch-executor.d.ts.map +1 -0
- package/dist/client/batch-executor.js +397 -0
- package/dist/client/batch-executor.js.map +1 -0
- package/dist/client/call-types.d.ts +271 -0
- package/dist/client/call-types.d.ts.map +1 -0
- package/dist/client/call-types.js +208 -0
- package/dist/client/call-types.js.map +1 -0
- package/dist/client/client.d.ts +517 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +990 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/consumption.d.ts +191 -0
- package/dist/client/consumption.d.ts.map +1 -0
- package/dist/client/consumption.js +98 -0
- package/dist/client/consumption.js.map +1 -0
- package/dist/client/context.d.ts +116 -0
- package/dist/client/context.d.ts.map +1 -0
- package/dist/client/context.js +111 -0
- package/dist/client/context.js.map +1 -0
- package/dist/client/errors/codes.d.ts +71 -0
- package/dist/client/errors/codes.d.ts.map +1 -0
- package/dist/client/errors/codes.js +81 -0
- package/dist/client/errors/codes.js.map +1 -0
- package/dist/client/errors/factory.d.ts +102 -0
- package/dist/client/errors/factory.d.ts.map +1 -0
- package/dist/client/errors/factory.js +210 -0
- package/dist/client/errors/factory.js.map +1 -0
- package/dist/client/errors/http-errors.d.ts +47 -0
- package/dist/client/errors/http-errors.d.ts.map +1 -0
- package/dist/client/errors/http-errors.js +548 -0
- package/dist/client/errors/http-errors.js.map +1 -0
- package/dist/client/errors/http-status.d.ts +73 -0
- package/dist/client/errors/http-status.d.ts.map +1 -0
- package/dist/client/errors/http-status.js +79 -0
- package/dist/client/errors/http-status.js.map +1 -0
- package/dist/client/errors/index.d.ts +36 -0
- package/dist/client/errors/index.d.ts.map +1 -0
- package/dist/client/errors/index.js +40 -0
- package/dist/client/errors/index.js.map +1 -0
- package/dist/client/errors/registry.d.ts +38 -0
- package/dist/client/errors/registry.d.ts.map +1 -0
- package/dist/client/errors/registry.js +535 -0
- package/dist/client/errors/registry.js.map +1 -0
- package/dist/client/errors/types.d.ts +112 -0
- package/dist/client/errors/types.d.ts.map +1 -0
- package/dist/client/errors/types.js +45 -0
- package/dist/client/errors/types.js.map +1 -0
- package/dist/client/index.d.ts +44 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +36 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/middleware/auth.d.ts +90 -0
- package/dist/client/middleware/auth.d.ts.map +1 -0
- package/dist/client/middleware/auth.js +98 -0
- package/dist/client/middleware/auth.js.map +1 -0
- package/dist/client/middleware/batching.d.ts +102 -0
- package/dist/client/middleware/batching.d.ts.map +1 -0
- package/dist/client/middleware/batching.js +245 -0
- package/dist/client/middleware/batching.js.map +1 -0
- package/dist/client/middleware/cache.d.ts +124 -0
- package/dist/client/middleware/cache.d.ts.map +1 -0
- package/dist/client/middleware/cache.js +208 -0
- package/dist/client/middleware/cache.js.map +1 -0
- package/dist/client/middleware/circuit-breaker.d.ts +113 -0
- package/dist/client/middleware/circuit-breaker.d.ts.map +1 -0
- package/dist/client/middleware/circuit-breaker.js +236 -0
- package/dist/client/middleware/circuit-breaker.js.map +1 -0
- package/dist/client/middleware/contexts.d.ts +199 -0
- package/dist/client/middleware/contexts.d.ts.map +1 -0
- package/dist/client/middleware/contexts.js +74 -0
- package/dist/client/middleware/contexts.js.map +1 -0
- package/dist/client/middleware/items.d.ts +37 -0
- package/dist/client/middleware/items.d.ts.map +1 -0
- package/dist/client/middleware/items.js +100 -0
- package/dist/client/middleware/items.js.map +1 -0
- package/dist/client/middleware/lru.d.ts +32 -0
- package/dist/client/middleware/lru.d.ts.map +1 -0
- package/dist/client/middleware/lru.js +62 -0
- package/dist/client/middleware/lru.js.map +1 -0
- package/dist/client/middleware/pagination.d.ts +114 -0
- package/dist/client/middleware/pagination.d.ts.map +1 -0
- package/dist/client/middleware/pagination.js +148 -0
- package/dist/client/middleware/pagination.js.map +1 -0
- package/dist/client/middleware/rate-limit.d.ts +105 -0
- package/dist/client/middleware/rate-limit.d.ts.map +1 -0
- package/dist/client/middleware/rate-limit.js +222 -0
- package/dist/client/middleware/rate-limit.js.map +1 -0
- package/dist/client/middleware/retry.d.ts +100 -0
- package/dist/client/middleware/retry.d.ts.map +1 -0
- package/dist/client/middleware/retry.js +150 -0
- package/dist/client/middleware/retry.js.map +1 -0
- package/dist/client/middleware/timeout.d.ts +91 -0
- package/dist/client/middleware/timeout.d.ts.map +1 -0
- package/dist/client/middleware/timeout.js +253 -0
- package/dist/client/middleware/timeout.js.map +1 -0
- package/dist/client/middleware/tracing.d.ts +118 -0
- package/dist/client/middleware/tracing.d.ts.map +1 -0
- package/dist/client/middleware/tracing.js +152 -0
- package/dist/client/middleware/tracing.js.map +1 -0
- package/dist/client/route-resolver.d.ts +181 -0
- package/dist/client/route-resolver.d.ts.map +1 -0
- package/dist/client/route-resolver.js +300 -0
- package/dist/client/route-resolver.js.map +1 -0
- package/dist/client/typed-method.d.ts +29 -0
- package/dist/client/typed-method.d.ts.map +1 -0
- package/dist/client/typed-method.js +36 -0
- package/dist/client/typed-method.js.map +1 -0
- package/dist/client/typed.d.ts +102 -0
- package/dist/client/typed.d.ts.map +1 -0
- package/dist/client/typed.js +52 -0
- package/dist/client/typed.js.map +1 -0
- package/dist/client/types.d.ts +296 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +26 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/validation/index.d.ts +34 -0
- package/dist/client/validation/index.d.ts.map +1 -0
- package/dist/client/validation/index.js +36 -0
- package/dist/client/validation/index.js.map +1 -0
- package/dist/client/validation/middleware.d.ts +82 -0
- package/dist/client/validation/middleware.d.ts.map +1 -0
- package/dist/client/validation/middleware.js +138 -0
- package/dist/client/validation/middleware.js.map +1 -0
- package/dist/client/validation/types.d.ts +118 -0
- package/dist/client/validation/types.d.ts.map +1 -0
- package/dist/client/validation/types.js +59 -0
- package/dist/client/validation/types.js.map +1 -0
- package/dist/collections/async/async-queue.d.ts +144 -0
- package/dist/collections/async/async-queue.d.ts.map +1 -0
- package/dist/collections/async/async-queue.js +347 -0
- package/dist/collections/async/async-queue.js.map +1 -0
- package/dist/collections/async/channels.d.ts +188 -0
- package/dist/collections/async/channels.d.ts.map +1 -0
- package/dist/collections/async/channels.js +312 -0
- package/dist/collections/async/channels.js.map +1 -0
- package/dist/collections/behaviors/bounded.d.ts +79 -0
- package/dist/collections/behaviors/bounded.d.ts.map +1 -0
- package/dist/collections/behaviors/bounded.js +384 -0
- package/dist/collections/behaviors/bounded.js.map +1 -0
- package/dist/collections/behaviors/evented.d.ts +154 -0
- package/dist/collections/behaviors/evented.d.ts.map +1 -0
- package/dist/collections/behaviors/evented.js +299 -0
- package/dist/collections/behaviors/evented.js.map +1 -0
- package/dist/collections/behaviors/lru.d.ts +84 -0
- package/dist/collections/behaviors/lru.d.ts.map +1 -0
- package/dist/collections/behaviors/lru.js +330 -0
- package/dist/collections/behaviors/lru.js.map +1 -0
- package/dist/collections/behaviors/readonly.d.ts +73 -0
- package/dist/collections/behaviors/readonly.d.ts.map +1 -0
- package/dist/collections/behaviors/readonly.js +158 -0
- package/dist/collections/behaviors/readonly.js.map +1 -0
- package/dist/collections/behaviors/safe.d.ts +163 -0
- package/dist/collections/behaviors/safe.d.ts.map +1 -0
- package/dist/collections/behaviors/safe.js +172 -0
- package/dist/collections/behaviors/safe.js.map +1 -0
- package/dist/collections/behaviors/synchronized.d.ts +88 -0
- package/dist/collections/behaviors/synchronized.d.ts.map +1 -0
- package/dist/collections/behaviors/synchronized.js +294 -0
- package/dist/collections/behaviors/synchronized.js.map +1 -0
- package/dist/collections/behaviors/ttl.d.ts +118 -0
- package/dist/collections/behaviors/ttl.d.ts.map +1 -0
- package/dist/collections/behaviors/ttl.js +338 -0
- package/dist/collections/behaviors/ttl.js.map +1 -0
- package/dist/collections/core/effects.d.ts +176 -0
- package/dist/collections/core/effects.d.ts.map +1 -0
- package/dist/collections/core/effects.js +180 -0
- package/dist/collections/core/effects.js.map +1 -0
- package/dist/collections/core/events.d.ts +192 -0
- package/dist/collections/core/events.d.ts.map +1 -0
- package/dist/collections/core/events.js +291 -0
- package/dist/collections/core/events.js.map +1 -0
- package/dist/collections/core/middleware.d.ts +231 -0
- package/dist/collections/core/middleware.d.ts.map +1 -0
- package/dist/collections/core/middleware.js +161 -0
- package/dist/collections/core/middleware.js.map +1 -0
- package/dist/collections/core/policies.d.ts +220 -0
- package/dist/collections/core/policies.d.ts.map +1 -0
- package/dist/collections/core/policies.js +48 -0
- package/dist/collections/core/policies.js.map +1 -0
- package/dist/collections/core/traits.d.ts +142 -0
- package/dist/collections/core/traits.d.ts.map +1 -0
- package/dist/collections/core/traits.js +8 -0
- package/dist/collections/core/traits.js.map +1 -0
- package/dist/collections/examples.d.ts +13 -0
- package/dist/collections/examples.d.ts.map +1 -0
- package/dist/collections/examples.js +302 -0
- package/dist/collections/examples.js.map +1 -0
- package/dist/collections/fx/collectors.d.ts +190 -0
- package/dist/collections/fx/collectors.d.ts.map +1 -0
- package/dist/collections/fx/collectors.js +369 -0
- package/dist/collections/fx/collectors.js.map +1 -0
- package/dist/collections/fx/iter.d.ts +166 -0
- package/dist/collections/fx/iter.d.ts.map +1 -0
- package/dist/collections/fx/iter.js +421 -0
- package/dist/collections/fx/iter.js.map +1 -0
- package/dist/collections/impl/array-deque.d.ts +107 -0
- package/dist/collections/impl/array-deque.d.ts.map +1 -0
- package/dist/collections/impl/array-deque.js +381 -0
- package/dist/collections/impl/array-deque.js.map +1 -0
- package/dist/collections/impl/array-list.d.ts +101 -0
- package/dist/collections/impl/array-list.d.ts.map +1 -0
- package/dist/collections/impl/array-list.js +387 -0
- package/dist/collections/impl/array-list.js.map +1 -0
- package/dist/collections/impl/hash-map.d.ts +141 -0
- package/dist/collections/impl/hash-map.d.ts.map +1 -0
- package/dist/collections/impl/hash-map.js +450 -0
- package/dist/collections/impl/hash-map.js.map +1 -0
- package/dist/collections/impl/hash-set.d.ts +125 -0
- package/dist/collections/impl/hash-set.d.ts.map +1 -0
- package/dist/collections/impl/hash-set.js +264 -0
- package/dist/collections/impl/hash-set.js.map +1 -0
- package/dist/collections/impl/linked-hash-map.d.ts +141 -0
- package/dist/collections/impl/linked-hash-map.d.ts.map +1 -0
- package/dist/collections/impl/linked-hash-map.js +472 -0
- package/dist/collections/impl/linked-hash-map.js.map +1 -0
- package/dist/collections/impl/linked-list.d.ts +109 -0
- package/dist/collections/impl/linked-list.d.ts.map +1 -0
- package/dist/collections/impl/linked-list.js +491 -0
- package/dist/collections/impl/linked-list.js.map +1 -0
- package/dist/collections/impl/priority-queue.d.ts +134 -0
- package/dist/collections/impl/priority-queue.d.ts.map +1 -0
- package/dist/collections/impl/priority-queue.js +336 -0
- package/dist/collections/impl/priority-queue.js.map +1 -0
- package/dist/collections/impl/tree-map.d.ts +146 -0
- package/dist/collections/impl/tree-map.d.ts.map +1 -0
- package/dist/collections/impl/tree-map.js +781 -0
- package/dist/collections/impl/tree-map.js.map +1 -0
- package/dist/collections/impl/tree-set.d.ts +112 -0
- package/dist/collections/impl/tree-set.d.ts.map +1 -0
- package/dist/collections/impl/tree-set.js +374 -0
- package/dist/collections/impl/tree-set.js.map +1 -0
- package/dist/collections/index.d.ts +105 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +135 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/interfaces/collection.d.ts +119 -0
- package/dist/collections/interfaces/collection.d.ts.map +1 -0
- package/dist/collections/interfaces/collection.js +8 -0
- package/dist/collections/interfaces/collection.js.map +1 -0
- package/dist/collections/interfaces/list.d.ts +247 -0
- package/dist/collections/interfaces/list.d.ts.map +1 -0
- package/dist/collections/interfaces/list.js +8 -0
- package/dist/collections/interfaces/list.js.map +1 -0
- package/dist/collections/interfaces/map.d.ts +344 -0
- package/dist/collections/interfaces/map.d.ts.map +1 -0
- package/dist/collections/interfaces/map.js +8 -0
- package/dist/collections/interfaces/map.js.map +1 -0
- package/dist/collections/interfaces/queue.d.ts +304 -0
- package/dist/collections/interfaces/queue.d.ts.map +1 -0
- package/dist/collections/interfaces/queue.js +8 -0
- package/dist/collections/interfaces/queue.js.map +1 -0
- package/dist/collections/interfaces/set.d.ts +137 -0
- package/dist/collections/interfaces/set.d.ts.map +1 -0
- package/dist/collections/interfaces/set.js +8 -0
- package/dist/collections/interfaces/set.js.map +1 -0
- package/dist/collections/storage/api.d.ts +109 -0
- package/dist/collections/storage/api.d.ts.map +1 -0
- package/dist/collections/storage/api.js +182 -0
- package/dist/collections/storage/api.js.map +1 -0
- package/dist/collections/storage/hybrid.d.ts +164 -0
- package/dist/collections/storage/hybrid.d.ts.map +1 -0
- package/dist/collections/storage/hybrid.js +416 -0
- package/dist/collections/storage/hybrid.js.map +1 -0
- package/dist/collections/storage/index.d.ts +16 -0
- package/dist/collections/storage/index.d.ts.map +1 -0
- package/dist/collections/storage/index.js +13 -0
- package/dist/collections/storage/index.js.map +1 -0
- package/dist/collections/storage/interface.d.ts +141 -0
- package/dist/collections/storage/interface.d.ts.map +1 -0
- package/dist/collections/storage/interface.js +23 -0
- package/dist/collections/storage/interface.js.map +1 -0
- package/dist/collections/storage/memory.d.ts +68 -0
- package/dist/collections/storage/memory.d.ts.map +1 -0
- package/dist/collections/storage/memory.js +154 -0
- package/dist/collections/storage/memory.js.map +1 -0
- package/dist/collections/utils/defaults.d.ts +135 -0
- package/dist/collections/utils/defaults.d.ts.map +1 -0
- package/dist/collections/utils/defaults.js +322 -0
- package/dist/collections/utils/defaults.js.map +1 -0
- package/dist/collections/utils/factories.d.ts +144 -0
- package/dist/collections/utils/factories.d.ts.map +1 -0
- package/dist/collections/utils/factories.js +293 -0
- package/dist/collections/utils/factories.js.map +1 -0
- package/dist/collections/utils/helpers.d.ts +137 -0
- package/dist/collections/utils/helpers.d.ts.map +1 -0
- package/dist/collections/utils/helpers.js +221 -0
- package/dist/collections/utils/helpers.js.map +1 -0
- package/dist/collections.d.ts +12 -0
- package/dist/collections.d.ts.map +1 -0
- package/dist/collections.js +10 -0
- package/dist/collections.js.map +1 -0
- package/dist/components/define.d.ts +134 -0
- package/dist/components/define.d.ts.map +1 -0
- package/dist/components/define.js +486 -0
- package/dist/components/define.js.map +1 -0
- package/dist/components/index.d.ts +39 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +38 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/types.d.ts +264 -0
- package/dist/components/types.d.ts.map +1 -0
- package/dist/components/types.js +46 -0
- package/dist/components/types.js.map +1 -0
- package/dist/events/bus.d.ts +193 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +511 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/events/index.d.ts +34 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +36 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +242 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +8 -0
- package/dist/events/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/compose.d.ts +88 -0
- package/dist/middleware/compose.d.ts.map +1 -0
- package/dist/middleware/compose.js +108 -0
- package/dist/middleware/compose.js.map +1 -0
- package/dist/middleware/index.d.ts +12 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +11 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/types.d.ts +112 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +14 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/procedures/cli/announce.d.ts +67 -0
- package/dist/procedures/cli/announce.d.ts.map +1 -0
- package/dist/procedures/cli/announce.js +392 -0
- package/dist/procedures/cli/announce.js.map +1 -0
- package/dist/procedures/cli/discover.d.ts +66 -0
- package/dist/procedures/cli/discover.d.ts.map +1 -0
- package/dist/procedures/cli/discover.js +310 -0
- package/dist/procedures/cli/discover.js.map +1 -0
- package/dist/procedures/cli/index.d.ts +13 -0
- package/dist/procedures/cli/index.d.ts.map +1 -0
- package/dist/procedures/cli/index.js +201 -0
- package/dist/procedures/cli/index.js.map +1 -0
- package/dist/procedures/cli/init.d.ts +17 -0
- package/dist/procedures/cli/init.d.ts.map +1 -0
- package/dist/procedures/cli/init.js +336 -0
- package/dist/procedures/cli/init.js.map +1 -0
- package/dist/procedures/collection/index.d.ts +10 -0
- package/dist/procedures/collection/index.d.ts.map +1 -0
- package/dist/procedures/collection/index.js +10 -0
- package/dist/procedures/collection/index.js.map +1 -0
- package/dist/procedures/collection/procedures.d.ts +21 -0
- package/dist/procedures/collection/procedures.d.ts.map +1 -0
- package/dist/procedures/collection/procedures.js +198 -0
- package/dist/procedures/collection/procedures.js.map +1 -0
- package/dist/procedures/collection/schemas.d.ts +131 -0
- package/dist/procedures/collection/schemas.d.ts.map +1 -0
- package/dist/procedures/collection/schemas.js +422 -0
- package/dist/procedures/collection/schemas.js.map +1 -0
- package/dist/procedures/collection/storage.d.ts +53 -0
- package/dist/procedures/collection/storage.d.ts.map +1 -0
- package/dist/procedures/collection/storage.js +2 -0
- package/dist/procedures/collection/storage.js.map +1 -0
- package/dist/procedures/core/array.d.ts +276 -0
- package/dist/procedures/core/array.d.ts.map +1 -0
- package/dist/procedures/core/array.js +637 -0
- package/dist/procedures/core/array.js.map +1 -0
- package/dist/procedures/core/comparison.d.ts +85 -0
- package/dist/procedures/core/comparison.d.ts.map +1 -0
- package/dist/procedures/core/comparison.js +156 -0
- package/dist/procedures/core/comparison.js.map +1 -0
- package/dist/procedures/core/index.d.ts +261 -0
- package/dist/procedures/core/index.d.ts.map +1 -0
- package/dist/procedures/core/index.js +585 -0
- package/dist/procedures/core/index.js.map +1 -0
- package/dist/procedures/core/logic.d.ts +144 -0
- package/dist/procedures/core/logic.d.ts.map +1 -0
- package/dist/procedures/core/logic.js +169 -0
- package/dist/procedures/core/logic.js.map +1 -0
- package/dist/procedures/core/math.d.ts +139 -0
- package/dist/procedures/core/math.d.ts.map +1 -0
- package/dist/procedures/core/math.js +273 -0
- package/dist/procedures/core/math.js.map +1 -0
- package/dist/procedures/core/meta.d.ts +111 -0
- package/dist/procedures/core/meta.d.ts.map +1 -0
- package/dist/procedures/core/meta.js +239 -0
- package/dist/procedures/core/meta.js.map +1 -0
- package/dist/procedures/core/object.d.ts +109 -0
- package/dist/procedures/core/object.d.ts.map +1 -0
- package/dist/procedures/core/object.js +270 -0
- package/dist/procedures/core/object.js.map +1 -0
- package/dist/procedures/core/operands.d.ts +51 -0
- package/dist/procedures/core/operands.d.ts.map +1 -0
- package/dist/procedures/core/operands.js +90 -0
- package/dist/procedures/core/operands.js.map +1 -0
- package/dist/procedures/core/outputs.d.ts +28 -0
- package/dist/procedures/core/outputs.d.ts.map +1 -0
- package/dist/procedures/core/outputs.js +42 -0
- package/dist/procedures/core/outputs.js.map +1 -0
- package/dist/procedures/core/results.d.ts +202 -0
- package/dist/procedures/core/results.d.ts.map +1 -0
- package/dist/procedures/core/results.js +106 -0
- package/dist/procedures/core/results.js.map +1 -0
- package/dist/procedures/core/schemas.d.ts +48 -0
- package/dist/procedures/core/schemas.d.ts.map +1 -0
- package/dist/procedures/core/schemas.js +102 -0
- package/dist/procedures/core/schemas.js.map +1 -0
- package/dist/procedures/core/string.d.ts +138 -0
- package/dist/procedures/core/string.d.ts.map +1 -0
- package/dist/procedures/core/string.js +268 -0
- package/dist/procedures/core/string.js.map +1 -0
- package/dist/procedures/core/type.d.ts +101 -0
- package/dist/procedures/core/type.d.ts.map +1 -0
- package/dist/procedures/core/type.js +208 -0
- package/dist/procedures/core/type.js.map +1 -0
- package/dist/procedures/define-procedure.d.ts +187 -0
- package/dist/procedures/define-procedure.d.ts.map +1 -0
- package/dist/procedures/define-procedure.js +356 -0
- package/dist/procedures/define-procedure.js.map +1 -0
- package/dist/procedures/define.d.ts +228 -0
- package/dist/procedures/define.d.ts.map +1 -0
- package/dist/procedures/define.js +300 -0
- package/dist/procedures/define.js.map +1 -0
- package/dist/procedures/discovery.d.ts +57 -0
- package/dist/procedures/discovery.d.ts.map +1 -0
- package/dist/procedures/discovery.js +68 -0
- package/dist/procedures/discovery.js.map +1 -0
- package/dist/procedures/index.d.ts +24 -0
- package/dist/procedures/index.d.ts.map +1 -0
- package/dist/procedures/index.js +69 -0
- package/dist/procedures/index.js.map +1 -0
- package/dist/procedures/interceptors.d.ts +82 -0
- package/dist/procedures/interceptors.d.ts.map +1 -0
- package/dist/procedures/interceptors.js +193 -0
- package/dist/procedures/interceptors.js.map +1 -0
- package/dist/procedures/invoke.d.ts +127 -0
- package/dist/procedures/invoke.d.ts.map +1 -0
- package/dist/procedures/invoke.js +277 -0
- package/dist/procedures/invoke.js.map +1 -0
- package/dist/procedures/module.d.ts +49 -0
- package/dist/procedures/module.d.ts.map +1 -0
- package/dist/procedures/module.js +93 -0
- package/dist/procedures/module.js.map +1 -0
- package/dist/procedures/policy.d.ts +70 -0
- package/dist/procedures/policy.d.ts.map +1 -0
- package/dist/procedures/policy.js +138 -0
- package/dist/procedures/policy.js.map +1 -0
- package/dist/procedures/ref.d.ts +606 -0
- package/dist/procedures/ref.d.ts.map +1 -0
- package/dist/procedures/ref.js +895 -0
- package/dist/procedures/ref.js.map +1 -0
- package/dist/procedures/registry.d.ts +208 -0
- package/dist/procedures/registry.d.ts.map +1 -0
- package/dist/procedures/registry.js +402 -0
- package/dist/procedures/registry.js.map +1 -0
- package/dist/procedures/schema.d.ts +126 -0
- package/dist/procedures/schema.d.ts.map +1 -0
- package/dist/procedures/schema.js +108 -0
- package/dist/procedures/schema.js.map +1 -0
- package/dist/procedures/storage/adapter.d.ts +148 -0
- package/dist/procedures/storage/adapter.d.ts.map +1 -0
- package/dist/procedures/storage/adapter.js +214 -0
- package/dist/procedures/storage/adapter.js.map +1 -0
- package/dist/procedures/storage/api.d.ts +125 -0
- package/dist/procedures/storage/api.d.ts.map +1 -0
- package/dist/procedures/storage/api.js +220 -0
- package/dist/procedures/storage/api.js.map +1 -0
- package/dist/procedures/storage/factory.d.ts +134 -0
- package/dist/procedures/storage/factory.d.ts.map +1 -0
- package/dist/procedures/storage/factory.js +166 -0
- package/dist/procedures/storage/factory.js.map +1 -0
- package/dist/procedures/storage/hybrid.d.ts +193 -0
- package/dist/procedures/storage/hybrid.d.ts.map +1 -0
- package/dist/procedures/storage/hybrid.js +519 -0
- package/dist/procedures/storage/hybrid.js.map +1 -0
- package/dist/procedures/storage/index.d.ts +17 -0
- package/dist/procedures/storage/index.d.ts.map +1 -0
- package/dist/procedures/storage/index.js +17 -0
- package/dist/procedures/storage/index.js.map +1 -0
- package/dist/procedures/storage/procedures.d.ts +39 -0
- package/dist/procedures/storage/procedures.d.ts.map +1 -0
- package/dist/procedures/storage/procedures.js +261 -0
- package/dist/procedures/storage/procedures.js.map +1 -0
- package/dist/procedures/storage/serialization.d.ts +123 -0
- package/dist/procedures/storage/serialization.d.ts.map +1 -0
- package/dist/procedures/storage/serialization.js +216 -0
- package/dist/procedures/storage/serialization.js.map +1 -0
- package/dist/procedures/storage/synced-registry.d.ts +246 -0
- package/dist/procedures/storage/synced-registry.d.ts.map +1 -0
- package/dist/procedures/storage/synced-registry.js +575 -0
- package/dist/procedures/storage/synced-registry.js.map +1 -0
- package/dist/procedures/storage/types.d.ts +130 -0
- package/dist/procedures/storage/types.d.ts.map +1 -0
- package/dist/procedures/storage/types.js +8 -0
- package/dist/procedures/storage/types.js.map +1 -0
- package/dist/procedures/types.d.ts +370 -0
- package/dist/procedures/types.d.ts.map +1 -0
- package/dist/procedures/types.js +23 -0
- package/dist/procedures/types.js.map +1 -0
- package/dist/server/browser-guard.d.ts +69 -0
- package/dist/server/browser-guard.d.ts.map +1 -0
- package/dist/server/browser-guard.js +103 -0
- package/dist/server/browser-guard.js.map +1 -0
- package/dist/server/host-policy.d.ts +59 -0
- package/dist/server/host-policy.d.ts.map +1 -0
- package/dist/server/host-policy.js +82 -0
- package/dist/server/host-policy.js.map +1 -0
- package/dist/server/index.d.ts +46 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +42 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/method.d.ts +24 -0
- package/dist/server/method.d.ts.map +1 -0
- package/dist/server/method.js +29 -0
- package/dist/server/method.js.map +1 -0
- package/dist/server/procedure-server.d.ts +212 -0
- package/dist/server/procedure-server.d.ts.map +1 -0
- package/dist/server/procedure-server.js +323 -0
- package/dist/server/procedure-server.js.map +1 -0
- package/dist/server/server.d.ts +161 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +279 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/types.d.ts +106 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +29 -0
- package/dist/server/types.js.map +1 -0
- package/package.json +115 -3
- package/src/adapters/http/client/index.ts +51 -0
- package/src/adapters/http/client/transport.ts +338 -0
- package/src/adapters/http/client/types.ts +33 -0
- package/src/adapters/http/index.ts +7 -0
- package/src/adapters/http/server/index.ts +14 -0
- package/src/adapters/http/server/strategies.ts +105 -0
- package/src/adapters/http/server/transport.ts +622 -0
- package/src/adapters/http/server/types.ts +81 -0
- package/src/adapters/http/shared/constants.ts +108 -0
- package/src/adapters/http/shared/errors.ts +199 -0
- package/src/adapters/http/shared/headers.ts +291 -0
- package/src/adapters/http/shared/index.ts +21 -0
- package/src/adapters/http/shared/status-codes.ts +212 -0
- package/src/adapters/http/shared/strategies.ts +255 -0
- package/src/adapters/local/client/index.ts +11 -0
- package/src/adapters/local/client/transport.ts +188 -0
- package/src/adapters/local/client/types.ts +50 -0
- package/src/adapters/metadata.ts +17 -0
- package/src/adapters/mock/client/builder.ts +64 -0
- package/src/adapters/mock/client/index.ts +19 -0
- package/src/adapters/mock/client/transport.ts +352 -0
- package/src/adapters/mock/client/types.ts +99 -0
- package/src/adapters/websocket/client/index.ts +18 -0
- package/src/adapters/websocket/client/transport.ts +733 -0
- package/src/adapters/websocket/client/types.ts +235 -0
- package/src/adapters/websocket/index.ts +24 -0
- package/src/adapters/websocket/server/index.ts +18 -0
- package/src/adapters/websocket/server/transport.ts +705 -0
- package/src/adapters/websocket/server/types.ts +169 -0
- package/src/browser.ts +373 -0
- package/src/client/batch-executor.ts +514 -0
- package/src/client/call-types.ts +491 -0
- package/src/client/client.ts +1202 -0
- package/src/client/consumption.ts +288 -0
- package/src/client/context.ts +228 -0
- package/src/client/errors/README.md +279 -0
- package/src/client/errors/codes.ts +88 -0
- package/src/client/errors/factory.ts +263 -0
- package/src/client/errors/http-errors.ts +601 -0
- package/src/client/errors/http-status.ts +82 -0
- package/src/client/errors/index.ts +72 -0
- package/src/client/errors/registry.ts +595 -0
- package/src/client/errors/types.ts +139 -0
- package/src/client/index.ts +124 -0
- package/src/client/middleware/auth.ts +132 -0
- package/src/client/middleware/cache.ts +316 -0
- package/src/client/middleware/circuit-breaker.ts +339 -0
- package/src/client/middleware/contexts.ts +319 -0
- package/src/client/middleware/items.ts +114 -0
- package/src/client/middleware/lru.ts +66 -0
- package/src/client/middleware/pagination.ts +213 -0
- package/src/client/middleware/rate-limit.ts +315 -0
- package/src/client/middleware/retry.ts +236 -0
- package/src/client/middleware/timeout.ts +308 -0
- package/src/client/middleware/tracing.ts +191 -0
- package/src/client/route-resolver.ts +407 -0
- package/src/client/typed-method.ts +65 -0
- package/src/client/typed.ts +140 -0
- package/src/client/types.ts +361 -0
- package/src/client/validation/index.ts +56 -0
- package/src/client/validation/middleware.ts +254 -0
- package/src/client/validation/types.ts +162 -0
- package/src/events/bus.ts +594 -0
- package/src/events/index.ts +67 -0
- package/src/events/types.ts +263 -0
- package/src/index.ts +33 -0
- package/src/middleware/compose.ts +159 -0
- package/src/middleware/index.ts +28 -0
- package/src/middleware/types.ts +166 -0
- package/src/procedures/cli/announce.ts +470 -0
- package/src/procedures/cli/discover.ts +390 -0
- package/src/procedures/cli/index.ts +229 -0
- package/src/procedures/cli/init.ts +370 -0
- package/src/procedures/collection/index.ts +51 -0
- package/src/procedures/collection/procedures.ts +245 -0
- package/src/procedures/collection/schemas.ts +550 -0
- package/src/procedures/collection/storage.ts +53 -0
- package/src/procedures/core/array.ts +1024 -0
- package/src/procedures/core/comparison.ts +263 -0
- package/src/procedures/core/index.ts +895 -0
- package/src/procedures/core/logic.ts +225 -0
- package/src/procedures/core/math.ts +469 -0
- package/src/procedures/core/meta.ts +384 -0
- package/src/procedures/core/object.ts +427 -0
- package/src/procedures/core/operands.ts +119 -0
- package/src/procedures/core/outputs.ts +48 -0
- package/src/procedures/core/results.ts +296 -0
- package/src/procedures/core/schemas.ts +123 -0
- package/src/procedures/core/string.ts +458 -0
- package/src/procedures/core/type.ts +344 -0
- package/src/procedures/define-procedure.ts +531 -0
- package/src/procedures/define.ts +387 -0
- package/src/procedures/discovery.ts +76 -0
- package/src/procedures/index.ts +228 -0
- package/src/procedures/interceptors.ts +272 -0
- package/src/procedures/invoke.ts +413 -0
- package/src/procedures/module.ts +107 -0
- package/src/procedures/policy.ts +171 -0
- package/src/procedures/ref.ts +1305 -0
- package/src/procedures/registry.ts +473 -0
- package/src/procedures/schema.ts +225 -0
- package/src/procedures/types.ts +485 -0
- package/src/server/browser-guard.ts +147 -0
- package/src/server/host-policy.ts +121 -0
- package/src/server/index.ts +70 -0
- package/src/server/method.ts +33 -0
- package/src/server/procedure-server.ts +417 -0
- package/src/server/server.ts +364 -0
- package/src/server/types.ts +147 -0
|
@@ -0,0 +1,895 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Language Procedures
|
|
3
|
+
*
|
|
4
|
+
* Foundational procedures for composing and controlling procedure execution.
|
|
5
|
+
* These procedures enable declarative pipelines and control flow.
|
|
6
|
+
*
|
|
7
|
+
* Core procedures:
|
|
8
|
+
* - `chain` - Execute procedures sequentially, passing results through
|
|
9
|
+
* - `parallel` - Execute procedures concurrently
|
|
10
|
+
* - `conditional` - Conditional execution (if/then/else)
|
|
11
|
+
* - `and` - Short-circuit AND (returns first falsy or last result)
|
|
12
|
+
* - `or` - Short-circuit OR (returns first truthy result)
|
|
13
|
+
* - `map` - Map over array with a procedure
|
|
14
|
+
* - `reduce` - Reduce array with a procedure
|
|
15
|
+
* - `identity` - Return input unchanged
|
|
16
|
+
* - `constant` - Return a constant value
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* import { proc } from "@procedures/client";
|
|
21
|
+
*
|
|
22
|
+
* // Sequential execution
|
|
23
|
+
* const pipeline = proc(["client", "chain"]).input({
|
|
24
|
+
* steps: [
|
|
25
|
+
* proc(["git", "add"]).input({ all: true }).ref,
|
|
26
|
+
* proc(["git", "commit"]).input({ message: "auto" }).ref,
|
|
27
|
+
* proc(["git", "push"]).input({}).ref,
|
|
28
|
+
* ],
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* // Parallel execution
|
|
32
|
+
* const parallel = proc(["client", "parallel"]).input({
|
|
33
|
+
* tasks: [
|
|
34
|
+
* proc(["lib", "build"]).input({ path: "pkg1" }).ref,
|
|
35
|
+
* proc(["lib", "build"]).input({ path: "pkg2" }).ref,
|
|
36
|
+
* ],
|
|
37
|
+
* });
|
|
38
|
+
*
|
|
39
|
+
* // Conditional
|
|
40
|
+
* const conditional = proc(["client", "conditional"]).input({
|
|
41
|
+
* condition: proc(["git", "hasChanges"]).input({}).ref,
|
|
42
|
+
* then: proc(["git", "commit"]).input({ message: "auto" }).ref,
|
|
43
|
+
* else: proc(["client", "identity"]).input({ message: "no changes" }).ref,
|
|
44
|
+
* });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
import { z } from "zod";
|
|
49
|
+
import { anyOutput, booleanOutput } from "./outputs.js";
|
|
50
|
+
import { defineProcedure, namespace } from "../define.js";
|
|
51
|
+
import type { AnyProcedure, Procedure, ProcedureContext } from "../types.js";
|
|
52
|
+
|
|
53
|
+
// Re-export for convenience
|
|
54
|
+
export { anySchema } from "./schemas.js";
|
|
55
|
+
|
|
56
|
+
// =============================================================================
|
|
57
|
+
// Input schemas of the control-flow procedures (roadmap 2.1)
|
|
58
|
+
// =============================================================================
|
|
59
|
+
// The operands are programs: a call ({ $proc, input }), a list of calls, or a plain value. So
|
|
60
|
+
// each operand is any JSON (z.unknown()), and each object is loose: a runner adds fields such as
|
|
61
|
+
// `cwd` and `node`, which the operands get. The schemas name the fields for the MCP tool list and
|
|
62
|
+
// the help of mark.
|
|
63
|
+
|
|
64
|
+
// An operand is optional: in zod 4 a z.unknown() key is required, and JSON drops a key whose
|
|
65
|
+
// value is undefined (over HTTP, { value: undefined } arrives as {})
|
|
66
|
+
const operand = (description: string) => z.unknown().optional().describe(description);
|
|
67
|
+
|
|
68
|
+
const ChainInputSchema = z.looseObject({
|
|
69
|
+
steps: z.array(z.unknown()).describe("The steps, in order: calls or values. A step can read an earlier result as { $ref: name } or { $ref: \"$last\" }."),
|
|
70
|
+
passThrough: z.boolean().optional().describe("Give each step that has no input the result of the step before"),
|
|
71
|
+
initialInput: operand("The input of the first step when passThrough is true"),
|
|
72
|
+
});
|
|
73
|
+
const ParallelInputSchema = z.looseObject({
|
|
74
|
+
tasks: z.array(z.unknown()).describe("The tasks to run at the same time: calls or values"),
|
|
75
|
+
concurrency: z.number().int().min(1).optional().describe("The most tasks that run at the same time (default: all)"),
|
|
76
|
+
failFast: z.boolean().optional().describe("Stop at the first error (default: false)"),
|
|
77
|
+
});
|
|
78
|
+
const ConditionalInputSchema = z.looseObject({
|
|
79
|
+
condition: operand("The condition: a value or a call. A truthy result runs then, a falsy one runs else."),
|
|
80
|
+
then: operand("The program for a truthy condition"),
|
|
81
|
+
else: operand("The program for a falsy condition (default: undefined)"),
|
|
82
|
+
});
|
|
83
|
+
const LogicInputSchema = z.looseObject({
|
|
84
|
+
values: z.array(z.unknown()).describe("The operands, in order: values or calls. The evaluation stops at the deciding value."),
|
|
85
|
+
});
|
|
86
|
+
const NotInputSchema = z.looseObject({ value: operand("The value or call to negate") });
|
|
87
|
+
const VariadicBoolInputSchema = z.looseObject({
|
|
88
|
+
values: z.array(z.unknown()).describe("The values or calls to evaluate"),
|
|
89
|
+
});
|
|
90
|
+
const MapInputSchema = z.looseObject({
|
|
91
|
+
items: operand("The array, or a call that gives it"),
|
|
92
|
+
fn: operand("The call to run for each item. It reads the item as { $ref: \"item\" } (or the name in as) and the position as { $ref: \"index\" }."),
|
|
93
|
+
as: z.string().optional().describe("The $ref name of the item in fn (default: item)"),
|
|
94
|
+
results: operand("Results that were computed before (old form)"),
|
|
95
|
+
});
|
|
96
|
+
const ReduceInputSchema = z.looseObject({
|
|
97
|
+
items: operand("The array, or a call that gives it"),
|
|
98
|
+
initial: operand("The first accumulator value"),
|
|
99
|
+
fn: operand("The call to run for each item. It reads { $ref: \"acc\" }, { $ref: \"item\" } and { $ref: \"index\" }; its result is the next accumulator."),
|
|
100
|
+
accumulated: operand("A result that was computed before (old form)"),
|
|
101
|
+
});
|
|
102
|
+
const ValueInputSchema = z.looseObject({ value: operand("The value") });
|
|
103
|
+
const ThrowInputSchema = z.looseObject({
|
|
104
|
+
message: z.string().describe("The error message"),
|
|
105
|
+
code: z.string().optional().describe("The error code"),
|
|
106
|
+
});
|
|
107
|
+
const TryCatchInputSchema = z.looseObject({
|
|
108
|
+
try: operand("The program to try"),
|
|
109
|
+
catch: operand("The program or value for an error. It reads the message as { $ref: \"error\" }."),
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
// =============================================================================
|
|
114
|
+
// Operands
|
|
115
|
+
// =============================================================================
|
|
116
|
+
|
|
117
|
+
import {
|
|
118
|
+
isAnyProcedureRef,
|
|
119
|
+
normalizeRef,
|
|
120
|
+
createRefScope,
|
|
121
|
+
scopeOf,
|
|
122
|
+
getRefWhen,
|
|
123
|
+
WHEN_NEVER,
|
|
124
|
+
RUNS_REFS_TAG,
|
|
125
|
+
type RefScope,
|
|
126
|
+
} from "../ref.js";
|
|
127
|
+
import {
|
|
128
|
+
substituteRefs,
|
|
129
|
+
hydrateOperand,
|
|
130
|
+
callOperand,
|
|
131
|
+
evaluateOperand,
|
|
132
|
+
parentContext,
|
|
133
|
+
scopeWith,
|
|
134
|
+
controlFlowTags,
|
|
135
|
+
} from "./operands.js";
|
|
136
|
+
|
|
137
|
+
// =============================================================================
|
|
138
|
+
// Chain Procedure
|
|
139
|
+
// =============================================================================
|
|
140
|
+
|
|
141
|
+
interface ChainInput {
|
|
142
|
+
/** Procedures to execute in sequence */
|
|
143
|
+
steps: unknown[];
|
|
144
|
+
/**
|
|
145
|
+
* When true, a step that is a call with no `input` gets the result of the step before as its
|
|
146
|
+
* input (the first step gets `initialInput`). A step with its own input keeps it, and can read
|
|
147
|
+
* the result of the step before as `{ $ref: "$last" }`.
|
|
148
|
+
*/
|
|
149
|
+
passThrough?: boolean;
|
|
150
|
+
/** The input of the first step when `passThrough` is true. Its calls run first. */
|
|
151
|
+
initialInput?: unknown;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
interface ChainOutput {
|
|
155
|
+
/** Results from each step */
|
|
156
|
+
results: unknown[];
|
|
157
|
+
/** Final result (last step's output) */
|
|
158
|
+
final: unknown;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const ChainOutputSchema = z.looseObject({
|
|
162
|
+
results: z.array(z.unknown()).describe("The result of each step, in order"),
|
|
163
|
+
final: z.unknown().optional().describe("The result of the last step"),
|
|
164
|
+
}) as z.ZodType<ChainOutput>;
|
|
165
|
+
|
|
166
|
+
type ChainProcedure = Procedure<ChainInput, ChainOutput, { description: string; tags: string[] }>;
|
|
167
|
+
|
|
168
|
+
const chainProcedure: ChainProcedure = defineProcedure({
|
|
169
|
+
path: ["chain"],
|
|
170
|
+
input: ChainInputSchema as any,
|
|
171
|
+
output: ChainOutputSchema,
|
|
172
|
+
metadata: {
|
|
173
|
+
description: "Execute procedures sequentially",
|
|
174
|
+
tags: controlFlowTags("control-flow"),
|
|
175
|
+
},
|
|
176
|
+
handler: async (input: ChainInput, ctx?: ProcedureContext): Promise<ChainOutput> => {
|
|
177
|
+
const { steps, passThrough, initialInput, ...parentInput } = input;
|
|
178
|
+
if (!Array.isArray(steps)) {
|
|
179
|
+
throw new Error(`client.chain: steps must be an array, got ${steps === null ? "null" : typeof steps}`);
|
|
180
|
+
}
|
|
181
|
+
const results: unknown[] = [];
|
|
182
|
+
// The scope of an outer chain is the parent: its names stay visible here
|
|
183
|
+
const scope = createRefScope(scopeOf(input));
|
|
184
|
+
|
|
185
|
+
// Extract context to propagate to steps (e.g., cwd, node)
|
|
186
|
+
const { cwd, node } = parentInput as { cwd?: string; node?: unknown };
|
|
187
|
+
|
|
188
|
+
// With passThrough, the value that the next step without input gets (docs review DOC-4:
|
|
189
|
+
// before, the procedure ignored passThrough and initialInput)
|
|
190
|
+
let passed: unknown = passThrough && ctx?.client ? await hydrateOperand(initialInput, ctx, scope) : undefined;
|
|
191
|
+
|
|
192
|
+
for (const step of steps) {
|
|
193
|
+
let result: unknown;
|
|
194
|
+
|
|
195
|
+
if (isAnyProcedureRef(step) && getRefWhen(step) === WHEN_NEVER) {
|
|
196
|
+
// A $never step is data, like a $never ref anywhere (docs review DOC-1)
|
|
197
|
+
result = step;
|
|
198
|
+
} else if (!ctx?.client) {
|
|
199
|
+
// No client context: the result of a step is its input, with the known $refs resolved
|
|
200
|
+
result = substituteRefs(isAnyProcedureRef(step) ? normalizeRef(step).input : step, scope);
|
|
201
|
+
} else if (isAnyProcedureRef(step)) {
|
|
202
|
+
// Resolve the $refs of the step's input, run its nested refs, add the parent context (cwd, node).
|
|
203
|
+
// With passThrough, a step with no input gets the passed value as a literal: it ran already.
|
|
204
|
+
const operand =
|
|
205
|
+
passThrough && normalizeRef(step).input === undefined ? { ...step, input: { $literal: passed } } : step;
|
|
206
|
+
result = await callOperand(operand, ctx, { scope, extra: parentContext({ cwd, node }) });
|
|
207
|
+
} else {
|
|
208
|
+
// A $ref, a $literal, or a value that holds refs
|
|
209
|
+
result = await hydrateOperand(step, ctx, scope);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Store named output
|
|
213
|
+
const stepName = isAnyProcedureRef(step) ? normalizeRef(step).$name : undefined;
|
|
214
|
+
if (stepName) {
|
|
215
|
+
scope.outputs.set(stepName, result);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Update $last
|
|
219
|
+
scope.last = result;
|
|
220
|
+
passed = result;
|
|
221
|
+
results.push(result);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return {
|
|
225
|
+
results,
|
|
226
|
+
final: results[results.length - 1],
|
|
227
|
+
};
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// =============================================================================
|
|
232
|
+
// Parallel Procedure
|
|
233
|
+
// =============================================================================
|
|
234
|
+
|
|
235
|
+
interface ParallelInput {
|
|
236
|
+
/** Procedures to execute in parallel */
|
|
237
|
+
tasks: unknown[];
|
|
238
|
+
/** Maximum concurrency (default: unlimited) */
|
|
239
|
+
concurrency?: number;
|
|
240
|
+
/** Whether to fail fast on first error (default: false) */
|
|
241
|
+
failFast?: boolean;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
interface ParallelOutput {
|
|
245
|
+
/** Results from each task (in order) */
|
|
246
|
+
results: unknown[];
|
|
247
|
+
/** Whether all tasks succeeded */
|
|
248
|
+
allSucceeded: boolean;
|
|
249
|
+
/** Errors from failed tasks */
|
|
250
|
+
errors: Array<{ index: number; error: string }>;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const ParallelOutputSchema = z.looseObject({
|
|
254
|
+
results: z.array(z.unknown()).describe("The result of each task, in the order of the tasks"),
|
|
255
|
+
allSucceeded: z.boolean().describe("True when no task failed"),
|
|
256
|
+
errors: z
|
|
257
|
+
.array(
|
|
258
|
+
z.looseObject({
|
|
259
|
+
index: z.number().describe("The index of the task that failed"),
|
|
260
|
+
error: z.string().describe("The error message of the task"),
|
|
261
|
+
})
|
|
262
|
+
)
|
|
263
|
+
.describe("The failed tasks"),
|
|
264
|
+
}) as z.ZodType<ParallelOutput>;
|
|
265
|
+
|
|
266
|
+
type ParallelProcedure = Procedure<ParallelInput, ParallelOutput, { description: string; tags: string[] }>;
|
|
267
|
+
|
|
268
|
+
const parallelProcedure: ParallelProcedure = defineProcedure({
|
|
269
|
+
path: ["parallel"],
|
|
270
|
+
input: ParallelInputSchema as any,
|
|
271
|
+
output: ParallelOutputSchema,
|
|
272
|
+
metadata: {
|
|
273
|
+
description: "Execute procedures in parallel",
|
|
274
|
+
tags: controlFlowTags("control-flow"),
|
|
275
|
+
},
|
|
276
|
+
handler: async (input: ParallelInput, ctx?: ProcedureContext): Promise<ParallelOutput> => {
|
|
277
|
+
const { tasks, concurrency, failFast } = input as ParallelInput & {
|
|
278
|
+
cwd?: string;
|
|
279
|
+
node?: unknown;
|
|
280
|
+
};
|
|
281
|
+
const { cwd, node } = input as { cwd?: string; node?: unknown };
|
|
282
|
+
const scope = scopeOf(input);
|
|
283
|
+
|
|
284
|
+
// Operands arrive raw (exec() does not pre-hydrate control-flow procedures). Execute
|
|
285
|
+
// task refs concurrently, honoring `concurrency` and `failFast`, and report per-task
|
|
286
|
+
// errors. Other tasks are values: their refs run. See BUGS-2026-07 M35.
|
|
287
|
+
const runTask = async (task: unknown): Promise<unknown> => {
|
|
288
|
+
if (!ctx?.client) {
|
|
289
|
+
return task;
|
|
290
|
+
}
|
|
291
|
+
return evaluateOperand(task, ctx, { scope, extra: parentContext({ cwd, node }) });
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
const results: unknown[] = new Array(tasks.length);
|
|
295
|
+
const errors: Array<{ index: number; error: string }> = [];
|
|
296
|
+
|
|
297
|
+
const limit =
|
|
298
|
+
typeof concurrency === "number" && concurrency > 0
|
|
299
|
+
? Math.min(concurrency, tasks.length)
|
|
300
|
+
: tasks.length;
|
|
301
|
+
|
|
302
|
+
let nextIndex = 0;
|
|
303
|
+
let aborted = false;
|
|
304
|
+
|
|
305
|
+
const worker = async (): Promise<void> => {
|
|
306
|
+
while (!aborted) {
|
|
307
|
+
const index = nextIndex++;
|
|
308
|
+
if (index >= tasks.length) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
try {
|
|
312
|
+
results[index] = await runTask(tasks[index]);
|
|
313
|
+
} catch (error) {
|
|
314
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
315
|
+
if (failFast) {
|
|
316
|
+
aborted = true;
|
|
317
|
+
throw error;
|
|
318
|
+
}
|
|
319
|
+
errors.push({ index, error: message });
|
|
320
|
+
results[index] = undefined;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
const workerCount = Math.max(1, limit);
|
|
326
|
+
await Promise.all(Array.from({ length: workerCount }, () => worker()));
|
|
327
|
+
|
|
328
|
+
errors.sort((a, b) => a.index - b.index);
|
|
329
|
+
|
|
330
|
+
return {
|
|
331
|
+
results,
|
|
332
|
+
allSucceeded: errors.length === 0,
|
|
333
|
+
errors,
|
|
334
|
+
};
|
|
335
|
+
},
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// =============================================================================
|
|
339
|
+
// Conditional Procedure
|
|
340
|
+
// =============================================================================
|
|
341
|
+
|
|
342
|
+
interface ConditionalInput {
|
|
343
|
+
/** Condition value (truthy/falsy) */
|
|
344
|
+
condition: unknown;
|
|
345
|
+
/** Value/result to use if condition is truthy */
|
|
346
|
+
then: unknown;
|
|
347
|
+
/** Value/result to use if condition is falsy */
|
|
348
|
+
else?: unknown;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
type ConditionalProcedure = Procedure<ConditionalInput, unknown, { description: string; tags: string[] }>;
|
|
352
|
+
|
|
353
|
+
const conditionalProcedure: ConditionalProcedure = defineProcedure({
|
|
354
|
+
path: ["conditional"],
|
|
355
|
+
input: ConditionalInputSchema as any,
|
|
356
|
+
output: anyOutput("The value of the chosen branch: its shape depends on the program"),
|
|
357
|
+
metadata: {
|
|
358
|
+
description: "Conditional execution (if/then/else)",
|
|
359
|
+
tags: controlFlowTags("control-flow"),
|
|
360
|
+
},
|
|
361
|
+
handler: async (input: ConditionalInput, ctx?: ProcedureContext): Promise<unknown> => {
|
|
362
|
+
const { condition: rawCondition, then: thenValue, else: elseValue, ...parentInput } = input as ConditionalInput & {
|
|
363
|
+
cwd?: string;
|
|
364
|
+
node?: unknown;
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
// Extract context to propagate to branches (e.g., cwd, node)
|
|
368
|
+
const { cwd, node } = parentInput;
|
|
369
|
+
const scope = scopeOf(input);
|
|
370
|
+
|
|
371
|
+
// Operands arrive raw (exec() does not pre-hydrate control-flow procedures), so the
|
|
372
|
+
// condition runs here, before its truthiness is known. See BUGS-2026-07 H2. A condition
|
|
373
|
+
// that is a $ref reads the scope of the caller.
|
|
374
|
+
const condition: unknown = ctx?.client
|
|
375
|
+
? await evaluateOperand(rawCondition, ctx, { scope, extra: parentContext({ cwd, node }) })
|
|
376
|
+
: rawCondition;
|
|
377
|
+
|
|
378
|
+
// Determine truthiness - check for .value property (from predicates like git.hasChanges)
|
|
379
|
+
let isTruthy: boolean;
|
|
380
|
+
if (condition && typeof condition === "object" && "value" in condition) {
|
|
381
|
+
isTruthy = Boolean((condition as { value: unknown }).value);
|
|
382
|
+
} else {
|
|
383
|
+
isTruthy = Boolean(condition);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// Select the branch to execute/return
|
|
387
|
+
const selectedBranch = isTruthy ? thenValue : elseValue;
|
|
388
|
+
|
|
389
|
+
// Only the selected branch runs. Without a client, the branch is the result as it is.
|
|
390
|
+
if (selectedBranch === undefined || !ctx?.client) {
|
|
391
|
+
return selectedBranch;
|
|
392
|
+
}
|
|
393
|
+
return evaluateOperand(selectedBranch, ctx, { scope, extra: parentContext({ cwd, node }) });
|
|
394
|
+
},
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
// =============================================================================
|
|
398
|
+
// Logic Operators (unified with group theory)
|
|
399
|
+
// =============================================================================
|
|
400
|
+
|
|
401
|
+
import {
|
|
402
|
+
notHandler,
|
|
403
|
+
allHandler,
|
|
404
|
+
anyHandler as anyLogicHandler,
|
|
405
|
+
noneHandler,
|
|
406
|
+
andMetadata,
|
|
407
|
+
orMetadata,
|
|
408
|
+
notMetadata,
|
|
409
|
+
allMetadata,
|
|
410
|
+
anyMetadata,
|
|
411
|
+
noneMetadata,
|
|
412
|
+
type LogicMetadata,
|
|
413
|
+
} from "./logic.js";
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* The handler of a short-circuit operator (`and`, `or`). It runs the operands in order and stops
|
|
417
|
+
* at the first value for which `stopOn` is true: that value is the result. Otherwise the result
|
|
418
|
+
* is the last value. (Deep dive CORE-1: before, the handler only tested the raw operands, and a
|
|
419
|
+
* ref is always truthy, so no operand ran.)
|
|
420
|
+
*/
|
|
421
|
+
function shortCircuit(stopOn: (value: unknown) => boolean) {
|
|
422
|
+
return async (input: { values: unknown[]; cwd?: string; node?: unknown }, ctx?: ProcedureContext): Promise<unknown> => {
|
|
423
|
+
const { values } = input;
|
|
424
|
+
if (!Array.isArray(values)) {
|
|
425
|
+
throw new Error(`values must be an array, got ${values === null ? "null" : typeof values}`);
|
|
426
|
+
}
|
|
427
|
+
const scope = scopeOf(input);
|
|
428
|
+
let last: unknown = undefined;
|
|
429
|
+
for (const operand of values) {
|
|
430
|
+
last = ctx?.client ? await evaluateOperand(operand, ctx, { scope, extra: parentContext(input) }) : operand;
|
|
431
|
+
if (stopOn(last)) {
|
|
432
|
+
return last;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
return last;
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
interface AndInput {
|
|
440
|
+
/** Values to AND together (short-circuit) */
|
|
441
|
+
values: unknown[];
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
type AndProcedure = Procedure<AndInput, unknown, LogicMetadata>;
|
|
445
|
+
|
|
446
|
+
const andProcedure: AndProcedure = defineProcedure({
|
|
447
|
+
path: ["and"],
|
|
448
|
+
input: LogicInputSchema as any,
|
|
449
|
+
output: anyOutput("The first falsy operand value, or the last value"),
|
|
450
|
+
metadata: { ...andMetadata, tags: [...andMetadata.tags, RUNS_REFS_TAG] },
|
|
451
|
+
handler: shortCircuit((value) => !value),
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
interface OrInput {
|
|
455
|
+
/** Values to OR together (short-circuit) */
|
|
456
|
+
values: unknown[];
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
type OrProcedure = Procedure<OrInput, unknown, LogicMetadata>;
|
|
460
|
+
|
|
461
|
+
const orProcedure: OrProcedure = defineProcedure({
|
|
462
|
+
path: ["or"],
|
|
463
|
+
input: LogicInputSchema as any,
|
|
464
|
+
output: anyOutput("The first truthy operand value, or the last value"),
|
|
465
|
+
metadata: { ...orMetadata, tags: [...orMetadata.tags, RUNS_REFS_TAG] },
|
|
466
|
+
handler: shortCircuit((value) => Boolean(value)),
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
interface NotInput {
|
|
470
|
+
/** Value to negate */
|
|
471
|
+
value: unknown;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
type NotProcedure = Procedure<NotInput, boolean, LogicMetadata>;
|
|
475
|
+
|
|
476
|
+
const notProcedure: NotProcedure = defineProcedure({
|
|
477
|
+
path: ["not"],
|
|
478
|
+
input: NotInputSchema as any,
|
|
479
|
+
output: booleanOutput("The negated truth value"),
|
|
480
|
+
metadata: notMetadata,
|
|
481
|
+
handler: notHandler,
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
// Additional logic operators with boolean results
|
|
485
|
+
|
|
486
|
+
interface VariadicBoolInput {
|
|
487
|
+
/** Values to evaluate */
|
|
488
|
+
values: unknown[];
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
type AllProcedure = Procedure<VariadicBoolInput, boolean, LogicMetadata>;
|
|
492
|
+
|
|
493
|
+
const allProcedure: AllProcedure = defineProcedure({
|
|
494
|
+
path: ["all"],
|
|
495
|
+
input: VariadicBoolInputSchema as any,
|
|
496
|
+
output: booleanOutput("True when every value is truthy"),
|
|
497
|
+
metadata: allMetadata,
|
|
498
|
+
handler: allHandler,
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
type AnyProcedureType = Procedure<VariadicBoolInput, boolean, LogicMetadata>;
|
|
502
|
+
|
|
503
|
+
const anyProcedure: AnyProcedureType = defineProcedure({
|
|
504
|
+
path: ["any"],
|
|
505
|
+
input: VariadicBoolInputSchema as any,
|
|
506
|
+
output: booleanOutput("True when one value is truthy"),
|
|
507
|
+
metadata: anyMetadata,
|
|
508
|
+
handler: anyLogicHandler,
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
type NoneProcedure = Procedure<VariadicBoolInput, boolean, LogicMetadata>;
|
|
512
|
+
|
|
513
|
+
const noneProcedure: NoneProcedure = defineProcedure({
|
|
514
|
+
path: ["none"],
|
|
515
|
+
input: VariadicBoolInputSchema as any,
|
|
516
|
+
output: booleanOutput("True when no value is truthy"),
|
|
517
|
+
metadata: noneMetadata,
|
|
518
|
+
handler: noneHandler,
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
// =============================================================================
|
|
522
|
+
// Map Procedure
|
|
523
|
+
// =============================================================================
|
|
524
|
+
|
|
525
|
+
interface MapInput {
|
|
526
|
+
/** The array to map over. An element (or the whole value) can be a procedure ref: it runs first. */
|
|
527
|
+
items: unknown[];
|
|
528
|
+
/**
|
|
529
|
+
* The procedure ref to run for each item. Its input reads the item as `{ $ref: "item" }`
|
|
530
|
+
* (or the name in `as`) and the position as `{ $ref: "index" }`. Without `fn`, the result
|
|
531
|
+
* is the items, with their refs run.
|
|
532
|
+
*/
|
|
533
|
+
fn?: unknown;
|
|
534
|
+
/** The `$ref` name of the item in `fn`. The default is "item". */
|
|
535
|
+
as?: string;
|
|
536
|
+
/** Results from mapping (items should be procedure refs that get hydrated) */
|
|
537
|
+
results?: unknown[];
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
interface MapOutput {
|
|
541
|
+
/** Mapped results */
|
|
542
|
+
results: unknown[];
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
const MapOutputSchema = z.looseObject({
|
|
546
|
+
results: z.array(z.unknown()).describe("The result of fn for each item, in order"),
|
|
547
|
+
}) as z.ZodType<MapOutput>;
|
|
548
|
+
|
|
549
|
+
type MapProcedure = Procedure<MapInput, MapOutput, { description: string; tags: string[] }>;
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* This function runs the refs of an `items` operand. It runs each element separately and in
|
|
553
|
+
* order, so an array whose elements are all refs stays an array (hydration makes such an array
|
|
554
|
+
* a chain).
|
|
555
|
+
*/
|
|
556
|
+
async function hydrateItems(items: unknown, ctx: ProcedureContext | undefined, scope: RefScope | undefined): Promise<unknown[]> {
|
|
557
|
+
if (!ctx?.client) return Array.isArray(items) ? items : [];
|
|
558
|
+
let value: unknown;
|
|
559
|
+
if (Array.isArray(items)) {
|
|
560
|
+
const results: unknown[] = [];
|
|
561
|
+
for (const item of items) results.push(await hydrateOperand(item, ctx, scope));
|
|
562
|
+
value = results;
|
|
563
|
+
} else {
|
|
564
|
+
value = await hydrateOperand(items, ctx, scope);
|
|
565
|
+
}
|
|
566
|
+
if (!Array.isArray(value)) {
|
|
567
|
+
throw new Error(`items must be an array, got ${value === null ? "null" : typeof value}`);
|
|
568
|
+
}
|
|
569
|
+
return value;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
const mapProcedure: MapProcedure = defineProcedure({
|
|
573
|
+
path: ["map"],
|
|
574
|
+
input: MapInputSchema as any,
|
|
575
|
+
output: MapOutputSchema,
|
|
576
|
+
metadata: {
|
|
577
|
+
description: "Map over an array: run fn for each item (the item is { $ref: \"item\" })",
|
|
578
|
+
tags: controlFlowTags("collection"),
|
|
579
|
+
},
|
|
580
|
+
handler: async (input: MapInput, ctx?: ProcedureContext): Promise<MapOutput> => {
|
|
581
|
+
// map is a control-flow procedure: its operands arrive raw, and it runs them here.
|
|
582
|
+
// Before, the handler only returned the raw items, so their refs never ran and no
|
|
583
|
+
// function was applied.
|
|
584
|
+
const outer = scopeOf(input);
|
|
585
|
+
const items = await hydrateItems(input.items, ctx, outer);
|
|
586
|
+
if (!isAnyProcedureRef(input.fn) || !ctx?.client) {
|
|
587
|
+
return { results: items };
|
|
588
|
+
}
|
|
589
|
+
const results: unknown[] = [];
|
|
590
|
+
for (const [index, item] of items.entries()) {
|
|
591
|
+
results.push(await callOperand(input.fn, ctx, { scope: scopeWith({ [input.as ?? "item"]: item, index }, outer) }));
|
|
592
|
+
}
|
|
593
|
+
return { results };
|
|
594
|
+
},
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
// =============================================================================
|
|
598
|
+
// Reduce Procedure
|
|
599
|
+
// =============================================================================
|
|
600
|
+
|
|
601
|
+
interface ReduceInput {
|
|
602
|
+
/** The array to reduce. An element (or the whole value) can be a procedure ref: it runs first. */
|
|
603
|
+
items: unknown[];
|
|
604
|
+
/** Initial accumulator value */
|
|
605
|
+
initial: unknown;
|
|
606
|
+
/**
|
|
607
|
+
* The procedure ref to run for each item. Its input reads the accumulator as `{ $ref: "acc" }`,
|
|
608
|
+
* the item as `{ $ref: "item" }` and the position as `{ $ref: "index" }`. Its result is the
|
|
609
|
+
* next accumulator.
|
|
610
|
+
*/
|
|
611
|
+
fn?: unknown;
|
|
612
|
+
/** Reducer results (computed externally via procedure refs) */
|
|
613
|
+
accumulated?: unknown;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
type ReduceProcedure = Procedure<ReduceInput, unknown, { description: string; tags: string[] }>;
|
|
617
|
+
|
|
618
|
+
const reduceProcedure: ReduceProcedure = defineProcedure({
|
|
619
|
+
path: ["reduce"],
|
|
620
|
+
input: ReduceInputSchema as any,
|
|
621
|
+
output: anyOutput("The last accumulator: its shape depends on the program"),
|
|
622
|
+
metadata: {
|
|
623
|
+
description: "Reduce an array: run fn for each item (acc and item are $refs)",
|
|
624
|
+
tags: controlFlowTags("collection"),
|
|
625
|
+
},
|
|
626
|
+
handler: async (input: ReduceInput, ctx?: ProcedureContext): Promise<unknown> => {
|
|
627
|
+
if (!ctx?.client) {
|
|
628
|
+
return input.accumulated ?? input.initial;
|
|
629
|
+
}
|
|
630
|
+
if (!isAnyProcedureRef(input.fn)) {
|
|
631
|
+
// Without fn, the result is the accumulated value, hydrated like any operand. (Docs review
|
|
632
|
+
// DOC-4: before, a call in initial did not run, while map without fn hydrated its items.)
|
|
633
|
+
return hydrateOperand(input.accumulated ?? input.initial, ctx, scopeOf(input));
|
|
634
|
+
}
|
|
635
|
+
const outer = scopeOf(input);
|
|
636
|
+
const items = await hydrateItems(input.items, ctx, outer);
|
|
637
|
+
let acc = await hydrateOperand(input.initial, ctx, outer);
|
|
638
|
+
for (const [index, item] of items.entries()) {
|
|
639
|
+
acc = await callOperand(input.fn, ctx, { scope: scopeWith({ acc, item, index }, outer) });
|
|
640
|
+
}
|
|
641
|
+
return acc;
|
|
642
|
+
},
|
|
643
|
+
});
|
|
644
|
+
|
|
645
|
+
// =============================================================================
|
|
646
|
+
// Identity Procedure
|
|
647
|
+
// =============================================================================
|
|
648
|
+
|
|
649
|
+
interface IdentityInput {
|
|
650
|
+
/** Value to return unchanged */
|
|
651
|
+
value: unknown;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
type IdentityProcedure = Procedure<IdentityInput, unknown, { description: string; tags: string[] }>;
|
|
655
|
+
|
|
656
|
+
const identityProcedure: IdentityProcedure = defineProcedure({
|
|
657
|
+
path: ["identity"],
|
|
658
|
+
input: ValueInputSchema as any,
|
|
659
|
+
output: anyOutput("The input value, unchanged"),
|
|
660
|
+
metadata: {
|
|
661
|
+
description: "Return input unchanged",
|
|
662
|
+
tags: ["core", "utility"],
|
|
663
|
+
},
|
|
664
|
+
handler: async (input: IdentityInput): Promise<unknown> => {
|
|
665
|
+
return input.value;
|
|
666
|
+
},
|
|
667
|
+
});
|
|
668
|
+
|
|
669
|
+
// =============================================================================
|
|
670
|
+
// Constant Procedure
|
|
671
|
+
// =============================================================================
|
|
672
|
+
|
|
673
|
+
interface ConstantInput {
|
|
674
|
+
/** Constant value to return */
|
|
675
|
+
value: unknown;
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
type ConstantProcedure = Procedure<ConstantInput, unknown, { description: string; tags: string[] }>;
|
|
679
|
+
|
|
680
|
+
const constantProcedure: ConstantProcedure = defineProcedure({
|
|
681
|
+
path: ["constant"],
|
|
682
|
+
input: ValueInputSchema as any,
|
|
683
|
+
output: anyOutput("The constant value"),
|
|
684
|
+
metadata: {
|
|
685
|
+
description: "Return a constant value",
|
|
686
|
+
tags: ["core", "utility"],
|
|
687
|
+
},
|
|
688
|
+
handler: async (input: ConstantInput): Promise<unknown> => {
|
|
689
|
+
return input.value;
|
|
690
|
+
},
|
|
691
|
+
});
|
|
692
|
+
|
|
693
|
+
// =============================================================================
|
|
694
|
+
// Throw Procedure
|
|
695
|
+
// =============================================================================
|
|
696
|
+
|
|
697
|
+
interface ThrowInput {
|
|
698
|
+
/** Error message */
|
|
699
|
+
message: string;
|
|
700
|
+
/** Error code */
|
|
701
|
+
code?: string;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
type ThrowProcedure = Procedure<ThrowInput, never, { description: string; tags: string[] }>;
|
|
705
|
+
|
|
706
|
+
const throwProcedure: ThrowProcedure = defineProcedure({
|
|
707
|
+
path: ["throw"],
|
|
708
|
+
input: ThrowInputSchema as any,
|
|
709
|
+
output: z.never().describe("client.throw never gives a value: it throws"),
|
|
710
|
+
metadata: {
|
|
711
|
+
description: "Throw an error",
|
|
712
|
+
tags: ["core", "control-flow"],
|
|
713
|
+
},
|
|
714
|
+
handler: async (input: ThrowInput): Promise<never> => {
|
|
715
|
+
const error = new Error(input.message);
|
|
716
|
+
if (input.code) {
|
|
717
|
+
(error as any).code = input.code;
|
|
718
|
+
}
|
|
719
|
+
throw error;
|
|
720
|
+
},
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
// =============================================================================
|
|
724
|
+
// TryCatch Procedure
|
|
725
|
+
// =============================================================================
|
|
726
|
+
|
|
727
|
+
interface TryCatchInput {
|
|
728
|
+
/** Value to try (should be a procedure ref) */
|
|
729
|
+
try: unknown;
|
|
730
|
+
/** Value to use on error (a procedure ref or a value). It can read the message as `{ $ref: "error" }`. */
|
|
731
|
+
catch: unknown;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
interface TryCatchOutput {
|
|
735
|
+
/** Whether the try succeeded */
|
|
736
|
+
success: boolean;
|
|
737
|
+
/** Result value */
|
|
738
|
+
value: unknown;
|
|
739
|
+
/** Error if failed */
|
|
740
|
+
error?: string;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
const TryCatchOutputSchema = z.looseObject({
|
|
744
|
+
success: z.boolean().describe("True when the try operand did not throw"),
|
|
745
|
+
value: z.unknown().optional().describe("The value of the try operand, or of the catch operand after an error"),
|
|
746
|
+
error: z.string().optional().describe("The error message of the try operand"),
|
|
747
|
+
}) as z.ZodType<TryCatchOutput>;
|
|
748
|
+
|
|
749
|
+
type TryCatchProcedure = Procedure<TryCatchInput, TryCatchOutput, { description: string; tags: string[] }>;
|
|
750
|
+
|
|
751
|
+
const tryCatchProcedure: TryCatchProcedure = defineProcedure({
|
|
752
|
+
path: ["tryCatch"],
|
|
753
|
+
input: TryCatchInputSchema as any,
|
|
754
|
+
output: TryCatchOutputSchema,
|
|
755
|
+
metadata: {
|
|
756
|
+
description: "Try/catch wrapper for procedures",
|
|
757
|
+
tags: controlFlowTags("control-flow"),
|
|
758
|
+
},
|
|
759
|
+
handler: async (input: TryCatchInput, ctx?: ProcedureContext): Promise<TryCatchOutput> => {
|
|
760
|
+
const { try: tryValue, catch: catchValue } = input;
|
|
761
|
+
|
|
762
|
+
// Without a client, nothing can run: `try` is the value
|
|
763
|
+
if (!ctx?.client) {
|
|
764
|
+
return { success: true, value: tryValue };
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
// Operands arrive raw (exec() does not pre-hydrate control-flow procedures), so the
|
|
768
|
+
// `try` operand runs HERE inside a real JS try/catch. If it throws, the `catch` operand
|
|
769
|
+
// runs (or its value is the result). See BUGS-2026-07 H3.
|
|
770
|
+
const scope = scopeOf(input);
|
|
771
|
+
try {
|
|
772
|
+
const value = await evaluateOperand(tryValue, ctx, { scope });
|
|
773
|
+
return { success: true, value };
|
|
774
|
+
} catch (error) {
|
|
775
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
776
|
+
const value = await evaluateOperand(catchValue, ctx, { scope: scopeWith({ error: message }, scope) });
|
|
777
|
+
return { success: false, value, error: message };
|
|
778
|
+
}
|
|
779
|
+
},
|
|
780
|
+
});
|
|
781
|
+
|
|
782
|
+
// =============================================================================
|
|
783
|
+
// Export Core Procedures
|
|
784
|
+
// =============================================================================
|
|
785
|
+
|
|
786
|
+
/**
|
|
787
|
+
* All core language procedures namespaced under "client".
|
|
788
|
+
*/
|
|
789
|
+
export const coreProcedures: AnyProcedure[] = namespace(["client"], [
|
|
790
|
+
chainProcedure as AnyProcedure,
|
|
791
|
+
parallelProcedure as AnyProcedure,
|
|
792
|
+
conditionalProcedure as AnyProcedure,
|
|
793
|
+
// Logic operators (unified with group theory)
|
|
794
|
+
andProcedure as AnyProcedure,
|
|
795
|
+
orProcedure as AnyProcedure,
|
|
796
|
+
notProcedure as AnyProcedure,
|
|
797
|
+
allProcedure as AnyProcedure,
|
|
798
|
+
anyProcedure as AnyProcedure,
|
|
799
|
+
noneProcedure as AnyProcedure,
|
|
800
|
+
// Collection operators
|
|
801
|
+
mapProcedure as AnyProcedure,
|
|
802
|
+
reduceProcedure as AnyProcedure,
|
|
803
|
+
// Utility operators
|
|
804
|
+
identityProcedure as AnyProcedure,
|
|
805
|
+
constantProcedure as AnyProcedure,
|
|
806
|
+
throwProcedure as AnyProcedure,
|
|
807
|
+
tryCatchProcedure as AnyProcedure,
|
|
808
|
+
]);
|
|
809
|
+
|
|
810
|
+
/**
|
|
811
|
+
* Core procedures module for registration.
|
|
812
|
+
*/
|
|
813
|
+
export const coreModule: { name: string; procedures: AnyProcedure[] } = {
|
|
814
|
+
name: "client-core",
|
|
815
|
+
procedures: coreProcedures,
|
|
816
|
+
};
|
|
817
|
+
|
|
818
|
+
// Re-export individual procedures for direct access
|
|
819
|
+
export {
|
|
820
|
+
chainProcedure,
|
|
821
|
+
parallelProcedure,
|
|
822
|
+
conditionalProcedure,
|
|
823
|
+
// Logic operators
|
|
824
|
+
andProcedure,
|
|
825
|
+
orProcedure,
|
|
826
|
+
notProcedure,
|
|
827
|
+
allProcedure,
|
|
828
|
+
anyProcedure,
|
|
829
|
+
noneProcedure,
|
|
830
|
+
// Collection operators
|
|
831
|
+
mapProcedure,
|
|
832
|
+
reduceProcedure,
|
|
833
|
+
// Utility operators
|
|
834
|
+
identityProcedure,
|
|
835
|
+
constantProcedure,
|
|
836
|
+
throwProcedure,
|
|
837
|
+
tryCatchProcedure,
|
|
838
|
+
};
|
|
839
|
+
|
|
840
|
+
// Re-export schemas, result types, and logic utilities
|
|
841
|
+
export * from "./schemas.js";
|
|
842
|
+
export * from "./results.js";
|
|
843
|
+
export * from "./logic.js";
|
|
844
|
+
|
|
845
|
+
// =============================================================================
|
|
846
|
+
// Import additional procedure modules
|
|
847
|
+
// =============================================================================
|
|
848
|
+
|
|
849
|
+
export * from "./math.js";
|
|
850
|
+
export * from "./comparison.js";
|
|
851
|
+
export * from "./string.js";
|
|
852
|
+
export * from "./type.js";
|
|
853
|
+
export * from "./object.js";
|
|
854
|
+
export * from "./array.js";
|
|
855
|
+
export * from "./meta.js";
|
|
856
|
+
|
|
857
|
+
// =============================================================================
|
|
858
|
+
// Combined exports for all core procedures
|
|
859
|
+
// =============================================================================
|
|
860
|
+
|
|
861
|
+
import { mathProcedures, mathModule } from "./math.js";
|
|
862
|
+
import { comparisonProcedures, comparisonModule } from "./comparison.js";
|
|
863
|
+
import { stringProcedures, stringModule } from "./string.js";
|
|
864
|
+
import { typeProcedures, typeModule } from "./type.js";
|
|
865
|
+
import { objectProcedures, objectModule } from "./object.js";
|
|
866
|
+
import { arrayProcedures, arrayModule } from "./array.js";
|
|
867
|
+
import { metaProcedures, metaModule } from "./meta.js";
|
|
868
|
+
|
|
869
|
+
/**
|
|
870
|
+
* All core procedures combined (control flow + math + comparison + string + type + object + array + meta).
|
|
871
|
+
*/
|
|
872
|
+
export const allCoreProcedures: AnyProcedure[] = [
|
|
873
|
+
...coreProcedures,
|
|
874
|
+
...mathProcedures,
|
|
875
|
+
...comparisonProcedures,
|
|
876
|
+
...stringProcedures,
|
|
877
|
+
...typeProcedures,
|
|
878
|
+
...objectProcedures,
|
|
879
|
+
...arrayProcedures,
|
|
880
|
+
...metaProcedures,
|
|
881
|
+
];
|
|
882
|
+
|
|
883
|
+
/**
|
|
884
|
+
* All core modules combined.
|
|
885
|
+
*/
|
|
886
|
+
export const allCoreModules: Array<{ name: string; procedures: AnyProcedure[] }> = [
|
|
887
|
+
coreModule,
|
|
888
|
+
mathModule,
|
|
889
|
+
comparisonModule,
|
|
890
|
+
stringModule,
|
|
891
|
+
typeModule,
|
|
892
|
+
objectModule,
|
|
893
|
+
arrayModule,
|
|
894
|
+
metaModule,
|
|
895
|
+
];
|