Synaplan
开源 AI 软件平台,面向企业:自托管 AI 代理,符合 GDPR 的聊天机器人小部件,RAG 知识库,WhatsApp 与 Outlook AI,MCP,多模型路由。支持 Docker、Kubernetes 或在 Germ 托管。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗AI construction scheduling that asks before it builds. Built by Hoshmand AI.
RunF9 works in three stages: build a schedule, analyze it, then monitor it.
| Capability | Where |
|---|---|
| Elicitation. It works out what is missing and asks targeted questions, ordered by how much each answer can move the finish date. Follow-up questions depend on earlier answers, contradictions are flagged, and "don't know" or "can't share" answers become explicit assumptions with visible contingency. | src/lib/planning/elicitation.ts |
| Grounding. Durations and logic come from regional permit and regulation catalogs (10 regions, 50 permits, 20 regulations), long-lead equipment lead times (27 items), activity templates for 9 facility types, and the firm's own completed projects (actual vs. planned). | src/lib/knowledge/*, src/lib/planning/history.ts |
| Evaluation. Each plan gets a DCMA 14-point score, benchmarks against the firm's actual outcomes, risk-adjusted P50/P80 finish dates, a check that every grounded requirement is covered, recorded expert review, and a leave-one-out backtest against the firm's completed projects. | src/lib/planning/evaluation.ts |
Private data. Every firm is an organization, and every query is scoped by org_id. Firm history only ever reads that firm's own schedules. | src/lib/db.ts |
Any file format. Imports P6 XER and P6 XML (including calendars, constraints and WBS; the same project in either format gives identical CPM results), MS Project XML, Excel/CSV (messy headers are handled, and a P6 Excel import/export workbook's logic is read from its TASKPRED sheet) and PDF. Nothing is dropped silently: every import and export carries an exception report of what was not mapped, converted or defaulted (src/lib/parsers/exceptions.ts). Activity names and calendars are normalized to shared meanings (for example "SOG", "F/R/P footings" and "Hang/Tape/Finish GWB" each map to a standard category). Exports MS Project XML, CSV and a Basis of Schedule narrative. | src/lib/parsers/*, src/lib/semantic/taxonomy.ts, src/lib/export/* |
| Self-checking inputs. Flags weekend or holiday work, out-of-sequence progress, invalid dates, dangling logic and other data issues. The scheduler answers each one inline. | src/lib/analysis/input-checks.ts |
Secure / air-gapped use. Runs with no model, with an on-prem model, or with a cloud model through a provider-agnostic AI gateway (default cloud provider: Anthropic Claude via ANTHROPIC_API_KEY; OpenAI is an approved alternate, selected with RUNF9_AI_PROVIDER=openai). Cloud AI calls send request-relevant content to the selected provider. In air-gapped mode it refuses any model host that is not private. Withheld answers are never sent to a model; withheld constraints become placeholders with reserved time. Small models get narrow, JSON-only tasks that are validated and retried. | src/lib/llm/provider.ts, src/lib/llm/gateway.ts, src/lib/planning/ai-questions.ts |
| Project documents. Contracts, scheduling specifications and owner requirements are indexed per project (Postgres full-text search, scoped in SQL to the firm, project and workspace). Ask AI and reports can answer from them with verified citations like [Spec §1.3.4 p.3]; document text is treated as untrusted data, passages that read like prompt injection are never sent to a model, CUI passages never reach a cloud model, and candidate scheduling requirements (max duration, update frequency, float, NTP, completion, LDs) are suggested for people to confirm. | src/lib/rag/*, docs/privacy/PROJECT-DOCUMENTS.md |
| Human control. Every activity and link shows why it exists and where that came from. Overrides require a reason, report their impact on the finish date and critical path, survive regeneration, and are recorded in the audit trail and the narrative. | src/lib/planning/overrides.ts |
The scheduling core is deterministic TypeScript and runs without any model:
Next.js 16 (App Router, React 19), TypeScript strict, Tailwind v3, Postgres (pg, raw SQL, versioned migrations in src/lib/migrations.ts applied automatically), server-side sessions (signed httpOnly cookie), Vitest, Playwright + axe-core.
Roles (owner/admin/scheduler/reviewer/viewer), workspaces with ethical walls between client matters, invitations, two-step verification, single sign-on with OpenID Connect or SAML 2.0, SCIM 2.0 user provisioning, revocable sessions, rate limits and lockout, a hash-chained append-only audit log, retention and privacy controls, plan entitlements, and Monte Carlo schedule risk analysis.
api({ permission }) or publicApi() from src/lib/server/api.ts (the SCIM 2.0 endpoints under /api/scim/v2 use scimApi(), which accepts only an organization SCIM token). A test fails the build otherwise.npm install
cp .env.example .env.local # set DATABASE_URL, JWT_SECRET, and optionally AI settings
npm run dev
npm run typecheck
npm test # 410+ unit tests (incl. route guard, security, CPM performance budgets, export/import round trips)
BASE_URL=http://localhost:3000 node scripts/e2e-smoke.mjs # end-to-end against a running server
# Security & governance suite (use DATABASE_URL for the audit-immutability checks; OIDC_ISSUER for SSO,
# with `PORT=4010 node scripts/mock-oidc.mjs` running and the app started with RUNF9_ALLOW_INSECURE_OIDC=1)
# RUNF9_EMAIL_OUTBOX + RUNF9_ALLOW_INSECURE_WEBHOOKS=1 on the server enable the email and webhook checks
BASE_URL=… DATABASE_URL=… OIDC_ISSUER=http://localhost:4010 RUNF9_EMAIL_OUTBOX=/tmp/outbox WEBHOOK_RECEIVER_PORT=4020 node scripts/e2e-security.mjs
BASE_URL=… DATABASE_URL=… WEBHOOK_RECEIVER_PORT=4020 node scripts/e2e-tenant-isolation.mjs # org B vs every object of org A
BASE_URL=… DATABASE_URL=… node scripts/e2e-scim.mjs # SAML sign-in and SCIM provisioning (server with RUNF9_ALLOW_INSECURE_OIDC=1)
BASE_URL=… node scripts/e2e-rag.mjs # project documents: isolation, injection, citations, deletion
RAG_TEST_DATABASE_URL=… npx vitest run src/lib/rag/rag.db.test.ts # retrieval SQL against a real Postgres
BASE_URL=… node scripts/a11y-check.mjs # WCAG 2.2 AA (axe-core) on the main screens
# The suites above create their own firms: run that server with RUNF9_SIGNUP=open. The private beta gate is
# checked against a server in the default invite-only mode with [email protected]:
BASE_URL=… DATABASE_URL=… [email protected] node scripts/e2e-beta.mjs
DATABASE_URL=… node scripts/backup.mjs backups && ADMIN_DATABASE_URL=… node scripts/restore-drill.mjs backups/*.dump
RunF9 is in private beta: sign-up and sign-in are by invitation unless the instance re-opens self sign-up.
| Variable | Purpose |
|---|---|
RUNF9_SIGNUP | Unset (default) or invite_only: sign-up needs an organization invitation or a beta invitation (SSO/SCIM provisioning into an organization and the first account on an empty instance still work), and sign-in needs beta access. open: anyone may sign up and the sign-in gate is off. |
RUNF9_PLATFORM_ADMINS | Comma-separated platform operator emails (case-insensitive). Operators always pass the gate and use Beta access (/dashboard/platform, from the account menu) to invite a new firm (single-use, 14-day link; accepting it creates the firm's organization), revoke invitations, and revoke or restore a person's beta access. Everyone else gets 404 there. |
RUNF9_ACCESS_REQUEST_EMAIL | Address behind the "Request access" links on the landing and sign-in pages (hidden on sign-in when unset). |
Accounts that existed before the gate shipped were grandfathered (migration 18). Organization admins keep inviting their own members as before. See src/lib/server/signup-policy.ts and src/lib/server/beta.ts.
API keys, signed webhooks and the operator settings for email (RESEND_API_KEY/POSTMARK_TOKEN, EMAIL_FROM) and security alerts (RUNF9_ALERT_WEBHOOK_URL) are described in docs/API.md.
RUNF9_AIRGAPPED=true \
LLM_BASE_URL=http://gpu01.enclave.internal:11434/v1 LLM_MODEL=llama3.1:8b \
DATABASE_URL=postgres://[email protected]/runf9 PGSSLMODE=disable \
npm start
Fonts are bundled at build time, so at runtime the app makes no external network calls other than to the configured model host.
For a container deployment (non-root image, Docker Compose with PostgreSQL 17, backups, upgrades, TLS and hardening, every setting) see docs/operations/ON-PREM-INSTALL.md. npm run sbom writes a CycloneDX 1.5 SBOM from package-lock.json without network access. How the application maps to NIST SP 800-171 is in docs/security/NIST-800-171-MAPPING.md.
src/lib/
planning/ types (shared contract), calendar, cpm, elicitation, ai-questions, generator,
overrides, history, evaluation, service
knowledge/ regions (permits, regulations, climate), long-lead, templates, applicability
semantic/ taxonomy (activity + calendar normalization)
analysis/ dcma, input-checks
standards/ versioned rules engine: GAO Schedule Assessment Guide profile, DCMA 14-point adapter,
RunF9 Composite (threshold conflicts reported, never blended); runs stored in standards_runs
parsers/ xer, xml, excel/csv, pdf, index
export/ msp-xml, csv, narrative (Basis of Schedule)
llm/ gateway (provider-agnostic contract + model registry), provider (cloud / local / offline,
air-gap + CUI guard, quotas, audit), adapters: anthropic (default cloud), openai, local
rag/ project documents: extraction, chunking, injection screening, scoped retrieval,
grounding, citation checks, requirement extraction
src/app/
dashboard/plan Build: interview → schedule → evaluation & review → audit
dashboard/quality DCMA + the tool's questions about uploaded data; Standards tab (framework picker)
dashboard/history Firm data: private history, tagging, backtest
api/plans/[id]/... generate, edit, review, export, publish, suggest
Reference ranges for permits, regulations and lead times are planning defaults. Verify them with the Authority Having Jurisdiction and suppliers before baselining.