{"_id":"@dongkseo/transport","_rev":"6-ec75c60ae8be18707eff5c87498781a4","name":"@dongkseo/transport","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.0":{"name":"@dongkseo/transport","version":"0.1.0","_id":"@dongkseo/transport@0.1.0","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"6b20ada62506d4a16034a43bc42b1181d59eb8af","tarball":"https://registry.npmjs.org/@dongkseo/transport/-/transport-0.1.0.tgz","fileCount":30,"integrity":"sha512-29SFDDlOi4ERfujQkgS9JnidtxnHEI9YewiIUI6mBqoi17F6EDWy56Me2K9fufCv51BC4mKkJH4LGe0vnw/tqA==","signatures":[{"sig":"MEUCIHwyHq7NWpdjI/zwJBgVccvJynENWY4kZTuRnOZsT0LcAiEApWWN02R9vH7zmmb2wgHsIA+sBCiKlRjvFdubVj40YzY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110415},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-transport-0.1.0.tgz","types":"./dist/index.d.ts","nexora":{"stability":"stable"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/lw/t8yfg__j2nxd25m53gt8840h0000gn/T/f36d538c8c519ad0a10ddbc556629ed9/dongkseo-transport-0.1.0.tgz","_integrity":"sha512-29SFDDlOi4ERfujQkgS9JnidtxnHEI9YewiIUI6mBqoi17F6EDWy56Me2K9fufCv51BC4mKkJH4LGe0vnw/tqA==","_npmVersion":"11.12.1","description":"**Stability: stable**","directories":{},"_nodeVersion":"26.0.0","dependencies":{"@dongkseo/contracts":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/transport_0.1.0_1781668549300_0.0462532415643544","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dongkseo/transport","version":"0.1.1","_id":"@dongkseo/transport@0.1.1","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"4b4a24971cab2f6b85c795d341d173f2b045f8b1","tarball":"https://registry.npmjs.org/@dongkseo/transport/-/transport-0.1.1.tgz","fileCount":30,"integrity":"sha512-iJydGuq8v7CueuFcHXtdGce9FwCya6RyJ4XG9r2LTo2PFqGt0bpAPxQMhmI43Y6QnapgDStiovFjraCX7+1/jQ==","signatures":[{"sig":"MEQCIGPGiVZokgvum7rrkbrx+thl8SagI+XS1ercNyg0XdE9AiAIlC/UYvLUp/dW4NJ5I/PnpqLnGkH+9FsS+ry0H30W1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110415},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-transport-0.1.1.tgz","types":"./dist/index.d.ts","nexora":{"stability":"stable"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/f6/dfc3mm717vx9xjh0vbgqnddr0000gn/T/078a146b4e2878404a8f35ecc2974ba1/dongkseo-transport-0.1.1.tgz","_integrity":"sha512-iJydGuq8v7CueuFcHXtdGce9FwCya6RyJ4XG9r2LTo2PFqGt0bpAPxQMhmI43Y6QnapgDStiovFjraCX7+1/jQ==","_npmVersion":"11.12.1","description":"**Stability: stable**","directories":{},"_nodeVersion":"26.0.0","dependencies":{"@dongkseo/contracts":"0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/transport_0.1.1_1781693220801_0.3125433388937242","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@dongkseo/transport","version":"0.1.2","_id":"@dongkseo/transport@0.1.2","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"4a0ca4878599b85cda049f485932b67aa31a30b0","tarball":"https://registry.npmjs.org/@dongkseo/transport/-/transport-0.1.2.tgz","fileCount":30,"integrity":"sha512-fX1i+JUrHOXdQcafgkjfzxy4BJUQB0EbO9mPsaVMSj8F2n5aqPO34nx///zwe4CN3yf8kpxTiy1LMfmUqL+3HA==","signatures":[{"sig":"MEQCIG9gN0OYGxLEZmqhbkh8urlJL427KirZpeQlzB3z91DpAiA012fzU5Xvstfpl/VpLrK7aSGv8XIRMG5+6tIDkSTM3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110438},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-transport-0.1.2.tgz","types":"./dist/index.d.ts","nexora":{"stability":"stable"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/f6/dfc3mm717vx9xjh0vbgqnddr0000gn/T/0f2b4e5dedb4d0a1820c71471dcd3d05/dongkseo-transport-0.1.2.tgz","_integrity":"sha512-fX1i+JUrHOXdQcafgkjfzxy4BJUQB0EbO9mPsaVMSj8F2n5aqPO34nx///zwe4CN3yf8kpxTiy1LMfmUqL+3HA==","_npmVersion":"11.12.1","description":"**Stability: stable**","directories":{},"_nodeVersion":"26.0.0","dependencies":{"@dongkseo/contracts":"0.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/transport_0.1.2_1781856052659_0.2974407086678301","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@dongkseo/transport","version":"0.1.3","_id":"@dongkseo/transport@0.1.3","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"b11cc2f97b07c28420cb98f9c1c9ad17e5916bac","tarball":"https://registry.npmjs.org/@dongkseo/transport/-/transport-0.1.3.tgz","fileCount":30,"integrity":"sha512-dKQIH6Z2v04m9QzklxW3NZbFvc6ENuN/1odT1L/7QmlSAyuNVpCFJ0c26Jp8ranQeEPqE7aKv6CXDIIp/qA9+g==","signatures":[{"sig":"MEUCIQDCBq17udzPcwqRUEjYCugK4GcwcSz2jK9EmNm/LlrVLQIgBtHQ8rgb3pQjcSY2ASQiX4tPPxxuKBBhQiFb9HUa2e8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110439},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-transport-0.1.3.tgz","types":"./dist/index.d.ts","nexora":{"stability":"stable"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/f6/dfc3mm717vx9xjh0vbgqnddr0000gn/T/3d8e4f6b60aceff0def1687cd9ca9e43/dongkseo-transport-0.1.3.tgz","_integrity":"sha512-dKQIH6Z2v04m9QzklxW3NZbFvc6ENuN/1odT1L/7QmlSAyuNVpCFJ0c26Jp8ranQeEPqE7aKv6CXDIIp/qA9+g==","_npmVersion":"11.12.1","description":"**Stability: stable**","directories":{},"_nodeVersion":"26.0.0","dependencies":{"@dongkseo/contracts":"^0.1.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/transport_0.1.3_1782200189323_0.9349975572057312","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@dongkseo/transport","version":"0.1.4","_id":"@dongkseo/transport@0.1.4","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"93ed5b31bb38f76342e929fdeb90797af5ce99ab","tarball":"https://registry.npmjs.org/@dongkseo/transport/-/transport-0.1.4.tgz","fileCount":34,"integrity":"sha512-Vl59mfn4SinjcUaUFjzfUL4kpF1VioKIvXHR4LzRFXfmNRki57A32GZQjPo1tNm+Gpyw6xFvRNa7mapncto2fA==","signatures":[{"sig":"MEUCIHWmkOjzyejfgO4TZAHzWDyLxmEiNpP8szR5o2n9nb+XAiEAwm0OdIOkrSD/en/gGB9wC4SonbgzN6QHF0Kvfpt9xjo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125839},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-transport-0.1.4.tgz","types":"./dist/index.d.ts","nexora":{"stability":"stable"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/lw/t8yfg__j2nxd25m53gt8840h0000gn/T/e28281251392b40a79620d0a9f956dd1/dongkseo-transport-0.1.4.tgz","_integrity":"sha512-Vl59mfn4SinjcUaUFjzfUL4kpF1VioKIvXHR4LzRFXfmNRki57A32GZQjPo1tNm+Gpyw6xFvRNa7mapncto2fA==","_npmVersion":"11.16.0","description":"**Stability: stable** · `pnpm add @dongkseo/transport`","directories":{},"_nodeVersion":"26.3.1","dependencies":{"@dongkseo/contracts":"^0.1.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"peerDependencies":{"ioredis":"^5.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/transport_0.1.4_1782389355709_0.07768299280752822","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@dongkseo/transport","version":"0.1.5","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"dependencies":{"@dongkseo/contracts":"^0.1.32"},"peerDependencies":{"ioredis":"^5.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true}},"devDependencies":{"@types/node":"^26.1.2","typescript":"^7.0.2"},"nexora":{"stability":"stable"},"publishConfig":{"access":"public"},"scripts":{"build":"tsc","test":"vitest run","clean":"rm -rf dist .tsbuildinfo"},"_nodeVersion":"26.7.0","_id":"@dongkseo/transport@0.1.5","dist":{"integrity":"sha512-XsA9eURq5gvJtlKsh7jPOHJOqrm46rsdxib1MdozjELxT8kTfeoqVqTHELdHZhGhxlrLo9X4sESPXWblt/mmcQ==","shasum":"b5d553493aab87e6fe39ea1565fc4efa741b3e03","tarball":"https://registry.npmjs.org/@dongkseo/transport/-/transport-0.1.5.tgz","fileCount":34,"unpackedSize":126150,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFJHPWubnTnLpIqhlGexwr7s8hhgXf838c1+zqlq6sw+AiEAw6WDsk2I9A1usYHhFDfiB9+vrI5MRoiRv6O5Hi9bzJI="}]},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"directories":{},"maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/transport_0.1.5_1786622533545_0.18905733955091963"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-17T03:55:49.108Z","modified":"2026-08-13T12:02:13.872Z","0.1.0":"2026-06-17T03:55:49.464Z","0.1.1":"2026-06-17T10:47:00.993Z","0.1.2":"2026-06-19T08:00:52.785Z","0.1.3":"2026-06-23T07:36:29.466Z","0.1.4":"2026-06-25T12:09:15.862Z","0.1.5":"2026-08-13T12:02:13.691Z"},"maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"readme":"# @dongkseo/transport\n\n**Stability: stable** · `pnpm add @dongkseo/transport`\n\n> 이 파일은 에이전트(사람·LLM)가 **소스를 열지 않고도** 이 패키지를 쓸 수 있게 하는 오리엔테이션 문서다.\n> 정확한 API 타입은 \"API 표면\" 섹션의 방법으로 `signatures`만 읽어라 — 본문을 베끼지 말 것.\n\n## 무엇인가 / 무엇이 아닌가\n\n에이전트 간 **이벤트 통신 계층(EventTransport)의 구현체 모음**이다. `@dongkseo/contracts`의\n`./transport` 계약(`EventTransport`, `DurableTransport`, `assertDurable`)을 만족하는 구체 트랜스포트를 제공한다.\n모두 **topic 기반 pub/sub + request/reply**라는 같은 인터페이스를 따르므로, 같은 에이전트 코드를 인메모리에서\nRedis로 그대로 옮길 수 있다.\n\n- ✅ 담는 것: `EventTransport`/`DurableTransport` 구현(로컬·Redis·DLQ·트레이싱 래퍼), `createEnvelope` 헬퍼, trace 전파(`withTrace`)\n- ❌ 안 담는 것: 트랜스포트 **인터페이스/타입 정의**(그건 `contracts/transport`), 워크플로 엔진(`orchestrator`), LLM 호출(`core`)\n\n의존 방향은 항상 **transport → contracts** 단방향. `core`·`orchestrator`·`platform`이 transport에 의존한다.\n\n## 핵심 개념\n\n| 개념 | 무엇 | 대표 export |\n| --- | --- | --- |\n| **로컬 트랜스포트** | 인메모리 EventTransport (at-most-once, dev/test) | `LocalTransport`, `createEnvelope` |\n| **Redis PubSub** | Redis PUBSUB 기반 분산 EventTransport (at-most-once) | `RedisTransport` |\n| **Redis Streams** | Redis Streams 기반 **DurableTransport** (at-least-once, consumer group, prod 워크플로 경로) | `RedisStreamsTransport` |\n| **인메모리 Durable** | 컨슈머 그룹/ack/nack를 흉내내는 인메모리 DurableTransport (durable 경로 테스트용) | `InMemoryDurableTransport` |\n| **DLQ 래퍼** | 중복 제거 + 실패 메시지를 dead-letter topic으로 보내는 데코레이터 | `DLQTransport` |\n| **Tracing 래퍼** | AsyncLocalStorage로 trace context를 publish/subscribe 경계 너머로 전파 | `TracingTransport`, `withTrace`, `currentTrace` |\n\n`describe()`는 모든 트랜스포트가 구현하며, 런타임에서 delivery guarantee를 검사할 때 쓴다(`assertDurable`).\n\n## 사용 레시피\n\n기본: 로컬 트랜스포트를 만들고 발행/구독한다 (`platform/cli` dev 부팅과 동일한 패턴).\n\n```ts\nimport { LocalTransport, createEnvelope } from '@dongkseo/transport';\n\nconst transport = new LocalTransport();\n\n// 구독: 토픽 패턴(`*`=한 세그먼트, `#`=나머지 전부)\nconst sub = transport.subscribe('agent.coder.*', async (env) => {\n  console.log(env.topic, env.payload);\n});\n\n// 발행: createEnvelope로 표준 봉투를 만든 뒤 publish\nawait transport.publish(\n  createEnvelope({ topic: 'agent.coder.task', payload: { goal: '버그 수정' } }),\n);\n\n// request/reply: 응답 봉투(metadata.replyTo === requestId)를 기다림\nconst reply = await transport.request('agent.coder.task', { goal: '리뷰' });\n\nsub.unsubscribe();\nawait transport.close();\n```\n\n프로덕션: 워크플로 엔진은 **durable 트랜스포트**를 요구한다 (`orchestrator` 엔진 패턴).\n\n```ts\nimport { RedisStreamsTransport } from '@dongkseo/transport';\nimport { assertDurable } from '@dongkseo/contracts';\n\nconst transport = new RedisStreamsTransport({ redis /* ioredis 호환 client */ });\nassertDurable(transport); // at-least-once가 아니면 여기서 throw — prod 안전장치\n\n// 컨슈머 그룹으로 구독하면 ack/nack로 재처리/유실 방지가 가능\ntransport.subscribeGroup('agent.#', 'workers', async (env, ctrl) => {\n  await handle(env);\n  await ctrl.ack();\n});\n```\n\n기존 트랜스포트를 래핑해 DLQ·트레이싱을 입힐 수도 있다 (데코레이터).\n\n```ts\nimport { LocalTransport, DLQTransport, TracingTransport } from '@dongkseo/transport';\n\nconst base = new LocalTransport();\nconst traced = new TracingTransport(base);                          // trace 전파\nconst transport = new DLQTransport({ inner: traced, dlqTopic: 'dlq' }); // 실패 → dead-letter\n```\n\n## API 표면 (소스 안 열고 타입만)\n\n`index.ts` 맨 위에 **섹션 맵 주석**이 있고, 각 트랜스포트는 파일별로 분리돼 있다. 정확한 시그니처가\n필요하면 구현 본문 대신 **signatures 모드**로만 읽어라:\n\n```\nctx_read(path=\"packages/transport/src/index.ts\",         mode=\"map\")        # 전체 export 목록\nctx_read(path=\"packages/transport/src/local.ts\",         mode=\"signatures\") # LocalTransport, createEnvelope\nctx_read(path=\"packages/transport/src/redis-streams.ts\", mode=\"signatures\") # RedisStreamsTransport (durable)\nctx_read(path=\"packages/transport/src/dlq.ts\",           mode=\"signatures\") # DLQTransport\nctx_read(path=\"packages/transport/src/tracing.ts\",       mode=\"signatures\") # TracingTransport, withTrace\n```\n\n트랜스포트 **인터페이스/타입**(`EventTransport`, `DurableTransport`, `DeliveryControl`, `assertDurable` 등)은\n이 패키지가 아니라 `@dongkseo/contracts`의 `./transport`에 있다:\n\n```\nctx_read(path=\"packages/contracts/src/transport.ts\", mode=\"signatures\")\n```\n\n## 유지보수 (drift 방지)\n\n- 이 README = **목적·개념·레시피** 만. 거의 안 변하므로 손으로 관리.\n- **API 정본은 각 소스의 TSDoc** (`/** … */`). API가 바뀌면 코드 옆 TSDoc만 고치면 됨 — 여기 표는 복제하지 말 것.\n- 새 트랜스포트를 export하면 `index.ts` 상단 섹션 맵에 한 줄만 추가.\n\n## Tests\n\n```bash\ncd packages/transport && pnpm test\n```\n\nPart of the [Nexora](../../README.md) multi-tenant agent framework. · [Package map](../../docs/architecture/packages-map.md)\n","readmeFilename":""}