psyclaw 0.24.0

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.
Files changed (270) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +67 -0
  3. package/dist/apps/panel/index.html +3416 -0
  4. package/dist/src/adapters/pi/extension.d.ts +19 -0
  5. package/dist/src/adapters/pi/extension.js +735 -0
  6. package/dist/src/adapters/pi/extension.js.map +1 -0
  7. package/dist/src/adapters/pi/model.d.ts +72 -0
  8. package/dist/src/adapters/pi/model.js +152 -0
  9. package/dist/src/adapters/pi/model.js.map +1 -0
  10. package/dist/src/adapters/pi/resources.d.ts +23 -0
  11. package/dist/src/adapters/pi/resources.js +54 -0
  12. package/dist/src/adapters/pi/resources.js.map +1 -0
  13. package/dist/src/adapters/pi/rpc.d.ts +56 -0
  14. package/dist/src/adapters/pi/rpc.js +248 -0
  15. package/dist/src/adapters/pi/rpc.js.map +1 -0
  16. package/dist/src/adapters/pi/session.d.ts +30 -0
  17. package/dist/src/adapters/pi/session.js +64 -0
  18. package/dist/src/adapters/pi/session.js.map +1 -0
  19. package/dist/src/agents/catalog.d.ts +30 -0
  20. package/dist/src/agents/catalog.js +118 -0
  21. package/dist/src/agents/catalog.js.map +1 -0
  22. package/dist/src/agents/discover.d.ts +28 -0
  23. package/dist/src/agents/discover.js +127 -0
  24. package/dist/src/agents/discover.js.map +1 -0
  25. package/dist/src/agents/import.d.ts +67 -0
  26. package/dist/src/agents/import.js +801 -0
  27. package/dist/src/agents/import.js.map +1 -0
  28. package/dist/src/analysis/hooks.d.ts +81 -0
  29. package/dist/src/analysis/hooks.js +139 -0
  30. package/dist/src/analysis/hooks.js.map +1 -0
  31. package/dist/src/analysis/pre-registration.d.ts +18 -0
  32. package/dist/src/analysis/pre-registration.js +86 -0
  33. package/dist/src/analysis/pre-registration.js.map +1 -0
  34. package/dist/src/branding.d.ts +43 -0
  35. package/dist/src/branding.js +127 -0
  36. package/dist/src/branding.js.map +1 -0
  37. package/dist/src/chat.d.ts +16 -0
  38. package/dist/src/chat.js +67 -0
  39. package/dist/src/chat.js.map +1 -0
  40. package/dist/src/cli.d.ts +2 -0
  41. package/dist/src/cli.js +316 -0
  42. package/dist/src/cli.js.map +1 -0
  43. package/dist/src/core/citations.d.ts +44 -0
  44. package/dist/src/core/citations.js +48 -0
  45. package/dist/src/core/citations.js.map +1 -0
  46. package/dist/src/core/contracts.d.ts +119 -0
  47. package/dist/src/core/contracts.js +2 -0
  48. package/dist/src/core/contracts.js.map +1 -0
  49. package/dist/src/core/docx.d.ts +11 -0
  50. package/dist/src/core/docx.js +46 -0
  51. package/dist/src/core/docx.js.map +1 -0
  52. package/dist/src/core/doi.d.ts +41 -0
  53. package/dist/src/core/doi.js +82 -0
  54. package/dist/src/core/doi.js.map +1 -0
  55. package/dist/src/core/evidence-policy.d.ts +24 -0
  56. package/dist/src/core/evidence-policy.js +308 -0
  57. package/dist/src/core/evidence-policy.js.map +1 -0
  58. package/dist/src/core/filekind.d.ts +15 -0
  59. package/dist/src/core/filekind.js +82 -0
  60. package/dist/src/core/filekind.js.map +1 -0
  61. package/dist/src/core/hash.d.ts +2 -0
  62. package/dist/src/core/hash.js +17 -0
  63. package/dist/src/core/hash.js.map +1 -0
  64. package/dist/src/core/pricing.d.ts +38 -0
  65. package/dist/src/core/pricing.js +110 -0
  66. package/dist/src/core/pricing.js.map +1 -0
  67. package/dist/src/core/redact.d.ts +12 -0
  68. package/dist/src/core/redact.js +48 -0
  69. package/dist/src/core/redact.js.map +1 -0
  70. package/dist/src/core/references.d.ts +55 -0
  71. package/dist/src/core/references.js +102 -0
  72. package/dist/src/core/references.js.map +1 -0
  73. package/dist/src/core/schemas.d.ts +162 -0
  74. package/dist/src/core/schemas.js +160 -0
  75. package/dist/src/core/schemas.js.map +1 -0
  76. package/dist/src/extension.d.ts +1 -0
  77. package/dist/src/extension.js +2 -0
  78. package/dist/src/extension.js.map +1 -0
  79. package/dist/src/index.d.ts +72 -0
  80. package/dist/src/index.js +73 -0
  81. package/dist/src/index.js.map +1 -0
  82. package/dist/src/install/installer.d.ts +147 -0
  83. package/dist/src/install/installer.js +743 -0
  84. package/dist/src/install/installer.js.map +1 -0
  85. package/dist/src/integrations/contracts.d.ts +35 -0
  86. package/dist/src/integrations/contracts.js +27 -0
  87. package/dist/src/integrations/contracts.js.map +1 -0
  88. package/dist/src/integrations/mcp.d.ts +155 -0
  89. package/dist/src/integrations/mcp.js +826 -0
  90. package/dist/src/integrations/mcp.js.map +1 -0
  91. package/dist/src/knowledge-map/contracts.d.ts +20 -0
  92. package/dist/src/knowledge-map/contracts.js +2 -0
  93. package/dist/src/knowledge-map/contracts.js.map +1 -0
  94. package/dist/src/knowledge-map/index.d.ts +4 -0
  95. package/dist/src/knowledge-map/index.js +39 -0
  96. package/dist/src/knowledge-map/index.js.map +1 -0
  97. package/dist/src/literature/contracts.d.ts +106 -0
  98. package/dist/src/literature/contracts.js +2 -0
  99. package/dist/src/literature/contracts.js.map +1 -0
  100. package/dist/src/literature/fulltext.d.ts +7 -0
  101. package/dist/src/literature/fulltext.js +24 -0
  102. package/dist/src/literature/fulltext.js.map +1 -0
  103. package/dist/src/literature/knowledge-map.d.ts +2 -0
  104. package/dist/src/literature/knowledge-map.js +20 -0
  105. package/dist/src/literature/knowledge-map.js.map +1 -0
  106. package/dist/src/literature/ledger.d.ts +3 -0
  107. package/dist/src/literature/ledger.js +17 -0
  108. package/dist/src/literature/ledger.js.map +1 -0
  109. package/dist/src/literature/metadata.d.ts +6 -0
  110. package/dist/src/literature/metadata.js +32 -0
  111. package/dist/src/literature/metadata.js.map +1 -0
  112. package/dist/src/memory/store.d.ts +22 -0
  113. package/dist/src/memory/store.js +73 -0
  114. package/dist/src/memory/store.js.map +1 -0
  115. package/dist/src/orchestration/contracts.d.ts +61 -0
  116. package/dist/src/orchestration/contracts.js +2 -0
  117. package/dist/src/orchestration/contracts.js.map +1 -0
  118. package/dist/src/orchestration/pi-executor.d.ts +28 -0
  119. package/dist/src/orchestration/pi-executor.js +169 -0
  120. package/dist/src/orchestration/pi-executor.js.map +1 -0
  121. package/dist/src/orchestration/runner.d.ts +196 -0
  122. package/dist/src/orchestration/runner.js +991 -0
  123. package/dist/src/orchestration/runner.js.map +1 -0
  124. package/dist/src/orchestration/scheduler.d.ts +8 -0
  125. package/dist/src/orchestration/scheduler.js +335 -0
  126. package/dist/src/orchestration/scheduler.js.map +1 -0
  127. package/dist/src/panel/events.d.ts +20 -0
  128. package/dist/src/panel/events.js +93 -0
  129. package/dist/src/panel/events.js.map +1 -0
  130. package/dist/src/panel/extension.d.ts +8 -0
  131. package/dist/src/panel/extension.js +114 -0
  132. package/dist/src/panel/extension.js.map +1 -0
  133. package/dist/src/panel/literature-map.d.ts +26 -0
  134. package/dist/src/panel/literature-map.js +34 -0
  135. package/dist/src/panel/literature-map.js.map +1 -0
  136. package/dist/src/panel/projection.d.ts +51 -0
  137. package/dist/src/panel/projection.js +288 -0
  138. package/dist/src/panel/projection.js.map +1 -0
  139. package/dist/src/panel/server.d.ts +46 -0
  140. package/dist/src/panel/server.js +1610 -0
  141. package/dist/src/panel/server.js.map +1 -0
  142. package/dist/src/panel/usage.d.ts +53 -0
  143. package/dist/src/panel/usage.js +150 -0
  144. package/dist/src/panel/usage.js.map +1 -0
  145. package/dist/src/project/bootstrap.d.ts +10 -0
  146. package/dist/src/project/bootstrap.js +83 -0
  147. package/dist/src/project/bootstrap.js.map +1 -0
  148. package/dist/src/project/hitl.d.ts +12 -0
  149. package/dist/src/project/hitl.js +43 -0
  150. package/dist/src/project/hitl.js.map +1 -0
  151. package/dist/src/project/jsonl.d.ts +16 -0
  152. package/dist/src/project/jsonl.js +93 -0
  153. package/dist/src/project/jsonl.js.map +1 -0
  154. package/dist/src/project/manuscript.d.ts +21 -0
  155. package/dist/src/project/manuscript.js +74 -0
  156. package/dist/src/project/manuscript.js.map +1 -0
  157. package/dist/src/project/paths.d.ts +38 -0
  158. package/dist/src/project/paths.js +166 -0
  159. package/dist/src/project/paths.js.map +1 -0
  160. package/dist/src/project/versions.d.ts +10 -0
  161. package/dist/src/project/versions.js +14 -0
  162. package/dist/src/project/versions.js.map +1 -0
  163. package/dist/src/psyclaw-theme.d.ts +88 -0
  164. package/dist/src/psyclaw-theme.js +89 -0
  165. package/dist/src/psyclaw-theme.js.map +1 -0
  166. package/dist/src/research/brief.d.ts +11 -0
  167. package/dist/src/research/brief.js +81 -0
  168. package/dist/src/research/brief.js.map +1 -0
  169. package/dist/src/research/ledger.d.ts +12 -0
  170. package/dist/src/research/ledger.js +43 -0
  171. package/dist/src/research/ledger.js.map +1 -0
  172. package/dist/src/run.d.ts +20 -0
  173. package/dist/src/run.js +34 -0
  174. package/dist/src/run.js.map +1 -0
  175. package/dist/src/setup.d.ts +54 -0
  176. package/dist/src/setup.js +221 -0
  177. package/dist/src/setup.js.map +1 -0
  178. package/dist/src/skills/contracts.d.ts +105 -0
  179. package/dist/src/skills/contracts.js +3 -0
  180. package/dist/src/skills/contracts.js.map +1 -0
  181. package/dist/src/skills/preflight.d.ts +10 -0
  182. package/dist/src/skills/preflight.js +39 -0
  183. package/dist/src/skills/preflight.js.map +1 -0
  184. package/dist/src/skills/registry.d.ts +28 -0
  185. package/dist/src/skills/registry.js +556 -0
  186. package/dist/src/skills/registry.js.map +1 -0
  187. package/dist/src/style/artifact.d.ts +6 -0
  188. package/dist/src/style/artifact.js +61 -0
  189. package/dist/src/style/artifact.js.map +1 -0
  190. package/dist/src/style/cli-ui.d.ts +41 -0
  191. package/dist/src/style/cli-ui.js +119 -0
  192. package/dist/src/style/cli-ui.js.map +1 -0
  193. package/dist/src/style/contracts.d.ts +34 -0
  194. package/dist/src/style/contracts.js +2 -0
  195. package/dist/src/style/contracts.js.map +1 -0
  196. package/dist/src/style/registry.d.ts +16 -0
  197. package/dist/src/style/registry.js +50 -0
  198. package/dist/src/style/registry.js.map +1 -0
  199. package/dist/src/trust/manifest.d.ts +42 -0
  200. package/dist/src/trust/manifest.js +53 -0
  201. package/dist/src/trust/manifest.js.map +1 -0
  202. package/dist/src/trust/sbom.d.ts +54 -0
  203. package/dist/src/trust/sbom.js +77 -0
  204. package/dist/src/trust/sbom.js.map +1 -0
  205. package/dist/src/tui/app.d.ts +3 -0
  206. package/dist/src/tui/app.js +103 -0
  207. package/dist/src/tui/app.js.map +1 -0
  208. package/dist/src/tui/model.d.ts +13 -0
  209. package/dist/src/tui/model.js +25 -0
  210. package/dist/src/tui/model.js.map +1 -0
  211. package/dist/src/updates/check.d.ts +43 -0
  212. package/dist/src/updates/check.js +68 -0
  213. package/dist/src/updates/check.js.map +1 -0
  214. package/dist/src/updates/manifest.d.ts +19 -0
  215. package/dist/src/updates/manifest.js +58 -0
  216. package/dist/src/updates/manifest.js.map +1 -0
  217. package/dist/src/updates/registry.d.ts +21 -0
  218. package/dist/src/updates/registry.js +82 -0
  219. package/dist/src/updates/registry.js.map +1 -0
  220. package/dist/src/updates/skills.d.ts +15 -0
  221. package/dist/src/updates/skills.js +39 -0
  222. package/dist/src/updates/skills.js.map +1 -0
  223. package/dist/src/updates/status.d.ts +7 -0
  224. package/dist/src/updates/status.js +37 -0
  225. package/dist/src/updates/status.js.map +1 -0
  226. package/dist/src/updates/update.d.ts +43 -0
  227. package/dist/src/updates/update.js +126 -0
  228. package/dist/src/updates/update.js.map +1 -0
  229. package/dist/src/wizard.d.ts +7 -0
  230. package/dist/src/wizard.js +90 -0
  231. package/dist/src/wizard.js.map +1 -0
  232. package/dist/src/workflows/analysis-delegation.d.ts +3 -0
  233. package/dist/src/workflows/analysis-delegation.js +96 -0
  234. package/dist/src/workflows/analysis-delegation.js.map +1 -0
  235. package/dist/src/workflows/expert-review-runner.d.ts +29 -0
  236. package/dist/src/workflows/expert-review-runner.js +35 -0
  237. package/dist/src/workflows/expert-review-runner.js.map +1 -0
  238. package/dist/src/workflows/expert-review.d.ts +140 -0
  239. package/dist/src/workflows/expert-review.js +111 -0
  240. package/dist/src/workflows/expert-review.js.map +1 -0
  241. package/dist/src/workflows/institutional-fulltext.d.ts +16 -0
  242. package/dist/src/workflows/institutional-fulltext.js +110 -0
  243. package/dist/src/workflows/institutional-fulltext.js.map +1 -0
  244. package/dist/src/workflows/literature-review.d.ts +3 -0
  245. package/dist/src/workflows/literature-review.js +76 -0
  246. package/dist/src/workflows/literature-review.js.map +1 -0
  247. package/dist/src/workflows/meta-analysis.d.ts +38 -0
  248. package/dist/src/workflows/meta-analysis.js +185 -0
  249. package/dist/src/workflows/meta-analysis.js.map +1 -0
  250. package/dist/src/workflows/publish.d.ts +51 -0
  251. package/dist/src/workflows/publish.js +153 -0
  252. package/dist/src/workflows/publish.js.map +1 -0
  253. package/dist/src/workflows/spec.d.ts +51 -0
  254. package/dist/src/workflows/spec.js +157 -0
  255. package/dist/src/workflows/spec.js.map +1 -0
  256. package/dist/src/workflows/style-contract.d.ts +24 -0
  257. package/dist/src/workflows/style-contract.js +23 -0
  258. package/dist/src/workflows/style-contract.js.map +1 -0
  259. package/dist/src/workflows/writing-review.d.ts +15 -0
  260. package/dist/src/workflows/writing-review.js +82 -0
  261. package/dist/src/workflows/writing-review.js.map +1 -0
  262. package/package.json +73 -0
  263. package/package.json.psyclaw +21 -0
  264. package/skills/core/citation-audit/SKILL.md +9 -0
  265. package/skills/core/evidence-capture/SKILL.md +9 -0
  266. package/skills/core/manifest.json +15 -0
  267. package/skills/core/research-brief/SKILL.md +11 -0
  268. package/skills/core/research-intake/SKILL.md +9 -0
  269. package/skills/recommended/catalog.json +52 -0
  270. package/skills/recommended/mcp-catalog.json +118 -0
@@ -0,0 +1,140 @@
1
+ import { Type } from "typebox";
2
+ /** The smallest independent panel used for a bounded manuscript review. */
3
+ export type ExpertReviewRole = "methodologist" | "evidence-critic" | "writing-editor" | "devil-advocate" | "ethics-reviewer" | "reproducibility-reviewer";
4
+ export type ExpertReviewSeverity = "block" | "major" | "minor" | "note";
5
+ export type ExpertReviewDisposition = "accept" | "revise" | "reject" | "uncertain";
6
+ export interface ExpertReviewFinding {
7
+ id: string;
8
+ severity: ExpertReviewSeverity;
9
+ rule: string;
10
+ message: string;
11
+ /** A finding must point to an input, claim, or artifact when one exists. */
12
+ refs: string[];
13
+ disposition: ExpertReviewDisposition;
14
+ }
15
+ export interface ExpertReviewOpinion {
16
+ schemaVersion: "psyclaw/expert-review-opinion/v1";
17
+ runId: string;
18
+ taskId: string;
19
+ dispatchId: string;
20
+ expertId: string;
21
+ role: ExpertReviewRole;
22
+ outcome: "complete" | "blocked" | "uncertain";
23
+ summary: string;
24
+ findings: ExpertReviewFinding[];
25
+ /** Empty is valid only when the expert explicitly reports no findings. */
26
+ evidenceRefs: string[];
27
+ }
28
+ export interface ExpertReviewContract {
29
+ schemaVersion: "psyclaw/expert-review/v1";
30
+ runId: string;
31
+ subject: {
32
+ kind: "manuscript" | "artifact" | "workflow";
33
+ ref: string;
34
+ };
35
+ inputRefs: string[];
36
+ experts: {
37
+ expertId: string;
38
+ role: ExpertReviewRole;
39
+ taskId: string;
40
+ }[];
41
+ requiredRoles: ExpertReviewRole[];
42
+ minOpinions: number;
43
+ independent: true;
44
+ output: {
45
+ artifactPath: string;
46
+ verdictPath: string;
47
+ };
48
+ }
49
+ export interface ExpertReviewResult {
50
+ schemaVersion: "psyclaw/expert-review-result/v1";
51
+ runId: string;
52
+ verdict: "pass" | "blocked" | "uncertain";
53
+ opinions: ExpertReviewOpinion[];
54
+ findings: ExpertReviewFinding[];
55
+ unresolvedRoles: ExpertReviewRole[];
56
+ /** Aggregation is a report only; it never upgrades an unsupported finding. */
57
+ blockReasons: string[];
58
+ }
59
+ export declare const ExpertReviewOpinionSchema: Type.TObject<{
60
+ schemaVersion: Type.TLiteral<"psyclaw/expert-review-opinion/v1">;
61
+ runId: Type.TString;
62
+ taskId: Type.TString;
63
+ dispatchId: Type.TString;
64
+ expertId: Type.TString;
65
+ role: Type.TUnion<[Type.TLiteral<"methodologist">, Type.TLiteral<"evidence-critic">, Type.TLiteral<"writing-editor">, Type.TLiteral<"devil-advocate">, Type.TLiteral<"ethics-reviewer">, Type.TLiteral<"reproducibility-reviewer">]>;
66
+ outcome: Type.TUnion<[Type.TLiteral<"complete">, Type.TLiteral<"blocked">, Type.TLiteral<"uncertain">]>;
67
+ summary: Type.TString;
68
+ findings: Type.TArray<Type.TObject<{
69
+ id: Type.TString;
70
+ severity: Type.TUnion<[Type.TLiteral<"block">, Type.TLiteral<"major">, Type.TLiteral<"minor">, Type.TLiteral<"note">]>;
71
+ rule: Type.TString;
72
+ message: Type.TString;
73
+ refs: Type.TArray<Type.TString>;
74
+ disposition: Type.TUnion<[Type.TLiteral<"accept">, Type.TLiteral<"revise">, Type.TLiteral<"reject">, Type.TLiteral<"uncertain">]>;
75
+ }>>;
76
+ evidenceRefs: Type.TArray<Type.TString>;
77
+ }>;
78
+ export declare const ExpertReviewContractSchema: Type.TObject<{
79
+ schemaVersion: Type.TLiteral<"psyclaw/expert-review/v1">;
80
+ runId: Type.TString;
81
+ subject: Type.TObject<{
82
+ kind: Type.TUnion<[Type.TLiteral<"manuscript">, Type.TLiteral<"artifact">, Type.TLiteral<"workflow">]>;
83
+ ref: Type.TString;
84
+ }>;
85
+ inputRefs: Type.TArray<Type.TString>;
86
+ experts: Type.TArray<Type.TObject<{
87
+ expertId: Type.TString;
88
+ role: Type.TUnion<[Type.TLiteral<"methodologist">, Type.TLiteral<"evidence-critic">, Type.TLiteral<"writing-editor">, Type.TLiteral<"devil-advocate">, Type.TLiteral<"ethics-reviewer">, Type.TLiteral<"reproducibility-reviewer">]>;
89
+ taskId: Type.TString;
90
+ }>>;
91
+ requiredRoles: Type.TArray<Type.TUnion<[Type.TLiteral<"methodologist">, Type.TLiteral<"evidence-critic">, Type.TLiteral<"writing-editor">, Type.TLiteral<"devil-advocate">, Type.TLiteral<"ethics-reviewer">, Type.TLiteral<"reproducibility-reviewer">]>>;
92
+ minOpinions: Type.TInteger;
93
+ independent: Type.TLiteral<true>;
94
+ output: Type.TObject<{
95
+ artifactPath: Type.TString;
96
+ verdictPath: Type.TString;
97
+ }>;
98
+ }>;
99
+ export declare const ExpertReviewResultSchema: Type.TObject<{
100
+ schemaVersion: Type.TLiteral<"psyclaw/expert-review-result/v1">;
101
+ runId: Type.TString;
102
+ verdict: Type.TUnion<[Type.TLiteral<"pass">, Type.TLiteral<"blocked">, Type.TLiteral<"uncertain">]>;
103
+ opinions: Type.TArray<Type.TObject<{
104
+ schemaVersion: Type.TLiteral<"psyclaw/expert-review-opinion/v1">;
105
+ runId: Type.TString;
106
+ taskId: Type.TString;
107
+ dispatchId: Type.TString;
108
+ expertId: Type.TString;
109
+ role: Type.TUnion<[Type.TLiteral<"methodologist">, Type.TLiteral<"evidence-critic">, Type.TLiteral<"writing-editor">, Type.TLiteral<"devil-advocate">, Type.TLiteral<"ethics-reviewer">, Type.TLiteral<"reproducibility-reviewer">]>;
110
+ outcome: Type.TUnion<[Type.TLiteral<"complete">, Type.TLiteral<"blocked">, Type.TLiteral<"uncertain">]>;
111
+ summary: Type.TString;
112
+ findings: Type.TArray<Type.TObject<{
113
+ id: Type.TString;
114
+ severity: Type.TUnion<[Type.TLiteral<"block">, Type.TLiteral<"major">, Type.TLiteral<"minor">, Type.TLiteral<"note">]>;
115
+ rule: Type.TString;
116
+ message: Type.TString;
117
+ refs: Type.TArray<Type.TString>;
118
+ disposition: Type.TUnion<[Type.TLiteral<"accept">, Type.TLiteral<"revise">, Type.TLiteral<"reject">, Type.TLiteral<"uncertain">]>;
119
+ }>>;
120
+ evidenceRefs: Type.TArray<Type.TString>;
121
+ }>>;
122
+ findings: Type.TArray<Type.TObject<{
123
+ id: Type.TString;
124
+ severity: Type.TUnion<[Type.TLiteral<"block">, Type.TLiteral<"major">, Type.TLiteral<"minor">, Type.TLiteral<"note">]>;
125
+ rule: Type.TString;
126
+ message: Type.TString;
127
+ refs: Type.TArray<Type.TString>;
128
+ disposition: Type.TUnion<[Type.TLiteral<"accept">, Type.TLiteral<"revise">, Type.TLiteral<"reject">, Type.TLiteral<"uncertain">]>;
129
+ }>>;
130
+ unresolvedRoles: Type.TArray<Type.TUnion<[Type.TLiteral<"methodologist">, Type.TLiteral<"evidence-critic">, Type.TLiteral<"writing-editor">, Type.TLiteral<"devil-advocate">, Type.TLiteral<"ethics-reviewer">, Type.TLiteral<"reproducibility-reviewer">]>>;
131
+ blockReasons: Type.TArray<Type.TString>;
132
+ }>;
133
+ export declare function validateExpertReviewContract(value: unknown): ExpertReviewContract;
134
+ export declare function validateExpertReviewOpinion(value: unknown): ExpertReviewOpinion;
135
+ export declare function validateExpertReviewResult(value: unknown): ExpertReviewResult;
136
+ /**
137
+ * Deterministically combines independent opinions. It does not infer a
138
+ * finding from a vote and never upgrades an uncertain or blocked opinion.
139
+ */
140
+ export declare function aggregateExpertReview(contractValue: unknown, opinionValues: readonly unknown[]): ExpertReviewResult;
@@ -0,0 +1,111 @@
1
+ import { Type } from "typebox";
2
+ import { Compile } from "typebox/compile";
3
+ const Role = Type.Union([
4
+ Type.Literal("methodologist"),
5
+ Type.Literal("evidence-critic"),
6
+ Type.Literal("writing-editor"),
7
+ Type.Literal("devil-advocate"),
8
+ Type.Literal("ethics-reviewer"),
9
+ Type.Literal("reproducibility-reviewer"),
10
+ ]);
11
+ const Finding = Type.Object({
12
+ id: Type.String({ minLength: 1 }),
13
+ severity: Type.Union([Type.Literal("block"), Type.Literal("major"), Type.Literal("minor"), Type.Literal("note")]),
14
+ rule: Type.String({ minLength: 1 }),
15
+ message: Type.String({ minLength: 1 }),
16
+ refs: Type.Array(Type.String()),
17
+ disposition: Type.Union([Type.Literal("accept"), Type.Literal("revise"), Type.Literal("reject"), Type.Literal("uncertain")]),
18
+ }, { additionalProperties: false });
19
+ export const ExpertReviewOpinionSchema = Type.Object({
20
+ schemaVersion: Type.Literal("psyclaw/expert-review-opinion/v1"),
21
+ runId: Type.String({ minLength: 1 }), taskId: Type.String({ minLength: 1 }), dispatchId: Type.String({ minLength: 1 }),
22
+ expertId: Type.String({ minLength: 1 }), role: Role,
23
+ outcome: Type.Union([Type.Literal("complete"), Type.Literal("blocked"), Type.Literal("uncertain")]),
24
+ summary: Type.String({ minLength: 1 }), findings: Type.Array(Finding), evidenceRefs: Type.Array(Type.String()),
25
+ }, { additionalProperties: false });
26
+ export const ExpertReviewContractSchema = Type.Object({
27
+ schemaVersion: Type.Literal("psyclaw/expert-review/v1"), runId: Type.String({ minLength: 1 }),
28
+ subject: Type.Object({ kind: Type.Union([Type.Literal("manuscript"), Type.Literal("artifact"), Type.Literal("workflow")]), ref: Type.String({ minLength: 1 }) }, { additionalProperties: false }),
29
+ inputRefs: Type.Array(Type.String()),
30
+ experts: Type.Array(Type.Object({ expertId: Type.String({ minLength: 1 }), role: Role, taskId: Type.String({ minLength: 1 }) }, { additionalProperties: false }), { minItems: 1 }),
31
+ requiredRoles: Type.Array(Role, { minItems: 1 }), minOpinions: Type.Integer({ minimum: 1 }), independent: Type.Literal(true),
32
+ output: Type.Object({ artifactPath: Type.String({ minLength: 1 }), verdictPath: Type.String({ minLength: 1 }) }, { additionalProperties: false }),
33
+ }, { additionalProperties: false });
34
+ export const ExpertReviewResultSchema = Type.Object({
35
+ schemaVersion: Type.Literal("psyclaw/expert-review-result/v1"), runId: Type.String({ minLength: 1 }),
36
+ verdict: Type.Union([Type.Literal("pass"), Type.Literal("blocked"), Type.Literal("uncertain")]),
37
+ opinions: Type.Array(ExpertReviewOpinionSchema), findings: Type.Array(Finding), unresolvedRoles: Type.Array(Role), blockReasons: Type.Array(Type.String()),
38
+ }, { additionalProperties: false });
39
+ const contractValidator = Compile(ExpertReviewContractSchema);
40
+ const opinionValidator = Compile(ExpertReviewOpinionSchema);
41
+ const resultValidator = Compile(ExpertReviewResultSchema);
42
+ export function validateExpertReviewContract(value) {
43
+ if (!contractValidator.Check(value))
44
+ throw new Error("invalid psyclaw/expert-review/v1 contract");
45
+ const contract = value;
46
+ const expertRoles = new Set(contract.experts.map((expert) => expert.role));
47
+ if (contract.minOpinions > contract.experts.length)
48
+ throw new Error("minOpinions exceeds configured experts");
49
+ if (contract.requiredRoles.some((role) => !expertRoles.has(role)))
50
+ throw new Error("required role has no configured expert");
51
+ if (new Set(contract.requiredRoles).size !== contract.requiredRoles.length)
52
+ throw new Error("duplicate required role");
53
+ if (new Set(contract.experts.map((expert) => expert.expertId)).size !== contract.experts.length)
54
+ throw new Error("duplicate expertId");
55
+ return contract;
56
+ }
57
+ export function validateExpertReviewOpinion(value) {
58
+ if (!opinionValidator.Check(value))
59
+ throw new Error("invalid psyclaw/expert-review-opinion/v1 opinion");
60
+ return value;
61
+ }
62
+ export function validateExpertReviewResult(value) {
63
+ if (!resultValidator.Check(value))
64
+ throw new Error("invalid psyclaw/expert-review-result/v1 result");
65
+ return value;
66
+ }
67
+ /**
68
+ * Deterministically combines independent opinions. It does not infer a
69
+ * finding from a vote and never upgrades an uncertain or blocked opinion.
70
+ */
71
+ export function aggregateExpertReview(contractValue, opinionValues) {
72
+ const contract = validateExpertReviewContract(contractValue);
73
+ const opinions = opinionValues.map(validateExpertReviewOpinion);
74
+ const blockReasons = [];
75
+ const configured = new Map(contract.experts.map((expert) => [expert.expertId, expert]));
76
+ const seen = new Set();
77
+ for (const opinion of opinions) {
78
+ if (opinion.runId !== contract.runId)
79
+ blockReasons.push(`opinion ${opinion.expertId} belongs to another run`);
80
+ const expert = configured.get(opinion.expertId);
81
+ if (!expert)
82
+ blockReasons.push(`unconfigured expert: ${opinion.expertId}`);
83
+ else if (expert.role !== opinion.role || expert.taskId !== opinion.taskId)
84
+ blockReasons.push(`opinion identity mismatch: ${opinion.expertId}`);
85
+ if (seen.has(opinion.expertId))
86
+ blockReasons.push(`duplicate opinion: ${opinion.expertId}`);
87
+ seen.add(opinion.expertId);
88
+ if (opinion.outcome === "blocked")
89
+ blockReasons.push(`expert blocked: ${opinion.expertId}`);
90
+ }
91
+ const roles = new Set(opinions.map((opinion) => opinion.role));
92
+ const unresolvedRoles = contract.requiredRoles.filter((role) => !roles.has(role));
93
+ if (opinions.length < contract.minOpinions)
94
+ blockReasons.push("minimum opinion count not met");
95
+ if (unresolvedRoles.length > 0)
96
+ blockReasons.push(`missing required roles: ${unresolvedRoles.join(", ")}`);
97
+ const findings = opinions.flatMap((opinion) => opinion.findings);
98
+ if (findings.some((finding) => finding.severity === "block"))
99
+ blockReasons.push("blocking finding reported");
100
+ const uncertain = opinions.some((opinion) => opinion.outcome === "uncertain") || findings.some((finding) => finding.disposition === "uncertain");
101
+ return {
102
+ schemaVersion: "psyclaw/expert-review-result/v1",
103
+ runId: contract.runId,
104
+ verdict: blockReasons.length > 0 ? "blocked" : uncertain ? "uncertain" : "pass",
105
+ opinions,
106
+ findings,
107
+ unresolvedRoles,
108
+ blockReasons,
109
+ };
110
+ }
111
+ //# sourceMappingURL=expert-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expert-review.js","sourceRoot":"","sources":["../../../src/workflows/expert-review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { InstitutionalRequestPlan, LiteratureRequestMode, MetadataCandidate, VerifiedFulltextRecord } from "../literature/contracts.js";
2
+ import { type WorkflowResult, type WorkflowSpec } from "./spec.js";
3
+ export declare const institutionalFulltextSpec: WorkflowSpec;
4
+ export declare function runInstitutionalFulltext(root: string, identifier?: string): Promise<WorkflowResult>;
5
+ export declare function recordVerifiedInstitutionalFulltext(root: string, options: {
6
+ path: string;
7
+ expected: MetadataCandidate;
8
+ observed: MetadataCandidate;
9
+ approved: boolean;
10
+ retrievedAt?: string;
11
+ }): Promise<VerifiedFulltextRecord>;
12
+ export declare function makeInstitutionalRequestPlan(target: string, options?: {
13
+ mode?: LiteratureRequestMode;
14
+ apiUrl?: string;
15
+ allowedDomains?: string[];
16
+ }): InstitutionalRequestPlan;
@@ -0,0 +1,110 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename, resolve } from "node:path";
3
+ import { appendEvidence, readProject } from "../research/ledger.js";
4
+ import { assertSafeProjectPath } from "../project/paths.js";
5
+ import { crossCheckMetadata, detectFulltext, sha256Bytes } from "../literature/metadata.js";
6
+ import { allParadigms, finalizeWorkflow } from "./spec.js";
7
+ export const institutionalFulltextSpec = {
8
+ id: "institutional-fulltext",
9
+ version: "1.0.0",
10
+ description: "Prepare an auditable, human-approved browser workflow for retrieving institutionally authorized full text.",
11
+ paradigms: allParadigms,
12
+ steps: [
13
+ { id: "identify", role: "researcher", effect: "read", description: "normalize the DOI, publisher URL, or title supplied by the researcher" },
14
+ { id: "browse", role: "researcher", effect: "read", description: "use the user's already authenticated browser session" },
15
+ { id: "approve-download", role: "verifier", effect: "write", description: "ask for confirmation before downloading a licensed full text" },
16
+ { id: "validate", role: "verifier", effect: "read", description: "verify PDF signature, title/DOI, size, and SHA-256" },
17
+ { id: "ledger", role: "writer", effect: "write", description: "import the verified local PDF as evidence" },
18
+ ],
19
+ requiredArtifacts: ["institutional-fulltext-plan.json", "institutional-fulltext-plan.md"],
20
+ };
21
+ export async function runInstitutionalFulltext(root, identifier = "") {
22
+ const project = await readProject(root);
23
+ const target = identifier.trim() || project.goal;
24
+ const isUrl = /^https?:\/\//i.test(target);
25
+ const isDoi = /^10\.\d{4,9}\//i.test(target);
26
+ const plan = {
27
+ schemaVersion: "psyclaw/institutional-fulltext-plan/v1",
28
+ documentVersion: "1.0.0",
29
+ target: { value: target, kind: isUrl ? "publisher-url" : isDoi ? "doi" : "title-or-query" },
30
+ bridge: {
31
+ adapter: "playwright-mcp",
32
+ mode: "existing-chrome-tab",
33
+ credentialPolicy: "user-authenticated-session-only",
34
+ network: "publisher-domain-only",
35
+ },
36
+ steps: [
37
+ { id: "identify", action: "resolve DOI/title and verify publisher page" },
38
+ { id: "authenticate", action: "user completes institutional login, VPN, or proxy in the visible browser" },
39
+ { id: "confirm", action: "human confirms the exact article and download action" },
40
+ { id: "download", action: "save PDF under data/clean or an approved evidence staging path" },
41
+ { id: "validate", action: "check PDF magic bytes, non-HTML content, title/DOI match, size, and SHA-256" },
42
+ { id: "record", action: "import verified file with psyclaw evidence add and retain source receipt" },
43
+ ],
44
+ stopConditions: [
45
+ "login page, CAPTCHA, or access denied",
46
+ "publisher page does not match the requested work",
47
+ "download is HTML, truncated, or hash changes",
48
+ "the action would bypass access controls or violate the user's authorization",
49
+ ],
50
+ approval: { requiredBefore: ["download", "record"], actor: "human", status: "pending" },
51
+ };
52
+ const markdown = [
53
+ "# Institutional Full Text Plan",
54
+ "",
55
+ `Target: ${target}`,
56
+ `Bridge: ${plan.bridge.adapter} (${plan.bridge.mode})`,
57
+ "",
58
+ "## Human Gate",
59
+ "",
60
+ "The user must complete institutional authentication in the visible browser and confirm the exact article before download.",
61
+ "",
62
+ "## Steps",
63
+ "",
64
+ ...plan.steps.map((step, index) => `${index + 1}. **${step.id}** — ${step.action}`),
65
+ "",
66
+ "## Stop Conditions",
67
+ "",
68
+ ...plan.stopConditions.map((item) => `- ${item}`),
69
+ "",
70
+ "## Next Action",
71
+ "",
72
+ "Open the plan in the workbench, connect the approved browser bridge, and request human confirmation before the download step.",
73
+ "",
74
+ ].join("\n");
75
+ return finalizeWorkflow(root, institutionalFulltextSpec, {
76
+ gates: [{ gateId: "institutional-fulltext:human-approval", ok: false, severity: "block", reason: "human must confirm the authenticated article and download" }],
77
+ outputs: [
78
+ { path: "institutional-fulltext-plan.json", contents: `${JSON.stringify(plan, null, 2)}\n` },
79
+ { path: "institutional-fulltext-plan.md", contents: markdown },
80
+ ],
81
+ completed: ["target normalized", "browser bridge and validation plan prepared"],
82
+ });
83
+ }
84
+ export async function recordVerifiedInstitutionalFulltext(root, options) {
85
+ if (!options.approved)
86
+ throw new Error("human approval is required before ledger record");
87
+ const safe = await assertSafeProjectPath(root, options.path);
88
+ const bytes = await readFile(safe);
89
+ const contentType = detectFulltext(bytes);
90
+ if (contentType === "unknown")
91
+ throw new Error("full text is neither PDF nor HTML");
92
+ const crossCheck = crossCheckMetadata(options.expected, options.observed);
93
+ if (!crossCheck.match)
94
+ throw new Error(`metadata cross-check failed: ${crossCheck.reasons.join("; ")}`);
95
+ const hash = sha256Bytes(bytes);
96
+ const evidence = { id: `institutional:${hash.slice(0, 16)}`, source: { kind: "file", locator: resolve(root, options.path), title: options.observed.title ?? basename(options.path) }, level: "fulltext", retrievedAt: options.retrievedAt ?? new Date().toISOString(), sha256: hash, accessStatus: "verified", locators: [{ kind: "file", value: options.path }, ...(crossCheck.normalizedDoi ? [{ kind: "doi", value: crossCheck.normalizedDoi }] : [])] };
97
+ await appendEvidence(root, evidence);
98
+ return { evidence, crossCheck, contentType, sha256: hash, approval: "approved" };
99
+ }
100
+ export function makeInstitutionalRequestPlan(target, options = {}) {
101
+ const value = target.trim();
102
+ const doi = /^10\.\d{4,9}\//i.test(value);
103
+ const url = /^https?:\/\//i.test(value);
104
+ const mode = options.mode ?? "browser";
105
+ const plan = { schemaVersion: "psyclaw/institutional-request-plan/v1", mode, target: { value, kind: url ? "publisher-url" : doi ? "doi" : "title-or-query" }, allowedDomains: options.allowedDomains ?? [], approval: { required: true, before: ["network", "download", "ledger-record"], status: "pending" }, stopConditions: ["authentication, CAPTCHA, or access denied", "domain is not allowlisted", "request would bypass access controls", "response is HTML login page or metadata does not match"] };
106
+ if (mode === "api")
107
+ plan.api = { method: "GET", url: options.apiUrl ?? value, headers: { Accept: "application/pdf, text/html, application/json" }, response: "pdf-or-html" };
108
+ return plan;
109
+ }
110
+ //# sourceMappingURL=institutional-fulltext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"institutional-fulltext.js","sourceRoot":"","sources":["../../../src/workflows/institutional-fulltext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type WorkflowResult, type WorkflowSpec } from "./spec.js";
2
+ export declare const literatureReviewSpec: WorkflowSpec;
3
+ export declare function runLiteratureReview(root: string): Promise<WorkflowResult>;
@@ -0,0 +1,76 @@
1
+ import { checkEvidenceSufficiency } from "../core/evidence-policy.js";
2
+ import { loadLedger, readProject } from "../research/ledger.js";
3
+ import { buildKnowledgeMap } from "../knowledge-map/index.js";
4
+ import { allParadigms, finalizeWorkflow } from "./spec.js";
5
+ export const literatureReviewSpec = {
6
+ id: "literature-review",
7
+ version: "1.0.0",
8
+ description: "Aggregate the evidence ledger into a review matrix with conflicts and gaps.",
9
+ paradigms: allParadigms,
10
+ steps: [
11
+ { id: "capture", role: "researcher", effect: "read", description: "load sources and claims" },
12
+ { id: "audit", role: "critic", effect: "read", description: "evidence sufficiency and conflict disclosure" },
13
+ { id: "write", role: "writer", effect: "write", description: "write review matrix and markdown" },
14
+ ],
15
+ requiredArtifacts: ["literature-review.md", "review-matrix.json", "knowledge-map.json"],
16
+ };
17
+ export async function runLiteratureReview(root) {
18
+ const project = await readProject(root);
19
+ const ledger = await loadLedger(root);
20
+ const gates = checkEvidenceSufficiency({ ...ledger, paradigm: project.paradigm });
21
+ if (ledger.evidence.length === 0) {
22
+ gates.push({ gateId: "review:sources", ok: false, severity: "block", reason: "no sources recorded" });
23
+ }
24
+ const matrix = {
25
+ schemaVersion: "psyclaw/review-matrix/v1",
26
+ sources: ledger.evidence.map((item) => ({
27
+ id: item.id,
28
+ locator: item.source.locator,
29
+ level: item.level,
30
+ accessStatus: item.accessStatus,
31
+ })),
32
+ claims: ledger.claims.map((item) => ({
33
+ id: item.id,
34
+ kind: item.kind,
35
+ status: item.status,
36
+ evidenceIds: item.evidenceIds,
37
+ })),
38
+ conflicts: ledger.links
39
+ .filter((link) => link.relation === "contradicts")
40
+ .map((link) => ({ claimId: link.claimId, evidenceId: link.evidenceId })),
41
+ gaps: gates.filter((gate) => !gate.ok).map((gate) => gate.reason),
42
+ };
43
+ const knowledgeMap = buildKnowledgeMap(ledger.evidence, ledger.claims);
44
+ const markdown = [
45
+ "# Literature Review",
46
+ "",
47
+ `Research goal: ${project.goal}`,
48
+ "",
49
+ "## Sources",
50
+ "",
51
+ ...(matrix.sources.length ? matrix.sources.map((item) => `- [${item.level}] ${item.locator}`) : ["- None"]),
52
+ "",
53
+ "## Claims",
54
+ "",
55
+ ...(matrix.claims.length ? matrix.claims.map((item) => `- (${item.kind}) ${item.status}: ${item.id}`) : ["- None"]),
56
+ "",
57
+ "## Conflicts",
58
+ "",
59
+ ...(matrix.conflicts.length ? matrix.conflicts.map((item) => `- ${item.claimId} vs ${item.evidenceId}`) : ["- None"]),
60
+ "",
61
+ "## Gaps",
62
+ "",
63
+ ...(matrix.gaps.length ? matrix.gaps.map((item) => `- ${item}`) : ["- None"]),
64
+ "",
65
+ ].join("\n");
66
+ return finalizeWorkflow(root, literatureReviewSpec, {
67
+ gates,
68
+ outputs: [
69
+ { path: "literature-review.md", contents: markdown },
70
+ { path: "review-matrix.json", contents: `${JSON.stringify(matrix, null, 2)}\n` },
71
+ { path: "knowledge-map.json", contents: `${JSON.stringify(knowledgeMap, null, 2)}\n` },
72
+ ],
73
+ completed: ["sources loaded", "claims aggregated", "conflicts and gaps disclosed"],
74
+ });
75
+ }
76
+ //# sourceMappingURL=literature-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"literature-review.js","sourceRoot":"","sources":["../../../src/workflows/literature-review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAA0C,MAAM,WAAW,CAAC;AAEnG,MAAM,CAAC,MAAM,oBAAoB,GAAiB;IAChD,EAAE,EAAE,mBAAmB;IACvB,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,6EAA6E;IAC1F,SAAS,EAAE,YAAY;IACvB,KAAK,EAAE;QACL,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,yBAAyB,EAAE;QAC7F,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,8CAA8C,EAAE;QAC5G,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,kCAAkC,EAAE;KAClG;IACD,iBAAiB,EAAE,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,oBAAoB,CAAC;CACxF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,wBAAwB,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClF,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,MAAM,GAAG;QACb,aAAa,EAAE,0BAA0B;QACzC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAC;QACH,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;QACH,SAAS,EAAE,MAAM,CAAC,KAAK;aACpB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,aAAa,CAAC;aACjD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1E,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;KAClE,CAAC;IACF,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAG;QACf,qBAAqB;QACrB,EAAE;QACF,kBAAkB,OAAO,CAAC,IAAI,EAAE;QAChC,EAAE;QACF,YAAY;QACZ,EAAE;QACF,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC3G,EAAE;QACF,WAAW;QACX,EAAE;QACF,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnH,EAAE;QACF,cAAc;QACd,EAAE;QACF,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,OAAO,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrH,EAAE;QACF,SAAS;QACT,EAAE;QACF,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7E,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,EAAE;QAClD,KAAK;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,EAAE;YACpD,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAChF,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;SACvF;QACD,SAAS,EAAE,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,8BAA8B,CAAC;KACnF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { type StageRunner } from "../run.js";
2
+ import { type WorkflowResult, type WorkflowSpec } from "./spec.js";
3
+ export declare const metaAnalysisSpec: WorkflowSpec;
4
+ export interface MetaStudy {
5
+ id: string;
6
+ title: string;
7
+ authors: string[];
8
+ year?: number;
9
+ venue?: string;
10
+ doi?: string;
11
+ citations?: number;
12
+ }
13
+ /** Search OpenAlex for studies matching the target (real network; injectable for tests). */
14
+ export declare function searchOpenAlex(target: string, nStudies: number, fetchFn?: typeof fetch): Promise<MetaStudy[]>;
15
+ export interface EffectRow {
16
+ studyId: string;
17
+ effectSize: number;
18
+ standardError: number;
19
+ n?: number;
20
+ }
21
+ /** Parse a CSV with at least `study_id,effect_size,standard_error`. */
22
+ export declare function parseEffectCsv(text: string): EffectRow[];
23
+ export declare function loadEffectDataset(root: string): Promise<EffectRow[] | undefined>;
24
+ /** R metafor script that computes the random-effects model, I², Egger's test, and the forest plot. */
25
+ export declare function metaforScript(datasetPath: string): string;
26
+ export interface MetaAnalysisOptions {
27
+ target: string;
28
+ nStudies: number;
29
+ fetchFn?: typeof fetch;
30
+ runner?: StageRunner;
31
+ }
32
+ /**
33
+ * Real meta-analysis pipeline. Statistics are never computed in core: the
34
+ * audit stage writes an R (metafor) script and the brief records what was
35
+ * found and what must run externally. Effect sizes come from the project's
36
+ * dataset; without one the workflow blocks honestly instead of faking numbers.
37
+ */
38
+ export declare function runMetaAnalysis(root: string, options: MetaAnalysisOptions): Promise<WorkflowResult>;