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.
- package/LICENSE +21 -0
- package/README.md +67 -0
- package/dist/apps/panel/index.html +3416 -0
- package/dist/src/adapters/pi/extension.d.ts +19 -0
- package/dist/src/adapters/pi/extension.js +735 -0
- package/dist/src/adapters/pi/extension.js.map +1 -0
- package/dist/src/adapters/pi/model.d.ts +72 -0
- package/dist/src/adapters/pi/model.js +152 -0
- package/dist/src/adapters/pi/model.js.map +1 -0
- package/dist/src/adapters/pi/resources.d.ts +23 -0
- package/dist/src/adapters/pi/resources.js +54 -0
- package/dist/src/adapters/pi/resources.js.map +1 -0
- package/dist/src/adapters/pi/rpc.d.ts +56 -0
- package/dist/src/adapters/pi/rpc.js +248 -0
- package/dist/src/adapters/pi/rpc.js.map +1 -0
- package/dist/src/adapters/pi/session.d.ts +30 -0
- package/dist/src/adapters/pi/session.js +64 -0
- package/dist/src/adapters/pi/session.js.map +1 -0
- package/dist/src/agents/catalog.d.ts +30 -0
- package/dist/src/agents/catalog.js +118 -0
- package/dist/src/agents/catalog.js.map +1 -0
- package/dist/src/agents/discover.d.ts +28 -0
- package/dist/src/agents/discover.js +127 -0
- package/dist/src/agents/discover.js.map +1 -0
- package/dist/src/agents/import.d.ts +67 -0
- package/dist/src/agents/import.js +801 -0
- package/dist/src/agents/import.js.map +1 -0
- package/dist/src/analysis/hooks.d.ts +81 -0
- package/dist/src/analysis/hooks.js +139 -0
- package/dist/src/analysis/hooks.js.map +1 -0
- package/dist/src/analysis/pre-registration.d.ts +18 -0
- package/dist/src/analysis/pre-registration.js +86 -0
- package/dist/src/analysis/pre-registration.js.map +1 -0
- package/dist/src/branding.d.ts +43 -0
- package/dist/src/branding.js +127 -0
- package/dist/src/branding.js.map +1 -0
- package/dist/src/chat.d.ts +16 -0
- package/dist/src/chat.js +67 -0
- package/dist/src/chat.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +316 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/core/citations.d.ts +44 -0
- package/dist/src/core/citations.js +48 -0
- package/dist/src/core/citations.js.map +1 -0
- package/dist/src/core/contracts.d.ts +119 -0
- package/dist/src/core/contracts.js +2 -0
- package/dist/src/core/contracts.js.map +1 -0
- package/dist/src/core/docx.d.ts +11 -0
- package/dist/src/core/docx.js +46 -0
- package/dist/src/core/docx.js.map +1 -0
- package/dist/src/core/doi.d.ts +41 -0
- package/dist/src/core/doi.js +82 -0
- package/dist/src/core/doi.js.map +1 -0
- package/dist/src/core/evidence-policy.d.ts +24 -0
- package/dist/src/core/evidence-policy.js +308 -0
- package/dist/src/core/evidence-policy.js.map +1 -0
- package/dist/src/core/filekind.d.ts +15 -0
- package/dist/src/core/filekind.js +82 -0
- package/dist/src/core/filekind.js.map +1 -0
- package/dist/src/core/hash.d.ts +2 -0
- package/dist/src/core/hash.js +17 -0
- package/dist/src/core/hash.js.map +1 -0
- package/dist/src/core/pricing.d.ts +38 -0
- package/dist/src/core/pricing.js +110 -0
- package/dist/src/core/pricing.js.map +1 -0
- package/dist/src/core/redact.d.ts +12 -0
- package/dist/src/core/redact.js +48 -0
- package/dist/src/core/redact.js.map +1 -0
- package/dist/src/core/references.d.ts +55 -0
- package/dist/src/core/references.js +102 -0
- package/dist/src/core/references.js.map +1 -0
- package/dist/src/core/schemas.d.ts +162 -0
- package/dist/src/core/schemas.js +160 -0
- package/dist/src/core/schemas.js.map +1 -0
- package/dist/src/extension.d.ts +1 -0
- package/dist/src/extension.js +2 -0
- package/dist/src/extension.js.map +1 -0
- package/dist/src/index.d.ts +72 -0
- package/dist/src/index.js +73 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/install/installer.d.ts +147 -0
- package/dist/src/install/installer.js +743 -0
- package/dist/src/install/installer.js.map +1 -0
- package/dist/src/integrations/contracts.d.ts +35 -0
- package/dist/src/integrations/contracts.js +27 -0
- package/dist/src/integrations/contracts.js.map +1 -0
- package/dist/src/integrations/mcp.d.ts +155 -0
- package/dist/src/integrations/mcp.js +826 -0
- package/dist/src/integrations/mcp.js.map +1 -0
- package/dist/src/knowledge-map/contracts.d.ts +20 -0
- package/dist/src/knowledge-map/contracts.js +2 -0
- package/dist/src/knowledge-map/contracts.js.map +1 -0
- package/dist/src/knowledge-map/index.d.ts +4 -0
- package/dist/src/knowledge-map/index.js +39 -0
- package/dist/src/knowledge-map/index.js.map +1 -0
- package/dist/src/literature/contracts.d.ts +106 -0
- package/dist/src/literature/contracts.js +2 -0
- package/dist/src/literature/contracts.js.map +1 -0
- package/dist/src/literature/fulltext.d.ts +7 -0
- package/dist/src/literature/fulltext.js +24 -0
- package/dist/src/literature/fulltext.js.map +1 -0
- package/dist/src/literature/knowledge-map.d.ts +2 -0
- package/dist/src/literature/knowledge-map.js +20 -0
- package/dist/src/literature/knowledge-map.js.map +1 -0
- package/dist/src/literature/ledger.d.ts +3 -0
- package/dist/src/literature/ledger.js +17 -0
- package/dist/src/literature/ledger.js.map +1 -0
- package/dist/src/literature/metadata.d.ts +6 -0
- package/dist/src/literature/metadata.js +32 -0
- package/dist/src/literature/metadata.js.map +1 -0
- package/dist/src/memory/store.d.ts +22 -0
- package/dist/src/memory/store.js +73 -0
- package/dist/src/memory/store.js.map +1 -0
- package/dist/src/orchestration/contracts.d.ts +61 -0
- package/dist/src/orchestration/contracts.js +2 -0
- package/dist/src/orchestration/contracts.js.map +1 -0
- package/dist/src/orchestration/pi-executor.d.ts +28 -0
- package/dist/src/orchestration/pi-executor.js +169 -0
- package/dist/src/orchestration/pi-executor.js.map +1 -0
- package/dist/src/orchestration/runner.d.ts +196 -0
- package/dist/src/orchestration/runner.js +991 -0
- package/dist/src/orchestration/runner.js.map +1 -0
- package/dist/src/orchestration/scheduler.d.ts +8 -0
- package/dist/src/orchestration/scheduler.js +335 -0
- package/dist/src/orchestration/scheduler.js.map +1 -0
- package/dist/src/panel/events.d.ts +20 -0
- package/dist/src/panel/events.js +93 -0
- package/dist/src/panel/events.js.map +1 -0
- package/dist/src/panel/extension.d.ts +8 -0
- package/dist/src/panel/extension.js +114 -0
- package/dist/src/panel/extension.js.map +1 -0
- package/dist/src/panel/literature-map.d.ts +26 -0
- package/dist/src/panel/literature-map.js +34 -0
- package/dist/src/panel/literature-map.js.map +1 -0
- package/dist/src/panel/projection.d.ts +51 -0
- package/dist/src/panel/projection.js +288 -0
- package/dist/src/panel/projection.js.map +1 -0
- package/dist/src/panel/server.d.ts +46 -0
- package/dist/src/panel/server.js +1610 -0
- package/dist/src/panel/server.js.map +1 -0
- package/dist/src/panel/usage.d.ts +53 -0
- package/dist/src/panel/usage.js +150 -0
- package/dist/src/panel/usage.js.map +1 -0
- package/dist/src/project/bootstrap.d.ts +10 -0
- package/dist/src/project/bootstrap.js +83 -0
- package/dist/src/project/bootstrap.js.map +1 -0
- package/dist/src/project/hitl.d.ts +12 -0
- package/dist/src/project/hitl.js +43 -0
- package/dist/src/project/hitl.js.map +1 -0
- package/dist/src/project/jsonl.d.ts +16 -0
- package/dist/src/project/jsonl.js +93 -0
- package/dist/src/project/jsonl.js.map +1 -0
- package/dist/src/project/manuscript.d.ts +21 -0
- package/dist/src/project/manuscript.js +74 -0
- package/dist/src/project/manuscript.js.map +1 -0
- package/dist/src/project/paths.d.ts +38 -0
- package/dist/src/project/paths.js +166 -0
- package/dist/src/project/paths.js.map +1 -0
- package/dist/src/project/versions.d.ts +10 -0
- package/dist/src/project/versions.js +14 -0
- package/dist/src/project/versions.js.map +1 -0
- package/dist/src/psyclaw-theme.d.ts +88 -0
- package/dist/src/psyclaw-theme.js +89 -0
- package/dist/src/psyclaw-theme.js.map +1 -0
- package/dist/src/research/brief.d.ts +11 -0
- package/dist/src/research/brief.js +81 -0
- package/dist/src/research/brief.js.map +1 -0
- package/dist/src/research/ledger.d.ts +12 -0
- package/dist/src/research/ledger.js +43 -0
- package/dist/src/research/ledger.js.map +1 -0
- package/dist/src/run.d.ts +20 -0
- package/dist/src/run.js +34 -0
- package/dist/src/run.js.map +1 -0
- package/dist/src/setup.d.ts +54 -0
- package/dist/src/setup.js +221 -0
- package/dist/src/setup.js.map +1 -0
- package/dist/src/skills/contracts.d.ts +105 -0
- package/dist/src/skills/contracts.js +3 -0
- package/dist/src/skills/contracts.js.map +1 -0
- package/dist/src/skills/preflight.d.ts +10 -0
- package/dist/src/skills/preflight.js +39 -0
- package/dist/src/skills/preflight.js.map +1 -0
- package/dist/src/skills/registry.d.ts +28 -0
- package/dist/src/skills/registry.js +556 -0
- package/dist/src/skills/registry.js.map +1 -0
- package/dist/src/style/artifact.d.ts +6 -0
- package/dist/src/style/artifact.js +61 -0
- package/dist/src/style/artifact.js.map +1 -0
- package/dist/src/style/cli-ui.d.ts +41 -0
- package/dist/src/style/cli-ui.js +119 -0
- package/dist/src/style/cli-ui.js.map +1 -0
- package/dist/src/style/contracts.d.ts +34 -0
- package/dist/src/style/contracts.js +2 -0
- package/dist/src/style/contracts.js.map +1 -0
- package/dist/src/style/registry.d.ts +16 -0
- package/dist/src/style/registry.js +50 -0
- package/dist/src/style/registry.js.map +1 -0
- package/dist/src/trust/manifest.d.ts +42 -0
- package/dist/src/trust/manifest.js +53 -0
- package/dist/src/trust/manifest.js.map +1 -0
- package/dist/src/trust/sbom.d.ts +54 -0
- package/dist/src/trust/sbom.js +77 -0
- package/dist/src/trust/sbom.js.map +1 -0
- package/dist/src/tui/app.d.ts +3 -0
- package/dist/src/tui/app.js +103 -0
- package/dist/src/tui/app.js.map +1 -0
- package/dist/src/tui/model.d.ts +13 -0
- package/dist/src/tui/model.js +25 -0
- package/dist/src/tui/model.js.map +1 -0
- package/dist/src/updates/check.d.ts +43 -0
- package/dist/src/updates/check.js +68 -0
- package/dist/src/updates/check.js.map +1 -0
- package/dist/src/updates/manifest.d.ts +19 -0
- package/dist/src/updates/manifest.js +58 -0
- package/dist/src/updates/manifest.js.map +1 -0
- package/dist/src/updates/registry.d.ts +21 -0
- package/dist/src/updates/registry.js +82 -0
- package/dist/src/updates/registry.js.map +1 -0
- package/dist/src/updates/skills.d.ts +15 -0
- package/dist/src/updates/skills.js +39 -0
- package/dist/src/updates/skills.js.map +1 -0
- package/dist/src/updates/status.d.ts +7 -0
- package/dist/src/updates/status.js +37 -0
- package/dist/src/updates/status.js.map +1 -0
- package/dist/src/updates/update.d.ts +43 -0
- package/dist/src/updates/update.js +126 -0
- package/dist/src/updates/update.js.map +1 -0
- package/dist/src/wizard.d.ts +7 -0
- package/dist/src/wizard.js +90 -0
- package/dist/src/wizard.js.map +1 -0
- package/dist/src/workflows/analysis-delegation.d.ts +3 -0
- package/dist/src/workflows/analysis-delegation.js +96 -0
- package/dist/src/workflows/analysis-delegation.js.map +1 -0
- package/dist/src/workflows/expert-review-runner.d.ts +29 -0
- package/dist/src/workflows/expert-review-runner.js +35 -0
- package/dist/src/workflows/expert-review-runner.js.map +1 -0
- package/dist/src/workflows/expert-review.d.ts +140 -0
- package/dist/src/workflows/expert-review.js +111 -0
- package/dist/src/workflows/expert-review.js.map +1 -0
- package/dist/src/workflows/institutional-fulltext.d.ts +16 -0
- package/dist/src/workflows/institutional-fulltext.js +110 -0
- package/dist/src/workflows/institutional-fulltext.js.map +1 -0
- package/dist/src/workflows/literature-review.d.ts +3 -0
- package/dist/src/workflows/literature-review.js +76 -0
- package/dist/src/workflows/literature-review.js.map +1 -0
- package/dist/src/workflows/meta-analysis.d.ts +38 -0
- package/dist/src/workflows/meta-analysis.js +185 -0
- package/dist/src/workflows/meta-analysis.js.map +1 -0
- package/dist/src/workflows/publish.d.ts +51 -0
- package/dist/src/workflows/publish.js +153 -0
- package/dist/src/workflows/publish.js.map +1 -0
- package/dist/src/workflows/spec.d.ts +51 -0
- package/dist/src/workflows/spec.js +157 -0
- package/dist/src/workflows/spec.js.map +1 -0
- package/dist/src/workflows/style-contract.d.ts +24 -0
- package/dist/src/workflows/style-contract.js +23 -0
- package/dist/src/workflows/style-contract.js.map +1 -0
- package/dist/src/workflows/writing-review.d.ts +15 -0
- package/dist/src/workflows/writing-review.js +82 -0
- package/dist/src/workflows/writing-review.js.map +1 -0
- package/package.json +73 -0
- package/package.json.psyclaw +21 -0
- package/skills/core/citation-audit/SKILL.md +9 -0
- package/skills/core/evidence-capture/SKILL.md +9 -0
- package/skills/core/manifest.json +15 -0
- package/skills/core/research-brief/SKILL.md +11 -0
- package/skills/core/research-intake/SKILL.md +9 -0
- package/skills/recommended/catalog.json +52 -0
- package/skills/recommended/mcp-catalog.json +118 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { sha256Text } from "./hash.js";
|
|
2
|
+
import { readJsonl, appendJsonlIfMissing } from "../project/jsonl.js";
|
|
3
|
+
import { assertSafeProjectPath } from "../project/paths.js";
|
|
4
|
+
import { referenceFromVerification, upsertReference } from "./references.js";
|
|
5
|
+
import { verifyDoi } from "./doi.js";
|
|
6
|
+
export async function citationsPath(root) {
|
|
7
|
+
return assertSafeProjectPath(root, ".psyclaw/citations.jsonl");
|
|
8
|
+
}
|
|
9
|
+
export async function listCitationUses(root) {
|
|
10
|
+
return readJsonl(await citationsPath(root));
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Record one citation use: verify the DOI (real network unless a verifier is
|
|
14
|
+
* injected), archive the reference when verifiable, then append the use with
|
|
15
|
+
* its reason. The use is always recorded (with `verified` reflecting the
|
|
16
|
+
* verification outcome) so the citation reason is never lost.
|
|
17
|
+
*/
|
|
18
|
+
export async function recordCitationUse(root, input, verify = verifyDoi) {
|
|
19
|
+
const doi = input.doi.trim();
|
|
20
|
+
const reason = input.reason.trim();
|
|
21
|
+
const context = input.context.trim();
|
|
22
|
+
if (!doi || !reason || !context) {
|
|
23
|
+
throw new Error("doi, reason, and context are all required");
|
|
24
|
+
}
|
|
25
|
+
const verification = await verify(doi);
|
|
26
|
+
const reference = referenceFromVerification(verification);
|
|
27
|
+
if (reference !== null) {
|
|
28
|
+
await upsertReference(root, reference);
|
|
29
|
+
}
|
|
30
|
+
const surname = (reference?.authors[0]?.split(/\s+/).at(-1) ?? doi.split("/")[0] ?? doi).slice(0, 40);
|
|
31
|
+
const citationId = `cite_${sha256Text(`${doi}\u0000${reason}\u0000${context}`).slice(0, 16)}`;
|
|
32
|
+
const record = {
|
|
33
|
+
schemaVersion: "psyclaw/citation-use/v1",
|
|
34
|
+
citationId,
|
|
35
|
+
doi,
|
|
36
|
+
surname,
|
|
37
|
+
...(reference?.year === undefined ? {} : { year: reference.year }),
|
|
38
|
+
reason,
|
|
39
|
+
context,
|
|
40
|
+
...(input.section === undefined || input.section.trim() === "" ? {} : { section: input.section.trim() }),
|
|
41
|
+
...(input.claimId === undefined || input.claimId.trim() === "" ? {} : { claimId: input.claimId.trim() }),
|
|
42
|
+
verified: verification.status === "verified",
|
|
43
|
+
recordedAt: new Date().toISOString(),
|
|
44
|
+
};
|
|
45
|
+
const { appended } = await appendJsonlIfMissing(await citationsPath(root), record, (item) => item.citationId);
|
|
46
|
+
return { record, reference, appended };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=citations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"citations.js","sourceRoot":"","sources":["../../../src/core/citations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export declare const CONTRACT_VERSION: "psyclaw/core/v1";
|
|
2
|
+
export type Effect = "read" | "write" | "network" | "destructive";
|
|
3
|
+
export type EvidenceLevel = "metadata" | "abstract" | "snippet" | "fulltext" | "user";
|
|
4
|
+
export type ClaimStatus = "supported" | "uncertain" | "unsupported";
|
|
5
|
+
export type Relation = "supports" | "contradicts" | "context";
|
|
6
|
+
export type ResearchParadigm = "survey-observational" | "qualitative-thematic" | "experimental" | "quasi-experimental" | "longitudinal-panel" | "meta-analysis" | "ethnographic" | "historical-documentary" | "policy-legal" | "mixed-methods";
|
|
7
|
+
export interface ResearchProject {
|
|
8
|
+
id: string;
|
|
9
|
+
root: string;
|
|
10
|
+
paradigm: ResearchParadigm;
|
|
11
|
+
goal: string;
|
|
12
|
+
policyVersion: string;
|
|
13
|
+
createdAt: string;
|
|
14
|
+
}
|
|
15
|
+
export interface SourceRef {
|
|
16
|
+
kind: "doi" | "url" | "file" | "user" | "mcp";
|
|
17
|
+
locator: string;
|
|
18
|
+
title?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface Evidence {
|
|
21
|
+
id: string;
|
|
22
|
+
source: SourceRef;
|
|
23
|
+
level: EvidenceLevel;
|
|
24
|
+
quote?: string;
|
|
25
|
+
retrievedAt: string;
|
|
26
|
+
sha256?: string;
|
|
27
|
+
accessStatus: "verified" | "partial" | "unavailable";
|
|
28
|
+
locators: EvidenceLocator[];
|
|
29
|
+
}
|
|
30
|
+
export interface EvidenceLocator {
|
|
31
|
+
kind: "doi" | "url" | "file" | "page" | "section" | "offset" | "row";
|
|
32
|
+
value: string;
|
|
33
|
+
}
|
|
34
|
+
export type ClaimKind = "existence" | "definition" | "method" | "result" | "interpretation";
|
|
35
|
+
export interface Claim {
|
|
36
|
+
recordType?: "claim";
|
|
37
|
+
id: string;
|
|
38
|
+
text: string;
|
|
39
|
+
kind: ClaimKind;
|
|
40
|
+
evidenceIds: string[];
|
|
41
|
+
status: ClaimStatus;
|
|
42
|
+
uncertainty?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ClaimEvidenceLink {
|
|
45
|
+
recordType?: "claim-evidence-link";
|
|
46
|
+
claimId: string;
|
|
47
|
+
evidenceId: string;
|
|
48
|
+
relation: Relation;
|
|
49
|
+
locator?: EvidenceLocator;
|
|
50
|
+
rationale: string;
|
|
51
|
+
}
|
|
52
|
+
export interface EvidencePolicy {
|
|
53
|
+
paradigm: ResearchParadigm;
|
|
54
|
+
claimKind: ClaimKind;
|
|
55
|
+
minimumLevel: EvidenceLevel;
|
|
56
|
+
locatorRequired: boolean;
|
|
57
|
+
requiresIndependentSource: boolean;
|
|
58
|
+
requiresArtifactRun: boolean;
|
|
59
|
+
}
|
|
60
|
+
export interface Artifact {
|
|
61
|
+
id: string;
|
|
62
|
+
path: string;
|
|
63
|
+
sha256: string;
|
|
64
|
+
producedBy: string;
|
|
65
|
+
inputIds: string[];
|
|
66
|
+
reproducible: boolean;
|
|
67
|
+
}
|
|
68
|
+
export interface ToolReceipt {
|
|
69
|
+
schemaVersion: "psyclaw/tool-receipt/v1";
|
|
70
|
+
runId: string;
|
|
71
|
+
taskId: string;
|
|
72
|
+
tool: string;
|
|
73
|
+
effect: Effect;
|
|
74
|
+
approval: "not-needed" | "approved" | "denied";
|
|
75
|
+
idempotencyKey?: string;
|
|
76
|
+
ok: boolean;
|
|
77
|
+
/** Stable, non-sensitive diagnostic code for a denied or failed call. */
|
|
78
|
+
reasonCode?: string;
|
|
79
|
+
resultHash?: string;
|
|
80
|
+
startedAt: string;
|
|
81
|
+
finishedAt: string;
|
|
82
|
+
}
|
|
83
|
+
export interface GateResult {
|
|
84
|
+
gateId: string;
|
|
85
|
+
ok: boolean;
|
|
86
|
+
severity: "block" | "warn";
|
|
87
|
+
reason: string;
|
|
88
|
+
claimIds?: string[];
|
|
89
|
+
evidenceIds?: string[];
|
|
90
|
+
}
|
|
91
|
+
export interface MemoryRecord {
|
|
92
|
+
id: string;
|
|
93
|
+
kind: "profile" | "decision" | "fact" | "lesson" | "evidence";
|
|
94
|
+
scope: "session" | "project" | "user";
|
|
95
|
+
content: unknown;
|
|
96
|
+
sourceRefs: string[];
|
|
97
|
+
confidence: number;
|
|
98
|
+
status: "pending" | "active" | "archived";
|
|
99
|
+
createdAt: string;
|
|
100
|
+
updatedAt: string;
|
|
101
|
+
}
|
|
102
|
+
export interface Handoff {
|
|
103
|
+
schemaVersion: "psyclaw/handoff/v1";
|
|
104
|
+
projectId: string;
|
|
105
|
+
runId: string;
|
|
106
|
+
goal: string;
|
|
107
|
+
completed: string[];
|
|
108
|
+
verified: string[];
|
|
109
|
+
blocked: string[];
|
|
110
|
+
nextSteps: string[];
|
|
111
|
+
verificationCommands: string[];
|
|
112
|
+
generatedAt: string;
|
|
113
|
+
}
|
|
114
|
+
export interface ResearchRequest {
|
|
115
|
+
goal: string;
|
|
116
|
+
paradigm: ResearchParadigm;
|
|
117
|
+
output: "brief" | "ledger";
|
|
118
|
+
sourcePaths: string[];
|
|
119
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../src/core/contracts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,iBAA0B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Plain text (whitespace-unwrapped) for evidence reading. */
|
|
2
|
+
export declare function docxToText(path: string): Promise<string>;
|
|
3
|
+
/** Markdown (structure preserved) for citation-audit and quoting. */
|
|
4
|
+
export declare function docxToMarkdown(path: string): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Export a Markdown file to DOCX (the convention target is
|
|
7
|
+
* `paper/<name>_APA7.docx`). An optional reference document (e.g. a black and
|
|
8
|
+
* white APA-7 template) is passed through `--reference-doc` so heading/table
|
|
9
|
+
* styling follows the project template instead of pandoc defaults.
|
|
10
|
+
*/
|
|
11
|
+
export declare function markdownToDocx(markdownPath: string, outputPath: string, referenceDoc?: string): Promise<void>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Word document conversion via Pandoc. Pandoc is already part of psyclaw's DOCX
|
|
4
|
+
* export path; if it is unavailable, the caller should fall back to the
|
|
5
|
+
* markitdown skill (read) or report the failure (write).
|
|
6
|
+
*/
|
|
7
|
+
function runPandoc(args) {
|
|
8
|
+
return new Promise((resolve, reject) => {
|
|
9
|
+
const child = spawn("pandoc", args, {
|
|
10
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
11
|
+
shell: process.platform === "win32",
|
|
12
|
+
});
|
|
13
|
+
let output = "";
|
|
14
|
+
let errorText = "";
|
|
15
|
+
child.stdout?.on("data", (chunk) => { output += String(chunk); });
|
|
16
|
+
child.stderr?.on("data", (chunk) => { errorText += String(chunk); });
|
|
17
|
+
child.on("error", (error) => reject(new Error(`pandoc unavailable (${error.message}); install Pandoc or use the markitdown skill`)));
|
|
18
|
+
child.on("close", (code) => {
|
|
19
|
+
if (code === 0)
|
|
20
|
+
resolve(output);
|
|
21
|
+
else
|
|
22
|
+
reject(new Error(`pandoc failed (exit ${code ?? "unknown"})${errorText ? `: ${errorText.trim().slice(0, 300)}` : ""}`));
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/** Plain text (whitespace-unwrapped) for evidence reading. */
|
|
27
|
+
export function docxToText(path) {
|
|
28
|
+
return runPandoc([path, "-t", "plain", "--wrap=none"]);
|
|
29
|
+
}
|
|
30
|
+
/** Markdown (structure preserved) for citation-audit and quoting. */
|
|
31
|
+
export function docxToMarkdown(path) {
|
|
32
|
+
return runPandoc([path, "-t", "markdown", "--wrap=none"]);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Export a Markdown file to DOCX (the convention target is
|
|
36
|
+
* `paper/<name>_APA7.docx`). An optional reference document (e.g. a black and
|
|
37
|
+
* white APA-7 template) is passed through `--reference-doc` so heading/table
|
|
38
|
+
* styling follows the project template instead of pandoc defaults.
|
|
39
|
+
*/
|
|
40
|
+
export async function markdownToDocx(markdownPath, outputPath, referenceDoc) {
|
|
41
|
+
const args = [markdownPath, "-o", outputPath, "--wrap=none"];
|
|
42
|
+
if (referenceDoc)
|
|
43
|
+
args.push("--reference-doc", referenceDoc);
|
|
44
|
+
await runPandoc(args);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=docx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docx.js","sourceRoot":"","sources":["../../../src/core/docx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C;;;;GAIG;AACH,SAAS,SAAS,CAAC,IAAc;IAC/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE;YAClC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,OAAO,+CAA+C,CAAC,CAAC,CAAC,CAAC;QACrI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,CAAC;;gBAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,IAAI,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/H,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,SAAS,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,SAAS,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,YAAoB,EAAE,UAAkB,EAAE,YAAqB;IAClG,MAAM,IAAI,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IAC7D,IAAI,YAAY;QAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOI utilities: real cross-source verification (Crossref + OpenAlex) and
|
|
3
|
+
* open-access PDF lookup. Moved out of the panel server so the reference
|
|
4
|
+
* archive and any other caller can use them without a server dependency.
|
|
5
|
+
*/
|
|
6
|
+
export interface DoiVerification {
|
|
7
|
+
schemaVersion: "psyclaw/doi-verify/v1";
|
|
8
|
+
doi: string;
|
|
9
|
+
status: "verified" | "unverified" | "error";
|
|
10
|
+
crossref?: {
|
|
11
|
+
title?: string;
|
|
12
|
+
authors?: string[];
|
|
13
|
+
year?: number;
|
|
14
|
+
container?: string;
|
|
15
|
+
};
|
|
16
|
+
openalex?: {
|
|
17
|
+
title?: string;
|
|
18
|
+
citedBy?: number;
|
|
19
|
+
};
|
|
20
|
+
mismatch?: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
verifiedAt: string;
|
|
23
|
+
}
|
|
24
|
+
export interface OpenAlexOaLookup {
|
|
25
|
+
doi: string;
|
|
26
|
+
oaPdfUrl: string | null;
|
|
27
|
+
isOa: boolean;
|
|
28
|
+
queriedAt: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Real cross-source DOI verification via Crossref + OpenAlex. Never fabricates
|
|
32
|
+
* a "verified" status: any network failure returns `error`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function verifyDoi(doi: string, fetchFn?: typeof fetch): Promise<DoiVerification>;
|
|
35
|
+
/**
|
|
36
|
+
* Look up an open-access PDF URL for a DOI via OpenAlex
|
|
37
|
+
* (`open_access.oa_url` / `best_oa_location.pdf_url`). Returns null when the
|
|
38
|
+
* work is not open access or the lookup fails; the caller must still verify
|
|
39
|
+
* the returned URL before downloading it.
|
|
40
|
+
*/
|
|
41
|
+
export declare function lookupOaPdfUrl(doi: string, fetchFn?: typeof fetch): Promise<OpenAlexOaLookup>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOI utilities: real cross-source verification (Crossref + OpenAlex) and
|
|
3
|
+
* open-access PDF lookup. Moved out of the panel server so the reference
|
|
4
|
+
* archive and any other caller can use them without a server dependency.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Real cross-source DOI verification via Crossref + OpenAlex. Never fabricates
|
|
8
|
+
* a "verified" status: any network failure returns `error`.
|
|
9
|
+
*/
|
|
10
|
+
export async function verifyDoi(doi, fetchFn = fetch) {
|
|
11
|
+
const normalized = doi.trim();
|
|
12
|
+
const verifiedAt = new Date().toISOString();
|
|
13
|
+
if (!/^10\.\d{4,9}\/\S+$/i.test(normalized)) {
|
|
14
|
+
return { schemaVersion: "psyclaw/doi-verify/v1", doi: normalized, status: "error", error: "不是合法 DOI(应为 10.xxxx/…)", verifiedAt };
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const [crossrefRes, openalexRes] = await Promise.all([
|
|
18
|
+
fetchFn(`https://api.crossref.org/works/${encodeURIComponent(normalized)}`, { signal: AbortSignal.timeout(12_000) }),
|
|
19
|
+
fetchFn(`https://api.openalex.org/works/doi:${encodeURIComponent(normalized)}`, { signal: AbortSignal.timeout(12_000) }),
|
|
20
|
+
]);
|
|
21
|
+
const crossref = crossrefRes.ok
|
|
22
|
+
? await crossrefRes.json()
|
|
23
|
+
: undefined;
|
|
24
|
+
const openalex = openalexRes.ok
|
|
25
|
+
? await openalexRes.json()
|
|
26
|
+
: undefined;
|
|
27
|
+
const crossTitle = crossref?.message?.title?.[0];
|
|
28
|
+
const openalexTitle = openalex?.title;
|
|
29
|
+
const mismatch = crossTitle && openalexTitle && crossTitle.toLowerCase() !== openalexTitle.toLowerCase()
|
|
30
|
+
? `Crossref 与 OpenAlex 标题不一致:「${crossTitle}」vs「${openalexTitle}」`
|
|
31
|
+
: undefined;
|
|
32
|
+
const found = Boolean(crossref || openalex);
|
|
33
|
+
return {
|
|
34
|
+
schemaVersion: "psyclaw/doi-verify/v1",
|
|
35
|
+
doi: normalized,
|
|
36
|
+
status: found && !mismatch ? "verified" : mismatch ? "unverified" : "error",
|
|
37
|
+
...(crossref?.message ? {
|
|
38
|
+
crossref: {
|
|
39
|
+
...(crossref.message.title?.[0] === undefined ? {} : { title: crossref.message.title[0] }),
|
|
40
|
+
...(crossref.message.author && crossref.message.author.length > 0
|
|
41
|
+
? { authors: crossref.message.author.slice(0, 10).map((author) => [author.given, author.family].filter(Boolean).join(" ")).filter(Boolean) }
|
|
42
|
+
: {}),
|
|
43
|
+
...(crossref.message.issued?.["date-parts"]?.[0]?.[0] === undefined ? {} : { year: crossref.message.issued["date-parts"][0][0] }),
|
|
44
|
+
...(crossref.message["container-title"]?.[0] === undefined ? {} : { container: crossref.message["container-title"][0] }),
|
|
45
|
+
},
|
|
46
|
+
} : {}),
|
|
47
|
+
...(openalex ? { openalex: { ...(openalex.title === undefined ? {} : { title: openalex.title }), ...(openalex.cited_by_count === undefined ? {} : { citedBy: openalex.cited_by_count }) } } : {}),
|
|
48
|
+
...(mismatch ? { mismatch } : {}),
|
|
49
|
+
...(found ? {} : { error: "Crossref 与 OpenAlex 均未检索到该 DOI" }),
|
|
50
|
+
verifiedAt,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
return { schemaVersion: "psyclaw/doi-verify/v1", doi: normalized, status: "error", error: error instanceof Error ? error.message : String(error), verifiedAt };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Look up an open-access PDF URL for a DOI via OpenAlex
|
|
59
|
+
* (`open_access.oa_url` / `best_oa_location.pdf_url`). Returns null when the
|
|
60
|
+
* work is not open access or the lookup fails; the caller must still verify
|
|
61
|
+
* the returned URL before downloading it.
|
|
62
|
+
*/
|
|
63
|
+
export async function lookupOaPdfUrl(doi, fetchFn = fetch) {
|
|
64
|
+
const normalized = doi.trim();
|
|
65
|
+
const queriedAt = new Date().toISOString();
|
|
66
|
+
if (!/^10\.\d{4,9}\/\S+$/i.test(normalized)) {
|
|
67
|
+
return { doi: normalized, oaPdfUrl: null, isOa: false, queriedAt };
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const response = await fetchFn(`https://api.openalex.org/works/doi:${encodeURIComponent(normalized)}`, { signal: AbortSignal.timeout(12_000) });
|
|
71
|
+
if (!response.ok)
|
|
72
|
+
return { doi: normalized, oaPdfUrl: null, isOa: false, queriedAt };
|
|
73
|
+
const body = await response.json();
|
|
74
|
+
const isOa = Boolean(body.open_access?.is_oa || body.best_oa_location?.pdf_url);
|
|
75
|
+
const oaPdfUrl = body.best_oa_location?.pdf_url ?? body.open_access?.oa_url ?? null;
|
|
76
|
+
return { doi: normalized, oaPdfUrl: isOa ? oaPdfUrl : null, isOa, queriedAt };
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return { doi: normalized, oaPdfUrl: null, isOa: false, queriedAt };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=doi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doi.js","sourceRoot":"","sources":["../../../src/core/doi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Claim, ClaimEvidenceLink, Evidence, EvidencePolicy, GateResult, ResearchParadigm } from "./contracts.js";
|
|
2
|
+
export declare function defaultEvidencePolicy(paradigm: ResearchParadigm, claimKind: Claim["kind"]): EvidencePolicy;
|
|
3
|
+
/**
|
|
4
|
+
* The paradigm profile changes only the evidence thresholds and required
|
|
5
|
+
* reporting, never the honesty/locator/source baseline. Qualitative and
|
|
6
|
+
* ethnographic material is coded primary data: a theme does not need a second
|
|
7
|
+
* independent source or a numeric artifact run, but it still needs a located,
|
|
8
|
+
* non-user source. Absence of an effect size must not make a qualitative
|
|
9
|
+
* finding invalid.
|
|
10
|
+
*/
|
|
11
|
+
export declare function policiesForParadigm(paradigm: ResearchParadigm): EvidencePolicy[];
|
|
12
|
+
/** Required report sections per paradigm, beyond the universal honesty baseline. */
|
|
13
|
+
export declare const PARADIGM_REPORT_FIELDS: Record<ResearchParadigm, readonly string[]>;
|
|
14
|
+
export interface EvidenceCheckContext {
|
|
15
|
+
claims: readonly Claim[];
|
|
16
|
+
evidence: readonly Evidence[];
|
|
17
|
+
links: readonly ClaimEvidenceLink[];
|
|
18
|
+
/** Explicit policies take precedence over the paradigm profile. */
|
|
19
|
+
policies?: readonly EvidencePolicy[];
|
|
20
|
+
/** Methodological paradigm; drives the profile when `policies` is absent. */
|
|
21
|
+
paradigm?: ResearchParadigm;
|
|
22
|
+
artifactRunClaimIds?: ReadonlySet<string>;
|
|
23
|
+
}
|
|
24
|
+
export declare function checkEvidenceSufficiency(ctx: EvidenceCheckContext): GateResult[];
|