@plurnk/plurnk-service 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/.env.defaults +29 -42
  2. package/INSTALL.md +49 -10
  3. package/README.md +11 -1
  4. package/SPEC.md +631 -279
  5. package/digest-sql/channel-dispositions/dispositions.sql +15 -0
  6. package/digest-sql/channel-state/state.sql +6 -0
  7. package/digest-sql/curation/curation.sql +5 -0
  8. package/digest-sql/derivations/derivations.sql +4 -0
  9. package/digest-sql/embeddings/embeddings.sql +4 -0
  10. package/digest-sql/entry-dispositions/dispositions.sql +15 -0
  11. package/digest-sql/entry-state/state.sql +6 -0
  12. package/digest-sql/token-counts/token-counts.sql +2 -0
  13. package/dist/Paths.d.ts +2 -5
  14. package/dist/Paths.d.ts.map +1 -1
  15. package/dist/Paths.js +9 -21
  16. package/dist/Paths.js.map +1 -1
  17. package/dist/build-info.json +1 -1
  18. package/dist/content/read-projector.d.ts.map +1 -1
  19. package/dist/content/read-projector.js +4 -3
  20. package/dist/content/read-projector.js.map +1 -1
  21. package/dist/core/BudgetReadout.d.ts.map +1 -1
  22. package/dist/core/BudgetReadout.js +12 -22
  23. package/dist/core/BudgetReadout.js.map +1 -1
  24. package/dist/core/ChannelWrite.d.ts.map +1 -1
  25. package/dist/core/ChannelWrite.js.map +1 -1
  26. package/dist/core/ChannelWrite.sql +2 -1
  27. package/dist/core/Dispatcher.d.ts +7 -6
  28. package/dist/core/Dispatcher.d.ts.map +1 -1
  29. package/dist/core/Dispatcher.js +34 -88
  30. package/dist/core/Dispatcher.js.map +1 -1
  31. package/dist/core/Engine.d.ts +11 -8
  32. package/dist/core/Engine.d.ts.map +1 -1
  33. package/dist/core/Engine.js +45 -27
  34. package/dist/core/Engine.js.map +1 -1
  35. package/dist/core/Engine.sql +112 -107
  36. package/dist/core/ExecutorRegistry.d.ts +8 -2
  37. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  38. package/dist/core/ExecutorRegistry.js +6 -3
  39. package/dist/core/ExecutorRegistry.js.map +1 -1
  40. package/dist/core/HostPaths.d.ts +29 -0
  41. package/dist/core/HostPaths.d.ts.map +1 -0
  42. package/dist/core/HostPaths.js +74 -0
  43. package/dist/core/HostPaths.js.map +1 -0
  44. package/dist/core/LegacyHome.d.ts +10 -0
  45. package/dist/core/LegacyHome.d.ts.map +1 -0
  46. package/dist/core/LegacyHome.js +170 -0
  47. package/dist/core/LegacyHome.js.map +1 -0
  48. package/dist/core/LogBody.d.ts +1 -1
  49. package/dist/core/LogBody.d.ts.map +1 -1
  50. package/dist/core/LogBody.js +2 -2
  51. package/dist/core/LogBody.js.map +1 -1
  52. package/dist/core/LogEntryProjection.js +1 -1
  53. package/dist/core/LogEntryProjection.js.map +1 -1
  54. package/dist/core/LogVisibility.d.ts +28 -0
  55. package/dist/core/LogVisibility.d.ts.map +1 -0
  56. package/dist/core/LogVisibility.js +215 -0
  57. package/dist/core/LogVisibility.js.map +1 -0
  58. package/dist/core/LoopLifecycle.d.ts +1 -0
  59. package/dist/core/LoopLifecycle.d.ts.map +1 -1
  60. package/dist/core/LoopLifecycle.js +8 -0
  61. package/dist/core/LoopLifecycle.js.map +1 -1
  62. package/dist/core/LoopLifecycle.sql +10 -0
  63. package/dist/core/OperatorConfig.d.ts +6 -0
  64. package/dist/core/OperatorConfig.d.ts.map +1 -0
  65. package/dist/core/OperatorConfig.js +92 -0
  66. package/dist/core/OperatorConfig.js.map +1 -0
  67. package/dist/core/OverflowTurn.d.ts +11 -0
  68. package/dist/core/OverflowTurn.d.ts.map +1 -0
  69. package/dist/core/OverflowTurn.js +77 -0
  70. package/dist/core/OverflowTurn.js.map +1 -0
  71. package/dist/core/Owner.js +2 -2
  72. package/dist/core/Owner.js.map +1 -1
  73. package/dist/core/PacketBuilder.d.ts +3 -15
  74. package/dist/core/PacketBuilder.d.ts.map +1 -1
  75. package/dist/core/PacketBuilder.js +48 -121
  76. package/dist/core/PacketBuilder.js.map +1 -1
  77. package/dist/core/ProblemLog.js +1 -1
  78. package/dist/core/ProblemLog.js.map +1 -1
  79. package/dist/core/ProposalLifecycle.d.ts.map +1 -1
  80. package/dist/core/ProposalLifecycle.js +3 -23
  81. package/dist/core/ProposalLifecycle.js.map +1 -1
  82. package/dist/core/ProviderInstantiate.d.ts +9 -5
  83. package/dist/core/ProviderInstantiate.d.ts.map +1 -1
  84. package/dist/core/ProviderInstantiate.js +99 -104
  85. package/dist/core/ProviderInstantiate.js.map +1 -1
  86. package/dist/core/ResourceMutations.d.ts.map +1 -1
  87. package/dist/core/ResourceMutations.js +5 -3
  88. package/dist/core/ResourceMutations.js.map +1 -1
  89. package/dist/core/SchemeRegistry.d.ts +0 -1
  90. package/dist/core/SchemeRegistry.d.ts.map +1 -1
  91. package/dist/core/SchemeRegistry.js +7 -11
  92. package/dist/core/SchemeRegistry.js.map +1 -1
  93. package/dist/core/ToolResources.d.ts +19 -0
  94. package/dist/core/ToolResources.d.ts.map +1 -0
  95. package/dist/core/ToolResources.js +122 -0
  96. package/dist/core/ToolResources.js.map +1 -0
  97. package/dist/core/Turn.d.ts +27 -0
  98. package/dist/core/Turn.d.ts.map +1 -0
  99. package/dist/core/Turn.js +43 -0
  100. package/dist/core/Turn.js.map +1 -0
  101. package/dist/core/Turn.sql +72 -0
  102. package/dist/core/TurnOps.d.ts +7 -0
  103. package/dist/core/TurnOps.d.ts.map +1 -0
  104. package/dist/core/TurnOps.js +63 -0
  105. package/dist/core/TurnOps.js.map +1 -0
  106. package/dist/core/TurnRunner.d.ts +12 -4
  107. package/dist/core/TurnRunner.d.ts.map +1 -1
  108. package/dist/core/TurnRunner.js +1045 -898
  109. package/dist/core/TurnRunner.js.map +1 -1
  110. package/dist/core/WorkerName.d.ts +1 -1
  111. package/dist/core/WorkerName.d.ts.map +1 -1
  112. package/dist/core/env-defaults.d.ts.map +1 -1
  113. package/dist/core/env-defaults.js +7 -5
  114. package/dist/core/env-defaults.js.map +1 -1
  115. package/dist/core/fork.d.ts.map +1 -1
  116. package/dist/core/fork.js +15 -4
  117. package/dist/core/fork.js.map +1 -1
  118. package/dist/core/fork.sql +57 -27
  119. package/dist/core/git-env.d.ts +0 -1
  120. package/dist/core/git-env.d.ts.map +1 -1
  121. package/dist/core/git-env.js +0 -3
  122. package/dist/core/git-env.js.map +1 -1
  123. package/dist/core/git-membership.d.ts.map +1 -1
  124. package/dist/core/git-membership.js +10 -26
  125. package/dist/core/git-membership.js.map +1 -1
  126. package/dist/core/git-state.d.ts.map +1 -1
  127. package/dist/core/git-state.js +13 -14
  128. package/dist/core/git-state.js.map +1 -1
  129. package/dist/core/operation-target-groups.d.ts +3 -0
  130. package/dist/core/operation-target-groups.d.ts.map +1 -0
  131. package/dist/core/operation-target-groups.js +53 -0
  132. package/dist/core/operation-target-groups.js.map +1 -0
  133. package/dist/core/packet-inject.d.ts +0 -1
  134. package/dist/core/packet-inject.d.ts.map +1 -1
  135. package/dist/core/packet-inject.js +6 -13
  136. package/dist/core/packet-inject.js.map +1 -1
  137. package/dist/core/packet-wire.d.ts +4 -0
  138. package/dist/core/packet-wire.d.ts.map +1 -1
  139. package/dist/core/packet-wire.js +208 -44
  140. package/dist/core/packet-wire.js.map +1 -1
  141. package/dist/core/plurnk-uri.d.ts +1 -1
  142. package/dist/core/plurnk-uri.d.ts.map +1 -1
  143. package/dist/core/plurnk-uri.js +3 -3
  144. package/dist/core/plurnk-uri.js.map +1 -1
  145. package/dist/core/teaching.d.ts.map +1 -1
  146. package/dist/core/teaching.js +4 -5
  147. package/dist/core/teaching.js.map +1 -1
  148. package/dist/core/worker-settings.d.ts +9 -0
  149. package/dist/core/worker-settings.d.ts.map +1 -0
  150. package/dist/core/worker-settings.js +25 -0
  151. package/dist/core/worker-settings.js.map +1 -0
  152. package/dist/core/workspace-settings.d.ts +0 -11
  153. package/dist/core/workspace-settings.d.ts.map +1 -1
  154. package/dist/core/workspace-settings.js +3 -47
  155. package/dist/core/workspace-settings.js.map +1 -1
  156. package/dist/digest/Digest.d.ts.map +1 -1
  157. package/dist/digest/Digest.js +164 -92
  158. package/dist/digest/Digest.js.map +1 -1
  159. package/dist/digest/digest.sql +8 -2
  160. package/dist/observe/genai.d.ts +9 -0
  161. package/dist/observe/genai.d.ts.map +1 -0
  162. package/dist/observe/genai.js +31 -0
  163. package/dist/observe/genai.js.map +1 -0
  164. package/dist/observe/spans.d.ts +3 -3
  165. package/dist/observe/spans.d.ts.map +1 -1
  166. package/dist/observe/spans.js +20 -5
  167. package/dist/observe/spans.js.map +1 -1
  168. package/dist/schemes/EffectPolicy.d.ts +3 -0
  169. package/dist/schemes/EffectPolicy.d.ts.map +1 -1
  170. package/dist/schemes/EffectPolicy.js +38 -6
  171. package/dist/schemes/EffectPolicy.js.map +1 -1
  172. package/dist/schemes/Exec.d.ts.map +1 -1
  173. package/dist/schemes/Exec.js +55 -13
  174. package/dist/schemes/Exec.js.map +1 -1
  175. package/dist/schemes/Log.d.ts +6 -2
  176. package/dist/schemes/Log.d.ts.map +1 -1
  177. package/dist/schemes/Log.js +73 -22
  178. package/dist/schemes/Log.js.map +1 -1
  179. package/dist/schemes/Log.sql +25 -7
  180. package/dist/schemes/Prompt.d.ts.map +1 -1
  181. package/dist/schemes/Prompt.js +1 -2
  182. package/dist/schemes/Prompt.js.map +1 -1
  183. package/dist/schemes/QuestionTool.d.ts +10 -0
  184. package/dist/schemes/QuestionTool.d.ts.map +1 -0
  185. package/dist/schemes/QuestionTool.js +81 -0
  186. package/dist/schemes/QuestionTool.js.map +1 -0
  187. package/dist/schemes/Skill.d.ts.map +1 -1
  188. package/dist/schemes/Skill.js +4 -1
  189. package/dist/schemes/Skill.js.map +1 -1
  190. package/dist/schemes/Worker.d.ts.map +1 -1
  191. package/dist/schemes/Worker.js +20 -3
  192. package/dist/schemes/Worker.js.map +1 -1
  193. package/dist/schemes/_entry-crud.sql +19 -1
  194. package/dist/schemes/_entry-find.d.ts +5 -3
  195. package/dist/schemes/_entry-find.d.ts.map +1 -1
  196. package/dist/schemes/_entry-find.js +102 -22
  197. package/dist/schemes/_entry-find.js.map +1 -1
  198. package/dist/schemes/_entry-find.sql +8 -6
  199. package/dist/schemes/_entry-graph.sql +2 -6
  200. package/dist/schemes/_entry-manifest.d.ts.map +1 -1
  201. package/dist/schemes/_entry-manifest.js +12 -1
  202. package/dist/schemes/_entry-manifest.js.map +1 -1
  203. package/dist/schemes/_search-index.d.ts.map +1 -1
  204. package/dist/schemes/_search-index.js +37 -25
  205. package/dist/schemes/_search-index.js.map +1 -1
  206. package/dist/server/Daemon.d.ts +58 -7
  207. package/dist/server/Daemon.d.ts.map +1 -1
  208. package/dist/server/Daemon.js +551 -113
  209. package/dist/server/Daemon.js.map +1 -1
  210. package/dist/server/DrainSupervisor.d.ts +12 -9
  211. package/dist/server/DrainSupervisor.d.ts.map +1 -1
  212. package/dist/server/DrainSupervisor.js +59 -10
  213. package/dist/server/DrainSupervisor.js.map +1 -1
  214. package/dist/server/client-input.d.ts +5 -2
  215. package/dist/server/client-input.d.ts.map +1 -1
  216. package/dist/server/client-input.js +53 -34
  217. package/dist/server/client-input.js.map +1 -1
  218. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
  219. package/dist/server/dispatch-as-plurnk.js +28 -6
  220. package/dist/server/dispatch-as-plurnk.js.map +1 -1
  221. package/dist/server/drain.sql +26 -11
  222. package/dist/server/envelope.d.ts +1 -1
  223. package/dist/server/envelope.d.ts.map +1 -1
  224. package/dist/server/envelope.js +4 -4
  225. package/dist/server/envelope.js.map +1 -1
  226. package/dist/server/envelope.sql +25 -1
  227. package/dist/server/lifecycle-recovery.sql +11 -1
  228. package/dist/server/logEntry.d.ts +2 -1
  229. package/dist/server/logEntry.d.ts.map +1 -1
  230. package/dist/server/logEntry.js +3 -2
  231. package/dist/server/logEntry.js.map +1 -1
  232. package/dist/server/logEntry.sql +7 -0
  233. package/dist/server/loop-model.d.ts +2 -2
  234. package/dist/server/loop-model.d.ts.map +1 -1
  235. package/dist/server/loop-model.js +23 -33
  236. package/dist/server/loop-model.js.map +1 -1
  237. package/dist/server/loopDocs.d.ts.map +1 -1
  238. package/dist/server/loopDocs.js +61 -10
  239. package/dist/server/loopDocs.js.map +1 -1
  240. package/dist/server/loopDocs.sql +4 -2
  241. package/dist/server/model-catalog.d.ts +3 -0
  242. package/dist/server/model-catalog.d.ts.map +1 -0
  243. package/dist/server/model-catalog.js +83 -0
  244. package/dist/server/model-catalog.js.map +1 -0
  245. package/dist/server/model-route.d.ts +7 -0
  246. package/dist/server/model-route.d.ts.map +1 -0
  247. package/dist/server/model-route.js +47 -0
  248. package/dist/server/model-route.js.map +1 -0
  249. package/dist/server/module-discovery.d.ts +13 -0
  250. package/dist/server/module-discovery.d.ts.map +1 -0
  251. package/dist/server/module-discovery.js +78 -0
  252. package/dist/server/module-discovery.js.map +1 -0
  253. package/dist/server/skillDocs.d.ts +9 -0
  254. package/dist/server/skillDocs.d.ts.map +1 -0
  255. package/dist/server/skillDocs.js +212 -0
  256. package/dist/server/skillDocs.js.map +1 -0
  257. package/dist/server/skillDocs.sql +14 -0
  258. package/dist/service.d.ts.map +1 -1
  259. package/dist/service.js +182 -123
  260. package/dist/service.js.map +1 -1
  261. package/migrations/001_schema.sql +424 -65
  262. package/package.json +37 -37
  263. package/dist/core/ExecutableTools.d.ts +0 -11
  264. package/dist/core/ExecutableTools.d.ts.map +0 -1
  265. package/dist/core/ExecutableTools.js +0 -49
  266. package/dist/core/ExecutableTools.js.map +0 -1
  267. package/dist/core/JournalTurn.d.ts +0 -9
  268. package/dist/core/JournalTurn.d.ts.map +0 -1
  269. package/dist/core/JournalTurn.js +0 -14
  270. package/dist/core/JournalTurn.js.map +0 -1
  271. package/dist/core/JournalTurn.sql +0 -10
  272. package/dist/core/git-iso.d.ts +0 -13
  273. package/dist/core/git-iso.d.ts.map +0 -1
  274. package/dist/core/git-iso.js +0 -267
  275. package/dist/core/git-iso.js.map +0 -1
  276. package/dist/core/search-gate.d.ts +0 -17
  277. package/dist/core/search-gate.d.ts.map +0 -1
  278. package/dist/core/search-gate.js +0 -77
  279. package/dist/core/search-gate.js.map +0 -1
  280. package/dist/digest/Digest.sql +0 -1
@@ -0,0 +1,78 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { join } from "node:path";
10
+ import { pathToFileURL } from "node:url";
11
+ import fs from "node:fs/promises";
12
+ import Meta from "@plurnk/plurnk-meta";
13
+ // {§module-discovery} — third-party daemon-module composition. A package
14
+ // declares `plurnk: { kind: "module", module: "<export-subpath>" }`; the export
15
+ // is one DaemonModule (an object, or a no-arg factory returning one).
16
+ // Discovery mirrors the executor family ({§plugin-discovery}): scope-agnostic
17
+ // package scan, trust gate ({§plugin-trust-boundary}), lazy import.
18
+ //
19
+ // The service's explicit composition — the AG-UI, hooks, and MCP modules —
20
+ // carries init options and is wired in service.ts; discovery never duplicates
21
+ // those packages.
22
+ const EXPLICIT_COMPOSITION = new Set([
23
+ "@plurnk/plurnk-agui",
24
+ "@plurnk/plurnk-hooks",
25
+ "@plurnk/plurnk-mcp",
26
+ ]);
27
+ const readManifest = async (dir) => {
28
+ let raw;
29
+ try {
30
+ raw = await fs.readFile(join(dir, "package.json"), "utf8");
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ let pkg;
36
+ try {
37
+ pkg = JSON.parse(raw);
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ const plurnk = pkg.plurnk;
43
+ if (!Meta.declaresKind(plurnk, "module"))
44
+ return null;
45
+ const moduleSubpath = plurnk.module;
46
+ if (typeof moduleSubpath !== "string" || moduleSubpath.length === 0)
47
+ return null;
48
+ const packageName = typeof pkg.name === "string" && pkg.name.length > 0 ? pkg.name : null;
49
+ if (packageName === null)
50
+ return null;
51
+ return { packageName, module: moduleSubpath };
52
+ };
53
+ export const discoverDaemonModules = async (options = {}) => {
54
+ const dirs = options.packageDirs ?? await Meta.packageDirs(join(options.cwd ?? process.cwd(), "node_modules"));
55
+ const pending = [];
56
+ const skipped = [];
57
+ for (const candidate of dirs) {
58
+ const manifest = await readManifest(candidate.dir);
59
+ if (manifest === null)
60
+ continue;
61
+ if (EXPLICIT_COMPOSITION.has(manifest.packageName))
62
+ continue;
63
+ if (!Meta.isTrusted(manifest.packageName)) {
64
+ skipped.push(manifest.packageName);
65
+ continue;
66
+ }
67
+ pending.push((async () => {
68
+ const imported = await import(__rewriteRelativeImportExtension(pathToFileURL(join(candidate.dir, manifest.module)).href));
69
+ const exported = imported.default;
70
+ if (exported === undefined) {
71
+ throw new Error(`module package '${manifest.packageName}' exports no default DaemonModule at '${manifest.module}'.`);
72
+ }
73
+ return typeof exported === "function" ? exported() : exported;
74
+ })());
75
+ }
76
+ return { modules: await Promise.all(pending), skipped };
77
+ };
78
+ //# sourceMappingURL=module-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-discovery.js","sourceRoot":"","sources":["../../src/server/module-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type Engine from "../core/Engine.ts";
2
+ import type { Db } from "../core/Db.ts";
3
+ import HostPaths from "../core/HostPaths.ts";
4
+ export default class SkillDocs {
5
+ #private;
6
+ static refreshIfChanged(engine: Engine, db: Db, workspaceId: number, hostPaths?: HostPaths): Promise<void>;
7
+ static materialize(engine: Engine, db: Db, workspaceId: number, hostPaths?: HostPaths): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=skillDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillDocs.d.ts","sourceRoot":"","sources":["../../src/server/skillDocs.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,SAAS,MAAM,sBAAsB,CAAC;AAoI7C,MAAM,CAAC,OAAO,OAAO,SAAS;;IAiD1B,OAAa,gBAAgB,CACzB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,SAA2B,GACvC,OAAO,CAAC,IAAI,CAAC,CAMf;IAED,OAAa,WAAW,CACpB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,SAA2B,GACvC,OAAO,CAAC,IAAI,CAAC,CAIf;CAoCJ"}
@@ -0,0 +1,212 @@
1
+ // {§skills-materialization} — standard Agent Skills from the project, shared
2
+ // user root, and exact package bundle become kernel-owned pull-docs. This runs
3
+ // when a workspace boots and immediately before a changed filesystem can shape
4
+ // the next model turn, never as a per-worker ritual.
5
+ import { createHash } from "node:crypto";
6
+ import { readdir, readFile } from "node:fs/promises";
7
+ import { join } from "node:path";
8
+ import { UNKNOWN_POSITION, } from "@plurnk/plurnk-contracts";
9
+ import { parse as parseYaml } from "yaml";
10
+ import HostPaths from "../core/HostPaths.js";
11
+ import Owner from "../core/Owner.js";
12
+ import Paths from "../Paths.js";
13
+ import DispatchAsPlurnk from "./dispatch-as-plurnk.js";
14
+ const SKILLS_PREFIX_LENGTH = "/skills/".length;
15
+ const SKILL_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;
16
+ const skillPath = (segment) => ({
17
+ kind: "url",
18
+ raw: `worker://plurnk/skills/${segment}`,
19
+ scheme: "worker",
20
+ username: null,
21
+ password: null,
22
+ hostname: "plurnk",
23
+ port: null,
24
+ pathname: `/skills/${segment}`,
25
+ query: null,
26
+ fragment: null,
27
+ });
28
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
29
+ // Agent Skills requires YAML frontmatter with name and description. Admission
30
+ // consumes those two discovery keys and preserves the instruction body.
31
+ const parseSkill = (candidate, raw) => {
32
+ const lines = raw.replace(/\r\n/gu, "\n").split("\n");
33
+ if (lines[0] !== "---") {
34
+ throw new Error(`${candidate.file}: Agent Skill requires YAML frontmatter`);
35
+ }
36
+ let bodyStart = null;
37
+ for (let index = 1; index < lines.length; index += 1) {
38
+ const line = lines[index];
39
+ if (line === "---") {
40
+ bodyStart = index + 1;
41
+ break;
42
+ }
43
+ }
44
+ if (bodyStart === null)
45
+ throw new Error(`${candidate.file}: Agent Skill frontmatter is not closed`);
46
+ let metadata;
47
+ try {
48
+ metadata = parseYaml(lines.slice(1, bodyStart - 1).join("\n"), {
49
+ maxAliasCount: 0,
50
+ uniqueKeys: true,
51
+ });
52
+ }
53
+ catch (cause) {
54
+ throw new Error(`${candidate.file}: Agent Skill frontmatter is invalid YAML`, { cause });
55
+ }
56
+ if (!isRecord(metadata))
57
+ throw new Error(`${candidate.file}: Agent Skill frontmatter must be a mapping`);
58
+ const { name, description } = metadata;
59
+ if (typeof name !== "string" || name.length === 0) {
60
+ throw new Error(`${candidate.file}: Agent Skill frontmatter requires name`);
61
+ }
62
+ if (!SKILL_NAME.test(name))
63
+ throw new Error(`${candidate.file}: Agent Skill name ${JSON.stringify(name)} is invalid`);
64
+ if (name.length > 64)
65
+ throw new Error(`${candidate.file}: Agent Skill name exceeds 64 characters`);
66
+ if (name !== candidate.folder) {
67
+ throw new Error(`${candidate.file}: Agent Skill name ${JSON.stringify(name)} must match folder ${JSON.stringify(candidate.folder)}`);
68
+ }
69
+ if (typeof description !== "string" || description.length === 0) {
70
+ throw new Error(`${candidate.file}: Agent Skill frontmatter requires description`);
71
+ }
72
+ if (description.length > 1024)
73
+ throw new Error(`${candidate.file}: Agent Skill description exceeds 1024 characters`);
74
+ return {
75
+ name,
76
+ description,
77
+ body: lines.slice(bodyStart).join("\n").trim(),
78
+ };
79
+ };
80
+ const renderSkill = (doc) => [
81
+ `# ${doc.name}`,
82
+ "",
83
+ "## Summary",
84
+ "",
85
+ doc.description,
86
+ ...(doc.body.length === 0 ? [] : ["", doc.body]),
87
+ ].join("\n");
88
+ const renderIndex = (skills) => [
89
+ "# Skills",
90
+ "",
91
+ "## Summary",
92
+ "",
93
+ "Agent Skills available to this workspace.",
94
+ ...skills.flatMap((skill) => ["", `- **${skill.name}** — ${skill.description}`]),
95
+ ].join("\n");
96
+ const readDirectoryCandidates = async (dir, source) => {
97
+ let entries;
98
+ try {
99
+ entries = await readdir(dir, { withFileTypes: true });
100
+ }
101
+ catch (cause) {
102
+ if (cause.code === "ENOENT")
103
+ return [];
104
+ throw new Error(`read ${source} Agent Skills directory ${dir} failed`, { cause });
105
+ }
106
+ return entries
107
+ .filter((entry) => entry.isDirectory())
108
+ .map((entry) => ({
109
+ folder: entry.name,
110
+ file: join(dir, entry.name, "SKILL.md"),
111
+ source,
112
+ }))
113
+ .toSorted((left, right) => left.folder.localeCompare(right.folder));
114
+ };
115
+ const readCandidate = async (candidate) => {
116
+ let raw;
117
+ try {
118
+ raw = await readFile(candidate.file, "utf8");
119
+ }
120
+ catch (cause) {
121
+ if (cause.code === "ENOENT" && candidate.source !== "bundled")
122
+ return null;
123
+ throw new Error(`read ${candidate.source} Agent Skill ${candidate.file} failed`, { cause });
124
+ }
125
+ return parseSkill(candidate, raw);
126
+ };
127
+ export default class SkillDocs {
128
+ static #signatures = new WeakMap();
129
+ static async #scan(workspaceId, db, hostPaths) {
130
+ const workspace = await db.envelope_get_workspace.get({ id: workspaceId });
131
+ const candidates = [];
132
+ if (workspace?.project_root !== null && workspace?.project_root !== undefined) {
133
+ candidates.push(await readDirectoryCandidates(hostPaths.projectSkillsDir(workspace.project_root), "project"));
134
+ }
135
+ candidates.push(await readDirectoryCandidates(hostPaths.globalSkillsDir, "global"));
136
+ candidates.push([...Paths.bundledSkills()].map(([name, file]) => ({
137
+ folder: name,
138
+ file,
139
+ source: "bundled",
140
+ })));
141
+ const skills = [];
142
+ const claimed = new Set();
143
+ for (const layer of candidates) {
144
+ for (const candidate of layer) {
145
+ if (claimed.has(candidate.folder))
146
+ continue;
147
+ const skill = await readCandidate(candidate);
148
+ if (skill === null)
149
+ continue;
150
+ claimed.add(candidate.folder);
151
+ skills.push(skill);
152
+ }
153
+ }
154
+ skills.sort((left, right) => left.name.localeCompare(right.name));
155
+ const signature = createHash("sha256")
156
+ .update(skills.map((skill) => `${skill.name}\u0000${skill.description}\u0000${skill.body}`).join("\u0001"))
157
+ .digest("hex");
158
+ return { skills, signature };
159
+ }
160
+ static #byWorkspace(db) {
161
+ const existing = SkillDocs.#signatures.get(db);
162
+ if (existing !== undefined)
163
+ return existing;
164
+ const created = new Map();
165
+ SkillDocs.#signatures.set(db, created);
166
+ return created;
167
+ }
168
+ static async refreshIfChanged(engine, db, workspaceId, hostPaths = new HostPaths()) {
169
+ const scanned = await SkillDocs.#scan(workspaceId, db, hostPaths);
170
+ const signatures = SkillDocs.#byWorkspace(db);
171
+ if (signatures.get(workspaceId) === scanned.signature)
172
+ return;
173
+ await SkillDocs.#materialize(engine, db, workspaceId, scanned);
174
+ signatures.set(workspaceId, scanned.signature);
175
+ }
176
+ static async materialize(engine, db, workspaceId, hostPaths = new HostPaths()) {
177
+ const scanned = await SkillDocs.#scan(workspaceId, db, hostPaths);
178
+ await SkillDocs.#materialize(engine, db, workspaceId, scanned);
179
+ SkillDocs.#byWorkspace(db).set(workspaceId, scanned.signature);
180
+ }
181
+ static async #materialize(engine, db, workspaceId, scanned) {
182
+ const { skills } = scanned;
183
+ const statements = [];
184
+ const desired = new Map([
185
+ ["index.md", renderIndex(skills)],
186
+ ...skills.map((skill) => [`${encodeURIComponent(skill.name)}.md`, renderSkill(skill)]),
187
+ ]);
188
+ const ownerId = await Owner.kernelId(db, workspaceId);
189
+ const materialized = await db.skill_docs_materialized.all({
190
+ workspace_id: workspaceId,
191
+ owner_id: ownerId,
192
+ });
193
+ for (const { pathname } of materialized) {
194
+ if (desired.has(pathname.slice(SKILLS_PREFIX_LENGTH)))
195
+ continue;
196
+ statements.push({
197
+ op: "SEND", delimiter: "", annotation: null, signal: 410,
198
+ target: skillPath(pathname.slice(SKILLS_PREFIX_LENGTH)),
199
+ lineMarker: null, body: null, position: UNKNOWN_POSITION,
200
+ });
201
+ }
202
+ for (const [segment, content] of desired) {
203
+ statements.push({
204
+ op: "EDIT", delimiter: "", annotation: null, signal: null,
205
+ target: skillPath(segment),
206
+ lineMarker: { marks: [1, -1] }, body: content, position: UNKNOWN_POSITION,
207
+ });
208
+ }
209
+ await DispatchAsPlurnk.dispatch(engine, db, workspaceId, statements);
210
+ }
211
+ }
212
+ //# sourceMappingURL=skillDocs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillDocs.js","sourceRoot":"","sources":["../../src/server/skillDocs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ -- Workspace authored-skills reconciliation ({§skills-materialization}).
2
+ -- Mirrors loopDocs.sql's tracking pattern: kernel-owned worker://plurnk
3
+ -- entries whose pathnames carry the skills prefix, EXCLUDING the
4
+ -- kernel-generated /skills/plurnk/ namespace.
5
+
6
+ -- PREP: skill_docs_materialized
7
+ SELECT pathname
8
+ FROM entries
9
+ WHERE workspace_id = $workspace_id
10
+ AND owner_id = $owner_id
11
+ AND scheme = 'worker'
12
+ AND substr(pathname, 1, 8) = '/skills/'
13
+ AND substr(pathname, 1, 15) <> '/skills/plurnk/'
14
+ ORDER BY pathname;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":";AA0BA,MAAM,CAAC,OAAO,OAAO,OAAO;;IAyQxB,OAAa,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA+EjC;CACJ"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":";AA8BA,MAAM,CAAC,OAAO,OAAO,OAAO;;IA8TxB,OAAa,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAuGjC;CACJ"}