@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.
- package/LICENSE +13 -0
- package/dist/adapters/engine.d.ts +51 -0
- package/dist/adapters/engine.d.ts.map +1 -0
- package/dist/adapters/engine.js +316 -0
- package/dist/adapters/engine.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +4 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/loop-engine.d.ts +36 -0
- package/dist/adapters/loop-engine.d.ts.map +1 -0
- package/dist/adapters/loop-engine.js +534 -0
- package/dist/adapters/loop-engine.js.map +1 -0
- package/dist/adapters/node-filesystem.d.ts +22 -0
- package/dist/adapters/node-filesystem.d.ts.map +1 -0
- package/dist/adapters/node-filesystem.js +59 -0
- package/dist/adapters/node-filesystem.js.map +1 -0
- package/dist/adapters/node-shell.d.ts +5 -0
- package/dist/adapters/node-shell.d.ts.map +1 -0
- package/dist/adapters/node-shell.js +34 -0
- package/dist/adapters/node-shell.js.map +1 -0
- package/dist/adapters/node-spawner.d.ts +14 -0
- package/dist/adapters/node-spawner.d.ts.map +1 -0
- package/dist/adapters/node-spawner.js +103 -0
- package/dist/adapters/node-spawner.js.map +1 -0
- package/dist/assessment/assessor.d.ts +6 -0
- package/dist/assessment/assessor.d.ts.map +1 -0
- package/dist/assessment/assessor.js +37 -0
- package/dist/assessment/assessor.js.map +1 -0
- package/dist/assessment/index.d.ts +6 -0
- package/dist/assessment/index.d.ts.map +1 -0
- package/dist/assessment/index.js +6 -0
- package/dist/assessment/index.js.map +1 -0
- package/dist/assessment/llm-review.d.ts +34 -0
- package/dist/assessment/llm-review.d.ts.map +1 -0
- package/dist/assessment/llm-review.js +669 -0
- package/dist/assessment/llm-review.js.map +1 -0
- package/dist/assessment/schemas.d.ts +5 -0
- package/dist/assessment/schemas.d.ts.map +1 -0
- package/dist/assessment/schemas.js +5 -0
- package/dist/assessment/schemas.js.map +1 -0
- package/dist/assessment/scoring.d.ts +5 -0
- package/dist/assessment/scoring.d.ts.map +1 -0
- package/dist/assessment/scoring.js +5 -0
- package/dist/assessment/scoring.js.map +1 -0
- package/dist/assessment/transcript-parser.d.ts +31 -0
- package/dist/assessment/transcript-parser.d.ts.map +1 -0
- package/dist/assessment/transcript-parser.js +203 -0
- package/dist/assessment/transcript-parser.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/core/adapter.d.ts +62 -0
- package/dist/core/adapter.d.ts.map +1 -0
- package/dist/core/adapter.js +2 -0
- package/dist/core/adapter.js.map +1 -0
- package/dist/core/assessment-orchestrator.d.ts +18 -0
- package/dist/core/assessment-orchestrator.d.ts.map +1 -0
- package/dist/core/assessment-orchestrator.js +93 -0
- package/dist/core/assessment-orchestrator.js.map +1 -0
- package/dist/core/config.d.ts +17 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +272 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +10 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +11 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/deadlock-resolver.d.ts +35 -0
- package/dist/core/deadlock-resolver.d.ts.map +1 -0
- package/dist/core/deadlock-resolver.js +317 -0
- package/dist/core/deadlock-resolver.js.map +1 -0
- package/dist/core/drizzle-sqlite-schema.d.ts +8 -0
- package/dist/core/drizzle-sqlite-schema.d.ts.map +1 -0
- package/dist/core/drizzle-sqlite-schema.js +250 -0
- package/dist/core/drizzle-sqlite-schema.js.map +1 -0
- package/dist/core/events.d.ts +26 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +39 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/index.d.ts +37 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +31 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/ink.d.ts +165 -0
- package/dist/core/ink.d.ts.map +1 -0
- package/dist/core/ink.js +445 -0
- package/dist/core/ink.js.map +1 -0
- package/dist/core/orchestrator.d.ts +387 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +1015 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/question-detector.d.ts +19 -0
- package/dist/core/question-detector.d.ts.map +1 -0
- package/dist/core/question-detector.js +29 -0
- package/dist/core/question-detector.js.map +1 -0
- package/dist/core/runner.d.ts +14 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +299 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/session-reader.d.ts +46 -0
- package/dist/core/session-reader.d.ts.map +1 -0
- package/dist/core/session-reader.js +166 -0
- package/dist/core/session-reader.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/index.d.ts +8 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +21 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/pi-client.d.ts +8 -0
- package/dist/llm/pi-client.d.ts.map +1 -0
- package/dist/llm/pi-client.js +8 -0
- package/dist/llm/pi-client.js.map +1 -0
- package/dist/llm/prompts.d.ts +14 -0
- package/dist/llm/prompts.d.ts.map +1 -0
- package/dist/llm/prompts.js +1618 -0
- package/dist/llm/prompts.js.map +1 -0
- package/dist/llm/retry.d.ts +5 -0
- package/dist/llm/retry.d.ts.map +1 -0
- package/dist/llm/retry.js +5 -0
- package/dist/llm/retry.js.map +1 -0
- package/dist/llm/skills.d.ts +265 -0
- package/dist/llm/skills.d.ts.map +1 -0
- package/dist/llm/skills.js +804 -0
- package/dist/llm/skills.js.map +1 -0
- package/dist/quality/index.d.ts +3 -0
- package/dist/quality/index.d.ts.map +1 -0
- package/dist/quality/index.js +3 -0
- package/dist/quality/index.js.map +1 -0
- package/dist/quality/quality-controller.d.ts +2 -0
- package/dist/quality/quality-controller.d.ts.map +1 -0
- package/dist/quality/quality-controller.js +2 -0
- package/dist/quality/quality-controller.js.map +1 -0
- package/dist/quality/sla-monitor.d.ts +2 -0
- package/dist/quality/sla-monitor.d.ts.map +1 -0
- package/dist/quality/sla-monitor.js +2 -0
- package/dist/quality/sla-monitor.js.map +1 -0
- package/dist/scheduling/cron.d.ts +2 -0
- package/dist/scheduling/cron.d.ts.map +1 -0
- package/dist/scheduling/cron.js +2 -0
- package/dist/scheduling/cron.js.map +1 -0
- package/dist/scheduling/index.d.ts +3 -0
- package/dist/scheduling/index.d.ts.map +1 -0
- package/dist/scheduling/index.js +3 -0
- package/dist/scheduling/index.js.map +1 -0
- package/dist/scheduling/scheduler.d.ts +2 -0
- package/dist/scheduling/scheduler.d.ts.map +1 -0
- package/dist/scheduling/scheduler.js +2 -0
- package/dist/scheduling/scheduler.js.map +1 -0
- package/dist/server/app.d.ts +19 -0
- package/dist/server/app.d.ts.map +1 -0
- package/dist/server/app.js +302 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/deps.d.ts +157 -0
- package/dist/server/deps.d.ts.map +1 -0
- package/dist/server/deps.js +9 -0
- package/dist/server/deps.js.map +1 -0
- package/dist/server/index.d.ts +43 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +128 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware/auth.d.ts +3 -0
- package/dist/server/middleware/auth.d.ts.map +1 -0
- package/dist/server/middleware/auth.js +35 -0
- package/dist/server/middleware/auth.js.map +1 -0
- package/dist/server/middleware/error.d.ts +15 -0
- package/dist/server/middleware/error.d.ts.map +1 -0
- package/dist/server/middleware/error.js +44 -0
- package/dist/server/middleware/error.js.map +1 -0
- package/dist/server/middleware/rate-limit.d.ts +16 -0
- package/dist/server/middleware/rate-limit.d.ts.map +1 -0
- package/dist/server/middleware/rate-limit.js +51 -0
- package/dist/server/middleware/rate-limit.js.map +1 -0
- package/dist/server/routes/config.d.ts +25 -0
- package/dist/server/routes/config.d.ts.map +1 -0
- package/dist/server/routes/config.js +446 -0
- package/dist/server/routes/config.js.map +1 -0
- package/dist/server/routes/files.d.ts +11 -0
- package/dist/server/routes/files.d.ts.map +1 -0
- package/dist/server/routes/files.js +514 -0
- package/dist/server/routes/files.js.map +1 -0
- package/dist/server/routes/filesystem.d.ts +3 -0
- package/dist/server/routes/filesystem.d.ts.map +1 -0
- package/dist/server/routes/filesystem.js +152 -0
- package/dist/server/routes/filesystem.js.map +1 -0
- package/dist/server/routes/providers.d.ts +7 -0
- package/dist/server/routes/providers.d.ts.map +1 -0
- package/dist/server/routes/providers.js +256 -0
- package/dist/server/routes/providers.js.map +1 -0
- package/dist/server/routes/skills.d.ts +11 -0
- package/dist/server/routes/skills.d.ts.map +1 -0
- package/dist/server/routes/skills.js +543 -0
- package/dist/server/routes/skills.js.map +1 -0
- package/dist/server/security.d.ts +34 -0
- package/dist/server/security.d.ts.map +1 -0
- package/dist/server/security.js +118 -0
- package/dist/server/security.js.map +1 -0
- package/dist/server/sse-bridge.d.ts +36 -0
- package/dist/server/sse-bridge.d.ts.map +1 -0
- package/dist/server/sse-bridge.js +110 -0
- package/dist/server/sse-bridge.js.map +1 -0
- package/dist/server/types.d.ts +69 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/setup/env-persistence.d.ts +9 -0
- package/dist/setup/env-persistence.d.ts.map +1 -0
- package/dist/setup/env-persistence.js +42 -0
- package/dist/setup/env-persistence.js.map +1 -0
- package/dist/setup/index.d.ts +32 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +24 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/models.d.ts +20 -0
- package/dist/setup/models.d.ts.map +1 -0
- package/dist/setup/models.js +33 -0
- package/dist/setup/models.js.map +1 -0
- package/dist/setup/providers.d.ts +26 -0
- package/dist/setup/providers.d.ts.map +1 -0
- package/dist/setup/providers.js +31 -0
- package/dist/setup/providers.js.map +1 -0
- package/dist/vault/encrypted-store.d.ts +45 -0
- package/dist/vault/encrypted-store.d.ts.map +1 -0
- package/dist/vault/encrypted-store.js +149 -0
- package/dist/vault/encrypted-store.js.map +1 -0
- package/dist/vault/index.d.ts +4 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +3 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/resolver.d.ts +8 -0
- package/dist/vault/resolver.d.ts.map +1 -0
- package/dist/vault/resolver.js +8 -0
- package/dist/vault/resolver.js.map +1 -0
- package/package.json +76 -0
package/dist/core/ink.js
ADDED
|
@@ -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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"}
|