pi-harness-runtime 1.1.95 → 1.1.96

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 (225) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/harness/loop-runtime.ts +3 -0
  3. package/index.ts +130 -29
  4. package/package.json +2 -1
  5. package/packages/a2a-adapter/package.json +1 -1
  6. package/packages/architecture-generator/package.json +1 -1
  7. package/packages/auth/package.json +1 -1
  8. package/packages/autonomous-refactor/package.json +1 -1
  9. package/packages/autonomous-runtime/package.json +1 -1
  10. package/packages/cache-strategy/package.json +1 -1
  11. package/packages/capability-registry/package.json +1 -1
  12. package/packages/checkpoint/package.json +1 -1
  13. package/packages/cli-plugin-sdk/package.json +1 -1
  14. package/packages/clipboard/package.json +1 -1
  15. package/packages/clipboard-plugin/package.json +1 -1
  16. package/packages/code-generation/package.json +1 -1
  17. package/packages/code-review/package.json +1 -1
  18. package/packages/codex-adapter/package.json +1 -1
  19. package/packages/config-capture/package.json +1 -1
  20. package/packages/context-compiler/package.json +1 -1
  21. package/packages/context-discovery/package.json +1 -1
  22. package/packages/context-manager/package.json +1 -1
  23. package/packages/cookie-sanitizer/package.json +1 -1
  24. package/packages/cost-optimizer/package.json +1 -1
  25. package/packages/dependency-analyzer/package.json +1 -1
  26. package/packages/django-plugin/package.json +1 -1
  27. package/packages/doc-generator/package.json +1 -1
  28. package/packages/evaluation-engine/package.json +1 -1
  29. package/packages/evaluation-runner/package.json +1 -1
  30. package/packages/event-bus/package.json +1 -1
  31. package/packages/event-store/package.json +1 -1
  32. package/packages/experience-replay/package.json +1 -1
  33. package/packages/feedback-collector/package.json +1 -1
  34. package/packages/file-copy-helper/package.json +1 -1
  35. package/packages/framework-detector/package.json +1 -1
  36. package/packages/framework-plugin-sdk/package.json +1 -1
  37. package/packages/frappe-plugin/package.json +1 -1
  38. package/packages/generic-web-plugin/package.json +1 -1
  39. package/packages/health-monitor/package.json +1 -1
  40. package/packages/intent-analyzer/package.json +1 -1
  41. package/packages/jev-judge/package.json +1 -1
  42. package/packages/knowledge-graph/package.json +1 -1
  43. package/packages/knowledge-retrieval/package.json +1 -1
  44. package/packages/laravel-plugin/package.json +1 -1
  45. package/packages/learning-engine/package.json +1 -1
  46. package/packages/mcp-adapter/package.json +1 -1
  47. package/packages/memory-engine/package.json +1 -1
  48. package/packages/milestone-manager/package.json +1 -1
  49. package/packages/model-registry/package.json +1 -1
  50. package/packages/nextjs-plugin/package.json +1 -1
  51. package/packages/notification/package.json +1 -1
  52. package/packages/observability/package.json +1 -1
  53. package/packages/okf-indexer/package.json +1 -1
  54. package/packages/performance-optimizer/package.json +1 -1
  55. package/packages/privilege-broker/package.json +1 -1
  56. package/packages/project-analyzer/package.json +1 -1
  57. package/packages/project-bootstrap/package.json +1 -1
  58. package/packages/projection-engine/package.json +1 -1
  59. package/packages/prompt-compiler/package.json +1 -1
  60. package/packages/prompt-versioning/package.json +1 -1
  61. package/packages/provider-adapter-sdk/package.json +1 -1
  62. package/packages/provider-router/package.json +1 -1
  63. package/packages/provider-selector/package.json +1 -1
  64. package/packages/providers/package.json +1 -1
  65. package/packages/qdrant-skills/dist/client.d.ts +51 -0
  66. package/packages/qdrant-skills/dist/client.d.ts.map +1 -0
  67. package/packages/qdrant-skills/dist/client.js +105 -0
  68. package/packages/qdrant-skills/dist/client.js.map +1 -0
  69. package/packages/qdrant-skills/dist/embedder.d.ts +39 -0
  70. package/packages/qdrant-skills/dist/embedder.d.ts.map +1 -0
  71. package/packages/qdrant-skills/dist/embedder.js +101 -0
  72. package/packages/qdrant-skills/dist/embedder.js.map +1 -0
  73. package/packages/qdrant-skills/dist/index.d.ts +25 -0
  74. package/packages/qdrant-skills/dist/index.d.ts.map +1 -0
  75. package/packages/qdrant-skills/dist/index.js +25 -0
  76. package/packages/qdrant-skills/dist/index.js.map +1 -0
  77. package/packages/qdrant-skills/package.json +27 -0
  78. package/packages/qdrant-skills/src/client.ts +178 -0
  79. package/packages/qdrant-skills/src/embedder.ts +137 -0
  80. package/packages/qdrant-skills/src/index.ts +42 -0
  81. package/packages/quota-manager/package.json +1 -1
  82. package/packages/rate-limiter/package.json +1 -1
  83. package/packages/react-vite-plugin/package.json +1 -1
  84. package/packages/release-manager/package.json +1 -1
  85. package/packages/requirement-compiler/package.json +1 -1
  86. package/packages/runtime/package.json +1 -1
  87. package/packages/scheduler/package.json +1 -1
  88. package/packages/scheduler-adapter/package.json +1 -1
  89. package/packages/session/package.json +1 -1
  90. package/packages/session-api/package.json +1 -1
  91. package/packages/session-export/package.json +1 -1
  92. package/packages/shared-context/package.json +1 -1
  93. package/packages/skill-mcp-client/package.json +1 -1
  94. package/packages/skill-registry/package.json +1 -1
  95. package/packages/skills/dist/index.d.ts +40 -0
  96. package/packages/skills/dist/index.d.ts.map +1 -0
  97. package/packages/skills/dist/index.js +82 -0
  98. package/packages/skills/dist/index.js.map +1 -0
  99. package/packages/skills/dist/linter.d.ts +38 -0
  100. package/packages/skills/dist/linter.d.ts.map +1 -0
  101. package/packages/skills/dist/linter.js +323 -0
  102. package/packages/skills/dist/linter.js.map +1 -0
  103. package/packages/skills/dist/loader.d.ts +74 -0
  104. package/packages/skills/dist/loader.d.ts.map +1 -0
  105. package/packages/skills/dist/loader.js +280 -0
  106. package/packages/skills/dist/loader.js.map +1 -0
  107. package/packages/skills/dist/parser.d.ts +32 -0
  108. package/packages/skills/dist/parser.d.ts.map +1 -0
  109. package/packages/skills/dist/parser.js +459 -0
  110. package/packages/skills/dist/parser.js.map +1 -0
  111. package/packages/skills/dist/scanner.d.ts +33 -0
  112. package/packages/skills/dist/scanner.d.ts.map +1 -0
  113. package/packages/skills/dist/scanner.js +257 -0
  114. package/packages/skills/dist/scanner.js.map +1 -0
  115. package/packages/skills/dist/skill-commands.d.ts +33 -0
  116. package/packages/skills/dist/skill-commands.d.ts.map +1 -0
  117. package/packages/skills/dist/skill-commands.js +239 -0
  118. package/packages/skills/dist/skill-commands.js.map +1 -0
  119. package/packages/skills/dist/skill-tool.d.ts +120 -0
  120. package/packages/skills/dist/skill-tool.d.ts.map +1 -0
  121. package/packages/skills/dist/skill-tool.js +239 -0
  122. package/packages/skills/dist/skill-tool.js.map +1 -0
  123. package/packages/skills/dist/skill-versioning.d.ts +123 -0
  124. package/packages/skills/dist/skill-versioning.d.ts.map +1 -0
  125. package/packages/skills/dist/skill-versioning.js +240 -0
  126. package/packages/skills/dist/skill-versioning.js.map +1 -0
  127. package/packages/skills/dist/types.d.ts +226 -0
  128. package/packages/skills/dist/types.d.ts.map +1 -0
  129. package/packages/skills/dist/types.js +21 -0
  130. package/packages/skills/dist/types.js.map +1 -0
  131. package/packages/skills/package.json +46 -0
  132. package/packages/skills/src/index.ts +93 -0
  133. package/packages/skills/src/linter.ts +371 -0
  134. package/packages/skills/src/loader.ts +335 -0
  135. package/packages/skills/src/parser.ts +548 -0
  136. package/packages/skills/src/scanner.ts +322 -0
  137. package/packages/skills/src/skill-commands.ts +318 -0
  138. package/packages/skills/src/skill-tool.ts +324 -0
  139. package/packages/skills/src/skill-versioning.ts +345 -0
  140. package/packages/skills/src/types.ts +259 -0
  141. package/packages/sprint-planner/package.json +1 -1
  142. package/packages/subscription-engine/package.json +1 -1
  143. package/packages/task-compiler/package.json +1 -1
  144. package/packages/tencentdb-memory/package.json +1 -1
  145. package/packages/tencentdb-sync/package.json +1 -1
  146. package/packages/test-data-generator/package.json +1 -1
  147. package/packages/test-generator/package.json +1 -1
  148. package/packages/todo-bd-sync/package.json +1 -1
  149. package/packages/token-estimation/package.json +1 -1
  150. package/packages/token-optimizer/package.json +1 -1
  151. package/packages/trajectory/dist/src/curator.d.ts +189 -0
  152. package/packages/trajectory/dist/src/curator.d.ts.map +1 -0
  153. package/packages/trajectory/dist/src/curator.js +340 -0
  154. package/packages/trajectory/dist/src/curator.js.map +1 -0
  155. package/packages/trajectory/dist/src/journey-renderer.d.ts +53 -0
  156. package/packages/trajectory/dist/src/journey-renderer.d.ts.map +1 -0
  157. package/packages/trajectory/dist/src/journey-renderer.js +324 -0
  158. package/packages/trajectory/dist/src/journey-renderer.js.map +1 -0
  159. package/packages/trajectory/dist/src/learning-graph.d.ts +159 -0
  160. package/packages/trajectory/dist/src/learning-graph.d.ts.map +1 -0
  161. package/packages/trajectory/dist/src/learning-graph.js +258 -0
  162. package/packages/trajectory/dist/src/learning-graph.js.map +1 -0
  163. package/packages/trajectory/dist/src/memory-store.d.ts +146 -0
  164. package/packages/trajectory/dist/src/memory-store.d.ts.map +1 -0
  165. package/packages/trajectory/dist/src/memory-store.js +472 -0
  166. package/packages/trajectory/dist/src/memory-store.js.map +1 -0
  167. package/packages/trajectory/dist/src/review-fork.d.ts +164 -0
  168. package/packages/trajectory/dist/src/review-fork.d.ts.map +1 -0
  169. package/packages/trajectory/dist/src/review-fork.js +332 -0
  170. package/packages/trajectory/dist/src/review-fork.js.map +1 -0
  171. package/packages/trajectory/dist/src/write-approval.d.ts +136 -0
  172. package/packages/trajectory/dist/src/write-approval.d.ts.map +1 -0
  173. package/packages/trajectory/dist/src/write-approval.js +281 -0
  174. package/packages/trajectory/dist/src/write-approval.js.map +1 -0
  175. package/packages/trajectory/package.json +1 -1
  176. package/packages/trajectory/src/curator.ts +485 -0
  177. package/packages/trajectory/src/journey-renderer.ts +399 -0
  178. package/packages/trajectory/src/learning-graph.ts +363 -0
  179. package/packages/trajectory/src/memory-store.ts +578 -0
  180. package/packages/trajectory/src/review-fork.ts +450 -0
  181. package/packages/trajectory/src/write-approval.ts +372 -0
  182. package/packages/tui/package.json +1 -1
  183. package/packages/types/package.json +1 -1
  184. package/packages/workflow-events/package.json +1 -1
  185. package/packages/workspace-scanner/package.json +1 -1
  186. package/packages/worktree/package.json +1 -1
  187. package/packages/write-review/dist/blackboard.d.ts +98 -0
  188. package/packages/write-review/dist/blackboard.d.ts.map +1 -0
  189. package/packages/write-review/dist/blackboard.js +289 -0
  190. package/packages/write-review/dist/blackboard.js.map +1 -0
  191. package/packages/write-review/dist/event-bus.d.ts +106 -0
  192. package/packages/write-review/dist/event-bus.d.ts.map +1 -0
  193. package/packages/write-review/dist/event-bus.js +294 -0
  194. package/packages/write-review/dist/event-bus.js.map +1 -0
  195. package/packages/write-review/dist/gate.d.ts +37 -0
  196. package/packages/write-review/dist/gate.d.ts.map +1 -0
  197. package/packages/write-review/dist/gate.js +138 -0
  198. package/packages/write-review/dist/gate.js.map +1 -0
  199. package/packages/write-review/dist/index.d.ts +22 -0
  200. package/packages/write-review/dist/index.d.ts.map +1 -0
  201. package/packages/write-review/dist/index.js +60 -0
  202. package/packages/write-review/dist/index.js.map +1 -0
  203. package/packages/write-review/dist/injection.d.ts +40 -0
  204. package/packages/write-review/dist/injection.d.ts.map +1 -0
  205. package/packages/write-review/dist/injection.js +179 -0
  206. package/packages/write-review/dist/injection.js.map +1 -0
  207. package/packages/write-review/dist/review.d.ts +54 -0
  208. package/packages/write-review/dist/review.d.ts.map +1 -0
  209. package/packages/write-review/dist/review.js +154 -0
  210. package/packages/write-review/dist/review.js.map +1 -0
  211. package/packages/write-review/dist/trigger.d.ts +39 -0
  212. package/packages/write-review/dist/trigger.d.ts.map +1 -0
  213. package/packages/write-review/dist/trigger.js +107 -0
  214. package/packages/write-review/dist/trigger.js.map +1 -0
  215. package/packages/write-review/dist/types.d.ts +78 -0
  216. package/packages/write-review/dist/types.d.ts.map +1 -0
  217. package/packages/write-review/dist/types.js +26 -0
  218. package/packages/write-review/dist/types.js.map +1 -0
  219. package/packages/write-review/package.json +1 -1
  220. package/packages/write-review/src/event-bus.ts +351 -0
  221. package/packages/write-review/src/index.ts +1 -0
  222. package/packages/write-review/src/injection.ts +25 -3
  223. package/proactive-compact.ts +51 -7
  224. package/scripts/sync-skills.ts +275 -0
  225. package/scripts/sync-to-qdrant.ts +398 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,YAAY,GAIb,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,GAEhB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@pi-harness/qdrant-skills",
3
+ "version": "1.1.96",
4
+ "description": "Qdrant vector search integration for Hermes-style skill system",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": "./dist/index.js",
10
+ "./client": "./dist/client.js",
11
+ "./embedder": "./dist/embedder.js"
12
+ },
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "test": "echo \"No tests yet\" && exit 0"
16
+ },
17
+ "dependencies": {
18
+ "@qdrant/js-client-rest": "^1.19.0"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "^20.0.0",
22
+ "typescript": "^5.0.0"
23
+ },
24
+ "peerDependencies": {
25
+ "@earendil-works/pi-coding-agent": "*"
26
+ }
27
+ }
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Qdrant Client - Official @qdrant/js-client-rest wrapper
3
+ */
4
+
5
+ import { QdrantClient } from "@qdrant/js-client-rest";
6
+
7
+ export interface QdrantConfig {
8
+ /** Qdrant cluster URL (e.g., https://xxx.qdrant.tech) */
9
+ url: string;
10
+ /** API key for authentication */
11
+ apiKey: string;
12
+ /** Collection name (default: 'pi-harness-skills') */
13
+ collection?: string;
14
+ }
15
+
16
+ export interface SkillPoint {
17
+ id: number;
18
+ name: string;
19
+ description: string;
20
+ body: string;
21
+ /** Full text to embed */
22
+ text: string;
23
+ }
24
+
25
+ export interface SearchResult {
26
+ id: number;
27
+ name: string;
28
+ description: string;
29
+ score: number;
30
+ }
31
+
32
+ /**
33
+ * Parse host:port from URL
34
+ */
35
+ function parseHostPort(url: string): { host: string; port: number } {
36
+ const match = url.match(/https?:\/\/([^:]+)(?::(\d+))?/);
37
+ return {
38
+ host: match?.[1] || url,
39
+ port: parseInt(match?.[2] || "6333"),
40
+ };
41
+ }
42
+
43
+ /**
44
+ * Create a Qdrant client
45
+ */
46
+ export function createQdrantClient(config: QdrantConfig): QdrantClient {
47
+ const { host, port } = parseHostPort(config.url);
48
+ return new QdrantClient({ host, port, apiKey: config.apiKey });
49
+ }
50
+
51
+ /**
52
+ * Create a collection with dense vectors
53
+ */
54
+ export async function createCollection(
55
+ client: QdrantClient,
56
+ name: string,
57
+ dimensions: number = 384 // all-MiniLM-L6-v2
58
+ ): Promise<void> {
59
+ try {
60
+ await client.createCollection(name, {
61
+ vectors: { size: dimensions, distance: "Cosine" },
62
+ });
63
+ } catch (err) {
64
+ // Ignore "already exists" errors
65
+ if (err instanceof Error && !err.message.includes("already exists")) {
66
+ throw err;
67
+ }
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Delete a collection
73
+ */
74
+ export async function deleteCollection(
75
+ client: QdrantClient,
76
+ name: string
77
+ ): Promise<void> {
78
+ try {
79
+ await client.deleteCollection(name);
80
+ } catch {
81
+ // Ignore if not exists
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Upsert skill points with cloud inference
87
+ */
88
+ export async function upsertSkills(
89
+ client: QdrantClient,
90
+ collectionName: string,
91
+ skills: SkillPoint[],
92
+ model: string = "sentence-transformers/all-MiniLM-L6-v2"
93
+ ): Promise<void> {
94
+ const points = skills.map((skill, idx) => ({
95
+ id: skill.id || idx + 1,
96
+ payload: {
97
+ name: skill.name,
98
+ description: skill.description,
99
+ body: skill.body.slice(0, 2000),
100
+ },
101
+ vector: {
102
+ text: skill.text,
103
+ model,
104
+ },
105
+ }));
106
+
107
+ await client.upsert(collectionName, { wait: true, points });
108
+ }
109
+
110
+ /**
111
+ * Search skills with semantic query
112
+ */
113
+ export async function searchSkills(
114
+ client: QdrantClient,
115
+ collectionName: string,
116
+ query: string,
117
+ model: string = "sentence-transformers/all-MiniLM-L6-v2",
118
+ limit: number = 5
119
+ ): Promise<SearchResult[]> {
120
+ const results = await client.query(collectionName, {
121
+ query: { text: query, model },
122
+ limit,
123
+ with_payload: true,
124
+ } as Parameters<typeof client.query>[1]);
125
+
126
+ // Parse response: { result: { points: [...] } }
127
+ const typedResults = results as {
128
+ result?: {
129
+ points?: Array<{
130
+ id: number;
131
+ score: number;
132
+ payload?: Record<string, unknown>;
133
+ }>;
134
+ };
135
+ };
136
+
137
+ const points = typedResults?.result?.points || [];
138
+
139
+ return points.map((point) => ({
140
+ id: point.id,
141
+ name: (point.payload?.name as string) || `skill-${point.id}`,
142
+ description: (point.payload?.description as string) || "",
143
+ score: point.score,
144
+ }));
145
+ }
146
+
147
+ /**
148
+ * Get all skills from collection
149
+ */
150
+ export async function getAllSkills(
151
+ client: QdrantClient,
152
+ collectionName: string
153
+ ): Promise<SearchResult[]> {
154
+ const results = await client.query(collectionName, {
155
+ filter: {}, // Empty filter = all
156
+ limit: 100,
157
+ with_payload: true,
158
+ } as Parameters<typeof client.query>[1]);
159
+
160
+ const typedResults = results as {
161
+ result?: {
162
+ points?: Array<{
163
+ id: number;
164
+ score: number;
165
+ payload?: Record<string, unknown>;
166
+ }>;
167
+ };
168
+ };
169
+
170
+ const points = typedResults?.result?.points || [];
171
+
172
+ return points.map((point) => ({
173
+ id: point.id,
174
+ name: (point.payload?.name as string) || `skill-${point.id}`,
175
+ description: (point.payload?.description as string) || "",
176
+ score: point.score || 0,
177
+ }));
178
+ }
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Skill Embedder
3
+ *
4
+ * Creates embeddings for skill content using OpenAI.
5
+ * Used to store skills in Qdrant for semantic search.
6
+ */
7
+
8
+ import type { SkillPoint } from "./client.js";
9
+
10
+ /**
11
+ * Embedding result
12
+ */
13
+ export interface EmbeddingResult {
14
+ embedding: number[];
15
+ tokens: number;
16
+ }
17
+
18
+ /**
19
+ * Get OpenAI API key for embeddings
20
+ */
21
+ export function getOpenAIApiKey(): string | null {
22
+ // Check env vars (same as Jev)
23
+ if (process.env.OPENAI_API_KEY) {
24
+ return process.env.OPENAI_API_KEY;
25
+ }
26
+ if (process.env.TYPESAFE_API_KEY) {
27
+ return process.env.TYPESAFE_API_KEY;
28
+ }
29
+ if (process.env.OPENROUTER_API_KEY) {
30
+ return process.env.OPENROUTER_API_KEY;
31
+ }
32
+
33
+ // Check keys file
34
+ try {
35
+ const { existsSync, readFileSync } = require("node:fs");
36
+ const homedir = process.env.HOME || process.env.USERPROFILE || "/home/frappe";
37
+ const keyPath = `${homedir}/.pi-harness-runtime/keys/openai-api-key.txt`;
38
+ if (existsSync(keyPath)) {
39
+ return readFileSync(keyPath, "utf-8").trim();
40
+ }
41
+ } catch {
42
+ // ignore
43
+ }
44
+
45
+ return null;
46
+ }
47
+
48
+ /**
49
+ * Create embedding for text using OpenAI
50
+ */
51
+ export async function createEmbedding(
52
+ text: string,
53
+ apiKey?: string
54
+ ): Promise<EmbeddingResult> {
55
+ const key = apiKey || getOpenAIApiKey();
56
+ if (!key) {
57
+ throw new Error("No OpenAI API key available for embeddings");
58
+ }
59
+
60
+ const response = await fetch("https://api.openai.com/v1/embeddings", {
61
+ method: "POST",
62
+ headers: {
63
+ "Content-Type": "application/json",
64
+ "Authorization": `Bearer ${key}`,
65
+ },
66
+ body: JSON.stringify({
67
+ model: "text-embedding-3-small",
68
+ input: text.slice(0, 8000), // Limit to avoid token limits
69
+ }),
70
+ });
71
+
72
+ if (!response.ok) {
73
+ const error = await response.text();
74
+ throw new Error(`OpenAI embedding failed: ${error}`);
75
+ }
76
+
77
+ const data = await response.json() as {
78
+ data: Array<{ embedding: number[] }>;
79
+ usage: { total_tokens: number };
80
+ };
81
+
82
+ return {
83
+ embedding: data.data[0]?.embedding || [],
84
+ tokens: data.usage?.total_tokens || 0,
85
+ };
86
+ }
87
+
88
+ /**
89
+ * Create embedding for a skill document
90
+ */
91
+ export async function embedSkillDocument(
92
+ skill: SkillPoint,
93
+ apiKey?: string
94
+ ): Promise<{ id: number; embedding: number[]; payload: SkillPoint }> {
95
+ // Combine name and description for embedding
96
+ const textToEmbed = [skill.name, skill.description].join(". ");
97
+
98
+ const { embedding } = await createEmbedding(textToEmbed, apiKey);
99
+
100
+ return {
101
+ id: skill.id,
102
+ embedding,
103
+ payload: skill,
104
+ };
105
+ }
106
+
107
+ /**
108
+ * Batch embed multiple skills
109
+ */
110
+ export async function embedSkillsBatch(
111
+ skills: SkillPoint[],
112
+ apiKey?: string,
113
+ onProgress?: (index: number, total: number) => void
114
+ ): Promise<Array<{ id: number; embedding: number[]; payload: SkillPoint }>> {
115
+ const results: Array<{ id: number; embedding: number[]; payload: SkillPoint }> = [];
116
+
117
+ for (let i = 0; i < skills.length; i++) {
118
+ const skill = skills[i];
119
+ try {
120
+ const result = await embedSkillDocument(skill, apiKey);
121
+ results.push(result);
122
+ } catch (err) {
123
+ console.error(`[QdrantSkills] Failed to embed skill ${skill.name}:`, err);
124
+ }
125
+
126
+ if (onProgress) {
127
+ onProgress(i + 1, skills.length);
128
+ }
129
+
130
+ // Small delay to avoid rate limiting
131
+ if (i < skills.length - 1) {
132
+ await new Promise(resolve => setTimeout(resolve, 100));
133
+ }
134
+ }
135
+
136
+ return results;
137
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Qdrant Skills Package
3
+ *
4
+ * Vector search integration for Hermes-style skill system.
5
+ * Uses Qdrant Cloud with built-in sentence-transformers inference.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { createQdrantClient, searchSkills, upsertSkills } from '@pi-harness/qdrant-skills';
10
+ *
11
+ * const client = createQdrantClient({
12
+ * url: process.env.QDRANT_CLUSTER_ENDPOINT!,
13
+ * apiKey: process.env.QDRANT_API_KEY!,
14
+ * });
15
+ *
16
+ * // Search for skills
17
+ * const results = await searchSkills(client, 'my-skills', 'frappe permissions');
18
+ *
19
+ * // Upload skills
20
+ * await upsertSkills(client, 'my-skills', [{ id: 1, name: 'test', description: '...', body: '...', text: '...' }]);
21
+ * ```
22
+ */
23
+
24
+ export {
25
+ createQdrantClient,
26
+ createCollection,
27
+ deleteCollection,
28
+ upsertSkills,
29
+ searchSkills,
30
+ getAllSkills,
31
+ type QdrantConfig,
32
+ type SkillPoint,
33
+ type SearchResult,
34
+ } from './client.js';
35
+
36
+ export {
37
+ createEmbedding,
38
+ embedSkillDocument,
39
+ embedSkillsBatch,
40
+ getOpenAIApiKey,
41
+ type EmbeddingResult,
42
+ } from './embedder.js';
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/quota-manager",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "description": "pi-harness-runtime — quota-manager",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/rate-limiter",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "type": "module",
5
5
  "description": "Rate limiting with token bucket algorithm (RFC-0023)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/react-vite-plugin",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "description": "React/Vite framework analysis — components, config, TypeScript setup",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/release-manager",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "type": "module",
5
5
  "description": "Release management for pi-harness",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/requirement-compiler",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "description": "Compiles raw requirements into validated CompiledRequirement with ambiguity detection and risk tagging",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/runtime",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "description": "pi-harness-runtime — runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/scheduler",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "description": "pi-harness-runtime — scheduler",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/scheduler-adapter",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "description": "Scheduler Adapter — cron, systemd, launchd, internal adapters for autonomous runtime (RFC-0101 §6)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/session",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "description": "Session management system for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/session-api",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/session-export",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/shared-context",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "description": "pi-harness-runtime — shared-context",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/skill-mcp-client",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "description": "MCP client for Skills SaaS backend",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/skill-registry",
3
- "version": "1.1.95",
3
+ "version": "1.1.96",
4
4
  "description": "Skill Registry for pi-harness-runtime — dynamic skill discovery and invocation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Skills Package - File-based skill system with pi.dev compatibility
3
+ *
4
+ * Implements Hermes-style self-improving skills with:
5
+ * - pi.dev Agent Skills specification compatibility
6
+ * - Progressive disclosure (lazy loading)
7
+ * - Background review and auto-improvement
8
+ * - Hermes-style linter for quality checks
9
+ */
10
+ export * from "./types.js";
11
+ export * from "./parser.js";
12
+ export * from "./scanner.js";
13
+ export * from "./loader.js";
14
+ export * from "./skill-commands.js";
15
+ export * from "./skill-tool.js";
16
+ export * from "./skill-versioning.js";
17
+ export * from "./linter.js";
18
+ import type { SkillsConfig, ScanResult } from "./types.js";
19
+ /**
20
+ * Initialize skills system
21
+ */
22
+ export declare function initSkills(config?: Partial<SkillsConfig & {
23
+ maxDepth?: number;
24
+ includeHidden?: boolean;
25
+ }>): ScanResult;
26
+ /**
27
+ * Get skills summary
28
+ */
29
+ export declare function getSkillsSummary(): {
30
+ total: number;
31
+ loaded: number;
32
+ byAuthor: {
33
+ agent: number;
34
+ user: number;
35
+ curator: number;
36
+ unknown: number;
37
+ };
38
+ };
39
+ export declare const DEFAULT_SKILL_CONFIG: SkillsConfig;
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAE5B,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAe,MAAM,YAAY,CAAC;AAIxE;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAC9E,UAAU,CAkBZ;AAED;;GAEG;AACH,wBAAgB,gBAAgB;;;;;;;;;EAyB/B;AAGD,eAAO,MAAM,oBAAoB,EAAE,YAYlC,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Skills Package - File-based skill system with pi.dev compatibility
3
+ *
4
+ * Implements Hermes-style self-improving skills with:
5
+ * - pi.dev Agent Skills specification compatibility
6
+ * - Progressive disclosure (lazy loading)
7
+ * - Background review and auto-improvement
8
+ * - Hermes-style linter for quality checks
9
+ */
10
+ // Re-export all modules
11
+ export * from "./types.js";
12
+ export * from "./parser.js";
13
+ export * from "./scanner.js";
14
+ export * from "./loader.js";
15
+ export * from "./skill-commands.js";
16
+ export * from "./skill-tool.js";
17
+ export * from "./skill-versioning.js";
18
+ export * from "./linter.js";
19
+ import { scanForSkillsSync } from "./scanner.js";
20
+ import { getGlobalSkillRegistry } from "./loader.js";
21
+ /**
22
+ * Initialize skills system
23
+ */
24
+ export function initSkills(config) {
25
+ const registry = getGlobalSkillRegistry();
26
+ // Scan for skills
27
+ const scanOptions = {
28
+ directories: config?.locations,
29
+ };
30
+ if (config?.maxDepth !== undefined)
31
+ scanOptions.maxDepth = config.maxDepth;
32
+ if (config?.includeHidden !== undefined)
33
+ scanOptions.includeHidden = config.includeHidden;
34
+ const result = scanForSkillsSync(scanOptions);
35
+ // Register skills in global registry
36
+ for (const skill of result.skills) {
37
+ registry.register(skill);
38
+ }
39
+ return result;
40
+ }
41
+ /**
42
+ * Get skills summary
43
+ */
44
+ export function getSkillsSummary() {
45
+ const registry = getGlobalSkillRegistry();
46
+ const skills = registry.list();
47
+ const byAuthor = {
48
+ agent: 0,
49
+ user: 0,
50
+ curator: 0,
51
+ unknown: 0,
52
+ };
53
+ for (const skill of skills) {
54
+ const author = skill.hermes?.author ?? "unknown";
55
+ if (author in byAuthor) {
56
+ byAuthor[author]++;
57
+ }
58
+ else {
59
+ byAuthor.unknown++;
60
+ }
61
+ }
62
+ return {
63
+ total: skills.length,
64
+ loaded: skills.filter((s) => s.loaded).length,
65
+ byAuthor,
66
+ };
67
+ }
68
+ // Default configuration
69
+ export const DEFAULT_SKILL_CONFIG = {
70
+ enabled: true,
71
+ locations: [
72
+ "~/.pi-harness/skills",
73
+ "skills",
74
+ ".agents/skills",
75
+ ],
76
+ write_approval: false,
77
+ auto_create_threshold: 3,
78
+ auto_patch_threshold: 1,
79
+ progressive_disclosure: true,
80
+ default_author: "agent",
81
+ };
82
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wBAAwB;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAG5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,MAA+E;IAE/E,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;IAE1C,kBAAkB;IAClB,MAAM,WAAW,GAAyB;QACxC,WAAW,EAAE,MAAM,EAAE,SAAS;KAC/B,CAAC;IACF,IAAI,MAAM,EAAE,QAAQ,KAAK,SAAS;QAAE,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC3E,IAAI,MAAM,EAAE,aAAa,KAAK,SAAS;QAAE,WAAW,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAE1F,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAE9C,qCAAqC;IACrC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE/B,MAAM,QAAQ,GAAG;QACf,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,CAAC;QACP,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;KACX,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,SAAS,CAAC;QACjD,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;YACvB,QAAQ,CAAC,MAA+B,CAAC,EAAE,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM;QAC7C,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,wBAAwB;AACxB,MAAM,CAAC,MAAM,oBAAoB,GAAiB;IAChD,OAAO,EAAE,IAAI;IACb,SAAS,EAAE;QACT,sBAAsB;QACtB,QAAQ;QACR,gBAAgB;KACjB;IACD,cAAc,EAAE,KAAK;IACrB,qBAAqB,EAAE,CAAC;IACxB,oBAAoB,EAAE,CAAC;IACvB,sBAAsB,EAAE,IAAI;IAC5B,cAAc,EAAE,OAAO;CACxB,CAAC"}