메뉴
HN
Hacker News • 56일 전

QM: 업무용 다중 사용자 에이전트 플랫폼

IMP
8/10
핵심 요약

QM은 Slack과 웹 환경에서 작동하는 다중 사용용 AI 에이전트 플랫폼으로, 스타트업 환경에 맞춰 개인별 독립적인 워크스페이스와 채널 기반의 협업을 지원합니다. Claude Code, Codex 등 다양한 오픈소스 모델을 자유롭게 교체하여 사용할 수 있으며, 관리자는 조직 단위의 보안 및 권한 제어 기능을 통해 안전하게 에이전트를 관리할 수 있습니다.

번역된 본문

QM은 업무용 다중 사용자 에이전트 하네스(실행 환경)입니다. Slack과 웹 환경에서 작동합니다.

QM이란 무엇인가요? 대부분의 에이전트는 개인 비서처럼 설계되어 있습니다. 기업 전체가 하나를 사용하도록 만들 수도 있지만, 이는 금방 복잡해집니다. QM은 스타트업을 위해 설계되었습니다. 직원들은 각자 격리된 자신만의 워크스페이스를 받아 서로에게 영향을 주지 않고 독립적으로 작업할 수 있으며, 채널, 그룹 메시지, 프로젝트에서도 에이전트와 협업할 수 있습니다. 각 사용자와 각 방(Room)은 고유하게 할당된 메모리, 파일, 키체인 뷰, 권한, 크론 작업(Crons), 웹 앱, 그리고 영구적인 샌드박스를 갖습니다.

이 프로젝트는 오픈소스를 염두에 두고 구축되었습니다. 자신만의 하네스와 모델을 선택하고 자유롭게 전환할 수 있습니다. Pi, OpenCode, Codex, Claude Code는 모두 동일한 핵심 코어를 구동하므로 배포가 특정 벤더에 종속되지 않습니다.

주요 기능 개인 및 공유 범위(Scope): 사람들은 에이전트를 자신만의 맞춤형으로 설정하고도 Slack 채널과 프로젝트에서 다른 사람들과 협업하며 사용할 수 있습니다. Slack 및 웹 지원: Slack과 웹 앱 간에 동일한 신원(계정)과 설정이 그대로 유지됩니다. 관리자 제어: 조직 수준의 설정, 보안 태세, 사용 가능한 하네스 및 모델을 지정할 수 있습니다. 웹 앱: 맞춤형 내부 앱을 빠르게 띄우고(Spin up) 적절한 대상에게 게시할 수 있습니다. 공유 기술(Skills): 기술은 특정 범위 내에서 소유되며 권한 부여를 통해 공유할 수 있습니다. 또한 관리자의 승인을 통해 전사적으로 공유되거나 git 저장소에서 가져온 스킬 팩을 사용할 수 있습니다. 백그라운드 작업: 사용자가 지켜보지 않아도 크론(Cron) 작업과 감시(Watches) 기능이 백그라운드에서 작업을 실행합니다.

QM으로 할 수 있는 일

  • 내부 노트, 이메일, 문서, 데이터베이스 및 웹을 통합 검색합니다.
  • 회사의 집단 지성(Brain)에서 정보를 검색합니다.
  • 내부 앱을 구축하여 적절한 인원에게 배포하고 데이터를 최신 상태로 유지합니다.
  • 과거에 보낸 이메일을 학습하여 사용자의 말투를 익히고, 일정에 맞춰 받은 편지함을 분류(라벨링 및 답장 초안 작성 포함)합니다.
  • 기존 코드 저장소에서 작업합니다: 테스트 실행, PR 생성, CI 모니터링, 시스템 로그 확인.
  • 공유 채널에서 프로젝트를 추적하고 업데이트 및 후속 조치 내용을 게시합니다.

아키텍처 모든 턴(작업 단위)은 중앙 코어를 거치며, 이 코어는 다양한 모델과 하네스를 사용하여 응답을 생성합니다. Postgres 지속성 계층은 사용자 데이터, 세션 기록 및 기타 영구 상태를 저장합니다.

에이전트는 작고 고정된 도구 표면을 가지고 있으며, 그중 하나인 'execute'는 해당 범위의 격리된 전용 샌드박스(설치된 도구가 그대로 유지되는 영구적인 컴퓨터 환경)에서 명령을 실행합니다.

웹 UI, 관리자 패널, 공개 포털은 코어의 HTTP API 위에서 선택적으로 작동하는 플러그인입니다. Slack은 코어가 직접 서비스 클라이언트를 통해 시작하고 감독하는 선택적 인-프로세스(in-process) 플러그인입니다.

코어 자체는 Node에서 직접 TypeScript를 실행하고 HTTP에는 Fastify를 사용합니다. Slack 플러그인은 Bolt를 사용하며, 웹 UI는 Vite로 빌드하고 Lit으로 렌더링합니다.

코어 자체는 범용적입니다. 특정 회사에 맞는 모든 것(조직 설정, 맞춤형 도구 및 기술, 샌드박스 이미지, 인프라 등)은 qm CLI가 검증하고 배포하는 배포 디렉터리에 존재합니다. 모든 하위 구조(하네스, 세션 저장소, 샌드박스, 메모리)는 인터페이스 뒤에 배치되어 있으므로, 프로덕션 구현체는 하나의 설정 파일(wiring file)을 통해 쉽게 교체할 수 있습니다.

보안 및 비밀 QM의 접근 방식은 OpenCode, Codex, Claude Code 같은 로컬 코딩 에이전트를 따릅니다. 에이전트는 작업을 의뢰한 사용자의 자격 증명과 권한을 사용해 대신 행동하며, 에이전트가 수행하는 모든 작업은 감사(Audited)를 거칩니다.

조직은 하나의 보안 태세를 선택하며, 하위 범위는 이를 더 강화하기만 할 수 있습니다:

  • 엄격함(Strict): 부작용이 없는 두 가지 턴 종료자를 제외하고, 모든 하네스 도구 호출은 사람의 승인을 기다리도록 일시 정지됩니다.
  • 자동(기본값): 분류기(Classifier)가 모델에 전달되기 전에 출처가 라벨링된 외부 데이터와 도구 결과를 선별합니다. 배포 시 자체 스크리닝 프록시를 가리키도록 설정할 수도 있습니다.
  • 위험(Dangerous): 콘텐츠 스크리닝이나 도구 호출 사이의 일시 정지가 없습니다.

미리 선언된 명령 정책(승인 규칙 및 강력한 거부 사항 등)은...

원문 보기
원문 보기 (영어)
qm A multiplayer agent harness for work. In Slack and on the web. What is QM? Most agents are designed like personal assistants. You can make one work for a whole company, but it quickly gets complex. QM is designed for startups. Employees each get their own isolated workspace and work independently without affecting each other, and they can also collaborate with the agent in channels, group messages, and projects. Each person and each room has its own scoped memory, files, keychain view, permissions, crons, web apps, and durable sandbox. It's built with open source in mind. Pick your own harness and model and switch between them — Pi, OpenCode, Codex, and Claude Code all drive the same core, so a deployment isn't tied to any single vendor. Features Personal and shared scopes. People customize the agent to be theirs , and still work with it collaboratively in Slack channels and projects. Slack and web. The same identity and configuration carries between Slack and the web app. Admin control. Set org-level configuration, a security posture, and which harnesses and models are available. Web apps. Spin up custom internal apps and publish them to the right people. Shared skills. Skills are scope-owned and shareable by grant, with admin-gated promotion to the whole org and skill packs imported from git repositories. Background work. Crons and watches run work while nobody's watching. What you can do with it Search internal notes, email, documents, databases, and the web together Retrieve information from your company brain Build internal apps, publish them to the right people, and keep their data current Learn your writing voice from past sends, then triage your inbox on a schedule — labels and reply drafts included Work in an existing repository: run tests, open PRs, monitor CI, check system logs Track a project in a shared channel and post updates and follow-ups Architecture flowchart LR DB[("Postgres<br/>sessions · memory · queue")] subgraph CORE["Headless core"] API["API · identity · policy · scheduler"] LOOP["Agent loop<br/>(Pi, OpenCode, Claude Code)"] API <--> LOOP end SBX["Per-scope sandbox<br/>files · tools · logged-in services"] DB <--> API LOOP <--> SBX Loading Every turn runs through a central core, which can use a variety of models and harnesses to generate the response. A Postgres persistence layer holds user data, session history, and other durable state. The agent has a small, fixed tool surface; one of those tools is execute , which runs commands in the scope's own isolated sandbox — its durable computer, where installed tools stay installed. The web UI, the admin panel, and the public portal are optional plugins over the core's HTTP API; Slack is an optional in-process plugin that core starts and supervises through a direct service client. The core runs TypeScript directly on Node and uses Fastify for HTTP. The Slack plugin uses Bolt; the web UI builds with Vite and renders with Lit. The core itself is generic. Everything specific to one company — org config, custom tools and skills, sandbox image, infrastructure — lives in a deployment directory that the qm CLI validates and deploys. Every substrate (harness, session store, sandbox, memory) sits behind an interface, so production implementations swap in via one wiring file. Security and secrets QM's approach follows local coding agents like OpenCode, Codex, and Claude Code: the agent acts as the person it's working for, with their credentials and permissions, and everything it does is audited. An org picks one security posture, which narrower scopes can only tighten: Strict — every harness tool call pauses for human approval, except the two no-effect turn enders. Auto (default) — a classifier screens provenance-labelled external data and tool results before they reach the model; a deployment can point that at its own screening proxy. Dangerous — no content screening, no pauses between tool calls. The predeclared command policy — approval rules and hard denials for things like recursive deletes or destructive SQL — applies in every posture, Dangerous included. SECURITY.md has the threat model, the operator assumptions, and the known limitations. Deploy it for your org Create an organization-owned deployment repository that depends on @yc-software/qm : npm exec --yes --package=@yc-software/qm@latest -- \ qm init . --org < slug > --target < fly-or-aws > npm install Initialization materializes a deployment skill for an agent and walks through infrastructure, web sign-in, connector credentials, optional Slack access, deployment, and live verification — no source checkout required. Each deployment runs in the operator's own cloud account; initialization does not generate or enable deployment CI, and this repository has no production deployment workflow. See deployment.md for the details. Contributing We take contributions as human-written text, not code — see CONTRIBUTING.md . Describe the change you'd like informally in a .txt or .md file in adrs/ , and if we're aligned we'll handle the implementation. Report vulnerabilities privately — see SECURITY.md , not a public issue. Customize your instance The deployment repository above carries config and a sandbox layer, and never needs a source checkout. Some organizations want the opposite trade: the whole codebase in one place, so engineers and coding agents read core and customizations together, while the customizations themselves stay private. For that, keep a private fork : a standalone private repository whose history begins as a clone of qm and whose core stays identical to upstream. Populate it once, then clone it to work in: gh repo create < org > /qm-private --private git clone --bare git@github.com:yc-software/qm qm-seed.git git -C qm-seed.git push --mirror git@github.com: < org > /qm-private rm -rf qm-seed.git git clone git@github.com: < org > /qm-private git -C qm-private remote add upstream git@github.com:yc-software/qm Create the private fork with a plain clone, as shown above, and never with GitHub's fork feature. The word "fork" here names the concept — a downstream copy that diverges deliberately and merges from upstream — not GitHub's Fork button. A GitHub fork inherits the visibility of the repository it came from, so a fork of a public repository cannot be made private. A GitHub fork also shares one object network with the repository it came from, so commits pushed to the fork stay fetchable by SHA from the public side. Many organizations disallow forking private repositories as well. A plain clone has none of these problems, and it costs one thing: the clone is an ordinary repository, so upstream's CI workflows run live in your own account. Expect to supply the secrets those workflows need, or disable the ones you do not want running. Everything specific to your organization goes in deploy/layers/<org>/ — config, sandbox tools and skills, plugin images, infrastructure — in the same shape qm init produces. See deploy/layers/README.md . Core stays byte-identical to upstream, which is what keeps merges small. Two skills maintain the boundary in both directions. update-qm merges upstream qm into the private fork and opens the sync PR; upstream-pr sends an organization-agnostic fix back to qm, cutting the branch from upstream/main and checking the outgoing diff, commit messages, and screenshots for organization identifiers before it pushes. Nothing under deploy/layers/ ever travels upstream. Going deeper docs/getting-started.md — first run, end to end cli/README.md — the qm CLI and the deployment directory contract docs/deploy-directory.md — the deployment directory in full .env.example — every knob, documented in place plugins/ — the surfaces (Slack, web UI, admin, portal) License Except where otherwise noted, QM is available under the MIT License .