psyclaw 0.25.2 → 0.26.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 (271) hide show
  1. package/README.md +111 -60
  2. package/{apps → dist/apps}/panel/index.html +50 -28
  3. package/dist/src/adapters/pi/extension.d.ts +19 -0
  4. package/dist/src/adapters/pi/extension.js +735 -0
  5. package/dist/src/adapters/pi/extension.js.map +1 -0
  6. package/dist/src/adapters/pi/model.d.ts +72 -0
  7. package/dist/src/adapters/pi/model.js +152 -0
  8. package/dist/src/adapters/pi/model.js.map +1 -0
  9. package/dist/src/adapters/pi/resources.d.ts +23 -0
  10. package/dist/src/adapters/pi/resources.js +54 -0
  11. package/dist/src/adapters/pi/resources.js.map +1 -0
  12. package/dist/src/adapters/pi/rpc.d.ts +58 -0
  13. package/dist/src/adapters/pi/rpc.js +253 -0
  14. package/dist/src/adapters/pi/rpc.js.map +1 -0
  15. package/dist/src/adapters/pi/session.d.ts +30 -0
  16. package/dist/src/adapters/pi/session.js +64 -0
  17. package/dist/src/adapters/pi/session.js.map +1 -0
  18. package/dist/src/agents/catalog.d.ts +30 -0
  19. package/dist/src/agents/catalog.js +118 -0
  20. package/dist/src/agents/catalog.js.map +1 -0
  21. package/dist/src/agents/discover.d.ts +28 -0
  22. package/dist/src/agents/discover.js +127 -0
  23. package/dist/src/agents/discover.js.map +1 -0
  24. package/dist/src/agents/import.d.ts +67 -0
  25. package/dist/src/agents/import.js +789 -0
  26. package/dist/src/agents/import.js.map +1 -0
  27. package/dist/src/analysis/hooks.d.ts +81 -0
  28. package/dist/src/analysis/hooks.js +139 -0
  29. package/dist/src/analysis/hooks.js.map +1 -0
  30. package/dist/src/analysis/pre-registration.d.ts +18 -0
  31. package/dist/src/analysis/pre-registration.js +86 -0
  32. package/dist/src/analysis/pre-registration.js.map +1 -0
  33. package/dist/src/branding.d.ts +44 -0
  34. package/dist/src/branding.js +128 -0
  35. package/dist/src/branding.js.map +1 -0
  36. package/dist/src/chat.d.ts +16 -0
  37. package/dist/src/chat.js +95 -0
  38. package/dist/src/chat.js.map +1 -0
  39. package/dist/src/cli.d.ts +2 -0
  40. package/dist/src/cli.js +316 -0
  41. package/dist/src/cli.js.map +1 -0
  42. package/dist/src/core/citations.d.ts +44 -0
  43. package/dist/src/core/citations.js +48 -0
  44. package/dist/src/core/citations.js.map +1 -0
  45. package/dist/src/core/contracts.d.ts +119 -0
  46. package/dist/src/core/contracts.js +2 -0
  47. package/dist/src/core/contracts.js.map +1 -0
  48. package/dist/src/core/docx.d.ts +11 -0
  49. package/dist/src/core/docx.js +46 -0
  50. package/dist/src/core/docx.js.map +1 -0
  51. package/dist/src/core/doi.d.ts +41 -0
  52. package/dist/src/core/doi.js +82 -0
  53. package/dist/src/core/doi.js.map +1 -0
  54. package/dist/src/core/evidence-policy.d.ts +24 -0
  55. package/dist/src/core/evidence-policy.js +308 -0
  56. package/dist/src/core/evidence-policy.js.map +1 -0
  57. package/dist/src/core/filekind.d.ts +15 -0
  58. package/dist/src/core/filekind.js +82 -0
  59. package/dist/src/core/filekind.js.map +1 -0
  60. package/dist/src/core/hash.d.ts +2 -0
  61. package/dist/src/core/hash.js +17 -0
  62. package/dist/src/core/hash.js.map +1 -0
  63. package/dist/src/core/pricing.d.ts +38 -0
  64. package/dist/src/core/pricing.js +110 -0
  65. package/dist/src/core/pricing.js.map +1 -0
  66. package/dist/src/core/redact.d.ts +12 -0
  67. package/dist/src/core/redact.js +48 -0
  68. package/dist/src/core/redact.js.map +1 -0
  69. package/dist/src/core/references.d.ts +55 -0
  70. package/dist/src/core/references.js +102 -0
  71. package/dist/src/core/references.js.map +1 -0
  72. package/dist/src/core/schemas.d.ts +162 -0
  73. package/dist/src/core/schemas.js +160 -0
  74. package/dist/src/core/schemas.js.map +1 -0
  75. package/dist/src/extension.d.ts +1 -0
  76. package/dist/src/extension.js +2 -0
  77. package/dist/src/extension.js.map +1 -0
  78. package/dist/src/index.d.ts +72 -0
  79. package/dist/src/index.js +73 -0
  80. package/dist/src/index.js.map +1 -0
  81. package/dist/src/install/installer.d.ts +147 -0
  82. package/dist/src/install/installer.js +721 -0
  83. package/dist/src/install/installer.js.map +1 -0
  84. package/dist/src/integrations/contracts.d.ts +35 -0
  85. package/dist/src/integrations/contracts.js +27 -0
  86. package/dist/src/integrations/contracts.js.map +1 -0
  87. package/dist/src/integrations/mcp.d.ts +155 -0
  88. package/dist/src/integrations/mcp.js +826 -0
  89. package/dist/src/integrations/mcp.js.map +1 -0
  90. package/dist/src/knowledge-map/contracts.d.ts +20 -0
  91. package/dist/src/knowledge-map/contracts.js +2 -0
  92. package/dist/src/knowledge-map/contracts.js.map +1 -0
  93. package/dist/src/knowledge-map/index.d.ts +4 -0
  94. package/dist/src/knowledge-map/index.js +39 -0
  95. package/dist/src/knowledge-map/index.js.map +1 -0
  96. package/dist/src/literature/contracts.d.ts +106 -0
  97. package/dist/src/literature/contracts.js +2 -0
  98. package/dist/src/literature/contracts.js.map +1 -0
  99. package/dist/src/literature/fulltext.d.ts +7 -0
  100. package/dist/src/literature/fulltext.js +24 -0
  101. package/dist/src/literature/fulltext.js.map +1 -0
  102. package/dist/src/literature/knowledge-map.d.ts +2 -0
  103. package/dist/src/literature/knowledge-map.js +20 -0
  104. package/dist/src/literature/knowledge-map.js.map +1 -0
  105. package/dist/src/literature/ledger.d.ts +3 -0
  106. package/dist/src/literature/ledger.js +17 -0
  107. package/dist/src/literature/ledger.js.map +1 -0
  108. package/dist/src/literature/metadata.d.ts +6 -0
  109. package/dist/src/literature/metadata.js +32 -0
  110. package/dist/src/literature/metadata.js.map +1 -0
  111. package/dist/src/memory/store.d.ts +22 -0
  112. package/dist/src/memory/store.js +73 -0
  113. package/dist/src/memory/store.js.map +1 -0
  114. package/dist/src/orchestration/contracts.d.ts +61 -0
  115. package/dist/src/orchestration/contracts.js +2 -0
  116. package/dist/src/orchestration/contracts.js.map +1 -0
  117. package/dist/src/orchestration/pi-executor.d.ts +28 -0
  118. package/dist/src/orchestration/pi-executor.js +169 -0
  119. package/dist/src/orchestration/pi-executor.js.map +1 -0
  120. package/dist/src/orchestration/runner.d.ts +196 -0
  121. package/dist/src/orchestration/runner.js +991 -0
  122. package/dist/src/orchestration/runner.js.map +1 -0
  123. package/dist/src/orchestration/scheduler.d.ts +8 -0
  124. package/dist/src/orchestration/scheduler.js +335 -0
  125. package/dist/src/orchestration/scheduler.js.map +1 -0
  126. package/dist/src/panel/events.d.ts +20 -0
  127. package/dist/src/panel/events.js +93 -0
  128. package/dist/src/panel/events.js.map +1 -0
  129. package/dist/src/panel/extension.d.ts +8 -0
  130. package/dist/src/panel/extension.js +115 -0
  131. package/dist/src/panel/extension.js.map +1 -0
  132. package/dist/src/panel/literature-map.d.ts +26 -0
  133. package/dist/src/panel/literature-map.js +34 -0
  134. package/dist/src/panel/literature-map.js.map +1 -0
  135. package/dist/src/panel/projection.d.ts +51 -0
  136. package/dist/src/panel/projection.js +288 -0
  137. package/dist/src/panel/projection.js.map +1 -0
  138. package/dist/src/panel/server.d.ts +46 -0
  139. package/dist/src/panel/server.js +1610 -0
  140. package/dist/src/panel/server.js.map +1 -0
  141. package/dist/src/panel/usage.d.ts +53 -0
  142. package/dist/src/panel/usage.js +150 -0
  143. package/dist/src/panel/usage.js.map +1 -0
  144. package/dist/src/project/bootstrap.d.ts +10 -0
  145. package/dist/src/project/bootstrap.js +83 -0
  146. package/dist/src/project/bootstrap.js.map +1 -0
  147. package/dist/src/project/hitl.d.ts +12 -0
  148. package/dist/src/project/hitl.js +43 -0
  149. package/dist/src/project/hitl.js.map +1 -0
  150. package/dist/src/project/jsonl.d.ts +16 -0
  151. package/dist/src/project/jsonl.js +93 -0
  152. package/dist/src/project/jsonl.js.map +1 -0
  153. package/dist/src/project/manuscript.d.ts +21 -0
  154. package/dist/src/project/manuscript.js +74 -0
  155. package/dist/src/project/manuscript.js.map +1 -0
  156. package/dist/src/project/paths.d.ts +38 -0
  157. package/dist/src/project/paths.js +166 -0
  158. package/dist/src/project/paths.js.map +1 -0
  159. package/dist/src/project/versions.d.ts +10 -0
  160. package/dist/src/project/versions.js +14 -0
  161. package/dist/src/project/versions.js.map +1 -0
  162. package/dist/src/psyclaw-theme.d.ts +88 -0
  163. package/dist/src/psyclaw-theme.js +89 -0
  164. package/dist/src/psyclaw-theme.js.map +1 -0
  165. package/dist/src/research/brief.d.ts +11 -0
  166. package/dist/src/research/brief.js +81 -0
  167. package/dist/src/research/brief.js.map +1 -0
  168. package/dist/src/research/ledger.d.ts +12 -0
  169. package/dist/src/research/ledger.js +43 -0
  170. package/dist/src/research/ledger.js.map +1 -0
  171. package/dist/src/run.d.ts +20 -0
  172. package/dist/src/run.js +34 -0
  173. package/dist/src/run.js.map +1 -0
  174. package/dist/src/setup.d.ts +54 -0
  175. package/dist/src/setup.js +221 -0
  176. package/dist/src/setup.js.map +1 -0
  177. package/dist/src/skills/contracts.d.ts +105 -0
  178. package/dist/src/skills/contracts.js +3 -0
  179. package/dist/src/skills/contracts.js.map +1 -0
  180. package/dist/src/skills/preflight.d.ts +10 -0
  181. package/dist/src/skills/preflight.js +39 -0
  182. package/dist/src/skills/preflight.js.map +1 -0
  183. package/dist/src/skills/registry.d.ts +28 -0
  184. package/dist/src/skills/registry.js +540 -0
  185. package/dist/src/skills/registry.js.map +1 -0
  186. package/dist/src/style/artifact.d.ts +6 -0
  187. package/dist/src/style/artifact.js +61 -0
  188. package/dist/src/style/artifact.js.map +1 -0
  189. package/dist/src/style/cli-ui.d.ts +41 -0
  190. package/dist/src/style/cli-ui.js +119 -0
  191. package/dist/src/style/cli-ui.js.map +1 -0
  192. package/dist/src/style/contracts.d.ts +34 -0
  193. package/dist/src/style/contracts.js +2 -0
  194. package/dist/src/style/contracts.js.map +1 -0
  195. package/dist/src/style/registry.d.ts +16 -0
  196. package/dist/src/style/registry.js +50 -0
  197. package/dist/src/style/registry.js.map +1 -0
  198. package/dist/src/trust/manifest.d.ts +42 -0
  199. package/dist/src/trust/manifest.js +53 -0
  200. package/dist/src/trust/manifest.js.map +1 -0
  201. package/dist/src/trust/sbom.d.ts +54 -0
  202. package/dist/src/trust/sbom.js +77 -0
  203. package/dist/src/trust/sbom.js.map +1 -0
  204. package/dist/src/tui/app.d.ts +3 -0
  205. package/dist/src/tui/app.js +103 -0
  206. package/dist/src/tui/app.js.map +1 -0
  207. package/dist/src/tui/model.d.ts +13 -0
  208. package/dist/src/tui/model.js +25 -0
  209. package/dist/src/tui/model.js.map +1 -0
  210. package/dist/src/updates/check.d.ts +43 -0
  211. package/dist/src/updates/check.js +68 -0
  212. package/dist/src/updates/check.js.map +1 -0
  213. package/dist/src/updates/manifest.d.ts +19 -0
  214. package/dist/src/updates/manifest.js +58 -0
  215. package/dist/src/updates/manifest.js.map +1 -0
  216. package/dist/src/updates/registry.d.ts +21 -0
  217. package/dist/src/updates/registry.js +82 -0
  218. package/dist/src/updates/registry.js.map +1 -0
  219. package/dist/src/updates/skills.d.ts +15 -0
  220. package/dist/src/updates/skills.js +39 -0
  221. package/dist/src/updates/skills.js.map +1 -0
  222. package/dist/src/updates/status.d.ts +7 -0
  223. package/dist/src/updates/status.js +37 -0
  224. package/dist/src/updates/status.js.map +1 -0
  225. package/dist/src/updates/update.d.ts +43 -0
  226. package/dist/src/updates/update.js +128 -0
  227. package/dist/src/updates/update.js.map +1 -0
  228. package/dist/src/wizard.d.ts +7 -0
  229. package/dist/src/wizard.js +90 -0
  230. package/dist/src/wizard.js.map +1 -0
  231. package/dist/src/workflows/analysis-delegation.d.ts +3 -0
  232. package/dist/src/workflows/analysis-delegation.js +96 -0
  233. package/dist/src/workflows/analysis-delegation.js.map +1 -0
  234. package/dist/src/workflows/expert-review-runner.d.ts +29 -0
  235. package/dist/src/workflows/expert-review-runner.js +35 -0
  236. package/dist/src/workflows/expert-review-runner.js.map +1 -0
  237. package/dist/src/workflows/expert-review.d.ts +140 -0
  238. package/dist/src/workflows/expert-review.js +111 -0
  239. package/dist/src/workflows/expert-review.js.map +1 -0
  240. package/dist/src/workflows/institutional-fulltext.d.ts +16 -0
  241. package/dist/src/workflows/institutional-fulltext.js +110 -0
  242. package/dist/src/workflows/institutional-fulltext.js.map +1 -0
  243. package/dist/src/workflows/literature-review.d.ts +3 -0
  244. package/dist/src/workflows/literature-review.js +76 -0
  245. package/dist/src/workflows/literature-review.js.map +1 -0
  246. package/dist/src/workflows/meta-analysis.d.ts +38 -0
  247. package/dist/src/workflows/meta-analysis.js +185 -0
  248. package/dist/src/workflows/meta-analysis.js.map +1 -0
  249. package/dist/src/workflows/publish.d.ts +51 -0
  250. package/dist/src/workflows/publish.js +153 -0
  251. package/dist/src/workflows/publish.js.map +1 -0
  252. package/dist/src/workflows/spec.d.ts +51 -0
  253. package/dist/src/workflows/spec.js +157 -0
  254. package/dist/src/workflows/spec.js.map +1 -0
  255. package/dist/src/workflows/style-contract.d.ts +24 -0
  256. package/dist/src/workflows/style-contract.js +23 -0
  257. package/dist/src/workflows/style-contract.js.map +1 -0
  258. package/dist/src/workflows/writing-review.d.ts +15 -0
  259. package/dist/src/workflows/writing-review.js +82 -0
  260. package/dist/src/workflows/writing-review.js.map +1 -0
  261. package/package.json +20 -8
  262. package/scripts/rebrand-pi.mjs +3 -3
  263. package/scripts/__pycache__/build_dist.cpython-314.pyc +0 -0
  264. package/scripts/__pycache__/build_whitepaper_docx.cpython-314.pyc +0 -0
  265. package/scripts/build_preprint_docx.py +0 -729
  266. package/scripts/build_preprint_figures.py +0 -238
  267. package/scripts/build_three_line_table_fixture.py +0 -56
  268. package/scripts/build_whitepaper_docx.py +0 -768
  269. package/scripts/check-branding.mjs +0 -159
  270. package/scripts/copy-panel.mjs +0 -11
  271. package/scripts/verify_docx.py +0 -41
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Generation-time manuscript publishing with versioning (convention:
3
+ * docs/文档规范.md).
4
+ *
5
+ * paper/<name>.md latest editable Markdown source
6
+ * paper/<name>_APA7.docx latest APA-7 DOCX export
7
+ * paper/archive/<name>_v{n}.md archived previous versions
8
+ * .psyclaw/versions.jsonl version allocation (allocateProjectVersion,
9
+ * kind "manuscript")
10
+ * .psyclaw/publish.jsonl published-version records (idempotent by sha)
11
+ *
12
+ * Re-publishing identical content is a no-op (no new version); changed content
13
+ * archives the previous files and bumps the version. Both files are registered
14
+ * in the evidence ledger with their SHA-256 fingerprints.
15
+ */
16
+ /** A published manuscript version (one record per publish). */
17
+ export interface PublishedVersion {
18
+ schemaVersion: "psyclaw/publish/v1";
19
+ version: number;
20
+ name: string;
21
+ markdownPath: string;
22
+ docxPath: string | null;
23
+ markdownSha256: string;
24
+ docxSha256: string | null;
25
+ sourcePath: string | null;
26
+ publishedAt: string;
27
+ }
28
+ export declare function readPublishedVersions(root: string): Promise<PublishedVersion[]>;
29
+ /** Find a black-and-white reference document (paper/apa7-bw-reference.docx or similar). */
30
+ export declare function findReferenceDoc(root: string): Promise<string | null>;
31
+ export interface PublishOptions {
32
+ /** Base file name, e.g. "论文初稿" (default). */
33
+ name?: string;
34
+ /** Manuscript source (Markdown). If omitted, the discovered manuscript is used. */
35
+ markdown?: string;
36
+ /** Export the APA-7 DOCX (default true). */
37
+ exportDocx?: boolean;
38
+ }
39
+ export interface PublishResult {
40
+ schemaVersion: "psyclaw/publish/v1";
41
+ version: number;
42
+ name: string;
43
+ markdownPath: string;
44
+ docxPath: string | null;
45
+ markdownSha256: string;
46
+ docxSha256: string | null;
47
+ evidenceIds: string[];
48
+ sourcePath: string | null;
49
+ publishedAt: string;
50
+ }
51
+ export declare function publishManuscript(root: string, options?: PublishOptions): Promise<PublishResult>;
@@ -0,0 +1,153 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { lstat, readFile, readdir } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { markdownToDocx } from "../core/docx.js";
5
+ import { sha256File, sha256Text } from "../core/hash.js";
6
+ import { atomicWriteFile, appendJsonlIfMissing, readJsonl } from "../project/jsonl.js";
7
+ import { assertSafeProjectPath, projectPaths } from "../project/paths.js";
8
+ import { readManuscript } from "../project/manuscript.js";
9
+ import { allocateProjectVersion } from "../project/versions.js";
10
+ export async function readPublishedVersions(root) {
11
+ return readJsonl(await assertSafeProjectPath(root, ".psyclaw/publish.jsonl"));
12
+ }
13
+ async function archiveFile(root, sourceRel, targetRel) {
14
+ try {
15
+ const source = await assertSafeProjectPath(root, sourceRel);
16
+ const contents = await readFile(source, "utf8");
17
+ await atomicWriteFile(await assertSafeProjectPath(root, targetRel), contents);
18
+ }
19
+ catch { /* nothing to archive */ }
20
+ }
21
+ /** Find a black-and-white reference document (paper/apa7-bw-reference.docx or similar). */
22
+ export async function findReferenceDoc(root) {
23
+ let entries = [];
24
+ try {
25
+ entries = await readdir(join(root, "paper"), { withFileTypes: true });
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ for (const entry of entries) {
31
+ if (!entry.isFile() || !/\.docx$/i.test(entry.name))
32
+ continue;
33
+ if (/reference|模板|template/i.test(entry.name)) {
34
+ const path = `paper/${entry.name}`;
35
+ const stat = await lstat(await assertSafeProjectPath(root, path)).catch(() => undefined);
36
+ if (stat?.isFile())
37
+ return path;
38
+ }
39
+ }
40
+ return null;
41
+ }
42
+ export async function publishManuscript(root, options = {}) {
43
+ const name = (options.name ?? "论文初稿").trim().replace(/\.(md|docx)$/i, "");
44
+ if (!name)
45
+ throw new Error("manuscript name is required");
46
+ const exportDocx = options.exportDocx ?? true;
47
+ const existing = await readManuscript(root);
48
+ const sourcePath = existing.exists ? existing.path : null;
49
+ const markdown = options.markdown ?? existing.markdown;
50
+ if (!markdown.trim()) {
51
+ throw new Error("没有可发布的手稿内容:请先在编辑器写入内容,或先运行工作流生成论文初稿");
52
+ }
53
+ const markdownPath = `paper/${name}.md`;
54
+ const markdownTarget = await assertSafeProjectPath(root, markdownPath);
55
+ const written = markdown.endsWith("\n") ? markdown : `${markdown}\n`;
56
+ const markdownSha256 = sha256Text(written);
57
+ const published = await readPublishedVersions(root);
58
+ const last = published.at(-1);
59
+ if (last && last.markdownSha256 === markdownSha256) {
60
+ // Re-publishing identical content is a no-op: no new version, no rewrite.
61
+ return {
62
+ schemaVersion: "psyclaw/publish/v1",
63
+ version: last.version,
64
+ name: last.name,
65
+ markdownPath: last.markdownPath,
66
+ docxPath: last.docxPath,
67
+ markdownSha256,
68
+ docxSha256: last.docxSha256,
69
+ evidenceIds: [],
70
+ sourcePath,
71
+ publishedAt: last.publishedAt,
72
+ };
73
+ }
74
+ // Archive the current files under the version they were last published as.
75
+ if (last) {
76
+ await archiveFile(root, markdownPath, `paper/archive/${name}_v${last.version}.md`);
77
+ if (last.docxPath)
78
+ await archiveFile(root, last.docxPath, `paper/archive/${name}_v${last.version}_APA7.docx`);
79
+ }
80
+ // Allocate the next manuscript version through the shared project allocator.
81
+ const runId = `publish_${randomUUID().replaceAll("-", "")}`;
82
+ const versionLabel = await allocateProjectVersion(root, "manuscript", runId);
83
+ const version = Number(versionLabel.replace(/^v/i, ""));
84
+ await atomicWriteFile(markdownTarget, written);
85
+ const evidenceIds = [];
86
+ const recordEvidence = async (path, sha256) => {
87
+ const id = `evidence_${sha256.slice(0, 16)}`;
88
+ // Idempotent by evidence id: publishing and importing the same file must
89
+ // not create duplicate ledger entries.
90
+ await appendJsonlIfMissing(projectPaths(root).evidence, {
91
+ id,
92
+ source: { kind: "file", locator: path, title: path.split("/").pop() ?? path },
93
+ level: "fulltext",
94
+ retrievedAt: new Date().toISOString(),
95
+ sha256,
96
+ accessStatus: "partial",
97
+ locators: [{ kind: "file", value: path }],
98
+ }, (item) => item.id);
99
+ return id;
100
+ };
101
+ evidenceIds.push(await recordEvidence(markdownPath, markdownSha256));
102
+ let docxPath = null;
103
+ let docxSha256 = null;
104
+ if (exportDocx) {
105
+ docxPath = `paper/${name}_APA7.docx`;
106
+ const docxTarget = await assertSafeProjectPath(root, docxPath);
107
+ const referenceDoc = await findReferenceDoc(root);
108
+ const referenceTarget = referenceDoc ? await assertSafeProjectPath(root, referenceDoc) : undefined;
109
+ await markdownToDocx(markdownTarget, docxTarget, referenceTarget);
110
+ docxSha256 = await sha256File(docxTarget);
111
+ evidenceIds.push(await recordEvidence(docxPath, docxSha256));
112
+ }
113
+ const publishedAt = new Date().toISOString();
114
+ const versionRecord = {
115
+ schemaVersion: "psyclaw/publish/v1",
116
+ version,
117
+ name,
118
+ markdownPath,
119
+ docxPath,
120
+ markdownSha256,
121
+ docxSha256,
122
+ sourcePath,
123
+ publishedAt,
124
+ };
125
+ await appendJsonlIfMissing(await assertSafeProjectPath(root, ".psyclaw/publish.jsonl"), versionRecord, (record) => record.markdownSha256);
126
+ const result = {
127
+ schemaVersion: "psyclaw/publish/v1",
128
+ version,
129
+ name,
130
+ markdownPath,
131
+ docxPath,
132
+ markdownSha256,
133
+ docxSha256,
134
+ evidenceIds,
135
+ sourcePath,
136
+ publishedAt,
137
+ };
138
+ const receipt = {
139
+ schemaVersion: "psyclaw/tool-receipt/v1",
140
+ runId,
141
+ taskId: "workflow.publish.manuscript",
142
+ tool: "workflow.publish.manuscript",
143
+ effect: "write",
144
+ approval: "approved",
145
+ idempotencyKey: `publish:${markdownSha256}`,
146
+ ok: true,
147
+ startedAt: publishedAt,
148
+ finishedAt: publishedAt,
149
+ };
150
+ await atomicWriteFile(await assertSafeProjectPath(root, `.psyclaw/manifests/${runId}.receipt.json`), `${JSON.stringify(receipt, null, 2)}\n`);
151
+ return result;
152
+ }
153
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/workflows/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { GateResult, Handoff, ResearchParadigm } from "../core/contracts.js";
2
+ export declare const WORKFLOW_SCHEMA: "psyclaw/workflow/v1";
3
+ export type WorkflowRole = "researcher" | "analyst" | "critic" | "writer" | "verifier";
4
+ export type WorkflowEffect = "read" | "write";
5
+ export interface WorkflowStep {
6
+ id: string;
7
+ role: WorkflowRole;
8
+ effect: WorkflowEffect;
9
+ description: string;
10
+ }
11
+ export interface WorkflowSpec {
12
+ id: string;
13
+ version: string;
14
+ description: string;
15
+ paradigms: readonly ResearchParadigm[];
16
+ steps: readonly WorkflowStep[];
17
+ requiredArtifacts: readonly string[];
18
+ }
19
+ export interface WorkflowOutputRecord {
20
+ path: string;
21
+ sha256: string;
22
+ artifactVersion: string;
23
+ format: "json" | "markdown" | "text" | "unknown";
24
+ status: "verified" | "draft-blocked";
25
+ }
26
+ export interface WorkflowResult {
27
+ runId: string;
28
+ workflowId: string;
29
+ verdict: "pass" | "blocked";
30
+ gates: GateResult[];
31
+ outputPaths: string[];
32
+ manifestPath: string;
33
+ verdictPath: string;
34
+ outputIndexPath: string;
35
+ handoff: Handoff;
36
+ }
37
+ export declare const allParadigms: readonly ResearchParadigm[];
38
+ /**
39
+ * Shared tail for every workflow pack. Outputs are written to safe project
40
+ * paths, the spec's required artifacts are actually checked, every output is
41
+ * SHA-pinned with a workflow version and input fingerprint, and `completed`
42
+ * is emitted only after outputs, manifest, and verdict are all on disk.
43
+ */
44
+ export declare function finalizeWorkflow(root: string, workflow: WorkflowSpec, options: {
45
+ gates: GateResult[];
46
+ outputs: {
47
+ path: string;
48
+ contents: string;
49
+ }[];
50
+ completed: string[];
51
+ }): Promise<WorkflowResult>;
@@ -0,0 +1,157 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { mkdir } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { sha256Text } from "../core/hash.js";
5
+ import { assertSafeProjectPath, projectPaths } from "../project/paths.js";
6
+ import { writeHandoff } from "../project/bootstrap.js";
7
+ import { atomicWriteFile } from "../project/jsonl.js";
8
+ import { readProject } from "../research/ledger.js";
9
+ import { RunEventLog } from "../panel/events.js";
10
+ export const WORKFLOW_SCHEMA = "psyclaw/workflow/v1";
11
+ const ALL_PARADIGMS = [
12
+ "survey-observational",
13
+ "qualitative-thematic",
14
+ "experimental",
15
+ "quasi-experimental",
16
+ "longitudinal-panel",
17
+ "meta-analysis",
18
+ "ethnographic",
19
+ "historical-documentary",
20
+ "policy-legal",
21
+ "mixed-methods",
22
+ ];
23
+ export const allParadigms = ALL_PARADIGMS;
24
+ /**
25
+ * Reject a workflow output path before it is resolved, so a `..` segment or
26
+ * drive/ADS form cannot be collapsed away before the containment check.
27
+ */
28
+ async function safeOutputPath(root, outputPath) {
29
+ const normalized = outputPath.trim().replaceAll("\\", "/");
30
+ if (normalized.length === 0 ||
31
+ normalized.startsWith("/") ||
32
+ /^[a-z]:/.test(normalized) ||
33
+ normalized.includes("\0") ||
34
+ normalized.split("/").some((segment) => segment === ".." || segment === "")) {
35
+ throw new Error(`unsafe output path: ${outputPath}`);
36
+ }
37
+ return assertSafeProjectPath(root, join("outputs", normalized));
38
+ }
39
+ /**
40
+ * Shared tail for every workflow pack. Outputs are written to safe project
41
+ * paths, the spec's required artifacts are actually checked, every output is
42
+ * SHA-pinned with a workflow version and input fingerprint, and `completed`
43
+ * is emitted only after outputs, manifest, and verdict are all on disk.
44
+ */
45
+ export async function finalizeWorkflow(root, workflow, options) {
46
+ const paths = projectPaths(root);
47
+ const project = await readProject(root);
48
+ const runId = `run_${randomUUID().replaceAll("-", "")}`;
49
+ const gates = [...options.gates];
50
+ const eventLog = new RunEventLog(root, runId);
51
+ const eventAt = new Date().toISOString();
52
+ // planned first; any later failure only ever emits blocked/unknown.
53
+ await eventLog.append({ type: "planned", at: eventAt });
54
+ await mkdir(paths.manifests, { recursive: true });
55
+ await mkdir(paths.outputs, { recursive: true });
56
+ const outputPaths = [];
57
+ const outputRecords = [];
58
+ const artifactVersion = workflow.version;
59
+ const formatOf = (path) => {
60
+ const lower = path.toLowerCase();
61
+ if (lower.endsWith(".json"))
62
+ return "json";
63
+ if (lower.endsWith(".md") || lower.endsWith(".markdown"))
64
+ return "markdown";
65
+ if (lower.endsWith(".txt"))
66
+ return "text";
67
+ return "unknown";
68
+ };
69
+ for (const output of options.outputs) {
70
+ const target = await safeOutputPath(paths.root, output.path);
71
+ await atomicWriteFile(target, output.contents);
72
+ outputPaths.push(target);
73
+ outputRecords.push({ path: output.path, sha256: sha256Text(output.contents), artifactVersion, format: formatOf(output.path), status: "draft-blocked" });
74
+ }
75
+ // The spec's required artifacts must actually be produced.
76
+ for (const required of workflow.requiredArtifacts) {
77
+ if (!outputRecords.some((record) => record.path === required)) {
78
+ gates.push({
79
+ gateId: "workflow:missing-artifact",
80
+ ok: false,
81
+ severity: "block",
82
+ reason: `required artifact not produced: ${required}`,
83
+ });
84
+ }
85
+ }
86
+ const blocked = gates.filter((gate) => !gate.ok);
87
+ for (const gate of gates)
88
+ await eventLog.append({ type: "gate", at: eventAt, message: gate.reason });
89
+ const verifiedRecords = outputRecords.map((record) => ({
90
+ ...record,
91
+ status: blocked.length === 0 ? "verified" : "draft-blocked",
92
+ }));
93
+ const manifestPath = join(paths.manifests, `${runId}.json`);
94
+ const manifest = {
95
+ schemaVersion: "psyclaw/workflow-manifest/v1",
96
+ workflow: workflow.id,
97
+ workflowVersion: workflow.version,
98
+ runId,
99
+ inputDigest: sha256Text(`${project.goal}\u0000${project.paradigm}`),
100
+ outputs: verifiedRecords,
101
+ gates,
102
+ generatedAt: new Date().toISOString(),
103
+ };
104
+ await atomicWriteFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
105
+ const verdictPath = join(paths.manifests, `${runId}.verdict.json`);
106
+ const verdict = {
107
+ schemaVersion: "psyclaw/verdict/v1",
108
+ runId,
109
+ verdict: blocked.length === 0 ? "pass" : "blocked",
110
+ workflow: workflow.id,
111
+ manifestPath,
112
+ gateCount: gates.length,
113
+ blockedGateCount: blocked.length,
114
+ generatedAt: new Date().toISOString(),
115
+ };
116
+ await atomicWriteFile(verdictPath, `${JSON.stringify(verdict, null, 2)}\n`);
117
+ const outputIndexPath = await assertSafeProjectPath(root, "outputs/index.json");
118
+ await atomicWriteFile(outputIndexPath, `${JSON.stringify({
119
+ schemaVersion: "psyclaw/output-index/v1",
120
+ runId,
121
+ workflow: workflow.id,
122
+ workflowVersion: workflow.version,
123
+ artifacts: verifiedRecords,
124
+ generatedAt: new Date().toISOString(),
125
+ }, null, 2)}\n`);
126
+ const handoff = await writeHandoff(root, {
127
+ projectId: project.id,
128
+ runId,
129
+ goal: project.goal,
130
+ completed: options.completed,
131
+ verified: blocked.length === 0
132
+ ? ["outputs", "output index", "manifest", "verdict"]
133
+ : ["manifest", "verdict"],
134
+ blocked: blocked.map((gate) => gate.reason),
135
+ nextSteps: blocked.length === 0 ? ["human review before external use"] : ["resolve blocked workflow gates"],
136
+ verificationCommands: ["pnpm typecheck", "pnpm test"],
137
+ generatedAt: new Date().toISOString(),
138
+ });
139
+ // completed/blocked is emitted last, only after every artifact is on disk.
140
+ await eventLog.append({
141
+ type: blocked.length === 0 ? "completed" : "blocked",
142
+ at: eventAt,
143
+ message: blocked.length === 0 ? `${workflow.id} completed` : `${workflow.id} blocked`,
144
+ });
145
+ return {
146
+ runId,
147
+ workflowId: workflow.id,
148
+ verdict: blocked.length === 0 ? "pass" : "blocked",
149
+ gates,
150
+ outputPaths,
151
+ manifestPath,
152
+ verdictPath,
153
+ outputIndexPath,
154
+ handoff,
155
+ };
156
+ }
157
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../src/workflows/spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type StyleArtifactKind = "manuscript" | "figure" | "table";
2
+ export interface JournalStyleProfile {
3
+ schemaVersion: "psyclaw/journal-style/v1";
4
+ journal: string;
5
+ source: string;
6
+ ref: string;
7
+ version: string;
8
+ license?: string;
9
+ rules: Record<string, string | number | boolean>;
10
+ }
11
+ export interface StyleArtifactContract {
12
+ schemaVersion: "psyclaw/style-artifact/v1";
13
+ kind: StyleArtifactKind;
14
+ id: string;
15
+ version: string;
16
+ format: string;
17
+ profile: string;
18
+ sourceHash?: string;
19
+ scriptPath?: string;
20
+ inputHash?: string;
21
+ }
22
+ export declare const defaultJournalStyle: JournalStyleProfile;
23
+ export declare function validateStyleArtifact(value: StyleArtifactContract): StyleArtifactContract;
24
+ export declare function resolveJournalStyle(profile?: JournalStyleProfile): JournalStyleProfile;
@@ -0,0 +1,23 @@
1
+ export const defaultJournalStyle = {
2
+ schemaVersion: "psyclaw/journal-style/v1",
3
+ journal: "default-scientific",
4
+ source: "psyclaw-built-in",
5
+ ref: "default-v1",
6
+ version: "1.0.0",
7
+ rules: { citations: "author-year-or-numbered", figureFormat: "png-or-pdf", tableFormat: "tsv-or-csv", discloseUncertainty: true },
8
+ };
9
+ export function validateStyleArtifact(value) {
10
+ if (value.schemaVersion !== "psyclaw/style-artifact/v1" || !value.id || !value.version || !value.format || !value.profile)
11
+ throw new Error("invalid psyclaw/style-artifact/v1");
12
+ if ((value.kind === "figure" || value.kind === "table") && (!value.scriptPath || !value.inputHash))
13
+ throw new Error("data-derived figures and tables require scriptPath and inputHash");
14
+ return value;
15
+ }
16
+ export function resolveJournalStyle(profile) {
17
+ if (!profile)
18
+ return defaultJournalStyle;
19
+ if (profile.schemaVersion !== "psyclaw/journal-style/v1" || !profile.source || !profile.ref || !profile.version || !profile.license)
20
+ throw new Error("journal profile requires source, ref, version, and license");
21
+ return profile;
22
+ }
23
+ //# sourceMappingURL=style-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-contract.js","sourceRoot":"","sources":["../../../src/workflows/style-contract.ts"],"names":[],"mappings":"AAwBA,MAAM,CAAC,MAAM,mBAAmB,GAAwB;IACtD,aAAa,EAAE,0BAA0B;IACzC,OAAO,EAAE,oBAAoB;IAC7B,MAAM,EAAE,kBAAkB;IAC1B,GAAG,EAAE,YAAY;IACjB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,EAAE,SAAS,EAAE,yBAAyB,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,IAAI,EAAE;CAClI,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,KAA4B;IAChE,IAAI,KAAK,CAAC,aAAa,KAAK,2BAA2B,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAChL,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACxL,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,IAAI,CAAC,OAAO;QAAE,OAAO,mBAAmB,CAAC;IACzC,IAAI,OAAO,CAAC,aAAa,KAAK,0BAA0B,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IACnN,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type WorkflowResult, type WorkflowSpec } from "./spec.js";
2
+ export declare const writingReviewSpec: WorkflowSpec;
3
+ export interface ReviewFinding {
4
+ severity: "block" | "warn";
5
+ rule: string;
6
+ claimId?: string;
7
+ message: string;
8
+ }
9
+ export interface ReviewSuggestion {
10
+ severity: "block" | "warn";
11
+ rule: string;
12
+ claimId?: string;
13
+ suggestion: string;
14
+ }
15
+ export declare function runWritingReview(root: string): Promise<WorkflowResult>;
@@ -0,0 +1,82 @@
1
+ import { checkEvidenceSufficiency } from "../core/evidence-policy.js";
2
+ import { loadLedger, readProject } from "../research/ledger.js";
3
+ import { allParadigms, finalizeWorkflow } from "./spec.js";
4
+ import { allocateProjectVersion } from "../project/versions.js";
5
+ export const writingReviewSpec = {
6
+ id: "writing-review",
7
+ version: "1.0.0",
8
+ description: "Audit drafted claims against evidence, honesty, and causal-language rules.",
9
+ paradigms: allParadigms,
10
+ steps: [
11
+ { id: "read", role: "verifier", effect: "read", description: "load claims and evidence" },
12
+ { id: "check", role: "critic", effect: "read", description: "honesty and causal-language heuristics" },
13
+ { id: "write", role: "writer", effect: "write", description: "write findings report" },
14
+ ],
15
+ requiredArtifacts: ["writing-review.md", "review-findings.json", "review-suggestions.json"],
16
+ };
17
+ const CAUSAL_PATTERN = /\b(?:causes?|leads? to|determines?|increases?|decreases?|drives?|improves?)\b/i;
18
+ const CONFIRMATORY_PATTERN = /\b(?:proves?|proven|established)\b/i;
19
+ export async function runWritingReview(root) {
20
+ const project = await readProject(root);
21
+ const ledger = await loadLedger(root);
22
+ const gates = checkEvidenceSufficiency({ ...ledger, paradigm: project.paradigm });
23
+ const version = await allocateProjectVersion(root, "manuscript-revision", `writing-review:${Date.now()}`);
24
+ const gateByClaim = new Map(gates.map((gate) => [gate.claimIds?.[0], gate]));
25
+ const findings = [];
26
+ for (const claim of ledger.claims) {
27
+ const gate = gateByClaim.get(claim.id);
28
+ if (claim.status === "supported" && gate && !gate.ok) {
29
+ findings.push({
30
+ severity: "block",
31
+ rule: "unsupported-claim-asserted-as-supported",
32
+ claimId: claim.id,
33
+ message: `claim ${claim.id} is marked supported but fails its evidence gate`,
34
+ });
35
+ }
36
+ if (claim.kind !== "result" && CAUSAL_PATTERN.test(claim.text)) {
37
+ findings.push({
38
+ severity: "warn",
39
+ rule: "causal-language-without-result-artifact",
40
+ claimId: claim.id,
41
+ message: `claim ${claim.id} uses causal language but is not backed by a result artifact`,
42
+ });
43
+ }
44
+ if (claim.kind === "result" && CONFIRMATORY_PATTERN.test(claim.text)) {
45
+ findings.push({
46
+ severity: "warn",
47
+ rule: "confirmatory-language",
48
+ claimId: claim.id,
49
+ message: `claim ${claim.id} asserts a proof or established fact; prefer uncertainty-qualified language`,
50
+ });
51
+ }
52
+ }
53
+ const report = {
54
+ schemaVersion: "psyclaw/writing-review/v1",
55
+ version,
56
+ findings,
57
+ blockCount: findings.filter((finding) => finding.severity === "block").length,
58
+ suggestions: findings.map((finding) => ({ severity: finding.severity, rule: finding.rule, ...(finding.claimId ? { claimId: finding.claimId } : {}), suggestion: finding.message })),
59
+ };
60
+ const markdown = [
61
+ `# Writing Review ${version}`,
62
+ "",
63
+ `Research goal: ${project.goal}`,
64
+ "",
65
+ "## Findings",
66
+ "",
67
+ ...(findings.length ? findings.map((finding) => `- [${finding.severity}] ${finding.rule}: ${finding.message}`) : ["- None"]),
68
+ "",
69
+ ].join("\n");
70
+ return finalizeWorkflow(root, writingReviewSpec, {
71
+ gates,
72
+ outputs: [
73
+ { path: "writing-review.md", contents: markdown },
74
+ { path: "review-findings.json", contents: `${JSON.stringify(report, null, 2)}\n` },
75
+ { path: "review-suggestions.json", contents: `${JSON.stringify({ schemaVersion: "psyclaw/review-suggestions/v1", version, suggestions: report.suggestions }, null, 2)}\n` },
76
+ { path: `writing-review-${version}.md`, contents: markdown },
77
+ { path: `review-findings-${version}.json`, contents: `${JSON.stringify(report, null, 2)}\n` },
78
+ ],
79
+ completed: ["claims loaded", "honesty heuristics applied", "findings reported"],
80
+ });
81
+ }
82
+ //# sourceMappingURL=writing-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writing-review.js","sourceRoot":"","sources":["../../../src/workflows/writing-review.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,29 @@
1
1
  {
2
2
  "name": "psyclaw",
3
- "version": "0.25.2",
3
+ "version": "0.26.0",
4
4
  "description": "A standalone, evidence-grounded social-science research agent — a conversation-driven agent that bundles the Pi runtime with psyclaw's research contracts, evidence gates, and workflows",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/Exekiel179/psyclaw.git"
10
+ },
11
+ "homepage": "https://github.com/Exekiel179/psyclaw#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/Exekiel179/psyclaw/issues"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public",
17
+ "registry": "https://registry.npmjs.org/"
18
+ },
7
19
  "bin": {
8
20
  "psyclaw": "dist/src/cli.js"
9
21
  },
10
22
  "files": [
11
- "dist",
23
+ "dist/src",
24
+ "dist/apps/panel/index.html",
12
25
  "skills",
13
- "apps/panel",
14
- "scripts"
26
+ "scripts/rebrand-pi.mjs"
15
27
  ],
16
28
  "engines": {
17
29
  "node": ">=22.19.0"
@@ -27,8 +39,8 @@
27
39
  "packageManager": "pnpm@10.28.2",
28
40
  "pi": {
29
41
  "extensions": [
30
- "./src/extension.ts",
31
- "./src/panel/extension.ts"
42
+ "./dist/src/extension.js",
43
+ "./dist/src/panel/extension.js"
32
44
  ],
33
45
  "skills": [
34
46
  "./skills/core"
@@ -42,8 +54,8 @@
42
54
  "eval": "tsx evals/harness.ts",
43
55
  "eval:modules": "tsx evals/modules.ts",
44
56
  "rebrand": "node scripts/rebrand-pi.mjs",
45
- "postinstall": "node scripts/rebrand-pi.mjs",
46
- "prepublishOnly": "pnpm build"
57
+ "check:branding": "node scripts/check-branding.mjs",
58
+ "prepublishOnly": "pnpm check:branding && pnpm build"
47
59
  },
48
60
  "dependencies": {
49
61
  "@earendil-works/pi-ai": "0.84.1",