{"_id":"@dongkseo/orchestrator","_rev":"7-6c5a6c1daf4efe308f63f7907206bd07","name":"@dongkseo/orchestrator","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.0":{"name":"@dongkseo/orchestrator","version":"0.1.0","_id":"@dongkseo/orchestrator@0.1.0","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"82d8d75dcf46a82bb12102b6c0f82ef070428660","tarball":"https://registry.npmjs.org/@dongkseo/orchestrator/-/orchestrator-0.1.0.tgz","fileCount":18,"integrity":"sha512-bQl4X7twh8vv5DTB9o8DtsVHE51pFpsjYFPoCqs07hgWikK9HOnecxEoBoxcbSARQFhwIrchlME7y7VmhXSCag==","signatures":[{"sig":"MEQCIBmLESJPu1Q07bFY3qa4B4YF95q2CMOYt6Fw6PdR0u/LAiARxdvr/3nt23q5+IOClgTJ76IgLygx2CUjLTtbN2y+lw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52636},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-orchestrator-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/f624b370a9157a8a783e36f3b353ea54/dongkseo-orchestrator-0.1.0.tgz","_integrity":"sha512-bQl4X7twh8vv5DTB9o8DtsVHE51pFpsjYFPoCqs07hgWikK9HOnecxEoBoxcbSARQFhwIrchlME7y7VmhXSCag==","_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/orchestrator_0.1.0_1781668537499_0.5916124832837069","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dongkseo/orchestrator","version":"0.1.1","_id":"@dongkseo/orchestrator@0.1.1","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"1828b1b495b8abb6faffb65799279cfd02b4511e","tarball":"https://registry.npmjs.org/@dongkseo/orchestrator/-/orchestrator-0.1.1.tgz","fileCount":18,"integrity":"sha512-wVwk6HzesCfr9BEMIW7KG+rPebUGzGmXInq0oPuu3FakgO/aaFbEsgXdQNpZiG04T/TSL4hrIbnT4PnJ59uXIw==","signatures":[{"sig":"MEUCIAws8tlPX1luxoD6wIqk1ojrm2GOG6BaFvebflZfoljdAiEAvsSNcRx/zwFJaVoSvtlCNQmRDohmWcXs2gbBpKt1XzE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52636},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-orchestrator-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/fce0747b4e2224d6451aa3c7f6b363dc/dongkseo-orchestrator-0.1.1.tgz","_integrity":"sha512-wVwk6HzesCfr9BEMIW7KG+rPebUGzGmXInq0oPuu3FakgO/aaFbEsgXdQNpZiG04T/TSL4hrIbnT4PnJ59uXIw==","_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/orchestrator_0.1.1_1781856055659_0.8726698172517131","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@dongkseo/orchestrator","version":"0.1.2","_id":"@dongkseo/orchestrator@0.1.2","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"828d5b0a256bed13b68a4e9f99cc4f065a3e46a2","tarball":"https://registry.npmjs.org/@dongkseo/orchestrator/-/orchestrator-0.1.2.tgz","fileCount":22,"integrity":"sha512-s5UceDv6rrOx8kx/gXh/S9L/vk2CjAHF9ANgFeZ10HfyLkz76MbqVIpDBp+g/RJeJtHNpnpVtqH6vtUSVVqp3w==","signatures":[{"sig":"MEUCIHBa3wx2NY2r1t03pY4r4OHdmcrPfRfMAj7zIinXw+3XAiEA7YzY9ayYn/cCMr/xYRQ45WctBZCOgNcP+7qUY+59b9Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56305},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-orchestrator-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/505ed21248f15b0dd510804504a7b44f/dongkseo-orchestrator-0.1.2.tgz","_integrity":"sha512-s5UceDv6rrOx8kx/gXh/S9L/vk2CjAHF9ANgFeZ10HfyLkz76MbqVIpDBp+g/RJeJtHNpnpVtqH6vtUSVVqp3w==","_npmVersion":"11.12.1","description":"**Stability: stable**","directories":{},"_nodeVersion":"26.0.0","dependencies":{"@dongkseo/contracts":"0.1.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/orchestrator_0.1.2_1782111933789_0.07044166636798632","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@dongkseo/orchestrator","version":"0.1.3","_id":"@dongkseo/orchestrator@0.1.3","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"3316c1e927ad35458ed909e5b2130ef640df912e","tarball":"https://registry.npmjs.org/@dongkseo/orchestrator/-/orchestrator-0.1.3.tgz","fileCount":22,"integrity":"sha512-+c7CUu/ndjmCspnc7f3dy1VcEk4XgE0QodQ5+R2X7eGyQxNjAsCbcQZrP9ZsyVzq7yzrM9XAOE4NEyzhvWHWKw==","signatures":[{"sig":"MEYCIQCaWC+nmKN7igi8xkScQDpliFrhmPWTu9Nuhqi3nlodPwIhANjedKEMGLG+63Od8gtyrWn93C/kE5f8TseRRkItj3aP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56306},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-orchestrator-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/cdab12a00720397c75c2f07e6287d057/dongkseo-orchestrator-0.1.3.tgz","_integrity":"sha512-+c7CUu/ndjmCspnc7f3dy1VcEk4XgE0QodQ5+R2X7eGyQxNjAsCbcQZrP9ZsyVzq7yzrM9XAOE4NEyzhvWHWKw==","_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/orchestrator_0.1.3_1782200177656_0.9949147345998375","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@dongkseo/orchestrator","version":"0.1.4","_id":"@dongkseo/orchestrator@0.1.4","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"da394b789d6212ee91f74f03cb37d609568dc6b5","tarball":"https://registry.npmjs.org/@dongkseo/orchestrator/-/orchestrator-0.1.4.tgz","fileCount":30,"integrity":"sha512-sv4XCafy6m/C3Ano7yNcNGtBVr4YNIg+zYoupO0lC8TG7Z0zhRyxEYMFR62OtOn3gAd6Bl0KRtWrbR31uonBSg==","signatures":[{"sig":"MEYCIQCWRnPt4C2bLv1lsGYkSpkX3IdkS/7ioEGBV0GT9b6r3AIhAPN/3V4j894QG7ygF/Bp/qBbXbdZcA5D/RaKSwwwx0KL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79342},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-orchestrator-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/ddb35f469883070215eb4d639a19f3b4/dongkseo-orchestrator-0.1.4.tgz","_integrity":"sha512-sv4XCafy6m/C3Ano7yNcNGtBVr4YNIg+zYoupO0lC8TG7Z0zhRyxEYMFR62OtOn3gAd6Bl0KRtWrbR31uonBSg==","_npmVersion":"11.16.0","description":"**Stability: stable** · `pnpm add @dongkseo/orchestrator`","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"},"_npmOperationalInternal":{"tmp":"tmp/orchestrator_0.1.4_1782389346639_0.14967870337444622","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@dongkseo/orchestrator","version":"0.1.5","_id":"@dongkseo/orchestrator@0.1.5","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"426182ebabd1656cc6d907513bd5cea209a733d0","tarball":"https://registry.npmjs.org/@dongkseo/orchestrator/-/orchestrator-0.1.5.tgz","fileCount":30,"integrity":"sha512-aPGdzpU5WOgaO8TwsLgzQxRsYctJvylbUM8qU++L/H1ke7yMQpXi8hGcaConrBeYSsUCt0IvPSZIfMx+YmJ2bw==","signatures":[{"sig":"MEQCIBc1EuiKUfgNjIc8n86IO3zHZsqBiBANOrfoozKDJUkxAiAJ95w/iIcptzAOl4U8oQt6eajUP9C+Cv8SrNggi2PUww==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80864},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-orchestrator-0.1.5.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/99d18d11ebe19a61aeaedef395f7489b/dongkseo-orchestrator-0.1.5.tgz","_integrity":"sha512-aPGdzpU5WOgaO8TwsLgzQxRsYctJvylbUM8qU++L/H1ke7yMQpXi8hGcaConrBeYSsUCt0IvPSZIfMx+YmJ2bw==","_npmVersion":"11.17.0","description":"**Stability: stable** · `pnpm add @dongkseo/orchestrator`","directories":{},"_nodeVersion":"26.4.0","dependencies":{"@dongkseo/contracts":"^0.1.31"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3","@types/node":"^26.0.1"},"_npmOperationalInternal":{"tmp":"tmp/orchestrator_0.1.5_1785308096473_0.5469345885586234","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@dongkseo/orchestrator","version":"0.1.6","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"},"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/orchestrator@0.1.6","dist":{"integrity":"sha512-oSeQSTOyrog9ln5BKW3iGKGYCqYz2m3wYJAzuskzbmt8LTgshqjJWRrtjsZAKE8ENo50X9ZfZvL2JO/oUkbMZA==","shasum":"9e8fa1cfe1d92d76136d75103a0308f6a6d78e45","tarball":"https://registry.npmjs.org/@dongkseo/orchestrator/-/orchestrator-0.1.6.tgz","fileCount":30,"unpackedSize":80992,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD3eZkLSJjW7BxSfH7AwtmODDGX6p68qT6Pt5zBqcDV7AIhAMihb3lgGCD6EC/IXHB6PRypdcEbaDeNjRGLOT+1rBSe"}]},"_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/orchestrator_0.1.6_1786622510425_0.16602319167770507"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-17T03:55:37.311Z","modified":"2026-08-13T12:01:50.933Z","0.1.0":"2026-06-17T03:55:37.641Z","0.1.1":"2026-06-19T08:00:55.826Z","0.1.2":"2026-06-22T07:05:33.917Z","0.1.3":"2026-06-23T07:36:17.794Z","0.1.4":"2026-06-25T12:09:06.771Z","0.1.5":"2026-07-29T06:54:56.611Z","0.1.6":"2026-08-13T12:01:50.566Z"},"maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"readme":"# @dongkseo/orchestrator\n\n**Stability: stable** · `pnpm add @dongkseo/orchestrator`\n\n워크플로우 실행 엔진과 스케줄러. `WorkflowContract`를 transport request/reply 위로 단계별 실행하고, 주기/일회성 작업을 외부 cron 라이브러리 없이 돌린다.\n\n## 무엇인가 / 무엇이 아닌가\n\n`@dongkseo/contracts`의 `WorkflowContract`·`EventTransport`를 받아 **여러 에이전트 호출을 순서대로 엮는 실행 계층**이다. 단계 결과를 다음 단계 입력으로 흘려보내고, state store가 있으면 단계마다 체크포인트를 남겨 크래시 후 재개(resume)를 지원한다.\n\n- ✅ `WorkflowContract` 단계별 실행 (transport로 request/reply, 단계 간 입력 매핑)\n- ✅ state store 기반 체크포인트 + `resume(workflowId)` 재개\n- ✅ in-memory state / suspended-turn 스토어 기본 구현 제공\n- ✅ `CronScheduler`로 interval / one-shot 작업 스케줄링\n- ❌ 에이전트 런타임·LLM 호출·도구 실행 자체 (→ `@dongkseo/core`)\n- ❌ transport 구현체 (durable 큐 등은 어댑터가 주입 — 여기는 인터페이스만 소비)\n- ❌ cron 표현식 파싱 (`intervalMs` 또는 주입한 `nextRunAt`만 사용)\n\n의존 방향: orchestrator → **contracts** (타입/transport 인터페이스). core·adapters에는 의존하지 않는다.\n\n## 핵심 개념\n\n| 개념 | 무엇 | 대표 export |\n| --- | --- | --- |\n| **Workflow engine** | `WorkflowContract`를 단계별로 실행·재개 | `WorkflowEngine` |\n| **State store** | 단계 전이마다 체크포인트 저장 (재개 키 = `workflowId`) | `InMemoryWorkflowStateStore` |\n| **Suspended turn store** | 일시 중단된 턴(승인 대기 등) 상태 보관 | `InMemorySuspendedTurnStore` |\n| **Cron scheduler** | interval / one-shot 작업 스케줄러 | `CronScheduler`, `intervalJob`, `oneShotJob` |\n\n## 사용 레시피\n\n### 워크플로우 실행\n\n`WorkflowContract`와 `EventTransport`(어댑터에서 주입)를 넘겨 실행한다. state store를 주면 단계마다 체크포인트가 남는다.\n\n```ts\nimport {\n  WorkflowEngine,\n  InMemoryWorkflowStateStore,\n} from '@dongkseo/orchestrator';\n\nconst engine = new WorkflowEngine({\n  transport,                                // EventTransport (@dongkseo/contracts)\n  stateStore: new InMemoryWorkflowStateStore(),\n  defaultStepTimeoutMs: 60_000,\n});\n\nconst result = await engine.run(workflow, {\n  workflowId: 'run-001',                    // state store 있으면 필수 (체크포인트 키)\n  input: { goal: 'ship feature X' },        // template/fromStep 입력에서 key='input'로 참조\n  tenantId: 'default',\n});\n\nif (result.status === 'completed') {\n  for (const step of result.steps) {\n    console.log(step.stepId, step.topic, step.payload);\n  }\n}\n```\n\n크래시 후 같은 `workflowId`로 마지막 체크포인트부터 재개:\n\n```ts\nconst resumed = await engine.resume(workflow, 'run-001');\n```\n\ndurable transport를 강제하는 프로덕션 러너:\n\n```ts\nconst engine = WorkflowEngine.production({ transport: durableTransport });\n```\n\n### 일시 중단된 턴 보관\n\n승인 대기 등으로 중단된 턴 상태를 저장/조회한다 (`examples/auto-work-flow`에서 사용).\n\n```ts\nimport { InMemorySuspendedTurnStore } from '@dongkseo/orchestrator';\n\nconst suspendedTurnStore = new InMemorySuspendedTurnStore();\n// store.save(state) / store.load(pendingId) / store.listAwaiting()\n```\n\n### 스케줄러\n\n```ts\nimport { CronScheduler, intervalJob, oneShotJob } from '@dongkseo/orchestrator';\n\nconst scheduler = new CronScheduler();\nscheduler.schedule(intervalJob('heartbeat', 30_000, async () => { /* ... */ }));\nscheduler.schedule(oneShotJob('warmup', 1_000, async () => { /* ... */ }));\nawait scheduler.trigger('heartbeat');       // 수동 트리거\nscheduler.stop();\n```\n\n## API 표면 (소스 안 열고 타입만)\n\n`index.ts` 상단에 **섹션 맵 주석**이 있다. 정확한 시그니처는 구현 본문 대신 **signatures 모드**로만 읽어라:\n\n```\nctx_read(path=\"packages/orchestrator/src/engine.ts\",               mode=\"signatures\")\nctx_read(path=\"packages/orchestrator/src/cron.ts\",                 mode=\"signatures\")\nctx_read(path=\"packages/orchestrator/src/workflow-state-store.ts\", mode=\"signatures\")\nctx_read(path=\"packages/orchestrator/src/index.ts\",                mode=\"map\")   # 전체 export 목록\n```\n\n## 유지보수 (drift 방지)\n\n- 이 README = **목적·개념·레시피** 만. 거의 안 변하므로 손으로 관리.\n- **API 정본은 각 소스의 TSDoc** (`/** … */`). API가 바뀌면 코드 옆 TSDoc만 고치면 됨 — 여기 표는 복제하지 말 것.\n- 새 모듈을 export하면 `index.ts` 상단 섹션 맵에 한 줄만 추가.\n\n## Tests\n\n```bash\ncd packages/orchestrator && pnpm test\n```\n\nPart of the [Nexora](../../README.md) multi-tenant agent framework. · [Package map](../../docs/architecture/packages-map.md)\n","readmeFilename":""}