@polpo-ai/node 0.11.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 (238) hide show
  1. package/LICENSE +13 -0
  2. package/dist/adapters/engine.d.ts +51 -0
  3. package/dist/adapters/engine.d.ts.map +1 -0
  4. package/dist/adapters/engine.js +316 -0
  5. package/dist/adapters/engine.js.map +1 -0
  6. package/dist/adapters/index.d.ts +2 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/index.js +4 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/loop-engine.d.ts +36 -0
  11. package/dist/adapters/loop-engine.d.ts.map +1 -0
  12. package/dist/adapters/loop-engine.js +534 -0
  13. package/dist/adapters/loop-engine.js.map +1 -0
  14. package/dist/adapters/node-filesystem.d.ts +22 -0
  15. package/dist/adapters/node-filesystem.d.ts.map +1 -0
  16. package/dist/adapters/node-filesystem.js +59 -0
  17. package/dist/adapters/node-filesystem.js.map +1 -0
  18. package/dist/adapters/node-shell.d.ts +5 -0
  19. package/dist/adapters/node-shell.d.ts.map +1 -0
  20. package/dist/adapters/node-shell.js +34 -0
  21. package/dist/adapters/node-shell.js.map +1 -0
  22. package/dist/adapters/node-spawner.d.ts +14 -0
  23. package/dist/adapters/node-spawner.d.ts.map +1 -0
  24. package/dist/adapters/node-spawner.js +103 -0
  25. package/dist/adapters/node-spawner.js.map +1 -0
  26. package/dist/assessment/assessor.d.ts +6 -0
  27. package/dist/assessment/assessor.d.ts.map +1 -0
  28. package/dist/assessment/assessor.js +37 -0
  29. package/dist/assessment/assessor.js.map +1 -0
  30. package/dist/assessment/index.d.ts +6 -0
  31. package/dist/assessment/index.d.ts.map +1 -0
  32. package/dist/assessment/index.js +6 -0
  33. package/dist/assessment/index.js.map +1 -0
  34. package/dist/assessment/llm-review.d.ts +34 -0
  35. package/dist/assessment/llm-review.d.ts.map +1 -0
  36. package/dist/assessment/llm-review.js +669 -0
  37. package/dist/assessment/llm-review.js.map +1 -0
  38. package/dist/assessment/schemas.d.ts +5 -0
  39. package/dist/assessment/schemas.d.ts.map +1 -0
  40. package/dist/assessment/schemas.js +5 -0
  41. package/dist/assessment/schemas.js.map +1 -0
  42. package/dist/assessment/scoring.d.ts +5 -0
  43. package/dist/assessment/scoring.d.ts.map +1 -0
  44. package/dist/assessment/scoring.js +5 -0
  45. package/dist/assessment/scoring.js.map +1 -0
  46. package/dist/assessment/transcript-parser.d.ts +31 -0
  47. package/dist/assessment/transcript-parser.d.ts.map +1 -0
  48. package/dist/assessment/transcript-parser.js +203 -0
  49. package/dist/assessment/transcript-parser.js.map +1 -0
  50. package/dist/auth/index.d.ts +2 -0
  51. package/dist/auth/index.d.ts.map +1 -0
  52. package/dist/auth/index.js +4 -0
  53. package/dist/auth/index.js.map +1 -0
  54. package/dist/core/adapter.d.ts +62 -0
  55. package/dist/core/adapter.d.ts.map +1 -0
  56. package/dist/core/adapter.js +2 -0
  57. package/dist/core/adapter.js.map +1 -0
  58. package/dist/core/assessment-orchestrator.d.ts +18 -0
  59. package/dist/core/assessment-orchestrator.d.ts.map +1 -0
  60. package/dist/core/assessment-orchestrator.js +93 -0
  61. package/dist/core/assessment-orchestrator.js.map +1 -0
  62. package/dist/core/config.d.ts +17 -0
  63. package/dist/core/config.d.ts.map +1 -0
  64. package/dist/core/config.js +272 -0
  65. package/dist/core/config.js.map +1 -0
  66. package/dist/core/constants.d.ts +10 -0
  67. package/dist/core/constants.d.ts.map +1 -0
  68. package/dist/core/constants.js +11 -0
  69. package/dist/core/constants.js.map +1 -0
  70. package/dist/core/deadlock-resolver.d.ts +35 -0
  71. package/dist/core/deadlock-resolver.d.ts.map +1 -0
  72. package/dist/core/deadlock-resolver.js +317 -0
  73. package/dist/core/deadlock-resolver.js.map +1 -0
  74. package/dist/core/drizzle-sqlite-schema.d.ts +8 -0
  75. package/dist/core/drizzle-sqlite-schema.d.ts.map +1 -0
  76. package/dist/core/drizzle-sqlite-schema.js +250 -0
  77. package/dist/core/drizzle-sqlite-schema.js.map +1 -0
  78. package/dist/core/events.d.ts +26 -0
  79. package/dist/core/events.d.ts.map +1 -0
  80. package/dist/core/events.js +39 -0
  81. package/dist/core/events.js.map +1 -0
  82. package/dist/core/index.d.ts +37 -0
  83. package/dist/core/index.d.ts.map +1 -0
  84. package/dist/core/index.js +31 -0
  85. package/dist/core/index.js.map +1 -0
  86. package/dist/core/ink.d.ts +165 -0
  87. package/dist/core/ink.d.ts.map +1 -0
  88. package/dist/core/ink.js +445 -0
  89. package/dist/core/ink.js.map +1 -0
  90. package/dist/core/orchestrator.d.ts +387 -0
  91. package/dist/core/orchestrator.d.ts.map +1 -0
  92. package/dist/core/orchestrator.js +1015 -0
  93. package/dist/core/orchestrator.js.map +1 -0
  94. package/dist/core/question-detector.d.ts +19 -0
  95. package/dist/core/question-detector.d.ts.map +1 -0
  96. package/dist/core/question-detector.js +29 -0
  97. package/dist/core/question-detector.js.map +1 -0
  98. package/dist/core/runner.d.ts +14 -0
  99. package/dist/core/runner.d.ts.map +1 -0
  100. package/dist/core/runner.js +299 -0
  101. package/dist/core/runner.js.map +1 -0
  102. package/dist/core/session-reader.d.ts +46 -0
  103. package/dist/core/session-reader.d.ts.map +1 -0
  104. package/dist/core/session-reader.js +166 -0
  105. package/dist/core/session-reader.js.map +1 -0
  106. package/dist/index.d.ts +24 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +29 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/llm/index.d.ts +8 -0
  111. package/dist/llm/index.d.ts.map +1 -0
  112. package/dist/llm/index.js +21 -0
  113. package/dist/llm/index.js.map +1 -0
  114. package/dist/llm/pi-client.d.ts +8 -0
  115. package/dist/llm/pi-client.d.ts.map +1 -0
  116. package/dist/llm/pi-client.js +8 -0
  117. package/dist/llm/pi-client.js.map +1 -0
  118. package/dist/llm/prompts.d.ts +14 -0
  119. package/dist/llm/prompts.d.ts.map +1 -0
  120. package/dist/llm/prompts.js +1618 -0
  121. package/dist/llm/prompts.js.map +1 -0
  122. package/dist/llm/retry.d.ts +5 -0
  123. package/dist/llm/retry.d.ts.map +1 -0
  124. package/dist/llm/retry.js +5 -0
  125. package/dist/llm/retry.js.map +1 -0
  126. package/dist/llm/skills.d.ts +265 -0
  127. package/dist/llm/skills.d.ts.map +1 -0
  128. package/dist/llm/skills.js +804 -0
  129. package/dist/llm/skills.js.map +1 -0
  130. package/dist/quality/index.d.ts +3 -0
  131. package/dist/quality/index.d.ts.map +1 -0
  132. package/dist/quality/index.js +3 -0
  133. package/dist/quality/index.js.map +1 -0
  134. package/dist/quality/quality-controller.d.ts +2 -0
  135. package/dist/quality/quality-controller.d.ts.map +1 -0
  136. package/dist/quality/quality-controller.js +2 -0
  137. package/dist/quality/quality-controller.js.map +1 -0
  138. package/dist/quality/sla-monitor.d.ts +2 -0
  139. package/dist/quality/sla-monitor.d.ts.map +1 -0
  140. package/dist/quality/sla-monitor.js +2 -0
  141. package/dist/quality/sla-monitor.js.map +1 -0
  142. package/dist/scheduling/cron.d.ts +2 -0
  143. package/dist/scheduling/cron.d.ts.map +1 -0
  144. package/dist/scheduling/cron.js +2 -0
  145. package/dist/scheduling/cron.js.map +1 -0
  146. package/dist/scheduling/index.d.ts +3 -0
  147. package/dist/scheduling/index.d.ts.map +1 -0
  148. package/dist/scheduling/index.js +3 -0
  149. package/dist/scheduling/index.js.map +1 -0
  150. package/dist/scheduling/scheduler.d.ts +2 -0
  151. package/dist/scheduling/scheduler.d.ts.map +1 -0
  152. package/dist/scheduling/scheduler.js +2 -0
  153. package/dist/scheduling/scheduler.js.map +1 -0
  154. package/dist/server/app.d.ts +19 -0
  155. package/dist/server/app.d.ts.map +1 -0
  156. package/dist/server/app.js +302 -0
  157. package/dist/server/app.js.map +1 -0
  158. package/dist/server/deps.d.ts +157 -0
  159. package/dist/server/deps.d.ts.map +1 -0
  160. package/dist/server/deps.js +9 -0
  161. package/dist/server/deps.js.map +1 -0
  162. package/dist/server/index.d.ts +43 -0
  163. package/dist/server/index.d.ts.map +1 -0
  164. package/dist/server/index.js +128 -0
  165. package/dist/server/index.js.map +1 -0
  166. package/dist/server/middleware/auth.d.ts +3 -0
  167. package/dist/server/middleware/auth.d.ts.map +1 -0
  168. package/dist/server/middleware/auth.js +35 -0
  169. package/dist/server/middleware/auth.js.map +1 -0
  170. package/dist/server/middleware/error.d.ts +15 -0
  171. package/dist/server/middleware/error.d.ts.map +1 -0
  172. package/dist/server/middleware/error.js +44 -0
  173. package/dist/server/middleware/error.js.map +1 -0
  174. package/dist/server/middleware/rate-limit.d.ts +16 -0
  175. package/dist/server/middleware/rate-limit.d.ts.map +1 -0
  176. package/dist/server/middleware/rate-limit.js +51 -0
  177. package/dist/server/middleware/rate-limit.js.map +1 -0
  178. package/dist/server/routes/config.d.ts +25 -0
  179. package/dist/server/routes/config.d.ts.map +1 -0
  180. package/dist/server/routes/config.js +446 -0
  181. package/dist/server/routes/config.js.map +1 -0
  182. package/dist/server/routes/files.d.ts +11 -0
  183. package/dist/server/routes/files.d.ts.map +1 -0
  184. package/dist/server/routes/files.js +514 -0
  185. package/dist/server/routes/files.js.map +1 -0
  186. package/dist/server/routes/filesystem.d.ts +3 -0
  187. package/dist/server/routes/filesystem.d.ts.map +1 -0
  188. package/dist/server/routes/filesystem.js +152 -0
  189. package/dist/server/routes/filesystem.js.map +1 -0
  190. package/dist/server/routes/providers.d.ts +7 -0
  191. package/dist/server/routes/providers.d.ts.map +1 -0
  192. package/dist/server/routes/providers.js +256 -0
  193. package/dist/server/routes/providers.js.map +1 -0
  194. package/dist/server/routes/skills.d.ts +11 -0
  195. package/dist/server/routes/skills.d.ts.map +1 -0
  196. package/dist/server/routes/skills.js +543 -0
  197. package/dist/server/routes/skills.js.map +1 -0
  198. package/dist/server/security.d.ts +34 -0
  199. package/dist/server/security.d.ts.map +1 -0
  200. package/dist/server/security.js +118 -0
  201. package/dist/server/security.js.map +1 -0
  202. package/dist/server/sse-bridge.d.ts +36 -0
  203. package/dist/server/sse-bridge.d.ts.map +1 -0
  204. package/dist/server/sse-bridge.js +110 -0
  205. package/dist/server/sse-bridge.js.map +1 -0
  206. package/dist/server/types.d.ts +69 -0
  207. package/dist/server/types.d.ts.map +1 -0
  208. package/dist/server/types.js +2 -0
  209. package/dist/server/types.js.map +1 -0
  210. package/dist/setup/env-persistence.d.ts +9 -0
  211. package/dist/setup/env-persistence.d.ts.map +1 -0
  212. package/dist/setup/env-persistence.js +42 -0
  213. package/dist/setup/env-persistence.js.map +1 -0
  214. package/dist/setup/index.d.ts +32 -0
  215. package/dist/setup/index.d.ts.map +1 -0
  216. package/dist/setup/index.js +24 -0
  217. package/dist/setup/index.js.map +1 -0
  218. package/dist/setup/models.d.ts +20 -0
  219. package/dist/setup/models.d.ts.map +1 -0
  220. package/dist/setup/models.js +33 -0
  221. package/dist/setup/models.js.map +1 -0
  222. package/dist/setup/providers.d.ts +26 -0
  223. package/dist/setup/providers.d.ts.map +1 -0
  224. package/dist/setup/providers.js +31 -0
  225. package/dist/setup/providers.js.map +1 -0
  226. package/dist/vault/encrypted-store.d.ts +45 -0
  227. package/dist/vault/encrypted-store.d.ts.map +1 -0
  228. package/dist/vault/encrypted-store.js +149 -0
  229. package/dist/vault/encrypted-store.js.map +1 -0
  230. package/dist/vault/index.d.ts +4 -0
  231. package/dist/vault/index.d.ts.map +1 -0
  232. package/dist/vault/index.js +3 -0
  233. package/dist/vault/index.js.map +1 -0
  234. package/dist/vault/resolver.d.ts +8 -0
  235. package/dist/vault/resolver.d.ts.map +1 -0
  236. package/dist/vault/resolver.js +8 -0
  237. package/dist/vault/resolver.js.map +1 -0
  238. package/package.json +76 -0
@@ -0,0 +1,445 @@
1
+ /**
2
+ * Ink — Polpo's package registry.
3
+ *
4
+ * Distributes three package types via git-native discovery:
5
+ * - Playbooks: playbooks/<name>/playbook.json (PlaybookDefinition)
6
+ * - Agents: agents/<name>.json (AgentConfig)
7
+ * - Companies: companies/<name>/polpo.json (PolpoFileConfig)
8
+ *
9
+ * Distribution model:
10
+ * - Git repos as the distribution mechanism (like skills.sh)
11
+ * - `polpo ink add owner/repo` clones and discovers by convention
12
+ * - ink.lock tracks installed packages with source repo + commit hash
13
+ *
14
+ * Security:
15
+ * - Structural validation (schema + size limits) runs locally
16
+ * - LLM security scan via ink.polpo.dev worker (cache-aside on content hash)
17
+ * - Interactive review with warnings for dangerous patterns
18
+ */
19
+ import { readdirSync, readFileSync, existsSync, writeFileSync, mkdirSync, statSync, rmSync } from "node:fs";
20
+ import { join, resolve } from "node:path";
21
+ import { createHash } from "node:crypto";
22
+ // ── Helpers ────────────────────────────────────────────────────────────
23
+ /**
24
+ * Strip ink-specific metadata fields (version, author, tags) from an agent
25
+ * config so they don't end up persisted in polpo.json or agent stores.
26
+ */
27
+ export function stripInkMetadata(agent) {
28
+ const clean = { ...agent };
29
+ delete clean.version;
30
+ delete clean.author;
31
+ delete clean.tags;
32
+ return clean;
33
+ }
34
+ // ── Validation ─────────────────────────────────────────────────────────
35
+ /** Maximum file size for a single package JSON file (1 MB). */
36
+ const MAX_FILE_SIZE = 1024 * 1024;
37
+ /** Maximum number of packages per registry repo. */
38
+ const MAX_PACKAGES_PER_REGISTRY = 100;
39
+ /**
40
+ * Validate a playbook definition from a registry.
41
+ * Checks structural integrity and flags suspicious patterns.
42
+ */
43
+ export function validateInkPlaybook(def) {
44
+ const errors = [];
45
+ const warnings = [];
46
+ if (!def || typeof def !== "object") {
47
+ return { valid: false, errors: ["Not a valid JSON object"], warnings };
48
+ }
49
+ const obj = def;
50
+ if (typeof obj.name !== "string" || !obj.name) {
51
+ errors.push("Missing or invalid 'name' field");
52
+ }
53
+ else if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(obj.name)) {
54
+ errors.push(`Invalid name '${obj.name}' — must be kebab-case`);
55
+ }
56
+ if (typeof obj.description !== "string" || !obj.description) {
57
+ errors.push("Missing or invalid 'description' field");
58
+ }
59
+ if (!obj.mission || typeof obj.mission !== "object") {
60
+ errors.push("Missing or invalid 'mission' field");
61
+ }
62
+ if (obj.parameters !== undefined) {
63
+ if (!Array.isArray(obj.parameters)) {
64
+ errors.push("'parameters' must be an array");
65
+ }
66
+ }
67
+ // Warn on optional metadata fields with wrong types
68
+ if (obj.version !== undefined && typeof obj.version !== "string") {
69
+ warnings.push("'version' should be a string");
70
+ }
71
+ if (obj.author !== undefined && typeof obj.author !== "string") {
72
+ warnings.push("'author' should be a string");
73
+ }
74
+ if (obj.tags !== undefined && (!Array.isArray(obj.tags) || !obj.tags.every((t) => typeof t === "string"))) {
75
+ warnings.push("'tags' should be an array of strings");
76
+ }
77
+ return { valid: errors.length === 0, errors, warnings };
78
+ }
79
+ /**
80
+ * Validate an agent config from a registry.
81
+ * Checks structural integrity and flags suspicious patterns.
82
+ */
83
+ export function validateInkAgent(def) {
84
+ const errors = [];
85
+ const warnings = [];
86
+ if (!def || typeof def !== "object") {
87
+ return { valid: false, errors: ["Not a valid JSON object"], warnings };
88
+ }
89
+ const obj = def;
90
+ if (typeof obj.name !== "string" || !obj.name) {
91
+ errors.push("Missing or invalid 'name' field");
92
+ }
93
+ // Security warnings
94
+ if (typeof obj.systemPrompt === "string" && obj.systemPrompt.length > 0) {
95
+ warnings.push("Agent has a custom systemPrompt — review for prompt injection");
96
+ }
97
+ if (Array.isArray(obj.allowedTools)) {
98
+ const dangerousTools = ["bash", "exec", "write", "edit"];
99
+ const found = obj.allowedTools.filter(t => dangerousTools.some(d => t.includes(d)));
100
+ if (found.length > 0) {
101
+ warnings.push(`Agent allows potentially dangerous tools: ${found.join(", ")}`);
102
+ }
103
+ }
104
+ // Warn on optional metadata fields with wrong types
105
+ if (obj.version !== undefined && typeof obj.version !== "string") {
106
+ warnings.push("'version' should be a string");
107
+ }
108
+ if (obj.author !== undefined && typeof obj.author !== "string") {
109
+ warnings.push("'author' should be a string");
110
+ }
111
+ if (obj.tags !== undefined && (!Array.isArray(obj.tags) || !obj.tags.every((t) => typeof t === "string"))) {
112
+ warnings.push("'tags' should be an array of strings");
113
+ }
114
+ return { valid: errors.length === 0, errors, warnings };
115
+ }
116
+ /**
117
+ * Validate a company config (polpo.json) from a registry.
118
+ */
119
+ export function validateInkCompany(def) {
120
+ const errors = [];
121
+ const warnings = [];
122
+ if (!def || typeof def !== "object") {
123
+ return { valid: false, errors: ["Not a valid JSON object"], warnings };
124
+ }
125
+ const obj = def;
126
+ const hasProject = typeof obj.project === "string" && !!obj.project;
127
+ if (!hasProject) {
128
+ errors.push("Missing or invalid 'project' field");
129
+ }
130
+ if (obj.teams !== undefined && !Array.isArray(obj.teams)) {
131
+ // Also accept legacy singular 'team'
132
+ if (obj.team === undefined || typeof obj.team !== "object") {
133
+ errors.push("Missing 'teams' array or legacy 'team' object");
134
+ }
135
+ }
136
+ // Security: check agents within teams for systemPrompt injection
137
+ const teams = (Array.isArray(obj.teams) ? obj.teams : obj.team ? [obj.team] : []);
138
+ for (const team of teams) {
139
+ const agents = (Array.isArray(team.agents) ? team.agents : []);
140
+ for (const agent of agents) {
141
+ if (typeof agent.systemPrompt === "string" && agent.systemPrompt.length > 0) {
142
+ warnings.push(`Agent '${agent.name ?? "unknown"}' in team '${team.name ?? "unknown"}' has a custom systemPrompt — review for prompt injection`);
143
+ }
144
+ }
145
+ }
146
+ return { valid: errors.length === 0, errors, warnings };
147
+ }
148
+ // ── Source Parsing ─────────────────────────────────────────────────────
149
+ /**
150
+ * Parse an Ink source identifier into a structured source object.
151
+ * Supports: owner/repo, full GitHub URLs, local paths.
152
+ * Reuses the same logic as parseSkillSource() from the skills system.
153
+ */
154
+ export function parseInkSource(input) {
155
+ // Local path
156
+ if (input.startsWith("/") || input.startsWith("./") || input.startsWith("../") || input === ".") {
157
+ return { type: "local", url: resolve(input) };
158
+ }
159
+ // Full GitHub URL
160
+ const ghUrlMatch = input.match(/github\.com\/([^/]+\/[^/]+)/);
161
+ if (ghUrlMatch) {
162
+ const ownerRepo = ghUrlMatch[1].replace(/\.git$/, "");
163
+ return {
164
+ type: "github",
165
+ url: `https://github.com/${ownerRepo}.git`,
166
+ ownerRepo,
167
+ };
168
+ }
169
+ // owner/repo shorthand
170
+ if (/^[^/]+\/[^/]+$/.test(input)) {
171
+ return {
172
+ type: "github",
173
+ url: `https://github.com/${input}.git`,
174
+ ownerRepo: input,
175
+ };
176
+ }
177
+ // Assume it's a git URL
178
+ return { type: "github", url: input };
179
+ }
180
+ // ── Content Hashing ────────────────────────────────────────────────────
181
+ /** Compute SHA-256 hash of file content for verdict caching. */
182
+ export function hashContent(content) {
183
+ return createHash("sha256").update(content).digest("hex");
184
+ }
185
+ // ── Convention-Based Discovery ─────────────────────────────────────────
186
+ /**
187
+ * Discover all packages in a registry directory by convention.
188
+ *
189
+ * Scans:
190
+ * - playbooks/<name>/playbook.json → PlaybookDefinition
191
+ * - agents/<name>.json → AgentConfig
192
+ * - companies/<name>/polpo.json → PolpoFileConfig
193
+ *
194
+ * Returns validated packages with content hashes.
195
+ */
196
+ export function discoverInkPackages(registryDir) {
197
+ const packages = [];
198
+ const errors = [];
199
+ if (!existsSync(registryDir)) {
200
+ return { packages, errors: [`Registry directory not found: ${registryDir}`] };
201
+ }
202
+ // — Playbooks: playbooks/<name>/playbook.json
203
+ const playbooksDir = join(registryDir, "playbooks");
204
+ if (existsSync(playbooksDir)) {
205
+ try {
206
+ const entries = readdirSync(playbooksDir, { withFileTypes: true });
207
+ for (const entry of entries) {
208
+ if (!entry.isDirectory())
209
+ continue;
210
+ const playbookFile = join(playbooksDir, entry.name, "playbook.json");
211
+ if (!existsSync(playbookFile))
212
+ continue;
213
+ const result = loadAndValidatePackage(playbookFile, "playbook", entry.name);
214
+ if (result.error) {
215
+ errors.push(result.error);
216
+ }
217
+ else if (result.pkg) {
218
+ packages.push(result.pkg);
219
+ }
220
+ }
221
+ }
222
+ catch (e) {
223
+ errors.push(`Error scanning playbooks/: ${e.message}`);
224
+ }
225
+ }
226
+ // — Agents: agents/<name>.json
227
+ const agentsDir = join(registryDir, "agents");
228
+ if (existsSync(agentsDir)) {
229
+ try {
230
+ const entries = readdirSync(agentsDir, { withFileTypes: true });
231
+ for (const entry of entries) {
232
+ if (!entry.isFile() || !entry.name.endsWith(".json"))
233
+ continue;
234
+ const agentName = entry.name.replace(/\.json$/, "");
235
+ const agentFile = join(agentsDir, entry.name);
236
+ const result = loadAndValidatePackage(agentFile, "agent", agentName);
237
+ if (result.error) {
238
+ errors.push(result.error);
239
+ }
240
+ else if (result.pkg) {
241
+ packages.push(result.pkg);
242
+ }
243
+ }
244
+ }
245
+ catch (e) {
246
+ errors.push(`Error scanning agents/: ${e.message}`);
247
+ }
248
+ }
249
+ // — Companies: companies/<name>/polpo.json
250
+ const companiesDir = join(registryDir, "companies");
251
+ if (existsSync(companiesDir)) {
252
+ try {
253
+ const entries = readdirSync(companiesDir, { withFileTypes: true });
254
+ for (const entry of entries) {
255
+ if (!entry.isDirectory())
256
+ continue;
257
+ const companyFile = join(companiesDir, entry.name, "polpo.json");
258
+ if (!existsSync(companyFile))
259
+ continue;
260
+ const result = loadAndValidatePackage(companyFile, "company", entry.name);
261
+ if (result.error) {
262
+ errors.push(result.error);
263
+ }
264
+ else if (result.pkg) {
265
+ packages.push(result.pkg);
266
+ }
267
+ }
268
+ }
269
+ catch (e) {
270
+ errors.push(`Error scanning companies/: ${e.message}`);
271
+ }
272
+ }
273
+ // Enforce package limit
274
+ if (packages.length > MAX_PACKAGES_PER_REGISTRY) {
275
+ errors.push(`Registry exceeds maximum of ${MAX_PACKAGES_PER_REGISTRY} packages (found ${packages.length})`);
276
+ }
277
+ return { packages, errors };
278
+ }
279
+ /** Load, validate, and hash a single package file. */
280
+ function loadAndValidatePackage(filePath, type, name) {
281
+ try {
282
+ // Size check
283
+ const stats = statSync(filePath);
284
+ if (stats.size > MAX_FILE_SIZE) {
285
+ return { error: `${type} '${name}': file exceeds ${MAX_FILE_SIZE} byte limit (${stats.size} bytes)` };
286
+ }
287
+ const raw = readFileSync(filePath, "utf-8");
288
+ const contentHash = hashContent(raw);
289
+ let parsed;
290
+ try {
291
+ parsed = JSON.parse(raw);
292
+ }
293
+ catch {
294
+ return { error: `${type} '${name}': invalid JSON` };
295
+ }
296
+ // Validate by type
297
+ let validation;
298
+ switch (type) {
299
+ case "playbook":
300
+ validation = validateInkPlaybook(parsed);
301
+ break;
302
+ case "agent":
303
+ validation = validateInkAgent(parsed);
304
+ break;
305
+ case "company":
306
+ validation = validateInkCompany(parsed);
307
+ break;
308
+ }
309
+ if (!validation.valid) {
310
+ return { error: `${type} '${name}': ${validation.errors.join("; ")}` };
311
+ }
312
+ // Extract common metadata
313
+ const obj = parsed;
314
+ const metadata = {
315
+ version: typeof obj.version === "string" ? obj.version : undefined,
316
+ author: typeof obj.author === "string" ? obj.author : undefined,
317
+ tags: Array.isArray(obj.tags) ? obj.tags : undefined,
318
+ description: typeof obj.description === "string" ? obj.description : undefined,
319
+ };
320
+ return {
321
+ pkg: {
322
+ type,
323
+ name,
324
+ path: filePath,
325
+ contentHash,
326
+ content: parsed,
327
+ metadata,
328
+ },
329
+ };
330
+ }
331
+ catch (e) {
332
+ return { error: `${type} '${name}': ${e.message}` };
333
+ }
334
+ }
335
+ // ── Lock File Management ───────────────────────────────────────────────
336
+ const LOCK_FILE_NAME = "ink.lock";
337
+ /** Read the ink.lock file from a polpo directory. Returns empty lock if not found. */
338
+ export function readInkLock(polpoDir) {
339
+ const lockPath = join(polpoDir, LOCK_FILE_NAME);
340
+ if (!existsSync(lockPath)) {
341
+ return { version: 1, registries: [] };
342
+ }
343
+ try {
344
+ const raw = readFileSync(lockPath, "utf-8");
345
+ const parsed = JSON.parse(raw);
346
+ // Basic validation
347
+ if (parsed.version !== 1 || !Array.isArray(parsed.registries)) {
348
+ return { version: 1, registries: [] };
349
+ }
350
+ return parsed;
351
+ }
352
+ catch {
353
+ return { version: 1, registries: [] };
354
+ }
355
+ }
356
+ /** Write the ink.lock file to a polpo directory. */
357
+ export function writeInkLock(polpoDir, lock) {
358
+ if (!existsSync(polpoDir)) {
359
+ mkdirSync(polpoDir, { recursive: true });
360
+ }
361
+ const lockPath = join(polpoDir, LOCK_FILE_NAME);
362
+ writeFileSync(lockPath, JSON.stringify(lock, null, 2) + "\n", "utf-8");
363
+ }
364
+ /** Add or update a registry entry in the lock file. */
365
+ export function upsertInkLockEntry(lock, entry) {
366
+ const idx = lock.registries.findIndex(r => r.source === entry.source);
367
+ const updated = { ...lock, registries: [...lock.registries] };
368
+ if (idx >= 0) {
369
+ updated.registries[idx] = entry;
370
+ }
371
+ else {
372
+ updated.registries.push(entry);
373
+ }
374
+ return updated;
375
+ }
376
+ /** Remove a registry entry from the lock file. */
377
+ export function removeInkLockEntry(lock, source) {
378
+ return {
379
+ ...lock,
380
+ registries: lock.registries.filter(r => r.source !== source),
381
+ };
382
+ }
383
+ /** Check if a source is already installed in the lock file. */
384
+ export function isInkSourceInstalled(lock, source) {
385
+ return lock.registries.some(r => r.source === source);
386
+ }
387
+ /** Get the installed entry for a source, or undefined. */
388
+ export function getInkLockEntry(lock, source) {
389
+ return lock.registries.find(r => r.source === source);
390
+ }
391
+ // ── Uninstall ──────────────────────────────────────────────────────────
392
+ /**
393
+ * Uninstall packages recorded in a lock entry.
394
+ *
395
+ * - Playbooks: removes via PlaybookStore
396
+ * - Agents: removes from AgentStore
397
+ * - Companies: removes legacy paths (merged config cannot be cleanly reversed)
398
+ *
399
+ * @param entry - The lock entry whose packages should be removed
400
+ * @param polpoDir - Path to the .polpo directory
401
+ * @param agentStore - AgentStore to remove agents from
402
+ * @param playbookStore - PlaybookStore to remove playbooks from
403
+ */
404
+ export async function uninstallInkPackages(entry, polpoDir, agentStore, playbookStore) {
405
+ const removed = [];
406
+ for (const pkg of entry.packages) {
407
+ switch (pkg.type) {
408
+ case "playbook": {
409
+ if (playbookStore) {
410
+ const deleted = await playbookStore.delete(pkg.name);
411
+ if (deleted)
412
+ removed.push(`playbook: ${pkg.name}`);
413
+ }
414
+ else {
415
+ // Fallback: direct filesystem removal (when store not available)
416
+ const dir = join(polpoDir, "playbooks", pkg.name);
417
+ if (existsSync(dir)) {
418
+ rmSync(dir, { recursive: true, force: true });
419
+ removed.push(`playbook: ${pkg.name}`);
420
+ }
421
+ }
422
+ break;
423
+ }
424
+ case "agent": {
425
+ const deleted = await agentStore.deleteAgent(pkg.name);
426
+ if (deleted) {
427
+ removed.push(`agent: ${pkg.name}`);
428
+ }
429
+ break;
430
+ }
431
+ case "company": {
432
+ // Companies merge teams/agents — can't cleanly reverse.
433
+ // Remove legacy paths if present.
434
+ const legacyDir = join(polpoDir, "ink-companies", pkg.name);
435
+ if (existsSync(legacyDir)) {
436
+ rmSync(legacyDir, { recursive: true, force: true });
437
+ }
438
+ removed.push(`company: ${pkg.name} (merged config preserved)`);
439
+ break;
440
+ }
441
+ }
442
+ }
443
+ return removed;
444
+ }
445
+ //# sourceMappingURL=ink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ink.js","sourceRoot":"","sources":["../../src/core/ink.ts"],"names":[],"mappings":"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"}