psyclaw 0.25.2 → 0.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,39 @@
1
+ /**
2
+ * Content preflight for skill bodies. This is a heuristic tripwire, not an OS
3
+ * boundary: a body that instructs the agent to bypass gates or move data out
4
+ * of the project is marked suspicious and the skill is never executable.
5
+ */
6
+ const SUSPICIOUS_PATTERNS = [
7
+ {
8
+ name: "bypass-gate",
9
+ source: "\\b(?:bypass|circumvent|disable|skip|override|ignore|turn\\s+off)\\s+" +
10
+ "(?:the\\s+)?(?:gate|integrity|verification|check|audit|policy|approval|allowlist)s?\\b",
11
+ flags: "i",
12
+ },
13
+ {
14
+ name: "exfiltrate-data",
15
+ source: "\\b(?:upload|exfiltrate|send|transmit|forward|export)\\s+" +
16
+ "(?:all|every|the|our)\\s+(?:files?|data|documents?|credentials|secrets|tokens)\\b",
17
+ flags: "i",
18
+ },
19
+ {
20
+ name: "collect-secrets",
21
+ source: "\\b(?:read|collect|steal|harvest)\\s+" +
22
+ "(?:credentials|secrets|tokens|api[ -]?keys|passwords|env(?:ironment)?)\\b",
23
+ flags: "i",
24
+ },
25
+ {
26
+ name: "disable-audit",
27
+ source: "\\b(?:disable|suppress|turn\\s+off)\\s+(?:logging|audit(?:ing)?|tracing)\\b",
28
+ flags: "i",
29
+ },
30
+ ];
31
+ export function preflightSkillBody(body) {
32
+ const findings = [];
33
+ for (const { name, source, flags } of SUSPICIOUS_PATTERNS) {
34
+ if (new RegExp(source, flags).test(body))
35
+ findings.push(name);
36
+ }
37
+ return { suspicious: findings.length > 0, findings };
38
+ }
39
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../../src/skills/preflight.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,MAAM,mBAAmB,GAAiC;IACxD;QACE,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,uEAAuE;YAC7E,wFAAwF;QAC1F,KAAK,EAAE,GAAG;KACX;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,2DAA2D;YACjE,mFAAmF;QACrF,KAAK,EAAE,GAAG;KACX;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,uCAAuC;YAC7C,2EAA2E;QAC7E,KAAK,EAAE,GAAG;KACX;IACD;QACE,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,6EAA6E;QACrF,KAAK,EAAE,GAAG;KACX;CACF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,mBAAmB,EAAE,CAAC;QAC1D,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type LoadedSkill, type SkillDescriptor, type SkillDiagnostic, type SkillDiscoveryReport, type SkillRegistryOptions, type SkillSearchOptions } from "./contracts.js";
2
+ type Metadata = Record<string, unknown>;
3
+ interface ParsedSkill {
4
+ metadata: Metadata;
5
+ body: string;
6
+ }
7
+ /** Parse only the leading YAML document and return the Markdown body separately. */
8
+ declare function parseSkillDocument(text: string, path: string): ParsedSkill;
9
+ export declare class SkillRegistry {
10
+ private readonly roots;
11
+ private readonly approvals;
12
+ private readonly entries;
13
+ private readonly diagnosticLog;
14
+ constructor(roots?: string[]);
15
+ constructor(options?: SkillRegistryOptions);
16
+ discover(roots?: string[]): Promise<SkillDiscoveryReport>;
17
+ list(options?: {
18
+ enabledOnly?: boolean;
19
+ }): SkillDescriptor[];
20
+ diagnostics(): SkillDiagnostic[];
21
+ search(query: string, options?: SkillSearchOptions): SkillDescriptor[];
22
+ enable(id: string): SkillDescriptor;
23
+ disable(id: string): SkillDescriptor;
24
+ load(id: string): Promise<LoadedSkill>;
25
+ private unique;
26
+ private setEnabled;
27
+ }
28
+ export { parseSkillDocument };
@@ -0,0 +1,540 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lstat, readdir, readFile, realpath } from "node:fs/promises";
3
+ import { isAbsolute, relative, resolve } from "node:path";
4
+ import { parse as parseYaml } from "yaml";
5
+ import { SKILL_DESCRIPTOR_VERSION, } from "./contracts.js";
6
+ import { preflightSkillBody } from "./preflight.js";
7
+ const LICENSE_STATUSES = new Set([
8
+ "verified",
9
+ "declared",
10
+ "missing",
11
+ "invalid",
12
+ "unknown",
13
+ ]);
14
+ const DEPENDENCY_STATUSES = new Set([
15
+ "ready",
16
+ "declared",
17
+ "missing",
18
+ "blocked",
19
+ "unknown",
20
+ ]);
21
+ const TRUST_STATUSES = new Set(["trusted", "untrusted", "blocked", "unknown"]);
22
+ const RISK_LEVELS = new Set(["low", "medium", "high", "critical", "unknown"]);
23
+ function diagnostic(code, message, path, extra = {}) {
24
+ return {
25
+ code,
26
+ message,
27
+ ...(path === undefined ? {} : { path }),
28
+ severity: extra.severity ?? (code === "duplicate-id" || code === "path-traversal" || code === "symlink-path" ? "error" : "warning"),
29
+ ...(extra.skillId === undefined ? {} : { skillId: extra.skillId }),
30
+ ...(extra.relatedPaths === undefined ? {} : { relatedPaths: extra.relatedPaths }),
31
+ };
32
+ }
33
+ function nonEmptyString(value) {
34
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
35
+ }
36
+ function metadataString(metadata, ...keys) {
37
+ for (const key of keys) {
38
+ const value = nonEmptyString(metadata[key]);
39
+ if (value !== undefined)
40
+ return value;
41
+ }
42
+ return undefined;
43
+ }
44
+ function statusFromMetadata(metadata, keys, allowed, fallback) {
45
+ const value = metadataString(metadata, ...keys);
46
+ return value !== undefined && allowed.has(value) ? value : fallback;
47
+ }
48
+ function deriveLicenseStatus(metadata) {
49
+ // A skill cannot self-certify "verified": the frontmatter alone can only
50
+ // declare a license or report it missing. Verification comes from a host
51
+ // manifest/preflight, never from the skill's own claim.
52
+ const license = nonEmptyString(metadata.license);
53
+ return license === undefined ? "missing" : "declared";
54
+ }
55
+ function hasDependencies(metadata) {
56
+ const dependencies = metadata.dependencies;
57
+ if (Array.isArray(dependencies))
58
+ return dependencies.length > 0;
59
+ if (dependencies !== null && typeof dependencies === "object")
60
+ return Object.keys(dependencies).length > 0;
61
+ return nonEmptyString(dependencies) !== undefined;
62
+ }
63
+ function deriveDependencyStatus(metadata) {
64
+ // "ready" is a host determination that declared dependencies are
65
+ // satisfiable; the frontmatter can only declare or omit dependencies.
66
+ return hasDependencies(metadata) ? "declared" : "ready";
67
+ }
68
+ function deriveTrust(metadata) {
69
+ // Trust is host-decided. A self-declared "blocked" is honored as explicit
70
+ // self-exclusion; self-declared "trusted"/"untrusted" are not taken at face
71
+ // value and remain "unknown" until the host approves.
72
+ const value = metadataString(metadata, "trust", "trustStatus", "trust_status");
73
+ return value === "blocked" ? "blocked" : "unknown";
74
+ }
75
+ function deriveRisk(metadata) {
76
+ return statusFromMetadata(metadata, ["risk", "riskLevel", "risk_level"], RISK_LEVELS, "unknown");
77
+ }
78
+ function isPlainRecord(value) {
79
+ return value !== null && typeof value === "object" && !Array.isArray(value);
80
+ }
81
+ function rejectTraversal(input) {
82
+ const normalized = input.replaceAll("\\", "/");
83
+ const withoutDrive = normalized.replace(/^[A-Za-z]:\/?/, "");
84
+ if (withoutDrive.split("/").some((segment) => segment === "..")) {
85
+ throw new Error(`Path traversal is not allowed: ${input}`);
86
+ }
87
+ }
88
+ function assertContained(root, target) {
89
+ const rel = relative(root, target).replaceAll("\\", "/");
90
+ if (rel === ".." || rel.startsWith("../") || isAbsolute(rel) || rel.startsWith("/")) {
91
+ throw new Error(`Path escapes skill root: ${target}`);
92
+ }
93
+ }
94
+ /** Parse only the leading YAML document and return the Markdown body separately. */
95
+ function parseSkillDocument(text, path) {
96
+ const normalized = text.replace(/^\uFEFF/, "");
97
+ const opening = normalized.match(/^---[ \t]*\r?\n/);
98
+ if (opening === null)
99
+ throw new Error(`SKILL.md must start with YAML frontmatter: ${path}`);
100
+ const start = opening[0].length;
101
+ const closing = /^(---|\.\.\.)[ \t]*(?:\r?\n|$)/m.exec(normalized.slice(start));
102
+ if (closing === null)
103
+ throw new Error(`YAML frontmatter is not terminated: ${path}`);
104
+ const yamlText = normalized.slice(start, start + closing.index);
105
+ let parsed;
106
+ try {
107
+ parsed = parseYaml(yamlText);
108
+ }
109
+ catch (error) {
110
+ const message = error instanceof Error ? error.message : String(error);
111
+ throw new Error(`Invalid YAML frontmatter: ${message}`);
112
+ }
113
+ if (parsed === null || parsed === undefined)
114
+ parsed = {};
115
+ if (!isPlainRecord(parsed))
116
+ throw new Error(`YAML frontmatter must be a mapping: ${path}`);
117
+ const body = normalized.slice(start + closing.index + closing[0].length);
118
+ return { metadata: parsed, body };
119
+ }
120
+ function skillIdentity(metadata, filePath) {
121
+ const name = nonEmptyString(metadata.name);
122
+ const description = nonEmptyString(metadata.description);
123
+ if (name === undefined || description === undefined) {
124
+ throw new Error("Frontmatter requires non-empty name and description");
125
+ }
126
+ const id = nonEmptyString(metadata.id) ?? name;
127
+ // IDs are lookup keys, never paths. Refuse separators and traversal markers.
128
+ if (id.includes("/") || id.includes("\\") || id === "." || id === ".." || id.trim() !== id) {
129
+ throw new Error(`Invalid skill id: ${id}`);
130
+ }
131
+ if (id.length > 128)
132
+ throw new Error(`Skill id is too long: ${id}`);
133
+ void filePath;
134
+ return { id, name, description };
135
+ }
136
+ async function assertRoot(rootInput) {
137
+ rejectTraversal(rootInput);
138
+ const source = resolve(rootInput);
139
+ const stat = await lstat(source);
140
+ if (stat.isSymbolicLink())
141
+ throw new Error(`Skill root is a symlink: ${source}`);
142
+ if (!stat.isDirectory())
143
+ throw new Error(`Skill root is not a directory: ${source}`);
144
+ return { source, resolved: await realpath(source) };
145
+ }
146
+ async function walkSkillFiles(root, diagnostics) {
147
+ const files = [];
148
+ const visit = async (directory) => {
149
+ let entries;
150
+ try {
151
+ entries = await readdir(directory, { withFileTypes: true });
152
+ }
153
+ catch (error) {
154
+ diagnostics.push(diagnostic("read-error", `Unable to read skill directory: ${String(error)}`, directory));
155
+ return;
156
+ }
157
+ for (const entry of entries) {
158
+ const candidate = resolve(directory, entry.name);
159
+ try {
160
+ assertContained(root.resolved, await realpath(directory));
161
+ }
162
+ catch (error) {
163
+ diagnostics.push(diagnostic("path-traversal", String(error), candidate));
164
+ continue;
165
+ }
166
+ if (entry.isSymbolicLink()) {
167
+ diagnostics.push(diagnostic("symlink-path", "Symlinked skill paths are not allowed", candidate));
168
+ continue;
169
+ }
170
+ if (entry.isDirectory()) {
171
+ await visit(candidate);
172
+ }
173
+ else if (entry.isFile() && entry.name === "SKILL.md") {
174
+ files.push(candidate);
175
+ }
176
+ }
177
+ };
178
+ await visit(root.source);
179
+ return files;
180
+ }
181
+ async function verifyFilePath(sourcePath, rootPath) {
182
+ const sourceStat = await lstat(sourcePath);
183
+ if (sourceStat.isSymbolicLink())
184
+ throw new Error(`Skill file is a symlink: ${sourcePath}`);
185
+ if (!sourceStat.isFile())
186
+ throw new Error(`Skill path is not a file: ${sourcePath}`);
187
+ const resolved = await realpath(sourcePath);
188
+ assertContained(rootPath, resolved);
189
+ // `sourcePath` is produced by a non-symlink directory walk. If its
190
+ // canonical form later differs, a parent component was replaced by a
191
+ // junction/symlink (or the path was otherwise swapped); never follow it.
192
+ if (!samePath(resolve(sourcePath), resolved)) {
193
+ throw new Error(`Skill path contains a symlink or changed while reading: ${sourcePath}`);
194
+ }
195
+ return resolved;
196
+ }
197
+ function samePath(left, right) {
198
+ const normalize = process.platform === "win32"
199
+ ? (value) => value.replace(/[\\/]+/g, "\\").replace(/\\$/, "").toLocaleLowerCase()
200
+ : (value) => value;
201
+ const normalizedLeft = normalize(left);
202
+ const normalizedRight = normalize(right);
203
+ return normalizedLeft === normalizedRight;
204
+ }
205
+ function pathKey(value) {
206
+ return process.platform === "win32" ? value.toLocaleLowerCase() : value;
207
+ }
208
+ /**
209
+ * Read a skill twice with canonical-path checks around the reads. This is a
210
+ * small, fail-closed TOCTOU guard: if a path is swapped, symlinked, or
211
+ * modified while it is being inspected, discovery/load refuses the file.
212
+ */
213
+ async function readSkillFileStable(sourcePath, rootPath) {
214
+ const before = await verifyFilePath(sourcePath, rootPath);
215
+ const firstBytes = await readFile(before);
216
+ const firstText = firstBytes.toString("utf8");
217
+ const firstHash = createHash("sha256").update(firstBytes).digest("hex");
218
+ const after = await verifyFilePath(sourcePath, rootPath);
219
+ if (!samePath(before, after)) {
220
+ throw new Error(`Skill path changed while reading: ${sourcePath}`);
221
+ }
222
+ const secondBytes = await readFile(after);
223
+ const secondText = secondBytes.toString("utf8");
224
+ const secondHash = createHash("sha256").update(secondBytes).digest("hex");
225
+ if (firstHash !== secondHash || !firstBytes.equals(secondBytes)) {
226
+ throw new Error(`Skill changed while reading: ${sourcePath}`);
227
+ }
228
+ const finalPath = await verifyFilePath(sourcePath, rootPath);
229
+ if (!samePath(after, finalPath)) {
230
+ throw new Error(`Skill path changed after reading: ${sourcePath}`);
231
+ }
232
+ return { text: firstText, sha256: firstHash, resolvedPath: finalPath };
233
+ }
234
+ function approvalEntry(approvals, id) {
235
+ if (approvals instanceof Map)
236
+ return approvals.get(id);
237
+ const record = approvals;
238
+ return Object.prototype.hasOwnProperty.call(record, id) ? record[id] : undefined;
239
+ }
240
+ function isValidApproval(value) {
241
+ if (value === null || typeof value !== "object" || Array.isArray(value))
242
+ return false;
243
+ const candidate = value;
244
+ if (typeof candidate.approved !== "boolean")
245
+ return false;
246
+ if (candidate.sha256 !== undefined &&
247
+ (typeof candidate.sha256 !== "string" || !/^[a-f0-9]{64}$/i.test(candidate.sha256)))
248
+ return false;
249
+ if (candidate.sourcePath !== undefined && typeof candidate.sourcePath !== "string")
250
+ return false;
251
+ if (candidate.resolvedPath !== undefined && typeof candidate.resolvedPath !== "string")
252
+ return false;
253
+ if (candidate.admission !== undefined && !isValidAdmissionEvidence(candidate.admission))
254
+ return false;
255
+ return true;
256
+ }
257
+ function isValidAdmissionEvidence(value) {
258
+ if (value === null || typeof value !== "object" || Array.isArray(value))
259
+ return false;
260
+ const candidate = value;
261
+ return candidate.schemaVersion === "psyclaw/skill-admission/v1" &&
262
+ typeof candidate.contentSha256 === "string" && /^[a-f0-9]{64}$/i.test(candidate.contentSha256) &&
263
+ typeof candidate.licenseSpdx === "string" && candidate.licenseSpdx.trim() !== "" &&
264
+ candidate.licenseSpdx.toLocaleLowerCase() !== "unknown" &&
265
+ typeof candidate.licenseEvidenceRef === "string" && candidate.licenseEvidenceRef.trim() !== "" &&
266
+ typeof candidate.dependencyEvidenceRef === "string" && candidate.dependencyEvidenceRef.trim() !== "" &&
267
+ typeof candidate.sbomSha256 === "string" && /^[a-f0-9]{64}$/i.test(candidate.sbomSha256);
268
+ }
269
+ function copyApproval(entry) {
270
+ if (typeof entry === "boolean")
271
+ return entry;
272
+ if (!isValidApproval(entry))
273
+ return false;
274
+ return Object.freeze({
275
+ approved: entry.approved,
276
+ ...(entry.sha256 === undefined ? {} : { sha256: entry.sha256.toLocaleLowerCase() }),
277
+ ...(entry.sourcePath === undefined ? {} : { sourcePath: entry.sourcePath }),
278
+ ...(entry.resolvedPath === undefined ? {} : { resolvedPath: entry.resolvedPath }),
279
+ ...(entry.admission === undefined ? {} : {
280
+ admission: Object.freeze({
281
+ schemaVersion: entry.admission.schemaVersion,
282
+ contentSha256: entry.admission.contentSha256.toLocaleLowerCase(),
283
+ licenseSpdx: entry.admission.licenseSpdx,
284
+ licenseEvidenceRef: entry.admission.licenseEvidenceRef,
285
+ dependencyEvidenceRef: entry.admission.dependencyEvidenceRef,
286
+ sbomSha256: entry.admission.sbomSha256.toLocaleLowerCase(),
287
+ }),
288
+ }),
289
+ });
290
+ }
291
+ function pathMatchesPin(pin, descriptor) {
292
+ if (pin === undefined)
293
+ return true;
294
+ const normalizedPin = pin.replaceAll("\\", "/");
295
+ if (normalizedPin.split("/").some((segment) => segment === ".."))
296
+ return false;
297
+ const resolvedPin = resolve(pin);
298
+ const rootRelativePin = resolve(descriptor.rootPath, pin);
299
+ return samePath(resolvedPin, descriptor.sourcePath) ||
300
+ samePath(resolvedPin, descriptor.resolvedPath) ||
301
+ samePath(rootRelativePin, descriptor.sourcePath) ||
302
+ samePath(rootRelativePin, descriptor.resolvedPath);
303
+ }
304
+ function approvalFor(descriptor, approvals) {
305
+ if (descriptor.trust === "blocked")
306
+ return "blocked";
307
+ const entry = approvalEntry(approvals, descriptor.id);
308
+ if (entry === undefined)
309
+ return "discover-only";
310
+ const approval = typeof entry === "boolean"
311
+ ? { approved: entry }
312
+ : isValidApproval(entry)
313
+ ? entry
314
+ : { approved: false };
315
+ if (!approval.approved)
316
+ return "blocked";
317
+ // A path/content pin is not a license or dependency audit. Require a
318
+ // host-generated admission record before allowing executable content.
319
+ // Frontmatter-derived license/dependency values never upgrade this record;
320
+ // a verified external manifest may cover a skill whose frontmatter is terse.
321
+ if (!approval.admission || !isValidAdmissionEvidence(approval.admission))
322
+ return "discover-only";
323
+ if (approval.admission.contentSha256.toLocaleLowerCase() !== descriptor.sha256)
324
+ return "stale";
325
+ // A no-pin approval (e.g. the `approvedIds` id shorthand) cannot grant
326
+ // execution; a content SHA or path pin must bind the approval to the
327
+ // discovered skill.
328
+ const hasPin = approval.sha256 !== undefined ||
329
+ approval.sourcePath !== undefined ||
330
+ approval.resolvedPath !== undefined;
331
+ if (!hasPin)
332
+ return "discover-only";
333
+ if (approval.sha256 !== undefined && approval.sha256.toLocaleLowerCase() !== descriptor.sha256)
334
+ return "stale";
335
+ if (!pathMatchesPin(approval.sourcePath, descriptor) || !pathMatchesPin(approval.resolvedPath, descriptor))
336
+ return "stale";
337
+ return "approved";
338
+ }
339
+ export class SkillRegistry {
340
+ roots;
341
+ approvals;
342
+ entries = new Map();
343
+ diagnosticLog = [];
344
+ constructor(rootsOrOptions = []) {
345
+ if (Array.isArray(rootsOrOptions)) {
346
+ this.roots = [...rootsOrOptions];
347
+ this.approvals = new Map();
348
+ }
349
+ else {
350
+ this.roots = [...(rootsOrOptions.roots ?? [])];
351
+ // `enableByDefault` is retained in the public options only so existing
352
+ // callers fail safely after upgrade; frontmatter can never approve a
353
+ // skill. Explicit approvals always come from the host options.
354
+ const merged = new Map();
355
+ const configured = rootsOrOptions.approvals ?? rootsOrOptions.approvalMap ?? rootsOrOptions.approval;
356
+ if (configured !== undefined) {
357
+ if (configured instanceof Map) {
358
+ for (const [id, entry] of configured.entries())
359
+ merged.set(id, copyApproval(entry));
360
+ }
361
+ else {
362
+ for (const [id, entry] of Object.entries(configured))
363
+ merged.set(id, copyApproval(entry));
364
+ }
365
+ }
366
+ for (const id of rootsOrOptions.approvedIds ?? []) {
367
+ // An explicit deny in the richer map wins over the shorthand list.
368
+ if (!merged.has(id))
369
+ merged.set(id, true);
370
+ }
371
+ this.approvals = merged;
372
+ void rootsOrOptions.enableByDefault;
373
+ }
374
+ }
375
+ async discover(roots = this.roots) {
376
+ this.entries.clear();
377
+ this.diagnosticLog.length = 0;
378
+ const seenPaths = new Set();
379
+ for (const rootInput of roots) {
380
+ let root;
381
+ try {
382
+ root = await assertRoot(rootInput);
383
+ }
384
+ catch (error) {
385
+ const code = /symlink/i.test(String(error))
386
+ ? "root-symlink"
387
+ : /not a directory/i.test(String(error))
388
+ ? "root-not-directory"
389
+ : /ENOENT|not found/i.test(String(error))
390
+ ? "root-not-found"
391
+ : /traversal/i.test(String(error))
392
+ ? "path-traversal"
393
+ : "read-error";
394
+ this.diagnosticLog.push(diagnostic(code, String(error), resolve(rootInput)));
395
+ continue;
396
+ }
397
+ const files = await walkSkillFiles(root, this.diagnosticLog);
398
+ for (const sourcePath of files) {
399
+ let descriptor;
400
+ try {
401
+ const stable = await readSkillFileStable(sourcePath, root.resolved);
402
+ const resolvedPath = stable.resolvedPath;
403
+ const text = stable.text;
404
+ const parsed = parseSkillDocument(text, sourcePath);
405
+ const identity = skillIdentity(parsed.metadata, sourcePath);
406
+ const preflight = preflightSkillBody(parsed.body);
407
+ const resolvedKey = pathKey(resolvedPath);
408
+ if (seenPaths.has(resolvedKey))
409
+ continue;
410
+ seenPaths.add(resolvedKey);
411
+ if (preflight.suspicious) {
412
+ this.diagnosticLog.push(diagnostic("suspicious-body", `Skill body contains suspicious instructions: ${preflight.findings.join(", ")}`, sourcePath, { severity: "error", skillId: identity.id }));
413
+ }
414
+ const baseDescriptor = {
415
+ schemaVersion: SKILL_DESCRIPTOR_VERSION,
416
+ id: identity.id,
417
+ name: identity.name,
418
+ description: identity.description,
419
+ sourcePath,
420
+ resolvedPath,
421
+ rootPath: root.resolved,
422
+ sha256: stable.sha256,
423
+ licenseStatus: deriveLicenseStatus(parsed.metadata),
424
+ dependencyStatus: deriveDependencyStatus(parsed.metadata),
425
+ trust: preflight.suspicious ? "blocked" : deriveTrust(parsed.metadata),
426
+ risk: preflight.suspicious ? "critical" : deriveRisk(parsed.metadata),
427
+ enabled: false,
428
+ conflicted: false,
429
+ metadata: Object.freeze({ ...parsed.metadata }),
430
+ };
431
+ descriptor = Object.freeze({
432
+ ...baseDescriptor,
433
+ approvalStatus: approvalFor(baseDescriptor, this.approvals),
434
+ });
435
+ }
436
+ catch (error) {
437
+ const message = String(error);
438
+ const code = /frontmatter|YAML/i.test(message)
439
+ ? "invalid-frontmatter"
440
+ : /id|name and description/i.test(message)
441
+ ? "invalid-metadata"
442
+ : /hash/i.test(message)
443
+ ? "hash-error"
444
+ : /symlink/i.test(message)
445
+ ? "symlink-path"
446
+ : "read-error";
447
+ this.diagnosticLog.push(diagnostic(code, message, sourcePath));
448
+ continue;
449
+ }
450
+ const candidates = this.entries.get(descriptor.id) ?? [];
451
+ if (candidates.length > 0 && candidates.every((item) => item.resolvedPath !== descriptor.resolvedPath)) {
452
+ descriptor = { ...descriptor, conflicted: true };
453
+ const marked = candidates.map((item) => ({ ...item, conflicted: true }));
454
+ this.entries.set(descriptor.id, [...marked, descriptor]);
455
+ this.diagnosticLog.push(diagnostic("duplicate-id", `Skill id '${descriptor.id}' is provided by multiple paths`, descriptor.sourcePath, { severity: "error", skillId: descriptor.id, relatedPaths: [...marked.map((item) => item.sourcePath), descriptor.sourcePath] }));
456
+ }
457
+ else if (!candidates.some((item) => item.resolvedPath === descriptor.resolvedPath)) {
458
+ this.entries.set(descriptor.id, [...candidates, descriptor]);
459
+ }
460
+ }
461
+ }
462
+ return { skills: this.list(), diagnostics: this.diagnostics() };
463
+ }
464
+ list(options = {}) {
465
+ const skills = [...this.entries.values()].flat();
466
+ return (options.enabledOnly ? skills.filter((skill) => skill.enabled) : skills)
467
+ .sort((left, right) => left.id.localeCompare(right.id) || left.sourcePath.localeCompare(right.sourcePath));
468
+ }
469
+ diagnostics() {
470
+ return this.diagnosticLog.map((item) => ({
471
+ ...item,
472
+ ...(item.relatedPaths === undefined ? {} : { relatedPaths: [...item.relatedPaths] }),
473
+ }));
474
+ }
475
+ search(query, options = {}) {
476
+ const needle = query.trim().toLocaleLowerCase();
477
+ const candidates = options.enabledOnly === undefined
478
+ ? this.list()
479
+ : this.list({ enabledOnly: options.enabledOnly });
480
+ if (needle.length === 0)
481
+ return options.limit === undefined ? candidates : candidates.slice(0, options.limit);
482
+ const ranked = candidates
483
+ .map((skill) => {
484
+ const id = skill.id.toLocaleLowerCase();
485
+ const name = skill.name.toLocaleLowerCase();
486
+ const description = skill.description.toLocaleLowerCase();
487
+ const keywords = JSON.stringify(skill.metadata.keywords ?? skill.metadata.tags ?? "").toLocaleLowerCase();
488
+ const score = id === needle ? 0 : id.includes(needle) ? 1 : name.includes(needle) ? 2 : description.includes(needle) ? 3 : keywords.includes(needle) ? 4 : 5;
489
+ return { skill, score };
490
+ })
491
+ .filter((item) => item.score < 5)
492
+ .sort((left, right) => left.score - right.score || left.skill.id.localeCompare(right.skill.id) || left.skill.sourcePath.localeCompare(right.skill.sourcePath))
493
+ .map((item) => item.skill);
494
+ return options.limit === undefined ? ranked : ranked.slice(0, Math.max(0, options.limit));
495
+ }
496
+ enable(id) {
497
+ return this.setEnabled(id, true);
498
+ }
499
+ disable(id) {
500
+ return this.setEnabled(id, false);
501
+ }
502
+ async load(id) {
503
+ const descriptor = this.unique(id);
504
+ if (!descriptor.enabled)
505
+ throw new Error(`Skill is not enabled: ${id}`);
506
+ if (descriptor.approvalStatus !== "approved") {
507
+ throw new Error(`Skill requires explicit approval: ${id}`);
508
+ }
509
+ const stable = await readSkillFileStable(descriptor.sourcePath, descriptor.rootPath);
510
+ if (!samePath(stable.resolvedPath, descriptor.resolvedPath) || stable.sha256 !== descriptor.sha256) {
511
+ throw new Error(`Skill changed since discovery: ${id}`);
512
+ }
513
+ const text = stable.text;
514
+ const parsed = parseSkillDocument(text, descriptor.sourcePath);
515
+ return { ...descriptor, body: parsed.body };
516
+ }
517
+ unique(id) {
518
+ const candidates = this.entries.get(id) ?? [];
519
+ if (candidates.length === 0) {
520
+ throw new Error(`Skill not found: ${id}`);
521
+ }
522
+ if (candidates.length > 1) {
523
+ throw new Error(`Skill id is ambiguous: ${id}`);
524
+ }
525
+ return candidates[0];
526
+ }
527
+ setEnabled(id, enabled) {
528
+ const current = this.unique(id);
529
+ if (enabled && current.trust === "blocked")
530
+ throw new Error(`Skill is blocked by trust policy: ${id}`);
531
+ if (enabled && current.approvalStatus !== "approved") {
532
+ throw new Error(`Skill requires explicit approval: ${id}`);
533
+ }
534
+ const updated = Object.freeze({ ...current, enabled });
535
+ this.entries.set(id, [updated]);
536
+ return updated;
537
+ }
538
+ }
539
+ export { parseSkillDocument };
540
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/skills/registry.ts"],"names":[],"mappings":"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"}