psyclaw 0.28.0 → 0.28.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/agents/recommended/catalog.json +99 -0
- package/dist/apps/panel/index.html +5 -5
- package/dist/src/adapters/pi/extension.js +164 -18
- package/dist/src/adapters/pi/extension.js.map +1 -1
- package/dist/src/adapters/pi/rpc.d.ts +2 -0
- package/dist/src/adapters/pi/rpc.js +9 -2
- package/dist/src/adapters/pi/rpc.js.map +1 -1
- package/dist/src/agents/recommended-personas.d.ts +42 -0
- package/dist/src/agents/recommended-personas.js +135 -0
- package/dist/src/agents/recommended-personas.js.map +1 -0
- package/dist/src/ars/mode-editor.d.ts +20 -0
- package/dist/src/ars/mode-editor.js +57 -0
- package/dist/src/ars/mode-editor.js.map +1 -0
- package/dist/src/ars/profile.d.ts +4 -1
- package/dist/src/ars/profile.js +23 -6
- package/dist/src/ars/profile.js.map +1 -1
- package/dist/src/cli.js +6 -3
- package/dist/src/cli.js.map +1 -1
- package/dist/src/creation/contracts.d.ts +3 -0
- package/dist/src/creation/service.js +17 -5
- package/dist/src/creation/service.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/orchestration/bundled-personas.d.ts +16 -0
- package/dist/src/orchestration/bundled-personas.js +101 -0
- package/dist/src/orchestration/bundled-personas.js.map +1 -0
- package/dist/src/orchestration/effects.d.ts +8 -0
- package/dist/src/orchestration/effects.js +39 -0
- package/dist/src/orchestration/effects.js.map +1 -0
- package/dist/src/orchestration/personas.d.ts +2 -1
- package/dist/src/orchestration/personas.js +20 -7
- package/dist/src/orchestration/personas.js.map +1 -1
- package/dist/src/orchestration/pi-executor.d.ts +9 -5
- package/dist/src/orchestration/pi-executor.js +55 -22
- package/dist/src/orchestration/pi-executor.js.map +1 -1
- package/dist/src/orchestration/research-agents.d.ts +3 -7
- package/dist/src/orchestration/research-agents.js +5 -69
- package/dist/src/orchestration/research-agents.js.map +1 -1
- package/dist/src/panel/server.js +6 -0
- package/dist/src/panel/server.js.map +1 -1
- package/dist/src/style/cli-ui.d.ts +14 -0
- package/dist/src/style/cli-ui.js +45 -0
- package/dist/src/style/cli-ui.js.map +1 -1
- package/dist/src/tui/skill-manager.js +1 -1
- package/dist/src/tui/skill-manager.js.map +1 -1
- package/dist/src/updates/update.js +9 -3
- package/dist/src/updates/update.js.map +1 -1
- package/package.json +11 -3
- package/vendor/academic-paper-skills/LICENSE +21 -0
- package/vendor/academic-paper-skills/NOTICE.md +7 -0
- package/vendor/academic-paper-skills/PSYCLAW_SOURCE.json +14 -0
- package/vendor/academic-paper-skills/academic-paper-composer/SKILL.md +840 -0
- package/vendor/academic-paper-skills/academic-paper-composer/references/section_guides.md +675 -0
- package/vendor/academic-paper-skills/academic-paper-composer/references/writing_standards.md +629 -0
- package/vendor/academic-paper-skills/academic-paper-composer/scripts/chapter_quality_check.py +470 -0
- package/vendor/academic-paper-skills/academic-paper-composer/scripts/final_evaluation.py +550 -0
- package/vendor/academic-paper-skills/academic-paper-strategist/SKILL.md +670 -0
- package/vendor/academic-paper-skills/academic-paper-strategist/references/quality_standards.md +336 -0
- package/vendor/academic-paper-skills/academic-paper-strategist/references/search_strategy.md +459 -0
- package/vendor/academic-paper-skills/academic-paper-strategist/scripts/evaluate_samples.py +300 -0
- package/vendor/academic-paper-skills/academic-paper-strategist/scripts/gap_analysis.py +399 -0
- package/vendor/ars/pi/wrapper.js +9 -0
- package/vendor/nature-skills/LICENSE +201 -0
- package/vendor/nature-skills/NOTICE.md +7 -0
- package/vendor/nature-skills/PSYCLAW_SOURCE.json +19 -0
- package/vendor/nature-skills/skills/nature-figure/README.md +107 -0
- package/vendor/nature-skills/skills/nature-figure/README_EN.md +107 -0
- package/vendor/nature-skills/skills/nature-figure/SKILL.md +154 -0
- package/vendor/nature-skills/skills/nature-figure/agents/openai.yaml +4 -0
- package/vendor/nature-skills/skills/nature-figure/evals/evals.json +325 -0
- package/vendor/nature-skills/skills/nature-figure/manifest.yaml +103 -0
- package/vendor/nature-skills/skills/nature-figure/references/ai-graphical-abstract-workflow.md +129 -0
- package/vendor/nature-skills/skills/nature-figure/references/api.md +576 -0
- package/vendor/nature-skills/skills/nature-figure/references/asset-adaptation.md +72 -0
- package/vendor/nature-skills/skills/nature-figure/references/backend-selection.md +118 -0
- package/vendor/nature-skills/skills/nature-figure/references/chart-types.md +348 -0
- package/vendor/nature-skills/skills/nature-figure/references/common-patterns.md +371 -0
- package/vendor/nature-skills/skills/nature-figure/references/demos.md +58 -0
- package/vendor/nature-skills/skills/nature-figure/references/design-theory.md +467 -0
- package/vendor/nature-skills/skills/nature-figure/references/figure-contract.md +122 -0
- package/vendor/nature-skills/skills/nature-figure/references/figure-legend-conventions.md +90 -0
- package/vendor/nature-skills/skills/nature-figure/references/multipanel-evidence-architecture.md +268 -0
- package/vendor/nature-skills/skills/nature-figure/references/nature-2026-observations.md +124 -0
- package/vendor/nature-skills/skills/nature-figure/references/nature-article-requirements.md +149 -0
- package/vendor/nature-skills/skills/nature-figure/references/openrouter-image-generation.md +141 -0
- package/vendor/nature-skills/skills/nature-figure/references/qa-contract.md +344 -0
- package/vendor/nature-skills/skills/nature-figure/references/r-template-index.md +66 -0
- package/vendor/nature-skills/skills/nature-figure/references/r-workflow.md +234 -0
- package/vendor/nature-skills/skills/nature-figure/references/template-catalog.md +33 -0
- package/vendor/nature-skills/skills/nature-figure/references/tutorials.md +260 -0
- package/vendor/nature-skills/skills/nature-figure/requirements.txt +1 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/audit_figure_collisions.py +742 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/audit_panel_alignment.py +933 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/audit_pdf_text.py +152 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/figure_safety.py +50 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/generate_openrouter_schematic.py +260 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/nature_figure_backend.py +93 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/panel_alignment.R +188 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/plot_templates.py +604 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/validate_figure.py +835 -0
- package/vendor/nature-skills/skills/nature-figure/static/core/contract.md +55 -0
- package/vendor/nature-skills/skills/nature-figure/static/core/stance.md +41 -0
- package/vendor/nature-skills/skills/nature-figure/static/fragments/backend/python.md +56 -0
- package/vendor/nature-skills/skills/nature-figure/static/fragments/backend/r.md +63 -0
- package/vendor/nature-skills/skills/nature-figure/tests/test_figure_safety.py +209 -0
- package/vendor/nature-skills/skills/nature-polishing/README.md +58 -0
- package/vendor/nature-skills/skills/nature-polishing/README_EN.md +58 -0
- package/vendor/nature-skills/skills/nature-polishing/SKILL.md +111 -0
- package/vendor/nature-skills/skills/nature-polishing/agents/openai.yaml +4 -0
- package/vendor/nature-skills/skills/nature-polishing/manifest.yaml +101 -0
- package/vendor/nature-skills/skills/nature-polishing/references/latex-layout.md +211 -0
- package/vendor/nature-skills/skills/nature-polishing/references/nat-comms-2025-diction.md +73 -0
- package/vendor/nature-skills/skills/nature-polishing/references/phrasebank-playbook.md +175 -0
- package/vendor/nature-skills/skills/nature-polishing/references/published-article-patterns.md +126 -0
- package/vendor/nature-skills/skills/nature-polishing/references/section-moves.md +252 -0
- package/vendor/nature-skills/skills/nature-polishing/references/style-guardrails.md +94 -0
- package/vendor/nature-skills/skills/nature-polishing/references/writing-strategy.md +160 -0
- package/vendor/nature-skills/skills/nature-polishing/static/core/failure-modes.md +29 -0
- package/vendor/nature-skills/skills/nature-polishing/static/core/output-format.md +21 -0
- package/vendor/nature-skills/skills/nature-polishing/static/core/stance.md +26 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/journal/generic.md +17 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/journal/nat-comms.md +38 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/journal/nat-mach-intell.md +102 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/journal/nature.md +19 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/language/en.md +19 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/language/zh-to-en.md +19 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/paper_type/algorithmic.md +18 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/paper_type/hypothesis.md +17 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/paper_type/methods.md +35 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/paper_type/research.md +29 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/paper_type/review.md +17 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/abstract.md +26 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/conclusion.md +15 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/discussion.md +48 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/intro.md +33 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/methods.md +26 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/results.md +61 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/title.md +17 -0
- package/vendor/nature-skills/skills/nature-ref-verifier/README.md +44 -0
- package/vendor/nature-skills/skills/nature-ref-verifier/README_EN.md +44 -0
- package/vendor/nature-skills/skills/nature-ref-verifier/SKILL.md +196 -0
- package/vendor/nature-skills/skills/nature-ref-verifier/agents/openai.yaml +4 -0
- package/vendor/nature-skills/skills/nature-ref-verifier/manifest.yaml +19 -0
- package/vendor/nature-skills/skills/nature-ref-verifier/references/common-patterns.md +96 -0
- package/vendor/nature-skills/skills/nature-shared/README.md +43 -0
- package/vendor/nature-skills/skills/nature-shared/README_EN.md +43 -0
- package/vendor/nature-skills/skills/nature-shared/SKILL.md +33 -0
- package/vendor/nature-skills/skills/nature-shared/agents/openai.yaml +6 -0
- package/vendor/nature-skills/skills/nature-shared/core/consistency-sweep.md +122 -0
- package/vendor/nature-skills/skills/nature-shared/core/discussion-argument-language.md +192 -0
- package/vendor/nature-skills/skills/nature-shared/core/ethics.md +88 -0
- package/vendor/nature-skills/skills/nature-shared/core/main-text-discipline.md +179 -0
- package/vendor/nature-skills/skills/nature-shared/core/nature-abstract.md +171 -0
- package/vendor/nature-skills/skills/nature-shared/core/nature-introduction.md +164 -0
- package/vendor/nature-skills/skills/nature-shared/core/nature-results-discussion.md +215 -0
- package/vendor/nature-skills/skills/nature-shared/core/paper-type-taxonomy.md +41 -0
- package/vendor/nature-skills/skills/nature-shared/core/reader-workflow.md +21 -0
- package/vendor/nature-skills/skills/nature-shared/core/research-compliance.md +192 -0
- package/vendor/nature-skills/skills/nature-shared/core/terminology-ledger.md +58 -0
- package/vendor/nature-skills/skills/nature-shared/journal-formats/nat-comms.md +139 -0
- package/vendor/nature-skills/skills/nature-shared/journal-formats/nature-machine-intelligence.md +431 -0
- package/vendor/nature-skills/skills/nature-shared/journal-formats/nature.md +313 -0
- package/vendor/nature-skills/skills/nature-shared/manifest.yaml +52 -0
- package/vendor/nature-skills/skills/nature-shared/scripts/check_consistency.py +273 -0
- package/vendor/nature-skills/skills/nature-shared/tests/test_check_consistency.py +63 -0
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AgentRole, TaskNode } from "./contracts.js";
|
|
2
|
+
export type BundledPersonaPack = "literature" | "review";
|
|
3
|
+
export interface BundledPersonaDefinition {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
role: AgentRole;
|
|
7
|
+
pack: BundledPersonaPack;
|
|
8
|
+
stage: string;
|
|
9
|
+
description: string;
|
|
10
|
+
instructions: string;
|
|
11
|
+
}
|
|
12
|
+
/** Built-in read-only research subagents (Claude-style), selectable via `/agents --agent`. */
|
|
13
|
+
export declare const BUNDLED_PERSONAS: readonly BundledPersonaDefinition[];
|
|
14
|
+
export declare function bundledPersonasForPack(pack: BundledPersonaPack): readonly BundledPersonaDefinition[];
|
|
15
|
+
export declare function personaMarkdown(persona: Pick<BundledPersonaDefinition, "id" | "label" | "role" | "instructions">): string;
|
|
16
|
+
export declare function bundledPersonaAsTaskRole(persona: BundledPersonaDefinition): TaskNode["role"];
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/** Built-in read-only research subagents (Claude-style), selectable via `/agents --agent`. */
|
|
2
|
+
export const BUNDLED_PERSONAS = [
|
|
3
|
+
{
|
|
4
|
+
id: "landscape-mapper",
|
|
5
|
+
label: "研究版图分析者",
|
|
6
|
+
role: "researcher",
|
|
7
|
+
pack: "literature",
|
|
8
|
+
stage: "文献多智能体",
|
|
9
|
+
description: "梳理研究主题、年代分布、代表性论文和研究方向。",
|
|
10
|
+
instructions: "梳理研究主题、年代分布、代表性论文和研究方向。只依据提供的可核验元数据与摘要,不得补造论文内容。",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
id: "methods-scout",
|
|
14
|
+
label: "方法学分析者",
|
|
15
|
+
role: "analyst",
|
|
16
|
+
pack: "literature",
|
|
17
|
+
stage: "文献多智能体",
|
|
18
|
+
description: "识别研究设计、测量与分析线索,区分元数据可判断与不可判断之处。",
|
|
19
|
+
instructions: "识别文献中的研究设计、测量与分析线索,指出仅凭元数据无法判断之处,不得把推测写成研究事实。",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: "evidence-critic",
|
|
23
|
+
label: "证据批判者",
|
|
24
|
+
role: "critic",
|
|
25
|
+
pack: "literature",
|
|
26
|
+
stage: "文献多智能体",
|
|
27
|
+
description: "检查证据强弱、偏倚、冲突与因果边界。",
|
|
28
|
+
instructions: "检查证据强弱、潜在偏倚、相互冲突与因果边界,明确区分检索结果、摘要信息和进一步需要全文核验的主张。",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "gap-finder",
|
|
32
|
+
label: "研究缺口分析者",
|
|
33
|
+
role: "verifier",
|
|
34
|
+
pack: "literature",
|
|
35
|
+
stage: "文献多智能体",
|
|
36
|
+
description: "寻找尚未充分覆盖的问题、对象、情境和方法。",
|
|
37
|
+
instructions: "寻找尚未充分覆盖的问题、对象、情境和方法,并把真正的证据缺口与单纯的检索缺口分开。",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: "theory-reviewer",
|
|
41
|
+
label: "理论与贡献审稿人",
|
|
42
|
+
role: "critic",
|
|
43
|
+
pack: "review",
|
|
44
|
+
stage: "同行评审多智能体",
|
|
45
|
+
description: "检查问题重要性、理论定位、创新性与主张—证据一致性。",
|
|
46
|
+
instructions: "以匿名同行评审标准检查问题重要性、理论定位、创新性、主张与证据的一致性。给出带稿件定位的主要与次要意见。",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: "methods-reviewer",
|
|
50
|
+
label: "研究设计审稿人",
|
|
51
|
+
role: "analyst",
|
|
52
|
+
pack: "review",
|
|
53
|
+
stage: "同行评审多智能体",
|
|
54
|
+
description: "检查抽样、设计、测量、效度与因果推断边界。",
|
|
55
|
+
instructions: "检查抽样、设计、测量、效度、探索与确证边界、因果推断边界以及方法与问题的适配性。",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: "statistics-reviewer",
|
|
59
|
+
label: "统计与可复现性审稿人",
|
|
60
|
+
role: "verifier",
|
|
61
|
+
pack: "review",
|
|
62
|
+
stage: "同行评审多智能体",
|
|
63
|
+
description: "检查分析策略、效应量、置信区间与可复现信息(不重算统计)。",
|
|
64
|
+
instructions: "检查分析策略、效应量、置信区间、缺失值、稳健性、图表和可复现信息。不得重新计算或虚构任何统计量。",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: "ethics-editorial-reviewer",
|
|
68
|
+
label: "伦理与编辑审稿人",
|
|
69
|
+
role: "writer",
|
|
70
|
+
pack: "review",
|
|
71
|
+
stage: "同行评审多智能体",
|
|
72
|
+
description: "检查伦理、透明报告、引用表达与可读性。",
|
|
73
|
+
instructions: "检查伦理、隐私、透明报告、引用表达、结构与可读性,并给出可执行但不直接改稿的建议。",
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
export function bundledPersonasForPack(pack) {
|
|
77
|
+
return BUNDLED_PERSONAS.filter((persona) => persona.pack === pack);
|
|
78
|
+
}
|
|
79
|
+
export function personaMarkdown(persona) {
|
|
80
|
+
return [
|
|
81
|
+
"---",
|
|
82
|
+
"schemaVersion: psyclaw/agent-persona/v1",
|
|
83
|
+
`id: ${persona.id}`,
|
|
84
|
+
`label: ${persona.label}`,
|
|
85
|
+
`role: ${persona.role}`,
|
|
86
|
+
"allowedEffects:",
|
|
87
|
+
" - read",
|
|
88
|
+
"---",
|
|
89
|
+
"",
|
|
90
|
+
`# ${persona.label}`,
|
|
91
|
+
"",
|
|
92
|
+
persona.instructions,
|
|
93
|
+
"",
|
|
94
|
+
"所有判断必须标明依据和不确定性;不得虚构引用、数据、统计结果或稿件中不存在的内容。",
|
|
95
|
+
"",
|
|
96
|
+
].join("\n");
|
|
97
|
+
}
|
|
98
|
+
export function bundledPersonaAsTaskRole(persona) {
|
|
99
|
+
return persona.role;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=bundled-personas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundled-personas.js","sourceRoot":"","sources":["../../../src/orchestration/bundled-personas.ts"],"names":[],"mappings":"AAcA,8FAA8F;AAC9F,MAAM,CAAC,MAAM,gBAAgB,GAAwC;IACnE;QACE,EAAE,EAAE,kBAAkB;QACtB,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,yBAAyB;QACtC,YAAY,EAAE,kDAAkD;KACjE;IACD;QACE,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,iCAAiC;QAC9C,YAAY,EAAE,+CAA+C;KAC9D;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,oBAAoB;QACjC,YAAY,EAAE,mDAAmD;KAClE;IACD;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,uBAAuB;QACpC,YAAY,EAAE,2CAA2C;KAC1D;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,4BAA4B;QACzC,YAAY,EAAE,sDAAsD;KACrE;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,uBAAuB;QACpC,YAAY,EAAE,0CAA0C;KACzD;IACD;QACE,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,+BAA+B;QAC5C,YAAY,EAAE,kDAAkD;KACjE;IACD;QACE,EAAE,EAAE,2BAA2B;QAC/B,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,qBAAqB;QAClC,YAAY,EAAE,2CAA2C;KAC1D;CACO,CAAC;AAEX,MAAM,UAAU,sBAAsB,CAAC,IAAwB;IAC7D,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAiF;IAC/G,OAAO;QACL,KAAK;QACL,yCAAyC;QACzC,OAAO,OAAO,CAAC,EAAE,EAAE;QACnB,UAAU,OAAO,CAAC,KAAK,EAAE;QACzB,SAAS,OAAO,CAAC,IAAI,EAAE;QACvB,iBAAiB;QACjB,UAAU;QACV,KAAK;QACL,EAAE;QACF,KAAK,OAAO,CAAC,KAAK,EAAE;QACpB,EAAE;QACF,OAAO,CAAC,YAAY;QACpB,EAAE;QACF,2CAA2C;QAC3C,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAiC;IACxE,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Effect } from "../core/contracts.js";
|
|
2
|
+
export declare function isEffect(value: unknown): value is Effect;
|
|
3
|
+
/** Normalize declared effects: always include read, drop unknowns/duplicates, stable order. */
|
|
4
|
+
export declare function normalizeEffects(raw: readonly unknown[] | undefined): Effect[];
|
|
5
|
+
export declare function elevatedEffects(effects: readonly Effect[]): Effect[];
|
|
6
|
+
export declare function hasElevatedEffects(effects: readonly Effect[]): boolean;
|
|
7
|
+
export declare function toolsForEffects(effects: readonly Effect[]): string[];
|
|
8
|
+
export declare function formatEffects(effects: readonly Effect[]): string;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const EFFECT_ORDER = ["read", "write", "network", "destructive"];
|
|
2
|
+
const EFFECT_SET = new Set(EFFECT_ORDER);
|
|
3
|
+
/** Pi tools granted per effect class after explicit user approval. */
|
|
4
|
+
const TOOLS_BY_EFFECT = {
|
|
5
|
+
read: ["read", "grep", "find", "ls"],
|
|
6
|
+
write: ["write", "edit"],
|
|
7
|
+
network: ["bash"],
|
|
8
|
+
destructive: ["bash"],
|
|
9
|
+
};
|
|
10
|
+
export function isEffect(value) {
|
|
11
|
+
return typeof value === "string" && EFFECT_SET.has(value);
|
|
12
|
+
}
|
|
13
|
+
/** Normalize declared effects: always include read, drop unknowns/duplicates, stable order. */
|
|
14
|
+
export function normalizeEffects(raw) {
|
|
15
|
+
const selected = new Set(["read"]);
|
|
16
|
+
for (const item of raw ?? []) {
|
|
17
|
+
if (isEffect(item))
|
|
18
|
+
selected.add(item);
|
|
19
|
+
}
|
|
20
|
+
return EFFECT_ORDER.filter((effect) => selected.has(effect));
|
|
21
|
+
}
|
|
22
|
+
export function elevatedEffects(effects) {
|
|
23
|
+
return effects.filter((effect) => effect !== "read");
|
|
24
|
+
}
|
|
25
|
+
export function hasElevatedEffects(effects) {
|
|
26
|
+
return elevatedEffects(effects).length > 0;
|
|
27
|
+
}
|
|
28
|
+
export function toolsForEffects(effects) {
|
|
29
|
+
const tools = new Set();
|
|
30
|
+
for (const effect of normalizeEffects(effects)) {
|
|
31
|
+
for (const tool of TOOLS_BY_EFFECT[effect])
|
|
32
|
+
tools.add(tool);
|
|
33
|
+
}
|
|
34
|
+
return [...tools];
|
|
35
|
+
}
|
|
36
|
+
export function formatEffects(effects) {
|
|
37
|
+
return normalizeEffects(effects).join(", ");
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../../../src/orchestration/effects.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AACpF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS,YAAY,CAAC,CAAC;AAEjD,sEAAsE;AACtE,MAAM,eAAe,GAAsC;IACzD,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC;IACpC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,WAAW,EAAE,CAAC,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,KAAe,CAAC,CAAC;AACtE,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,gBAAgB,CAAC,GAAmC;IAClE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC;QAC7B,IAAI,QAAQ,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA0B;IACxD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA0B;IAC3D,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA0B;IACxD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,MAAM,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,MAAM,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAA0B;IACtD,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Effect } from "../core/contracts.js";
|
|
1
2
|
import type { AgentRole, Plan } from "./contracts.js";
|
|
2
3
|
export interface CustomPersona {
|
|
3
4
|
id: string;
|
|
@@ -5,7 +6,7 @@ export interface CustomPersona {
|
|
|
5
6
|
role: AgentRole;
|
|
6
7
|
prompt: string;
|
|
7
8
|
path: string;
|
|
8
|
-
allowedEffects:
|
|
9
|
+
allowedEffects: Effect[];
|
|
9
10
|
}
|
|
10
11
|
export declare function loadCustomPersonas(root: string): Promise<CustomPersona[]>;
|
|
11
12
|
export declare function customPersonaPlan(runId: string, objective: string, personas: readonly CustomPersona[]): Plan;
|
|
@@ -2,6 +2,7 @@ import { lstat, readFile, readdir } from "node:fs/promises";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { parseCreatedFrontmatter } from "../creation/service.js";
|
|
4
4
|
import { assertSafeProjectPath } from "../project/paths.js";
|
|
5
|
+
import { normalizeEffects } from "./effects.js";
|
|
5
6
|
const ROLES = new Set(["planner", "researcher", "analyst", "critic", "writer", "verifier"]);
|
|
6
7
|
export async function loadCustomPersonas(root) {
|
|
7
8
|
const directory = await assertSafeProjectPath(root, ".psyclaw/agents/custom");
|
|
@@ -20,13 +21,11 @@ export async function loadCustomPersonas(root) {
|
|
|
20
21
|
const id = metadata.id;
|
|
21
22
|
const label = metadata.label;
|
|
22
23
|
const role = metadata.role;
|
|
23
|
-
const effects = metadata.allowedEffects;
|
|
24
24
|
if (metadata.schemaVersion !== "psyclaw/agent-persona/v1" || typeof id !== "string" || typeof label !== "string" || typeof role !== "string" || !ROLES.has(role))
|
|
25
25
|
continue;
|
|
26
|
-
|
|
27
|
-
continue;
|
|
26
|
+
const allowedEffects = normalizeEffects(Array.isArray(metadata.allowedEffects) ? metadata.allowedEffects : ["read"]);
|
|
28
27
|
const prompt = text.replace(/^---\s*\n[\s\S]*?\n---\s*/, "").trim();
|
|
29
|
-
personas.push({ id, label, role: role, prompt, path, allowedEffects
|
|
28
|
+
personas.push({ id, label, role: role, prompt, path, allowedEffects });
|
|
30
29
|
}
|
|
31
30
|
catch { /* malformed or raced optional persona: skip this file only */ }
|
|
32
31
|
}
|
|
@@ -36,10 +35,24 @@ export function customPersonaPlan(runId, objective, personas) {
|
|
|
36
35
|
if (personas.length < 1 || personas.length > 4)
|
|
37
36
|
throw new Error("select between one and four custom subagents");
|
|
38
37
|
const tasks = personas.map((persona) => ({
|
|
39
|
-
id: persona.id,
|
|
40
|
-
|
|
38
|
+
id: persona.id,
|
|
39
|
+
role: persona.role,
|
|
40
|
+
objective: `${persona.prompt}\n\nBounded task: ${objective}`,
|
|
41
|
+
deps: [],
|
|
42
|
+
ownedPaths: [],
|
|
43
|
+
parallelSafe: true,
|
|
44
|
+
inputs: [],
|
|
45
|
+
outputs: [],
|
|
46
|
+
allowedEffects: [...persona.allowedEffects],
|
|
47
|
+
completionContract: { requiredArtifacts: [], requiredReceiptEffects: [], mustPassGates: [] },
|
|
41
48
|
}));
|
|
42
|
-
return {
|
|
49
|
+
return {
|
|
50
|
+
schemaVersion: "psyclaw/plan/v1",
|
|
51
|
+
runId,
|
|
52
|
+
tasks,
|
|
53
|
+
budget: { maxTurns: tasks.length, maxWorkers: tasks.length },
|
|
54
|
+
horizon: { strategy: "hierarchical-plan-act-reflect", maxIterations: tasks.length, reflectionEvery: 1 },
|
|
55
|
+
};
|
|
43
56
|
}
|
|
44
57
|
export function parseAgentsRequest(input) {
|
|
45
58
|
const trimmed = input.trim();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"personas.js","sourceRoot":"","sources":["../../../src/orchestration/personas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"personas.js","sourceRoot":"","sources":["../../../src/orchestration/personas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAWhD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAY,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAEvG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACvF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,MAAM;gBAAE,SAAS;YAC5E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,IAAI,QAAQ,CAAC,aAAa,KAAK,0BAA0B,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAiB,CAAC;gBAAE,SAAS;YACxL,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACrH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACpE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACtF,CAAC;QAAC,MAAM,CAAC,CAAC,8DAA8D,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,SAAiB,EAAE,QAAkC;IACpG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAChH,MAAM,KAAK,GAAe,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACnD,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,qBAAqB,SAAS,EAAE;QAC5D,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,EAAE;QACd,YAAY,EAAE,IAAI;QAClB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;QAC3C,kBAAkB,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,sBAAsB,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;KAC7F,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,aAAa,EAAE,iBAAiB;QAChC,KAAK;QACL,KAAK;QACL,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE;QAC5D,OAAO,EAAE,EAAE,QAAQ,EAAE,+BAA+B,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE;KACxG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IACnD,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC;AACzH,CAAC"}
|
|
@@ -8,16 +8,20 @@ export interface PiExecutorOptions {
|
|
|
8
8
|
agentDir?: string;
|
|
9
9
|
env?: Record<string, string>;
|
|
10
10
|
timeoutMs?: number;
|
|
11
|
-
tools?: readonly
|
|
11
|
+
tools?: readonly string[];
|
|
12
|
+
/** Host ceilings after interactive approval. */
|
|
13
|
+
allowWrites?: boolean;
|
|
14
|
+
allowNetwork?: boolean;
|
|
15
|
+
allowDestructive?: boolean;
|
|
12
16
|
onEvent?: (event: RunnerEvent) => void | Promise<void>;
|
|
13
17
|
pauseRequested?: () => boolean | Promise<boolean>;
|
|
14
18
|
}
|
|
15
19
|
/**
|
|
16
|
-
* Execute one task in a separate Pi process
|
|
17
|
-
*
|
|
18
|
-
* complete OS sandbox; deployments needing hostile-code isolation must add a
|
|
19
|
-
* container or equivalent runtime policy.
|
|
20
|
+
* Execute one task in a separate Pi process. Mutating tools are available only
|
|
21
|
+
* when the host options explicitly approve matching effects after user confirm.
|
|
20
22
|
*/
|
|
23
|
+
export declare function createPiWorkerExecutor(options: PiExecutorOptions): WorkerExecutor;
|
|
24
|
+
/** @deprecated Prefer createPiWorkerExecutor; kept as the read-only default alias. */
|
|
21
25
|
export declare function createPiReadOnlyExecutor(options: PiExecutorOptions): WorkerExecutor;
|
|
22
26
|
export declare function runPlanWithPi(plan: Parameters<BoundedOrchestrator["run"]>[0], options?: PiExecutorOptions & {
|
|
23
27
|
root?: string;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BoundedOrchestrator, } from "./runner.js";
|
|
2
2
|
import { PiRpcClient } from "../adapters/pi/rpc.js";
|
|
3
|
+
import { formatEffects, hasElevatedEffects, normalizeEffects, toolsForEffects } from "./effects.js";
|
|
3
4
|
function blockedReport(task, context, summary) {
|
|
4
5
|
return {
|
|
5
6
|
schemaVersion: "psyclaw/worker-report/v1",
|
|
@@ -44,7 +45,7 @@ function extractJson(text) {
|
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
|
-
function parseWorkerReport(value, task, context) {
|
|
48
|
+
function parseWorkerReport(value, task, context, allowFilesModified) {
|
|
48
49
|
if (!value || typeof value !== "object")
|
|
49
50
|
return undefined;
|
|
50
51
|
const record = value;
|
|
@@ -62,7 +63,7 @@ function parseWorkerReport(value, task, context) {
|
|
|
62
63
|
return undefined;
|
|
63
64
|
if (!Array.isArray(record.verification))
|
|
64
65
|
return undefined;
|
|
65
|
-
if (record.filesModified.length > 0)
|
|
66
|
+
if (!allowFilesModified && record.filesModified.length > 0)
|
|
66
67
|
return undefined;
|
|
67
68
|
return {
|
|
68
69
|
schemaVersion: "psyclaw/worker-report/v1",
|
|
@@ -70,7 +71,7 @@ function parseWorkerReport(value, task, context) {
|
|
|
70
71
|
dispatchId: context.dispatchId,
|
|
71
72
|
outcome: record.outcome,
|
|
72
73
|
summary: record.summary,
|
|
73
|
-
filesModified:
|
|
74
|
+
filesModified: record.filesModified,
|
|
74
75
|
verification: record.verification.filter((item) => {
|
|
75
76
|
if (!item || typeof item !== "object")
|
|
76
77
|
return false;
|
|
@@ -92,31 +93,54 @@ function lastAssistantText(events) {
|
|
|
92
93
|
}
|
|
93
94
|
return undefined;
|
|
94
95
|
}
|
|
95
|
-
function taskPrompt(task, context) {
|
|
96
|
+
function taskPrompt(task, context, effects) {
|
|
97
|
+
const elevated = hasElevatedEffects(effects);
|
|
96
98
|
return [
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
99
|
+
elevated
|
|
100
|
+
? `You are a psyclaw research worker with explicitly approved effects: ${formatEffects(effects)}.`
|
|
101
|
+
: "You are a read-only psyclaw research worker.",
|
|
102
|
+
elevated
|
|
103
|
+
? "Stay within the approved effects. Do not read credentials or bypass project gates."
|
|
104
|
+
: "Do not write, edit, delete, execute shell commands, access network services, or modify credentials.",
|
|
105
|
+
elevated
|
|
106
|
+
? "Use only the tools enabled for this run."
|
|
107
|
+
: "Inspect only the supplied task inputs and project files with read/grep/find/ls.",
|
|
100
108
|
"At the end return ONLY one JSON object matching this schema:",
|
|
101
109
|
'{"schemaVersion":"psyclaw/worker-report/v1","taskId":"...","dispatchId":"...","outcome":"succeeded|blocked|failed","summary":"...","filesModified":[],"verification":[{"command":"...","exitCode":0}],"blockers":[]}',
|
|
102
110
|
`taskId=${task.id}`,
|
|
103
111
|
`dispatchId=${context.dispatchId}`,
|
|
104
112
|
`objective=${task.objective}`,
|
|
105
113
|
`inputs=${JSON.stringify(task.inputs)}`,
|
|
114
|
+
`allowedEffects=${JSON.stringify(effects)}`,
|
|
106
115
|
].join("\n");
|
|
107
116
|
}
|
|
117
|
+
function hostAllowsTaskEffects(effects, options) {
|
|
118
|
+
for (const effect of effects) {
|
|
119
|
+
if (effect === "read")
|
|
120
|
+
continue;
|
|
121
|
+
if (effect === "write" && options.allowWrites !== true)
|
|
122
|
+
return false;
|
|
123
|
+
if (effect === "network" && options.allowNetwork !== true)
|
|
124
|
+
return false;
|
|
125
|
+
if (effect === "destructive" && options.allowDestructive !== true)
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
108
130
|
/**
|
|
109
|
-
* Execute one task in a separate Pi process
|
|
110
|
-
*
|
|
111
|
-
* complete OS sandbox; deployments needing hostile-code isolation must add a
|
|
112
|
-
* container or equivalent runtime policy.
|
|
131
|
+
* Execute one task in a separate Pi process. Mutating tools are available only
|
|
132
|
+
* when the host options explicitly approve matching effects after user confirm.
|
|
113
133
|
*/
|
|
114
|
-
export function
|
|
134
|
+
export function createPiWorkerExecutor(options) {
|
|
115
135
|
return async (task, context) => {
|
|
116
|
-
const effects = task.allowedEffects
|
|
117
|
-
if (effects
|
|
118
|
-
return {
|
|
136
|
+
const effects = normalizeEffects(task.allowedEffects);
|
|
137
|
+
if (!hostAllowsTaskEffects(effects, options)) {
|
|
138
|
+
return {
|
|
139
|
+
report: blockedReport(task, context, `Task effects [${formatEffects(effects)}] exceed approved host ceilings`),
|
|
140
|
+
};
|
|
119
141
|
}
|
|
142
|
+
const elevated = hasElevatedEffects(effects);
|
|
143
|
+
const tools = options.tools ?? toolsForEffects(effects);
|
|
120
144
|
const client = new PiRpcClient({
|
|
121
145
|
cwd: options.cwd,
|
|
122
146
|
...(options.cliPath === undefined ? {} : { cliPath: options.cliPath }),
|
|
@@ -126,12 +150,13 @@ export function createPiReadOnlyExecutor(options) {
|
|
|
126
150
|
...(options.agentDir === undefined ? {} : { agentDir: options.agentDir }),
|
|
127
151
|
...(options.env === undefined ? {} : { env: options.env }),
|
|
128
152
|
...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),
|
|
129
|
-
tools
|
|
153
|
+
tools,
|
|
154
|
+
...(elevated ? { allowElevatedTools: true } : {}),
|
|
130
155
|
});
|
|
131
156
|
try {
|
|
132
157
|
await client.start();
|
|
133
|
-
const events = await client.promptAndWait(taskPrompt(task, context), options.timeoutMs);
|
|
134
|
-
const report = parseWorkerReport(extractJson(lastAssistantText(events) ?? ""), task, context);
|
|
158
|
+
const events = await client.promptAndWait(taskPrompt(task, context, effects), options.timeoutMs);
|
|
159
|
+
const report = parseWorkerReport(extractJson(lastAssistantText(events) ?? ""), task, context, effects.includes("write"));
|
|
135
160
|
if (!report)
|
|
136
161
|
return { report: blockedReport(task, context, "Worker did not return a valid structured report") };
|
|
137
162
|
return { report };
|
|
@@ -144,24 +169,32 @@ export function createPiReadOnlyExecutor(options) {
|
|
|
144
169
|
}
|
|
145
170
|
};
|
|
146
171
|
}
|
|
172
|
+
/** @deprecated Prefer createPiWorkerExecutor; kept as the read-only default alias. */
|
|
173
|
+
export function createPiReadOnlyExecutor(options) {
|
|
174
|
+
return createPiWorkerExecutor({ ...options, allowWrites: false, allowNetwork: false, allowDestructive: false });
|
|
175
|
+
}
|
|
147
176
|
export async function runPlanWithPi(plan, options = { cwd: process.cwd() }) {
|
|
148
|
-
const executor =
|
|
177
|
+
const executor = createPiWorkerExecutor(options);
|
|
149
178
|
return new BoundedOrchestrator({
|
|
150
179
|
executor,
|
|
151
180
|
root: options.root ?? options.cwd,
|
|
152
181
|
...(options.maxWorkers === undefined ? {} : { maxWorkers: options.maxWorkers }),
|
|
153
|
-
allowWrites:
|
|
182
|
+
allowWrites: options.allowWrites === true,
|
|
183
|
+
allowNetwork: options.allowNetwork === true,
|
|
184
|
+
allowDestructive: options.allowDestructive === true,
|
|
154
185
|
...(options.pauseRequested === undefined ? {} : { pauseRequested: options.pauseRequested }),
|
|
155
186
|
...(options.onEvent === undefined ? {} : { onEvent: options.onEvent }),
|
|
156
187
|
}).run(plan);
|
|
157
188
|
}
|
|
158
189
|
export async function resumePlanWithPi(plan, options = { cwd: process.cwd() }) {
|
|
159
|
-
const executor =
|
|
190
|
+
const executor = createPiWorkerExecutor(options);
|
|
160
191
|
return new BoundedOrchestrator({
|
|
161
192
|
executor,
|
|
162
193
|
root: options.root ?? options.cwd,
|
|
163
194
|
...(options.maxWorkers === undefined ? {} : { maxWorkers: options.maxWorkers }),
|
|
164
|
-
allowWrites:
|
|
195
|
+
allowWrites: options.allowWrites === true,
|
|
196
|
+
allowNetwork: options.allowNetwork === true,
|
|
197
|
+
allowDestructive: options.allowDestructive === true,
|
|
165
198
|
...(options.pauseRequested === undefined ? {} : { pauseRequested: options.pauseRequested }),
|
|
166
199
|
...(options.onEvent === undefined ? {} : { onEvent: options.onEvent }),
|
|
167
200
|
}).resume(plan);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi-executor.js","sourceRoot":"","sources":["../../../src/orchestration/pi-executor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pi-executor.js","sourceRoot":"","sources":["../../../src/orchestration/pi-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import type { ResearchProject } from "../core/contracts.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { WorkerReport } from "./contracts.js";
|
|
3
3
|
import { type PiExecutorOptions } from "./pi-executor.js";
|
|
4
|
+
import { type BundledPersonaDefinition } from "./bundled-personas.js";
|
|
4
5
|
export type ResearchAgentMode = "literature" | "review";
|
|
5
|
-
|
|
6
|
-
id: string;
|
|
7
|
-
label: string;
|
|
8
|
-
role: TaskNode["role"];
|
|
9
|
-
instructions: string;
|
|
10
|
-
}
|
|
6
|
+
type PersonaDefinition = BundledPersonaDefinition;
|
|
11
7
|
export interface MultiAgentRunOptions extends Pick<PiExecutorOptions, "provider" | "model" | "env" | "timeoutMs"> {
|
|
12
8
|
root: string;
|
|
13
9
|
project: ResearchProject;
|
|
@@ -5,77 +5,13 @@ import { assertSafeProjectPath, projectPaths } from "../project/paths.js";
|
|
|
5
5
|
import { readManuscript } from "../project/manuscript.js";
|
|
6
6
|
import { searchOpenAlex } from "../workflows/meta-analysis.js";
|
|
7
7
|
import { runPlanWithPi } from "./pi-executor.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
label: "研究版图分析者",
|
|
12
|
-
role: "researcher",
|
|
13
|
-
instructions: "梳理研究主题、年代分布、代表性论文和研究方向。只依据提供的可核验元数据与摘要,不得补造论文内容。",
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
id: "methods-scout",
|
|
17
|
-
label: "方法学分析者",
|
|
18
|
-
role: "analyst",
|
|
19
|
-
instructions: "识别文献中的研究设计、测量与分析线索,指出仅凭元数据无法判断之处,不得把推测写成研究事实。",
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
id: "evidence-critic",
|
|
23
|
-
label: "证据批判者",
|
|
24
|
-
role: "critic",
|
|
25
|
-
instructions: "检查证据强弱、潜在偏倚、相互冲突与因果边界,明确区分检索结果、摘要信息和进一步需要全文核验的主张。",
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
id: "gap-finder",
|
|
29
|
-
label: "研究缺口分析者",
|
|
30
|
-
role: "verifier",
|
|
31
|
-
instructions: "寻找尚未充分覆盖的问题、对象、情境和方法,并把真正的证据缺口与单纯的检索缺口分开。",
|
|
32
|
-
},
|
|
33
|
-
];
|
|
34
|
-
const REVIEW_PERSONAS = [
|
|
35
|
-
{
|
|
36
|
-
id: "theory-reviewer",
|
|
37
|
-
label: "理论与贡献审稿人",
|
|
38
|
-
role: "critic",
|
|
39
|
-
instructions: "以匿名同行评审标准检查问题重要性、理论定位、创新性、主张与证据的一致性。给出带稿件定位的主要与次要意见。",
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
id: "methods-reviewer",
|
|
43
|
-
label: "研究设计审稿人",
|
|
44
|
-
role: "analyst",
|
|
45
|
-
instructions: "检查抽样、设计、测量、效度、探索与确证边界、因果推断边界以及方法与问题的适配性。",
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
id: "statistics-reviewer",
|
|
49
|
-
label: "统计与可复现性审稿人",
|
|
50
|
-
role: "verifier",
|
|
51
|
-
instructions: "检查分析策略、效应量、置信区间、缺失值、稳健性、图表和可复现信息。不得重新计算或虚构任何统计量。",
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
id: "ethics-editorial-reviewer",
|
|
55
|
-
label: "伦理与编辑审稿人",
|
|
56
|
-
role: "writer",
|
|
57
|
-
instructions: "检查伦理、隐私、透明报告、引用表达、结构与可读性,并给出可执行但不直接改稿的建议。",
|
|
58
|
-
},
|
|
59
|
-
];
|
|
60
|
-
function personaMarkdown(persona) {
|
|
61
|
-
return [
|
|
62
|
-
"---",
|
|
63
|
-
"schemaVersion: psyclaw/agent-persona/v1",
|
|
64
|
-
`id: ${persona.id}`,
|
|
65
|
-
`label: ${persona.label}`,
|
|
66
|
-
"---",
|
|
67
|
-
"",
|
|
68
|
-
`# ${persona.label}`,
|
|
69
|
-
"",
|
|
70
|
-
persona.instructions,
|
|
71
|
-
"",
|
|
72
|
-
"所有判断必须标明依据和不确定性;不得虚构引用、数据、统计结果或稿件中不存在的内容。",
|
|
73
|
-
"",
|
|
74
|
-
].join("\n");
|
|
8
|
+
import { bundledPersonasForPack, personaMarkdown, } from "./bundled-personas.js";
|
|
9
|
+
function personaFile(persona) {
|
|
10
|
+
return personaMarkdown(persona);
|
|
75
11
|
}
|
|
76
12
|
/** Create only the personas needed for the requested workflow. Existing files are user-owned and remain unchanged. */
|
|
77
13
|
export async function ensureResearchAgentPersonas(root, mode) {
|
|
78
|
-
const definitions = mode
|
|
14
|
+
const definitions = bundledPersonasForPack(mode);
|
|
79
15
|
const directory = await assertSafeProjectPath(root, `.psyclaw/agents/${mode}`);
|
|
80
16
|
await mkdir(directory, { recursive: true });
|
|
81
17
|
const loaded = [];
|
|
@@ -88,7 +24,7 @@ export async function ensureResearchAgentPersonas(root, mode) {
|
|
|
88
24
|
catch (error) {
|
|
89
25
|
if (error.code !== "ENOENT")
|
|
90
26
|
throw error;
|
|
91
|
-
const prompt =
|
|
27
|
+
const prompt = personaFile(persona);
|
|
92
28
|
await atomicWriteFile(path, prompt);
|
|
93
29
|
loaded.push({ ...persona, prompt });
|
|
94
30
|
}
|