psyclaw 0.24.0 → 0.25.1

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 (277) hide show
  1. package/README.md +46 -53
  2. package/{dist/apps → apps}/panel/index.html +28 -50
  3. package/package.json +10 -20
  4. package/scripts/__pycache__/build_dist.cpython-314.pyc +0 -0
  5. package/scripts/__pycache__/build_whitepaper_docx.cpython-314.pyc +0 -0
  6. package/scripts/build_preprint_docx.py +729 -0
  7. package/scripts/build_preprint_figures.py +238 -0
  8. package/scripts/build_three_line_table_fixture.py +56 -0
  9. package/scripts/build_whitepaper_docx.py +768 -0
  10. package/scripts/check-branding.mjs +159 -0
  11. package/scripts/copy-panel.mjs +11 -0
  12. package/scripts/rebrand-pi.mjs +291 -0
  13. package/scripts/verify_docx.py +41 -0
  14. package/skills/core/citation-audit/SKILL.md +9 -9
  15. package/skills/core/evidence-capture/SKILL.md +9 -9
  16. package/skills/core/manifest.json +15 -15
  17. package/skills/core/research-brief/SKILL.md +8 -8
  18. package/skills/core/research-intake/SKILL.md +9 -9
  19. package/dist/src/adapters/pi/extension.d.ts +0 -19
  20. package/dist/src/adapters/pi/extension.js +0 -735
  21. package/dist/src/adapters/pi/extension.js.map +0 -1
  22. package/dist/src/adapters/pi/model.d.ts +0 -72
  23. package/dist/src/adapters/pi/model.js +0 -152
  24. package/dist/src/adapters/pi/model.js.map +0 -1
  25. package/dist/src/adapters/pi/resources.d.ts +0 -23
  26. package/dist/src/adapters/pi/resources.js +0 -54
  27. package/dist/src/adapters/pi/resources.js.map +0 -1
  28. package/dist/src/adapters/pi/rpc.d.ts +0 -56
  29. package/dist/src/adapters/pi/rpc.js +0 -248
  30. package/dist/src/adapters/pi/rpc.js.map +0 -1
  31. package/dist/src/adapters/pi/session.d.ts +0 -30
  32. package/dist/src/adapters/pi/session.js +0 -64
  33. package/dist/src/adapters/pi/session.js.map +0 -1
  34. package/dist/src/agents/catalog.d.ts +0 -30
  35. package/dist/src/agents/catalog.js +0 -118
  36. package/dist/src/agents/catalog.js.map +0 -1
  37. package/dist/src/agents/discover.d.ts +0 -28
  38. package/dist/src/agents/discover.js +0 -127
  39. package/dist/src/agents/discover.js.map +0 -1
  40. package/dist/src/agents/import.d.ts +0 -67
  41. package/dist/src/agents/import.js +0 -801
  42. package/dist/src/agents/import.js.map +0 -1
  43. package/dist/src/analysis/hooks.d.ts +0 -81
  44. package/dist/src/analysis/hooks.js +0 -139
  45. package/dist/src/analysis/hooks.js.map +0 -1
  46. package/dist/src/analysis/pre-registration.d.ts +0 -18
  47. package/dist/src/analysis/pre-registration.js +0 -86
  48. package/dist/src/analysis/pre-registration.js.map +0 -1
  49. package/dist/src/branding.d.ts +0 -43
  50. package/dist/src/branding.js +0 -127
  51. package/dist/src/branding.js.map +0 -1
  52. package/dist/src/chat.d.ts +0 -16
  53. package/dist/src/chat.js +0 -67
  54. package/dist/src/chat.js.map +0 -1
  55. package/dist/src/cli.d.ts +0 -2
  56. package/dist/src/cli.js +0 -316
  57. package/dist/src/cli.js.map +0 -1
  58. package/dist/src/core/citations.d.ts +0 -44
  59. package/dist/src/core/citations.js +0 -48
  60. package/dist/src/core/citations.js.map +0 -1
  61. package/dist/src/core/contracts.d.ts +0 -119
  62. package/dist/src/core/contracts.js +0 -2
  63. package/dist/src/core/contracts.js.map +0 -1
  64. package/dist/src/core/docx.d.ts +0 -11
  65. package/dist/src/core/docx.js +0 -46
  66. package/dist/src/core/docx.js.map +0 -1
  67. package/dist/src/core/doi.d.ts +0 -41
  68. package/dist/src/core/doi.js +0 -82
  69. package/dist/src/core/doi.js.map +0 -1
  70. package/dist/src/core/evidence-policy.d.ts +0 -24
  71. package/dist/src/core/evidence-policy.js +0 -308
  72. package/dist/src/core/evidence-policy.js.map +0 -1
  73. package/dist/src/core/filekind.d.ts +0 -15
  74. package/dist/src/core/filekind.js +0 -82
  75. package/dist/src/core/filekind.js.map +0 -1
  76. package/dist/src/core/hash.d.ts +0 -2
  77. package/dist/src/core/hash.js +0 -17
  78. package/dist/src/core/hash.js.map +0 -1
  79. package/dist/src/core/pricing.d.ts +0 -38
  80. package/dist/src/core/pricing.js +0 -110
  81. package/dist/src/core/pricing.js.map +0 -1
  82. package/dist/src/core/redact.d.ts +0 -12
  83. package/dist/src/core/redact.js +0 -48
  84. package/dist/src/core/redact.js.map +0 -1
  85. package/dist/src/core/references.d.ts +0 -55
  86. package/dist/src/core/references.js +0 -102
  87. package/dist/src/core/references.js.map +0 -1
  88. package/dist/src/core/schemas.d.ts +0 -162
  89. package/dist/src/core/schemas.js +0 -160
  90. package/dist/src/core/schemas.js.map +0 -1
  91. package/dist/src/extension.d.ts +0 -1
  92. package/dist/src/extension.js +0 -2
  93. package/dist/src/extension.js.map +0 -1
  94. package/dist/src/index.d.ts +0 -72
  95. package/dist/src/index.js +0 -73
  96. package/dist/src/index.js.map +0 -1
  97. package/dist/src/install/installer.d.ts +0 -147
  98. package/dist/src/install/installer.js +0 -743
  99. package/dist/src/install/installer.js.map +0 -1
  100. package/dist/src/integrations/contracts.d.ts +0 -35
  101. package/dist/src/integrations/contracts.js +0 -27
  102. package/dist/src/integrations/contracts.js.map +0 -1
  103. package/dist/src/integrations/mcp.d.ts +0 -155
  104. package/dist/src/integrations/mcp.js +0 -826
  105. package/dist/src/integrations/mcp.js.map +0 -1
  106. package/dist/src/knowledge-map/contracts.d.ts +0 -20
  107. package/dist/src/knowledge-map/contracts.js +0 -2
  108. package/dist/src/knowledge-map/contracts.js.map +0 -1
  109. package/dist/src/knowledge-map/index.d.ts +0 -4
  110. package/dist/src/knowledge-map/index.js +0 -39
  111. package/dist/src/knowledge-map/index.js.map +0 -1
  112. package/dist/src/literature/contracts.d.ts +0 -106
  113. package/dist/src/literature/contracts.js +0 -2
  114. package/dist/src/literature/contracts.js.map +0 -1
  115. package/dist/src/literature/fulltext.d.ts +0 -7
  116. package/dist/src/literature/fulltext.js +0 -24
  117. package/dist/src/literature/fulltext.js.map +0 -1
  118. package/dist/src/literature/knowledge-map.d.ts +0 -2
  119. package/dist/src/literature/knowledge-map.js +0 -20
  120. package/dist/src/literature/knowledge-map.js.map +0 -1
  121. package/dist/src/literature/ledger.d.ts +0 -3
  122. package/dist/src/literature/ledger.js +0 -17
  123. package/dist/src/literature/ledger.js.map +0 -1
  124. package/dist/src/literature/metadata.d.ts +0 -6
  125. package/dist/src/literature/metadata.js +0 -32
  126. package/dist/src/literature/metadata.js.map +0 -1
  127. package/dist/src/memory/store.d.ts +0 -22
  128. package/dist/src/memory/store.js +0 -73
  129. package/dist/src/memory/store.js.map +0 -1
  130. package/dist/src/orchestration/contracts.d.ts +0 -61
  131. package/dist/src/orchestration/contracts.js +0 -2
  132. package/dist/src/orchestration/contracts.js.map +0 -1
  133. package/dist/src/orchestration/pi-executor.d.ts +0 -28
  134. package/dist/src/orchestration/pi-executor.js +0 -169
  135. package/dist/src/orchestration/pi-executor.js.map +0 -1
  136. package/dist/src/orchestration/runner.d.ts +0 -196
  137. package/dist/src/orchestration/runner.js +0 -991
  138. package/dist/src/orchestration/runner.js.map +0 -1
  139. package/dist/src/orchestration/scheduler.d.ts +0 -8
  140. package/dist/src/orchestration/scheduler.js +0 -335
  141. package/dist/src/orchestration/scheduler.js.map +0 -1
  142. package/dist/src/panel/events.d.ts +0 -20
  143. package/dist/src/panel/events.js +0 -93
  144. package/dist/src/panel/events.js.map +0 -1
  145. package/dist/src/panel/extension.d.ts +0 -8
  146. package/dist/src/panel/extension.js +0 -114
  147. package/dist/src/panel/extension.js.map +0 -1
  148. package/dist/src/panel/literature-map.d.ts +0 -26
  149. package/dist/src/panel/literature-map.js +0 -34
  150. package/dist/src/panel/literature-map.js.map +0 -1
  151. package/dist/src/panel/projection.d.ts +0 -51
  152. package/dist/src/panel/projection.js +0 -288
  153. package/dist/src/panel/projection.js.map +0 -1
  154. package/dist/src/panel/server.d.ts +0 -46
  155. package/dist/src/panel/server.js +0 -1610
  156. package/dist/src/panel/server.js.map +0 -1
  157. package/dist/src/panel/usage.d.ts +0 -53
  158. package/dist/src/panel/usage.js +0 -150
  159. package/dist/src/panel/usage.js.map +0 -1
  160. package/dist/src/project/bootstrap.d.ts +0 -10
  161. package/dist/src/project/bootstrap.js +0 -83
  162. package/dist/src/project/bootstrap.js.map +0 -1
  163. package/dist/src/project/hitl.d.ts +0 -12
  164. package/dist/src/project/hitl.js +0 -43
  165. package/dist/src/project/hitl.js.map +0 -1
  166. package/dist/src/project/jsonl.d.ts +0 -16
  167. package/dist/src/project/jsonl.js +0 -93
  168. package/dist/src/project/jsonl.js.map +0 -1
  169. package/dist/src/project/manuscript.d.ts +0 -21
  170. package/dist/src/project/manuscript.js +0 -74
  171. package/dist/src/project/manuscript.js.map +0 -1
  172. package/dist/src/project/paths.d.ts +0 -38
  173. package/dist/src/project/paths.js +0 -166
  174. package/dist/src/project/paths.js.map +0 -1
  175. package/dist/src/project/versions.d.ts +0 -10
  176. package/dist/src/project/versions.js +0 -14
  177. package/dist/src/project/versions.js.map +0 -1
  178. package/dist/src/psyclaw-theme.d.ts +0 -88
  179. package/dist/src/psyclaw-theme.js +0 -89
  180. package/dist/src/psyclaw-theme.js.map +0 -1
  181. package/dist/src/research/brief.d.ts +0 -11
  182. package/dist/src/research/brief.js +0 -81
  183. package/dist/src/research/brief.js.map +0 -1
  184. package/dist/src/research/ledger.d.ts +0 -12
  185. package/dist/src/research/ledger.js +0 -43
  186. package/dist/src/research/ledger.js.map +0 -1
  187. package/dist/src/run.d.ts +0 -20
  188. package/dist/src/run.js +0 -34
  189. package/dist/src/run.js.map +0 -1
  190. package/dist/src/setup.d.ts +0 -54
  191. package/dist/src/setup.js +0 -221
  192. package/dist/src/setup.js.map +0 -1
  193. package/dist/src/skills/contracts.d.ts +0 -105
  194. package/dist/src/skills/contracts.js +0 -3
  195. package/dist/src/skills/contracts.js.map +0 -1
  196. package/dist/src/skills/preflight.d.ts +0 -10
  197. package/dist/src/skills/preflight.js +0 -39
  198. package/dist/src/skills/preflight.js.map +0 -1
  199. package/dist/src/skills/registry.d.ts +0 -28
  200. package/dist/src/skills/registry.js +0 -556
  201. package/dist/src/skills/registry.js.map +0 -1
  202. package/dist/src/style/artifact.d.ts +0 -6
  203. package/dist/src/style/artifact.js +0 -61
  204. package/dist/src/style/artifact.js.map +0 -1
  205. package/dist/src/style/cli-ui.d.ts +0 -41
  206. package/dist/src/style/cli-ui.js +0 -119
  207. package/dist/src/style/cli-ui.js.map +0 -1
  208. package/dist/src/style/contracts.d.ts +0 -34
  209. package/dist/src/style/contracts.js +0 -2
  210. package/dist/src/style/contracts.js.map +0 -1
  211. package/dist/src/style/registry.d.ts +0 -16
  212. package/dist/src/style/registry.js +0 -50
  213. package/dist/src/style/registry.js.map +0 -1
  214. package/dist/src/trust/manifest.d.ts +0 -42
  215. package/dist/src/trust/manifest.js +0 -53
  216. package/dist/src/trust/manifest.js.map +0 -1
  217. package/dist/src/trust/sbom.d.ts +0 -54
  218. package/dist/src/trust/sbom.js +0 -77
  219. package/dist/src/trust/sbom.js.map +0 -1
  220. package/dist/src/tui/app.d.ts +0 -3
  221. package/dist/src/tui/app.js +0 -103
  222. package/dist/src/tui/app.js.map +0 -1
  223. package/dist/src/tui/model.d.ts +0 -13
  224. package/dist/src/tui/model.js +0 -25
  225. package/dist/src/tui/model.js.map +0 -1
  226. package/dist/src/updates/check.d.ts +0 -43
  227. package/dist/src/updates/check.js +0 -68
  228. package/dist/src/updates/check.js.map +0 -1
  229. package/dist/src/updates/manifest.d.ts +0 -19
  230. package/dist/src/updates/manifest.js +0 -58
  231. package/dist/src/updates/manifest.js.map +0 -1
  232. package/dist/src/updates/registry.d.ts +0 -21
  233. package/dist/src/updates/registry.js +0 -82
  234. package/dist/src/updates/registry.js.map +0 -1
  235. package/dist/src/updates/skills.d.ts +0 -15
  236. package/dist/src/updates/skills.js +0 -39
  237. package/dist/src/updates/skills.js.map +0 -1
  238. package/dist/src/updates/status.d.ts +0 -7
  239. package/dist/src/updates/status.js +0 -37
  240. package/dist/src/updates/status.js.map +0 -1
  241. package/dist/src/updates/update.d.ts +0 -43
  242. package/dist/src/updates/update.js +0 -126
  243. package/dist/src/updates/update.js.map +0 -1
  244. package/dist/src/wizard.d.ts +0 -7
  245. package/dist/src/wizard.js +0 -90
  246. package/dist/src/wizard.js.map +0 -1
  247. package/dist/src/workflows/analysis-delegation.d.ts +0 -3
  248. package/dist/src/workflows/analysis-delegation.js +0 -96
  249. package/dist/src/workflows/analysis-delegation.js.map +0 -1
  250. package/dist/src/workflows/expert-review-runner.d.ts +0 -29
  251. package/dist/src/workflows/expert-review-runner.js +0 -35
  252. package/dist/src/workflows/expert-review-runner.js.map +0 -1
  253. package/dist/src/workflows/expert-review.d.ts +0 -140
  254. package/dist/src/workflows/expert-review.js +0 -111
  255. package/dist/src/workflows/expert-review.js.map +0 -1
  256. package/dist/src/workflows/institutional-fulltext.d.ts +0 -16
  257. package/dist/src/workflows/institutional-fulltext.js +0 -110
  258. package/dist/src/workflows/institutional-fulltext.js.map +0 -1
  259. package/dist/src/workflows/literature-review.d.ts +0 -3
  260. package/dist/src/workflows/literature-review.js +0 -76
  261. package/dist/src/workflows/literature-review.js.map +0 -1
  262. package/dist/src/workflows/meta-analysis.d.ts +0 -38
  263. package/dist/src/workflows/meta-analysis.js +0 -185
  264. package/dist/src/workflows/meta-analysis.js.map +0 -1
  265. package/dist/src/workflows/publish.d.ts +0 -51
  266. package/dist/src/workflows/publish.js +0 -153
  267. package/dist/src/workflows/publish.js.map +0 -1
  268. package/dist/src/workflows/spec.d.ts +0 -51
  269. package/dist/src/workflows/spec.js +0 -157
  270. package/dist/src/workflows/spec.js.map +0 -1
  271. package/dist/src/workflows/style-contract.d.ts +0 -24
  272. package/dist/src/workflows/style-contract.js +0 -23
  273. package/dist/src/workflows/style-contract.js.map +0 -1
  274. package/dist/src/workflows/writing-review.d.ts +0 -15
  275. package/dist/src/workflows/writing-review.js +0 -82
  276. package/dist/src/workflows/writing-review.js.map +0 -1
  277. package/package.json.psyclaw +0 -21
@@ -1,140 +0,0 @@
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;
@@ -1,111 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"expert-review.js","sourceRoot":"","sources":["../../../src/workflows/expert-review.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
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;
@@ -1,110 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"institutional-fulltext.js","sourceRoot":"","sources":["../../../src/workflows/institutional-fulltext.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { type WorkflowResult, type WorkflowSpec } from "./spec.js";
2
- export declare const literatureReviewSpec: WorkflowSpec;
3
- export declare function runLiteratureReview(root: string): Promise<WorkflowResult>;
@@ -1,76 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"literature-review.js","sourceRoot":"","sources":["../../../src/workflows/literature-review.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
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>;