| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
refactor: consolidate plugin contributions into owning component packages | 1 个月前 | |
Improve reviewer specialist batch auditing | 1 个月前 | |
feat(runtime): 记录轨迹事件时间与精确上下文关联 | 1 个月前 | |
fix(context): pin reference observations without blocking concurrent agents | 1 个月前 | |
fix(deps): move undici, ajv and fflate past their reported CVEs undici 8.7.0 -> 8.9.0 covers CVE-2026-15157, CVE-2026-16728, CVE-2026-16729, CVE-2026-13697 and CVE-2026-14643. ajv 8.17.1 -> 8.18.0 covers CVE-2025-69873. fflate 0.8.2 -> 0.8.3 covers CVE-2026-45820. @modelcontextprotocol/sdk depends on ajv ^8.17.1, and pnpm keeps the already locked 8.17.1 for it, so the affected copy would stay in the tree beside our own 8.18.0 pin. A workspace override collapses both onto 8.18.0, which still satisfies that range. The third-party notice tracks the shipped versions, so its ajv, fflate and undici entries move with them; fflate also reissued its licence under a later copyright year. | 1 个月前 | |
feat(evolve): short run titles and hand the winning text to the agent Titles. A run's goal is the user's whole brief, kept verbatim because the search reads it, and the panel header printed all of it: a paragraph of constraints and a scoring rubric in a 16px heading. evolveShortTitle() keeps the first sentence, drops a leading "任务:" label and cuts at a fixed width; the panel shows that with the full task in a "Full task" fold, and the run card shows it too, with the whole statement still in its tooltip. Results. get_evolve_run returned scores and a one-line change summary, so an agent asked to apply a finished search had nothing to write and set about rebuilding the program from the summary, which yields one that was never scored. The winning text was already published as an artifact, but nothing said what it was called. Now a finished search that beat its starting point returns: - the winner's full text in its own <best_candidate> block, cut at 30,000 characters with the real length and the artifact name when it is longer; - resultArtifact, the artifact whose version 2 is the winner; - bestCodeHash. The winner is the node the engine names in search_finished, the same one the orchestrator publishes, and a search that is still running or that nothing beat returns none. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> | 30 天前 | |
fix(executor): remove superseded Runner binaries after a connect A deployed Runner is named by its own SHA-256, so upgrading the control plane adds a file rather than replacing one. Nothing ever removed the old ones: a machine iterated on for two days was holding eight of them, 915 MB, in a directory nobody looks at. Once the new binary has answered its health check, the connection deletes the other SHA-256-named binaries in that directory that no process is executing. What is running is read from /proc/<pid>/exe, so the machine needs no extra tooling, and a binary another connection is serving through is kept. A pre-installed runner, an interrupted upload and anything else in that directory are left alone. The step is best effort: a failure is logged instead of refusing the connection. | 1 个月前 | |
Merge origin/main into chore/rename-internal-packages main 合入了把 domain 能力搬进 packages/ 的重构(c151f58),与本分支的改名 产生 16 处冲突。冲突性质是「同一批代码被搬家 + 被改名」,不是逻辑冲突: 本分支在这些文件里的改动经核对全部是纯改名,故一律取 main 版本,再对 合并结果重新执行改名扫描。 - 新增的 artifact-manager / data-source / executor / governance / memory / provenance / specialist 七个包,其 package 名与内部 import 一并改为 @sciencediscovery/*,pnpm-lock.yaml 重新生成。 - main 搬家时丢掉的三处改名已补回:governed-download-manager 的工作区暂存 目录 .sciencediscovery、环境快照 format 标识、api health 的 service 名。 - PermissionDecisionQueue 已被 main 移入 @sciencediscovery/governance,本分支 对它的重写与单测随之迁到 packages/governance/src/decision-queue{,.test}.ts; services/api/src/permissions/index.test.ts 相应删除。governance 侧原有的 用例保留,与新增 6 例并存。 | 1 个月前 | |
fix(specialist,idea-tree): propagate SkillDescriptor.metadata type relaxation After rebasing onto upstream/main, RuntimeSkillSnapshot and IdeaTreeSkillSnapshot still declared metadata as Record<string, string>, but SkillDescriptor.metadata is now Record<string, unknown>. Widen these two internal snapshot types so PR #127's relaxed frontmatter shape flows through to the runtime without TS2322 errors. | 30 天前 | |
feat: session-level toggle for Web access and connector UI grouping Issue #103 - Web access (web_search/web_fetch) had no session-level toggle; it was always injected as an unconditional base tool. Custom MCP servers were already in enabledConnectorIds but the picker listed them under "Data connectors" with no grouping, so users did not realize they had to check them per session. Backend: - Add "web" to knownConnectorIdSet so enabledConnectorIds accepts it through the same normalize/validate/persist path as data connectors. - Gate createWebWorkspaceTools on enabledConnectorIds.includes("web") in main agent, subagent, and reviewer paths; unchecked sessions no longer get web_search/web_fetch in the tool schema. Spread the returned object directly (not wrapped in an array) so webFetch and webSearch land as tool keys, not as index "0". - filterEnabledMcpSources preserves "web" when the MCP master switch is off, since web is a built-in tool, not an MCP source. The connector.web plugin override still disables it per-source. - /api/connectors returns a built-in "web" ConnectorManifest so the frontend picker shows it automatically. - Backward-compat seed: on first load of a persisted catalog whose global settings never carried an explicit enabledConnectorIds list, add "web" so existing deployments keep web access by default. Catalogs that already persist an explicit list (even empty) are respected as a deliberate choice. Frontend: - ConnectorPicker groups connectors into Data sources / Web access / Custom MCP instead of one flat list labelled "Data connectors". - connectorName maps "web" to "Web". - i18n keys and CSS for the group labels (EN + ZH). Tests: - selection.test.ts: 5 tests covering web preservation under MCP master switch, connector.web plugin override, and normal operation. Fixes #103 | 30 天前 | |
feat: session-level toggle for Web access and connector UI grouping Issue #103 - Web access (web_search/web_fetch) had no session-level toggle; it was always injected as an unconditional base tool. Custom MCP servers were already in enabledConnectorIds but the picker listed them under "Data connectors" with no grouping, so users did not realize they had to check them per session. Backend: - Add "web" to knownConnectorIdSet so enabledConnectorIds accepts it through the same normalize/validate/persist path as data connectors. - Gate createWebWorkspaceTools on enabledConnectorIds.includes("web") in main agent, subagent, and reviewer paths; unchecked sessions no longer get web_search/web_fetch in the tool schema. Spread the returned object directly (not wrapped in an array) so webFetch and webSearch land as tool keys, not as index "0". - filterEnabledMcpSources preserves "web" when the MCP master switch is off, since web is a built-in tool, not an MCP source. The connector.web plugin override still disables it per-source. - /api/connectors returns a built-in "web" ConnectorManifest so the frontend picker shows it automatically. - Backward-compat seed: on first load of a persisted catalog whose global settings never carried an explicit enabledConnectorIds list, add "web" so existing deployments keep web access by default. Catalogs that already persist an explicit list (even empty) are respected as a deliberate choice. Frontend: - ConnectorPicker groups connectors into Data sources / Web access / Custom MCP instead of one flat list labelled "Data connectors". - connectorName maps "web" to "Web". - i18n keys and CSS for the group labels (EN + ZH). Tests: - selection.test.ts: 5 tests covering web preservation under MCP master switch, connector.web plugin override, and normal operation. Fixes #103 | 30 天前 | |
feat(memory-graph): add a Neo4j-free local file backend and make Neo4j opt-in ScienceMemory needed an external Neo4j server before it recorded anything. The graph can now live in the memory-graph sidecar itself, persisted as append-only JSONL (nodes.jsonl / edges.jsonl) under the data directory. - local_graph / _cypher / local_backend: an in-memory property graph with a small openCypher interpreter covering exactly the subset the service uses, so persistence, query and search_graph run unchanged on either backend. Transactions journal an undo log; a failing statement leaves no partial writes; a torn last line is skipped on load; files compact on load. - backend: a GraphBackend seam and router. The backend is a setting (System configuration -> Memory -> Storage backend), default "local", pushed to POST /internal/backend. A saved Neo4j credential alone never switches stores, and an unreachable Neo4j stays degraded rather than silently falling back. - /health reports {"status": "healthy", "backend": "local"} with no setup. - export_to_neo4j: one-way idempotent import of the local store into Neo4j. - API, schema and web editor: new backend setting; the Neo4j address, user and password fields only show when Neo4j is selected. - Tests: the live-Neo4j suites also run against the local backend (SCIENCE_AGENT_MEMORY_GRAPH_TEST_BACKEND=local), plus new local-backend tests. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> | 1 个月前 | |
fix(deps): move undici, ajv and fflate past their reported CVEs undici 8.7.0 -> 8.9.0 covers CVE-2026-15157, CVE-2026-16728, CVE-2026-16729, CVE-2026-13697 and CVE-2026-14643. ajv 8.17.1 -> 8.18.0 covers CVE-2025-69873. fflate 0.8.2 -> 0.8.3 covers CVE-2026-45820. @modelcontextprotocol/sdk depends on ajv ^8.17.1, and pnpm keeps the already locked 8.17.1 for it, so the affected copy would stay in the tree beside our own 8.18.0 pin. A workspace override collapses both onto 8.18.0, which still satisfies that range. The third-party notice tracks the shipped versions, so its ajv, fflate and undici entries move with them; fflate also reissued its licence under a later copyright year. | 1 个月前 | |
feat(api): persist framework connection diagnostics Design: follow the existing runtime, MCP session, and proxy confidentiality boundaries. Implementation: reuse api.log for framework initialization, MCP/proxy and remote Runner lifecycle diagnostics; bound MCP stderr, redact connection errors, preserve offline provisioner seeding, and drain HTTP connections before awaiting MCP cleanup during SIGTERM shutdown. Tests: cover MCP and remote-compute lifecycle logs, provisioner seeding, redaction, active-connection shutdown, package typechecks, and architecture boundaries. | 1 个月前 | |
refactor(trajectory): reuse persisted run events as the single event source | 1 个月前 | |
refactor: consolidate plugin contributions into owning component packages | 1 个月前 | |
feat(plugins): persist scoped compositions and govern candidate application | 1 个月前 | |
feat(reviewer): verify source-level scientific evidence | 1 个月前 | |
fix: 按模型响应身份保持流式正文与思考连续 | 1 个月前 | |
docs(deploy): gate the sandbox on the real probe instead of a sysctl The deployment guides and the deploy skill presented kernel.apparmor_restrict_unprivileged_userns=0 as a hard prerequisite on Ubuntu 24.04+, and the skill told the assistant to stop and ask for sudo sysctl -w ...=0 whenever the value was 1. That restriction is configured per AppArmor profile, so a host can leave it at 1 and still allow the sandbox: on an Ubuntu 24.04 host with the value at 1, both the host preflight and the in-container probe pass. Following the old text means asking a user to change a kernel switch for a working environment. What actually decides is the probe the product runs — the capability detection in packages/sandbox-capability and the preflight in the shared entry point. The guides now state that, give the reproducible in-container probe command, and reduce the sysctl to the third diagnostic after the container's security_opt and the host's AppArmor profiles. The entry-point warning and SANDBOX_UNUSABLE_HINT carry the same ordering, so the runtime text no longer contradicts the documentation. The probe command keeps its outer sh -c: with bwrap as the first process of a docker compose exec session, loopback setup fails for reasons that have nothing to do with sandbox capability, and pasting the command without the wrapper reads as a false negative. The Docker section also named .sciencediscovery-data/... as the micromamba seed target. That is the host-process default; under Compose the data directory is the bind mount, so the path is now written as it exists. | 1 个月前 | |
refactor: consolidate plugin contributions into owning component packages | 1 个月前 | |
feat(evolve): short run titles and hand the winning text to the agent Titles. A run's goal is the user's whole brief, kept verbatim because the search reads it, and the panel header printed all of it: a paragraph of constraints and a scoring rubric in a 16px heading. evolveShortTitle() keeps the first sentence, drops a leading "任务:" label and cuts at a fixed width; the panel shows that with the full task in a "Full task" fold, and the run card shows it too, with the whole statement still in its tooltip. Results. get_evolve_run returned scores and a one-line change summary, so an agent asked to apply a finished search had nothing to write and set about rebuilding the program from the summary, which yields one that was never scored. The winning text was already published as an artifact, but nothing said what it was called. Now a finished search that beat its starting point returns: - the winner's full text in its own <best_candidate> block, cut at 30,000 characters with the real length and the artifact name when it is longer; - resultArtifact, the artifact whose version 2 is the winner; - bestCodeHash. The winner is the node the engine names in search_finished, the same one the orchestrator publishes, and a search that is still running or that nothing beat returns none. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> | 30 天前 | |
refactor: consolidate plugin contributions into owning component packages | 1 个月前 | |
refactor(skills): trim evolve-design by 40% and move the custom_script contract out SKILL.md loads whole every time the skill triggers, and at 21.7KB much of it restated what the create_evolve_run tool already carries or told a measured anecdote at length. - Drop the cPuct / priorExponent walkthrough: the tool's parameter descriptions already hold the ranges and the reasoning. The skill keeps when to reach for each and that search is left out by default. - Move the custom_script evaluator contract, the error rule the probe enforces, how the script runs and the "evaluator reads nothing" constraint to references/custom-script.md, read only when that mode is chosen. SKILL.md keeps the one-line rule and points to it. - Cut the mode list and the "do not score a broken copy" passage down to what the tool descriptions do not say, and shorten the measured anecdotes to one clause each, keeping the rule and its reason. The four checkpoints, the sizing numbers, and every rule the probe or schema enforces are unchanged. SKILL.md goes from 21,685 to 12,983 bytes; the reference adds 2,633 on demand. Version 1.0.0 -> 1.1.0 in the frontmatter and in BUILT_IN_VERSIONS. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> | 30 天前 | |
feat(context): add immutable component checkpoints and reliable state commits | 1 个月前 | |
fix(trajectory): move the timeline scrollbar to the top of the track pane The track pane and its content are both vertically flipped (scaleY), so the always-on horizontal scrollbar renders at the top of the timeline where it stays visible instead of hiding at the bottom edge. | 1 个月前 | |
fix(specialist): relax SKILL.md frontmatter validation to name-only The previous validateSkillPackage rejected any frontmatter where metadata values were not plain strings. SAS skills like modal, exa-search, deepchem nest their openclaw declaration under metadata, so they all failed with 'metadata.openclaw must be a string'. 10+ of SAS's 163 skills were blocked by this single rule. Tighten the content-validation surface to just the name field: - Keep the SKILL_NAME regex (id is concatenated into revisionRoot by git import, so the regex is also the path-traversal guard for SD's server-side import flow). - Keep name = directoryName consistency. - Drop the SKILL.md 512KB ceiling, the description required check, the license/compatibility/allowed-tools string checks, the instructions non-empty check, and the per-value metadata string check. - Update schema metadata type from Record<string,string> to Record<string,unknown>; same change in apps/web's SkillEditorDraft. - Add typeof guards at the two downstream readers of the now-untyped fields (prompt.ts: skill.description; skills.ts: metadata.version) so non-string values degrade to '' / undefined instead of TypeError. Verified: - pnpm typecheck clean for specialist, schema, workspace, web. - 11-scenario smoke test (25 assertions) all pass, including scientific-slides (the literal 卡点2 case). - All 163 SAS skills import successfully. - Host stack restarted against rebuilt dists; /health returns ok. | 30 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 30 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 30 天前 | ||
| 30 天前 | ||
| 30 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 30 天前 | ||
| 1 个月前 | ||
| 30 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 30 天前 |