psyclaw 0.27.15 → 0.27.18

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 (71) hide show
  1. package/README.md +6 -7
  2. package/dist/apps/panel/index.html +8 -7
  3. package/dist/src/adapters/pi/extension.js +424 -175
  4. package/dist/src/adapters/pi/extension.js.map +1 -1
  5. package/dist/src/analysis/hooks.js +3 -3
  6. package/dist/src/analysis/hooks.js.map +1 -1
  7. package/dist/src/analysis/pre-registration.d.ts +5 -4
  8. package/dist/src/analysis/pre-registration.js +3 -3
  9. package/dist/src/analysis/pre-registration.js.map +1 -1
  10. package/dist/src/branding.d.ts +1 -1
  11. package/dist/src/branding.js +17 -12
  12. package/dist/src/branding.js.map +1 -1
  13. package/dist/src/chat.js +9 -0
  14. package/dist/src/chat.js.map +1 -1
  15. package/dist/src/cli.js +1 -18
  16. package/dist/src/cli.js.map +1 -1
  17. package/dist/src/index.d.ts +1 -0
  18. package/dist/src/index.js +1 -0
  19. package/dist/src/index.js.map +1 -1
  20. package/dist/src/orchestration/contracts.d.ts +4 -1
  21. package/dist/src/panel/events.js +28 -1
  22. package/dist/src/panel/events.js.map +1 -1
  23. package/dist/src/panel/extension.d.ts +1 -1
  24. package/dist/src/panel/extension.js +16 -9
  25. package/dist/src/panel/extension.js.map +1 -1
  26. package/dist/src/panel/projection.d.ts +1 -1
  27. package/dist/src/panel/projection.js +30 -12
  28. package/dist/src/panel/projection.js.map +1 -1
  29. package/dist/src/panel/server.d.ts +11 -1
  30. package/dist/src/panel/server.js +86 -4
  31. package/dist/src/panel/server.js.map +1 -1
  32. package/dist/src/project/approvals.d.ts +8 -0
  33. package/dist/src/project/approvals.js +6 -7
  34. package/dist/src/project/approvals.js.map +1 -1
  35. package/dist/src/project/bootstrap.d.ts +0 -17
  36. package/dist/src/project/bootstrap.js +1 -87
  37. package/dist/src/project/bootstrap.js.map +1 -1
  38. package/dist/src/project/hitl.d.ts +4 -1
  39. package/dist/src/project/hitl.js +8 -5
  40. package/dist/src/project/hitl.js.map +1 -1
  41. package/dist/src/research/brief.js +1 -1
  42. package/dist/src/research/brief.js.map +1 -1
  43. package/dist/src/research/decision.d.ts +46 -0
  44. package/dist/src/research/decision.js +85 -0
  45. package/dist/src/research/decision.js.map +1 -0
  46. package/dist/src/style/cli-ui.js +2 -3
  47. package/dist/src/style/cli-ui.js.map +1 -1
  48. package/dist/src/tui/skill-manager.d.ts +1 -0
  49. package/dist/src/tui/skill-manager.js +6 -1
  50. package/dist/src/tui/skill-manager.js.map +1 -1
  51. package/dist/src/wizard.js +16 -7
  52. package/dist/src/wizard.js.map +1 -1
  53. package/dist/src/workflows/expert-review-runner.js +4 -6
  54. package/dist/src/workflows/expert-review-runner.js.map +1 -1
  55. package/dist/src/workflows/institutional-fulltext.js +3 -3
  56. package/dist/src/workflows/institutional-fulltext.js.map +1 -1
  57. package/dist/src/workflows/publish.js +3 -2
  58. package/dist/src/workflows/publish.js.map +1 -1
  59. package/dist/src/workflows/spec.js +1 -1
  60. package/dist/src/workflows/spec.js.map +1 -1
  61. package/dist/src/workflows/writing-review.js +40 -7
  62. package/dist/src/workflows/writing-review.js.map +1 -1
  63. package/package.json +3 -2
  64. package/scripts/psyclaw.mjs +27 -0
  65. package/scripts/rebrand-pi.mjs +77 -16
  66. package/skills/core/academic-grill/SKILL.md +9 -1
  67. package/skills/core/citation-audit/SKILL.md +2 -0
  68. package/skills/core/research-brief/SKILL.md +6 -0
  69. package/skills/core/research-intake/SKILL.md +1 -1
  70. package/skills/recommended/catalog.json +11 -28
  71. package/skills/recommended/mcp-catalog.json +13 -1
@@ -8,6 +8,7 @@ import { readJsonl } from "../project/jsonl.js";
8
8
  import { projectPaths } from "../project/paths.js";
9
9
  import { assertSafeRunEventPath } from "./events.js";
10
10
  import { loadLedger, readProject } from "../research/ledger.js";
11
+ import { assessResearchDecision } from "../research/decision.js";
11
12
  export const RunSnapshotSchema = Type.Object({
12
13
  schemaVersion: Type.Literal("psyclaw/run-snapshot/v1"),
13
14
  runId: Type.String(),
@@ -20,6 +21,7 @@ export const RunSnapshotSchema = Type.Object({
20
21
  Type.Literal("verifying"),
21
22
  Type.Literal("completed"),
22
23
  Type.Literal("paused"),
24
+ Type.Literal("awaiting-human"),
23
25
  Type.Literal("blocked"),
24
26
  Type.Literal("unknown"),
25
27
  ]),
@@ -72,10 +74,21 @@ function isRunEvent(value) {
72
74
  if (typeof value !== "object" || value === null)
73
75
  return false;
74
76
  const event = value;
75
- return event.schemaVersion === "psyclaw/run-event/v1" &&
77
+ const validTypes = ["planned", "started", "receipt", "gate", "checkpoint", "awaiting-human", "decision-resolved", "completed", "blocked"];
78
+ if (!(event.schemaVersion === "psyclaw/run-event/v1" &&
76
79
  typeof event.runId === "string" &&
77
80
  typeof event.at === "string" &&
78
- typeof event.type === "string";
81
+ typeof event.type === "string" &&
82
+ validTypes.includes(event.type)))
83
+ return false;
84
+ if (event.type === "awaiting-human") {
85
+ return event.researchDecision !== undefined && event.researchDecisionResolution === undefined && assessResearchDecision(event.researchDecision).eligible;
86
+ }
87
+ if (event.type === "decision-resolved") {
88
+ const resolution = event.researchDecisionResolution;
89
+ return event.researchDecision === undefined && resolution?.schemaVersion === "psyclaw/research-decision-resolution/v1" && resolution.actor === "human" && Boolean(resolution.decisionId && resolution.selectedOption && resolution.rationale && resolution.resolvedAt);
90
+ }
91
+ return event.researchDecision === undefined && event.researchDecisionResolution === undefined;
79
92
  }
80
93
  function phaseFromEvents(events) {
81
94
  const first = events[0];
@@ -94,6 +107,10 @@ function phaseFromEvents(events) {
94
107
  return "blocked";
95
108
  case "checkpoint":
96
109
  return "paused";
110
+ case "awaiting-human":
111
+ return "awaiting-human";
112
+ case "decision-resolved":
113
+ return "executing";
97
114
  case "gate":
98
115
  return "verifying";
99
116
  case "started":
@@ -108,13 +125,13 @@ function nextStepFor(phase, blocked, waitingReasons, corrupt) {
108
125
  if (corrupt)
109
126
  return "运行事件或检查点不可用,先修复再继续";
110
127
  const waiting = waitingReasons.filter((item) => !item.includes("corrupt"));
128
+ if (phase === "awaiting-human")
129
+ return `有 ${Math.max(1, waiting.length)} 项研究取舍需要你决定`;
111
130
  if (blocked || phase === "blocked") {
112
- return waiting.length > 0 ? `有 ${waiting.length} 项门禁需要你确认后再继续` : "门禁未通过,检查证据与 Claim";
131
+ return "系统将先尝试补充材料或修正流程;无法完成时会说明具体原因和下一步";
113
132
  }
114
- if (waiting.length > 0)
115
- return `有 ${waiting.length} 项待你确认`;
116
133
  switch (phase) {
117
- case "paused": return "批准从 checkpoint 恢复运行";
134
+ case "paused": return "运行已暂停,可从当前检查点继续";
118
135
  case "completed": return "检查产物,按 APA7 导出 DOCX(图片已内嵌)";
119
136
  case "executing": return "模型正在后台执行,无需操作";
120
137
  case "verifying": return "模型正在核验门禁";
@@ -252,6 +269,11 @@ export async function projectRunSnapshot(root, runId) {
252
269
  : checkpoint.kind === "valid" && checkpoint.status === "paused"
253
270
  ? "paused"
254
271
  : phaseFromEvents(events);
272
+ const researchDecisions = phase === "awaiting-human"
273
+ ? events.slice(-1).flatMap((event) => event.type === "awaiting-human" && event.researchDecision
274
+ ? [redactSecrets(event.researchDecision.question)]
275
+ : [])
276
+ : [];
255
277
  const snapshot = {
256
278
  schemaVersion: "psyclaw/run-snapshot/v1",
257
279
  runId,
@@ -260,11 +282,7 @@ export async function projectRunSnapshot(root, runId) {
260
282
  paradigm: project.paradigm,
261
283
  phase,
262
284
  blocked: gateBlocked.length > 0 || phase === "blocked",
263
- waitingOnHuman: [
264
- ...(eventCorrupt ? ["run event log is corrupt or unavailable"] : []),
265
- ...(checkpointCorrupt ? ["run checkpoint is corrupt or unavailable"] : []),
266
- ...gateBlocked.map((gate) => redactSecrets(gate.reason)),
267
- ],
285
+ waitingOnHuman: researchDecisions,
268
286
  gates: gates.map((gate) => ({
269
287
  gateId: gate.gateId,
270
288
  ok: gate.ok,
@@ -280,7 +298,7 @@ export async function projectRunSnapshot(root, runId) {
280
298
  },
281
299
  eventCount: events.length,
282
300
  updatedAt: new Date().toISOString(),
283
- nextStep: nextStepFor(phase, gateBlocked.length > 0, gateBlocked.map((gate) => redactSecrets(gate.reason)), checkpointCorrupt || eventCorrupt),
301
+ nextStep: nextStepFor(phase, gateBlocked.length > 0, researchDecisions, checkpointCorrupt || eventCorrupt),
284
302
  };
285
303
  asRunSnapshot(snapshot);
286
304
  return snapshot;
@@ -1 +1 @@
1
- {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/panel/projection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/panel/projection.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,12 @@ export declare function downloadReferencePdf(root: string, doi: string, fetchFn?
24
24
  reason: string;
25
25
  doi: string;
26
26
  }>;
27
+ interface PanelPluginRecord {
28
+ source: string;
29
+ scope: "project" | "user";
30
+ filtered: boolean;
31
+ installed: boolean;
32
+ }
27
33
  export interface PanelServerOptions {
28
34
  /** Absolute or cwd-relative path to the panel HTML file. */
29
35
  panelHtmlPath?: string;
@@ -33,8 +39,12 @@ export interface PanelServerOptions {
33
39
  }>;
34
40
  /** Queue an approved installation task into the current PsyClaw model session. */
35
41
  installSkill?: (task: string) => Promise<void>;
42
+ /** Queue an explicitly requested external-tool installation task. */
43
+ installExternalTool?: (task: string) => Promise<void>;
36
44
  /** Install a Plugin through Pi's native package manager. */
37
- installPlugin?: (source: string) => Promise<void>;
45
+ installPlugin?: (source: string, scope: "project" | "user") => Promise<void>;
46
+ /** Read Pi's configured packages without duplicating its package registry. */
47
+ listPlugins?: () => PanelPluginRecord[];
38
48
  }
39
49
  /**
40
50
  * When the panel message references claims by id (e.g. the 追问此论断 flow),
@@ -425,6 +425,9 @@ function publicInstallPlan(plan) {
425
425
  const { projectRoot: _projectRoot, ...publicFields } = plan;
426
426
  return publicFields;
427
427
  }
428
+ function pluginSourceIdentity(source) {
429
+ return source.trim().replace(/^git:/, "").replace(/\.git$/i, "").replace(/\/$/, "").toLocaleLowerCase();
430
+ }
428
431
  function panelSkillInstallTask(root, item, scope) {
429
432
  const id = String(item.id ?? "");
430
433
  const name = String(item.name ?? id);
@@ -441,6 +444,16 @@ function panelSkillInstallTask(root, item, scope) {
441
444
  "安装完成后检查目标目录结构,并提醒用户执行 /skill 启用该项,再执行 /reload。",
442
445
  ].join("\n");
443
446
  }
447
+ function panelExternalToolInstallTask(root, item) {
448
+ return [
449
+ `安装推荐外部工具:${String(item.name ?? item.id ?? "external tool")}。`,
450
+ `官方来源:${String(item.sourceRef ?? "")}`,
451
+ `当前工作目录:${root}`,
452
+ String(item.installHint ?? "读取官方最新安装说明,选择适合当前操作系统的安装方式。"),
453
+ "用户已在 Panel 中明确点击安装。读取官方安装说明,执行安装并验证版本或最小命令;不要读取或输出凭据。",
454
+ "这是外部工具,不要将它宣称为来源仓库提供的 Skill 或 Plugin。完成后用自然语言报告实际安装位置、版本和验证结果。",
455
+ ].join("\n");
456
+ }
444
457
  /** Metadata-only catalog for the optional panel. No install or credential read. */
445
458
  async function panelCatalog(root) {
446
459
  const scans = await discoverAgents();
@@ -952,7 +965,7 @@ export function createPanelServer(root, options = {}) {
952
965
  return;
953
966
  }
954
967
  const body = await readJsonBody(request);
955
- const kind = body.kind === "skill" || body.kind === "mcp" || body.kind === "plugin" ? body.kind : undefined;
968
+ const kind = body.kind === "skill" || body.kind === "mcp" || body.kind === "plugin" || body.kind === "external" ? body.kind : undefined;
956
969
  const id = String(body.id ?? "").trim();
957
970
  const approved = body.approved === true;
958
971
  const scope = body.scope === "project" || body.scope === "user" ? body.scope : undefined;
@@ -965,7 +978,13 @@ export function createPanelServer(root, options = {}) {
965
978
  const item = (catalog.plugins ?? []).find((candidate) => candidate.id === id);
966
979
  return item ? { item } : undefined;
967
980
  })()
968
- : await findRecommendedItem(kind, id);
981
+ : kind === "external"
982
+ ? await (async () => {
983
+ const catalog = await recommendedSkills();
984
+ const item = (catalog.externalTools ?? []).find((candidate) => candidate.id === id && candidate.installable !== false);
985
+ return item ? { item } : undefined;
986
+ })()
987
+ : await findRecommendedItem(kind, id);
969
988
  if (!found) {
970
989
  response.writeHead(404, { "content-type": "application/json" });
971
990
  response.end(JSON.stringify({ error: "unknown recommended item" }));
@@ -996,6 +1015,8 @@ export function createPanelServer(root, options = {}) {
996
1015
  return;
997
1016
  }
998
1017
  if (kind === "plugin") {
1018
+ if (!scope)
1019
+ throw new Error("scope must be project or user for Plugin installation");
999
1020
  if (options.installPlugin === undefined) {
1000
1021
  response.writeHead(503, { "content-type": "application/json" });
1001
1022
  response.end(JSON.stringify({ error: "Plugin 安装器不可用,请在 PsyClaw 对话中执行 /panel 后重试。" }));
@@ -1004,9 +1025,20 @@ export function createPanelServer(root, options = {}) {
1004
1025
  const source = String(found.item.sourceRef ?? "").trim();
1005
1026
  if (!source)
1006
1027
  throw new Error("Plugin source is missing");
1007
- await options.installPlugin(source);
1028
+ await options.installPlugin(source, scope);
1029
+ response.writeHead(202, { "content-type": "application/json" });
1030
+ response.end(JSON.stringify({ schemaVersion: "psyclaw/plugin-install-receipt/v1", ok: true, id, source, scope, reloadHint: "/reload", message: "Plugin 已由 Pi 原生安装器处理;请执行 /reload。" }));
1031
+ return;
1032
+ }
1033
+ if (kind === "external") {
1034
+ if (options.installExternalTool === undefined) {
1035
+ response.writeHead(503, { "content-type": "application/json" });
1036
+ response.end(JSON.stringify({ error: "外部工具安装需要当前模型通道;请在 PsyClaw 对话中执行 /panel 后再安装。" }));
1037
+ return;
1038
+ }
1039
+ await options.installExternalTool(panelExternalToolInstallTask(root, found.item));
1008
1040
  response.writeHead(202, { "content-type": "application/json" });
1009
- response.end(JSON.stringify({ schemaVersion: "psyclaw/plugin-install-receipt/v1", ok: true, id, source, reloadHint: "/reload", message: "Plugin 已交给 Pi 原生安装器处理;请重启或执行 /reload。" }));
1041
+ response.end(JSON.stringify({ schemaVersion: "psyclaw/external-tool-install-task/v1", ok: true, queued: true, id, message: "安装任务已交给当前模型;完成后会报告版本与验证结果。" }));
1010
1042
  return;
1011
1043
  }
1012
1044
  const shellCommand = typeof found.prep?.command === "string" && found.prep.command.trim() ? found.prep.command.trim() : undefined;
@@ -1614,6 +1646,56 @@ export function createPanelServer(root, options = {}) {
1614
1646
  response.end(JSON.stringify(await recommendedSkills()));
1615
1647
  return;
1616
1648
  }
1649
+ if (url.pathname === "/api/recommended-plugins") {
1650
+ const catalog = await recommendedSkills();
1651
+ const configuredBySource = new Map();
1652
+ for (const entry of options.listPlugins?.() ?? []) {
1653
+ const key = pluginSourceIdentity(entry.source);
1654
+ const previous = configuredBySource.get(key);
1655
+ if (!previous || entry.scope === "project")
1656
+ configuredBySource.set(key, entry);
1657
+ }
1658
+ const matched = new Set();
1659
+ const items = (catalog.plugins ?? []).map((item) => {
1660
+ const sourceRef = String(item.sourceRef ?? "");
1661
+ const sourceKey = pluginSourceIdentity(sourceRef);
1662
+ const installed = configuredBySource.get(sourceKey);
1663
+ if (installed)
1664
+ matched.add(sourceKey);
1665
+ return {
1666
+ ...item,
1667
+ installed: installed?.installed === true,
1668
+ enabled: installed?.installed === true,
1669
+ configured: installed !== undefined,
1670
+ local: false,
1671
+ ...(installed === undefined ? {} : { scope: installed.scope }),
1672
+ ...(installed?.filtered === undefined ? {} : { filtered: installed.filtered }),
1673
+ };
1674
+ });
1675
+ const localItems = [...configuredBySource.entries()]
1676
+ .filter(([key]) => !matched.has(key))
1677
+ .map(([, entry], index) => {
1678
+ const normalized = entry.source.replace(/^git:/, "").replace(/[?#].*$/, "").replace(/\.git$/i, "").replace(/\/$/, "");
1679
+ const name = normalized.split(/[\\/]/).filter(Boolean).at(-1)?.replace(/^npm:/, "") || "Local Plugin";
1680
+ return {
1681
+ id: `local-plugin-${index + 1}`,
1682
+ name,
1683
+ kind: "plugin",
1684
+ stage: "本地 Plugin",
1685
+ description: "由 Pi 原生包管理器识别的本地已安装 Plugin。",
1686
+ sourceRef: entry.source,
1687
+ installed: entry.installed,
1688
+ enabled: entry.installed,
1689
+ configured: true,
1690
+ local: true,
1691
+ scope: entry.scope,
1692
+ filtered: entry.filtered,
1693
+ };
1694
+ });
1695
+ response.writeHead(200, { "content-type": "application/json" });
1696
+ response.end(JSON.stringify({ schemaVersion: "psyclaw/recommended-plugins/v1", items: [...items, ...localItems] }));
1697
+ return;
1698
+ }
1617
1699
  if (url.pathname === "/api/recommended-mcps") {
1618
1700
  response.writeHead(200, { "content-type": "application/json" });
1619
1701
  response.end(JSON.stringify(await recommendedMcps()));