@playcraft/common 0.0.57 → 0.0.58
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/README.md +1 -1
- package/dist/agent/gamepilot.d.ts +17 -0
- package/dist/agent/gamepilot.d.ts.map +1 -0
- package/dist/agent/gamepilot.js +37 -0
- package/dist/agent/gamepilot.js.map +1 -0
- package/dist/agent/index.d.ts +1 -0
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +1 -0
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/openai-responses-api.d.ts +12 -0
- package/dist/agent/openai-responses-api.d.ts.map +1 -1
- package/dist/agent/openai-responses-api.js +30 -0
- package/dist/agent/openai-responses-api.js.map +1 -1
- package/dist/agent/runtime-failure.d.ts +3 -1
- package/dist/agent/runtime-failure.d.ts.map +1 -1
- package/dist/agent/runtime-failure.js +6 -1
- package/dist/agent/runtime-failure.js.map +1 -1
- package/dist/agent/session-title.d.ts +1 -1
- package/dist/agent/session-title.js +1 -1
- package/dist/agent-messages/db-message-converter.d.ts +12 -0
- package/dist/agent-messages/db-message-converter.d.ts.map +1 -1
- package/dist/agent-messages/db-message-converter.js +28 -0
- package/dist/agent-messages/db-message-converter.js.map +1 -1
- package/dist/agent-messages/runtime-user-messages.d.ts +3 -0
- package/dist/agent-messages/runtime-user-messages.d.ts.map +1 -1
- package/dist/agent-messages/runtime-user-messages.js +36 -2
- package/dist/agent-messages/runtime-user-messages.js.map +1 -1
- package/dist/agent-tools/index.d.ts +1 -0
- package/dist/agent-tools/index.d.ts.map +1 -1
- package/dist/agent-tools/index.js +1 -0
- package/dist/agent-tools/index.js.map +1 -1
- package/dist/agent-tools/operation-protocol.d.ts +10 -0
- package/dist/agent-tools/operation-protocol.d.ts.map +1 -0
- package/dist/agent-tools/operation-protocol.js +13 -0
- package/dist/agent-tools/operation-protocol.js.map +1 -0
- package/dist/agent-tools/types.d.ts +1 -1
- package/dist/agent-tools/types.d.ts.map +1 -1
- package/dist/agent-tools/types.js +8 -1
- package/dist/agent-tools/types.js.map +1 -1
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/jwt.d.ts.map +1 -1
- package/dist/auth/jwt.js +2 -7
- package/dist/auth/jwt.js.map +1 -1
- package/dist/auth/project-access-checker.d.ts +42 -0
- package/dist/auth/project-access-checker.d.ts.map +1 -0
- package/dist/auth/project-access-checker.js +81 -0
- package/dist/auth/project-access-checker.js.map +1 -0
- package/dist/auth/resolve-secret.d.ts +18 -0
- package/dist/auth/resolve-secret.d.ts.map +1 -0
- package/dist/auth/resolve-secret.js +33 -0
- package/dist/auth/resolve-secret.js.map +1 -0
- package/dist/auth/signature.d.ts +6 -1
- package/dist/auth/signature.d.ts.map +1 -1
- package/dist/auth/signature.js +8 -3
- package/dist/auth/signature.js.map +1 -1
- package/dist/cloud-workspace/runtime/agent-chat-flush.d.ts +57 -0
- package/dist/cloud-workspace/runtime/agent-chat-flush.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-chat-flush.js +55 -0
- package/dist/cloud-workspace/runtime/agent-chat-flush.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-codebuddy.d.ts +266 -0
- package/dist/cloud-workspace/runtime/agent-codebuddy.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-codebuddy.js +189 -0
- package/dist/cloud-workspace/runtime/agent-codebuddy.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-command.d.ts +130 -0
- package/dist/cloud-workspace/runtime/agent-command.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-command.js +75 -0
- package/dist/cloud-workspace/runtime/agent-command.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-connection.d.ts +76 -0
- package/dist/cloud-workspace/runtime/agent-connection.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-connection.js +59 -0
- package/dist/cloud-workspace/runtime/agent-connection.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-lifecycle.d.ts +85 -0
- package/dist/cloud-workspace/runtime/agent-lifecycle.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-lifecycle.js +70 -0
- package/dist/cloud-workspace/runtime/agent-lifecycle.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-mutation.d.ts +197 -0
- package/dist/cloud-workspace/runtime/agent-mutation.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-mutation.js +114 -0
- package/dist/cloud-workspace/runtime/agent-mutation.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-opencode-gateway.d.ts +156 -0
- package/dist/cloud-workspace/runtime/agent-opencode-gateway.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-opencode-gateway.js +141 -0
- package/dist/cloud-workspace/runtime/agent-opencode-gateway.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-opencode.d.ts +240 -0
- package/dist/cloud-workspace/runtime/agent-opencode.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-opencode.js +176 -0
- package/dist/cloud-workspace/runtime/agent-opencode.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-promotion.d.ts +20 -0
- package/dist/cloud-workspace/runtime/agent-promotion.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-promotion.js +19 -0
- package/dist/cloud-workspace/runtime/agent-promotion.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-read.d.ts +343 -0
- package/dist/cloud-workspace/runtime/agent-read.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-read.js +159 -0
- package/dist/cloud-workspace/runtime/agent-read.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-tool-claim.d.ts +18 -0
- package/dist/cloud-workspace/runtime/agent-tool-claim.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-tool-claim.js +16 -0
- package/dist/cloud-workspace/runtime/agent-tool-claim.js.map +1 -0
- package/dist/cloud-workspace/runtime/capabilities.d.ts +40 -0
- package/dist/cloud-workspace/runtime/capabilities.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/capabilities.js +53 -0
- package/dist/cloud-workspace/runtime/capabilities.js.map +1 -0
- package/dist/cloud-workspace/runtime/checkpoints.d.ts +60 -0
- package/dist/cloud-workspace/runtime/checkpoints.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/checkpoints.js +33 -0
- package/dist/cloud-workspace/runtime/checkpoints.js.map +1 -0
- package/dist/cloud-workspace/runtime/config.d.ts +42 -0
- package/dist/cloud-workspace/runtime/config.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/config.js +89 -0
- package/dist/cloud-workspace/runtime/config.js.map +1 -0
- package/dist/cloud-workspace/runtime/errors.d.ts +26 -0
- package/dist/cloud-workspace/runtime/errors.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/errors.js +40 -0
- package/dist/cloud-workspace/runtime/errors.js.map +1 -0
- package/dist/cloud-workspace/runtime/events.d.ts +107 -0
- package/dist/cloud-workspace/runtime/events.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/events.js +70 -0
- package/dist/cloud-workspace/runtime/events.js.map +1 -0
- package/dist/cloud-workspace/runtime/execution-grant.d.ts +36 -0
- package/dist/cloud-workspace/runtime/execution-grant.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/execution-grant.js +102 -0
- package/dist/cloud-workspace/runtime/execution-grant.js.map +1 -0
- package/dist/cloud-workspace/runtime/file-snapshot.d.ts +62 -0
- package/dist/cloud-workspace/runtime/file-snapshot.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/file-snapshot.js +147 -0
- package/dist/cloud-workspace/runtime/file-snapshot.js.map +1 -0
- package/dist/cloud-workspace/runtime/files.d.ts +58 -0
- package/dist/cloud-workspace/runtime/files.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/files.js +78 -0
- package/dist/cloud-workspace/runtime/files.js.map +1 -0
- package/dist/cloud-workspace/runtime/generations.d.ts +18 -0
- package/dist/cloud-workspace/runtime/generations.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/generations.js +39 -0
- package/dist/cloud-workspace/runtime/generations.js.map +1 -0
- package/dist/cloud-workspace/runtime/git.d.ts +46 -0
- package/dist/cloud-workspace/runtime/git.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/git.js +44 -0
- package/dist/cloud-workspace/runtime/git.js.map +1 -0
- package/dist/cloud-workspace/runtime/handshake.d.ts +47 -0
- package/dist/cloud-workspace/runtime/handshake.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/handshake.js +31 -0
- package/dist/cloud-workspace/runtime/handshake.js.map +1 -0
- package/dist/cloud-workspace/runtime/http-object-store.d.ts +15 -0
- package/dist/cloud-workspace/runtime/http-object-store.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/http-object-store.js +108 -0
- package/dist/cloud-workspace/runtime/http-object-store.js.map +1 -0
- package/dist/cloud-workspace/runtime/index.d.ts +32 -0
- package/dist/cloud-workspace/runtime/index.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/index.js +32 -0
- package/dist/cloud-workspace/runtime/index.js.map +1 -0
- package/dist/cloud-workspace/runtime/instance-rebuild.d.ts +59 -0
- package/dist/cloud-workspace/runtime/instance-rebuild.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/instance-rebuild.js +51 -0
- package/dist/cloud-workspace/runtime/instance-rebuild.js.map +1 -0
- package/dist/cloud-workspace/runtime/operations.d.ts +142 -0
- package/dist/cloud-workspace/runtime/operations.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/operations.js +134 -0
- package/dist/cloud-workspace/runtime/operations.js.map +1 -0
- package/dist/cloud-workspace/runtime/parameters.d.ts +38 -0
- package/dist/cloud-workspace/runtime/parameters.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/parameters.js +75 -0
- package/dist/cloud-workspace/runtime/parameters.js.map +1 -0
- package/dist/cloud-workspace/runtime/project-native-skills.d.ts +40 -0
- package/dist/cloud-workspace/runtime/project-native-skills.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/project-native-skills.js +45 -0
- package/dist/cloud-workspace/runtime/project-native-skills.js.map +1 -0
- package/dist/cloud-workspace/runtime/protocol.d.ts +23 -0
- package/dist/cloud-workspace/runtime/protocol.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/protocol.js +30 -0
- package/dist/cloud-workspace/runtime/protocol.js.map +1 -0
- package/dist/cloud-workspace/runtime/resource-grant.d.ts +54 -0
- package/dist/cloud-workspace/runtime/resource-grant.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/resource-grant.js +80 -0
- package/dist/cloud-workspace/runtime/resource-grant.js.map +1 -0
- package/dist/cloud-workspace/runtime/terminals.d.ts +52 -0
- package/dist/cloud-workspace/runtime/terminals.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/terminals.js +62 -0
- package/dist/cloud-workspace/runtime/terminals.js.map +1 -0
- package/dist/cloud-workspace/runtime/variant-workspace.d.ts +221 -0
- package/dist/cloud-workspace/runtime/variant-workspace.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/variant-workspace.js +75 -0
- package/dist/cloud-workspace/runtime/variant-workspace.js.map +1 -0
- package/dist/cloud-workspace/runtime/workspace-binding.d.ts +84 -0
- package/dist/cloud-workspace/runtime/workspace-binding.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/workspace-binding.js +121 -0
- package/dist/cloud-workspace/runtime/workspace-binding.js.map +1 -0
- package/dist/database/postgres-adapter.js +1 -1
- package/dist/database/postgres-adapter.js.map +1 -1
- package/dist/database/schema.d.ts +1 -1
- package/dist/database/schema.js +1 -1
- package/dist/messenger/server.d.ts +14 -1
- package/dist/messenger/server.d.ts.map +1 -1
- package/dist/messenger/server.js +5 -1
- package/dist/messenger/server.js.map +1 -1
- package/dist/playable-ads-filename.d.ts +16 -0
- package/dist/playable-ads-filename.d.ts.map +1 -1
- package/dist/playable-ads-filename.js +18 -0
- package/dist/playable-ads-filename.js.map +1 -1
- package/dist/prefab/mime-type-list.d.ts.map +1 -1
- package/dist/prefab/mime-type-list.js +8 -0
- package/dist/prefab/mime-type-list.js.map +1 -1
- package/dist/project-skills/bundle-archive.d.ts +21 -0
- package/dist/project-skills/bundle-archive.d.ts.map +1 -0
- package/dist/project-skills/bundle-archive.js +161 -0
- package/dist/project-skills/bundle-archive.js.map +1 -0
- package/dist/project-skills/bundle-path.d.ts +3 -0
- package/dist/project-skills/bundle-path.d.ts.map +1 -0
- package/dist/project-skills/bundle-path.js +17 -0
- package/dist/project-skills/bundle-path.js.map +1 -0
- package/dist/project-skills/evidence.d.ts +15 -0
- package/dist/project-skills/evidence.d.ts.map +1 -0
- package/dist/project-skills/evidence.js +33 -0
- package/dist/project-skills/evidence.js.map +1 -0
- package/dist/project-skills/index.d.ts +7 -0
- package/dist/project-skills/index.d.ts.map +1 -0
- package/dist/project-skills/index.js +7 -0
- package/dist/project-skills/index.js.map +1 -0
- package/dist/project-skills/inventory.d.ts +23 -0
- package/dist/project-skills/inventory.d.ts.map +1 -0
- package/dist/project-skills/inventory.js +150 -0
- package/dist/project-skills/inventory.js.map +1 -0
- package/dist/project-skills/local-snapshot.d.ts +12 -0
- package/dist/project-skills/local-snapshot.d.ts.map +1 -0
- package/dist/project-skills/local-snapshot.js +66 -0
- package/dist/project-skills/local-snapshot.js.map +1 -0
- package/dist/project-skills/protocol.d.ts +31 -0
- package/dist/project-skills/protocol.d.ts.map +1 -0
- package/dist/project-skills/protocol.js +197 -0
- package/dist/project-skills/protocol.js.map +1 -0
- package/dist/project-skills/runtime-plugin.d.ts +66 -0
- package/dist/project-skills/runtime-plugin.d.ts.map +1 -0
- package/dist/project-skills/runtime-plugin.js +102 -0
- package/dist/project-skills/runtime-plugin.js.map +1 -0
- package/dist/project-skills/types.d.ts +63 -0
- package/dist/project-skills/types.d.ts.map +1 -0
- package/dist/project-skills/types.js +13 -0
- package/dist/project-skills/types.js.map +1 -0
- package/dist/recommend/types.d.ts +1 -1
- package/dist/recommend/types.js +1 -1
- package/dist/sharedb/server.d.ts +12 -0
- package/dist/sharedb/server.d.ts.map +1 -1
- package/dist/sharedb/server.js +27 -6
- package/dist/sharedb/server.js.map +1 -1
- package/dist/skill-evaluation.d.ts +152 -0
- package/dist/skill-evaluation.d.ts.map +1 -0
- package/dist/skill-evaluation.js +14 -0
- package/dist/skill-evaluation.js.map +1 -0
- package/package.json +21 -1
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { lstat, readdir, readFile, realpath } from 'node:fs/promises';
|
|
2
|
+
import { join, resolve, sep } from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { parseProjectSkillDeclaration, sourceTreeDigest } from './protocol.js';
|
|
5
|
+
import { PROJECT_SKILLS_DECLARATION_PATH, PROJECT_SKILLS_LOCK_PATH, ProjectSkillsError, } from './types.js';
|
|
6
|
+
export const PROJECT_SKILL_SOURCE_ROOTS = ['.agents/skills', '.claude/skills', '.opencode/skills', '.opencode/skill'];
|
|
7
|
+
const MAX_FILES = 512;
|
|
8
|
+
const MAX_FILE_BYTES = 16 * 1024 * 1024;
|
|
9
|
+
const MAX_BUNDLE_BYTES = 64 * 1024 * 1024;
|
|
10
|
+
/** Metadata is never read through repository-supplied links. */
|
|
11
|
+
export async function readProjectSkillsLockFile(projectRoot) {
|
|
12
|
+
const root = await realpath(resolve(projectRoot));
|
|
13
|
+
try {
|
|
14
|
+
const file = await safePath(root, PROJECT_SKILLS_LOCK_PATH);
|
|
15
|
+
const stat = await lstat(file);
|
|
16
|
+
if (!stat.isFile() || stat.size > 1024 * 1024)
|
|
17
|
+
throw new ProjectSkillsError('source_limit', PROJECT_SKILLS_LOCK_PATH);
|
|
18
|
+
return await readFile(file, 'utf8');
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error.code === 'ENOENT')
|
|
22
|
+
return null;
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function exists(path) {
|
|
27
|
+
try {
|
|
28
|
+
await lstat(path);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error.code === 'ENOENT')
|
|
33
|
+
return false;
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Reject links at every segment, including roots. Snapshot bytes before registering. */
|
|
38
|
+
async function safePath(root, relative) {
|
|
39
|
+
let current = root;
|
|
40
|
+
for (const part of relative.split('/')) {
|
|
41
|
+
current = join(current, part);
|
|
42
|
+
if ((await lstat(current)).isSymbolicLink())
|
|
43
|
+
throw new ProjectSkillsError('source_symlink', relative);
|
|
44
|
+
}
|
|
45
|
+
const target = await realpath(current);
|
|
46
|
+
if (!target.startsWith(root + sep))
|
|
47
|
+
throw new ProjectSkillsError('source_escape', relative);
|
|
48
|
+
return target;
|
|
49
|
+
}
|
|
50
|
+
export async function readProjectSkillSource(projectRoot, entry) {
|
|
51
|
+
if (entry.source.kind !== 'repository')
|
|
52
|
+
throw new ProjectSkillsError('not_repository_source', entry.entryKey);
|
|
53
|
+
// Reuse the portable validation before ever interpreting an uploaded path.
|
|
54
|
+
parseProjectSkillDeclaration({ schemaVersion: 1, entries: [entry] });
|
|
55
|
+
const root = await realpath(resolve(projectRoot));
|
|
56
|
+
const files = [];
|
|
57
|
+
let bytes = 0;
|
|
58
|
+
const walk = async (projectPath, bundlePath) => {
|
|
59
|
+
const absolute = await safePath(root, projectPath);
|
|
60
|
+
const info = await lstat(absolute);
|
|
61
|
+
if (info.isDirectory()) {
|
|
62
|
+
for (const name of (await readdir(absolute)).sort()) {
|
|
63
|
+
if (name === '.git' || name === 'node_modules')
|
|
64
|
+
throw new ProjectSkillsError('unsupported_source', `${projectPath}/${name}`);
|
|
65
|
+
await walk(`${projectPath}/${name}`, bundlePath ? `${bundlePath}/${name}` : name);
|
|
66
|
+
}
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (!info.isFile())
|
|
70
|
+
throw new ProjectSkillsError('unsupported_source', projectPath);
|
|
71
|
+
if (info.size > MAX_FILE_BYTES || files.length >= MAX_FILES)
|
|
72
|
+
throw new ProjectSkillsError('source_limit', projectPath);
|
|
73
|
+
const content = await readFile(absolute);
|
|
74
|
+
bytes += content.byteLength;
|
|
75
|
+
if (content.byteLength > MAX_FILE_BYTES || bytes > MAX_BUNDLE_BYTES)
|
|
76
|
+
throw new ProjectSkillsError('source_limit', projectPath);
|
|
77
|
+
files.push({ path: bundlePath, content });
|
|
78
|
+
};
|
|
79
|
+
await walk(entry.source.root, '');
|
|
80
|
+
if (!files.some((file) => file.path === 'SKILL.md'))
|
|
81
|
+
throw new ProjectSkillsError('missing_skill_body', entry.source.root);
|
|
82
|
+
// External project resources retain their original relative path beneath a reserved prefix.
|
|
83
|
+
if (entry.projectFiles?.length && files.some((file) => file.path === 'project' || file.path.startsWith('project/'))) {
|
|
84
|
+
throw new ProjectSkillsError('project_resource_collision', entry.entryKey);
|
|
85
|
+
}
|
|
86
|
+
for (const relative of entry.projectFiles ?? [])
|
|
87
|
+
await walk(relative, `project/${relative}`);
|
|
88
|
+
return { entryKey: entry.entryKey, root: entry.source.root, files, sourceTreeHash: sourceTreeDigest(files) };
|
|
89
|
+
}
|
|
90
|
+
/** Static inventory only: no source scripts, model calls, or repository mutations. */
|
|
91
|
+
export async function inspectProjectSkills(projectRoot) {
|
|
92
|
+
const root = await realpath(resolve(projectRoot));
|
|
93
|
+
const result = { declaration: null, discovered: [], sources: [], issues: [] };
|
|
94
|
+
const issue = (error, path) => result.issues.push({
|
|
95
|
+
code: error instanceof ProjectSkillsError ? error.code : 'source_read_failed',
|
|
96
|
+
detail: error instanceof Error ? error.message : String(error), path,
|
|
97
|
+
});
|
|
98
|
+
try {
|
|
99
|
+
if (await exists(join(root, PROJECT_SKILLS_DECLARATION_PATH))) {
|
|
100
|
+
const file = await safePath(root, PROJECT_SKILLS_DECLARATION_PATH);
|
|
101
|
+
if ((await lstat(file)).size > 1024 * 1024)
|
|
102
|
+
throw new ProjectSkillsError('source_limit', PROJECT_SKILLS_DECLARATION_PATH);
|
|
103
|
+
result.declaration = parseProjectSkillDeclaration(await readFile(file, 'utf8'));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
issue(error, PROJECT_SKILLS_DECLARATION_PATH);
|
|
108
|
+
}
|
|
109
|
+
for (const sourceRoot of PROJECT_SKILL_SOURCE_ROOTS) {
|
|
110
|
+
try {
|
|
111
|
+
if (!await exists(join(root, sourceRoot)))
|
|
112
|
+
continue;
|
|
113
|
+
const directory = await safePath(root, sourceRoot);
|
|
114
|
+
for (const name of (await readdir(directory)).sort()) {
|
|
115
|
+
const source = `${sourceRoot}/${name}`;
|
|
116
|
+
const safe = await safePath(root, source);
|
|
117
|
+
if (!(await lstat(safe)).isDirectory())
|
|
118
|
+
continue;
|
|
119
|
+
if (!await exists(join(safe, 'SKILL.md'))) {
|
|
120
|
+
result.issues.push({ code: 'unrecognized_entry', path: source, detail: 'A skill directory must contain SKILL.md at its root' });
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
result.discovered.push({ root: source, entryKey: `repo-${createHash('sha256').update(source).digest('hex').slice(0, 24)}` });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
issue(error, sourceRoot);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const declaredRoots = new Set(result.declaration?.entries.flatMap((entry) => entry.source.kind === 'repository' ? [entry.source.root] : []) ?? []);
|
|
131
|
+
const entries = [
|
|
132
|
+
...(result.declaration?.entries ?? []),
|
|
133
|
+
...result.discovered.filter((item) => !declaredRoots.has(item.root)).map((item) => ({
|
|
134
|
+
entryKey: item.entryKey, source: { kind: 'repository', root: item.root },
|
|
135
|
+
enabled: result.declaration === null, surface: 'sandbox-agent',
|
|
136
|
+
})),
|
|
137
|
+
];
|
|
138
|
+
for (const entry of entries) {
|
|
139
|
+
if (entry.source.kind !== 'repository')
|
|
140
|
+
continue;
|
|
141
|
+
try {
|
|
142
|
+
result.sources.push(await readProjectSkillSource(root, entry));
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
issue(error, entry.source.root);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../src/project-skills/inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ProjectSkillInventory } from './inventory.js';
|
|
2
|
+
import { type ProjectSkillsLockV3, type ProjectSkillDeclaration } from './types.js';
|
|
3
|
+
/** Offline identity is a provenance label, never an access grant on the server. */
|
|
4
|
+
export declare function buildLocalProjectSkillsSnapshot(inventory: ProjectSkillInventory, previous?: unknown): {
|
|
5
|
+
declaration: ProjectSkillDeclaration;
|
|
6
|
+
lock: ProjectSkillsLockV3;
|
|
7
|
+
artifacts: {
|
|
8
|
+
artifactHash: string;
|
|
9
|
+
archive: Buffer;
|
|
10
|
+
}[];
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=local-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-snapshot.d.ts","sourceRoot":"","sources":["../../src/project-skills/local-snapshot.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAsB,KAAK,mBAAmB,EAAE,KAAK,uBAAuB,EAA8B,MAAM,YAAY,CAAC;AAEpI,mFAAmF;AACnF,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,qBAAqB,EAAE,QAAQ,CAAC,EAAE,OAAO;;;;sBAW3D,MAAM;iBAAW,MAAM;;EAmC/D"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { createCanonicalBundleArchive } from './bundle-archive.js';
|
|
3
|
+
import { declarationDigest, dependencyDigest, parseProjectSkillsLock, validateProjectSkillsSnapshot } from './protocol.js';
|
|
4
|
+
import { ProjectSkillsError } from './types.js';
|
|
5
|
+
/** Offline identity is a provenance label, never an access grant on the server. */
|
|
6
|
+
export function buildLocalProjectSkillsSnapshot(inventory, previous) {
|
|
7
|
+
if (inventory.issues.length)
|
|
8
|
+
throw new ProjectSkillsError('inventory_invalid', JSON.stringify(inventory.issues));
|
|
9
|
+
const old = previous === undefined ? null : parseProjectSkillsLock(previous);
|
|
10
|
+
if (old && !inventory.declaration)
|
|
11
|
+
throw new ProjectSkillsError('missing_declaration', 'A managed lock requires its declaration');
|
|
12
|
+
const declaration = structuredClone(inventory.declaration ?? { schemaVersion: 1, entries: [] });
|
|
13
|
+
const roots = new Set(declaration.entries.flatMap((entry) => entry.source.kind === 'repository' ? [entry.source.root] : []));
|
|
14
|
+
for (const found of inventory.discovered)
|
|
15
|
+
if (!roots.has(found.root))
|
|
16
|
+
declaration.entries.push({
|
|
17
|
+
entryKey: found.entryKey, source: { kind: 'repository', root: found.root }, enabled: !inventory.declaration && !old, surface: 'sandbox-agent',
|
|
18
|
+
});
|
|
19
|
+
const oldByKey = new Map(old?.entries.map((entry) => [entry.entryKey, entry]) ?? []);
|
|
20
|
+
const localNamespace = `local-${randomUUID()}`;
|
|
21
|
+
const artifacts = [];
|
|
22
|
+
const required = new Map();
|
|
23
|
+
const entries = declaration.entries.map((entry) => {
|
|
24
|
+
const previous = oldByKey.get(entry.entryKey);
|
|
25
|
+
if (entry.source.kind === 'registry') {
|
|
26
|
+
if (!previous || previous.revision.kind !== 'release' || previous.revision.skillRef !== entry.source.skillRef || previous.revision.version !== entry.source.version) {
|
|
27
|
+
throw new ProjectSkillsError('missing_release', `An authorized exact release must be downloaded first: ${entry.entryKey}`);
|
|
28
|
+
}
|
|
29
|
+
return structuredClone(previous);
|
|
30
|
+
}
|
|
31
|
+
const source = inventory.sources.find((source) => source.entryKey === entry.entryKey);
|
|
32
|
+
if (!source)
|
|
33
|
+
throw new ProjectSkillsError('missing_source', entry.entryKey);
|
|
34
|
+
const archive = createCanonicalBundleArchive(source.files.map((file) => ({ path: file.path, data: Buffer.from(file.content) })));
|
|
35
|
+
const artifactHash = createHash('sha256').update(archive).digest('hex');
|
|
36
|
+
artifacts.push({ artifactHash, archive });
|
|
37
|
+
entry.source.skillRef ??= previous?.revision.skillRef ?? `${localNamespace}/${entry.entryKey}`;
|
|
38
|
+
const manifestFile = source.files.find((file) => file.path === 'manifest.json');
|
|
39
|
+
if (manifestFile) {
|
|
40
|
+
const manifest = JSON.parse(Buffer.from(manifestFile.content).toString('utf8'));
|
|
41
|
+
if (manifest.imports?.some((item) => item.edgeKind !== 'optional'))
|
|
42
|
+
throw new ProjectSkillsError('dependency_unresolved', entry.entryKey);
|
|
43
|
+
required.set(entry.entryKey, (manifest.relationships ?? []).filter((edge) => edge.relationType === 'requires')
|
|
44
|
+
.map((edge) => edge.toSkillRef ?? edge.targetSkillRef));
|
|
45
|
+
}
|
|
46
|
+
return { entryKey: entry.entryKey, revision: { kind: 'source', skillRef: entry.source.skillRef, sourceRevision: `src-v1-sha256:${source.sourceTreeHash}`, artifactHash },
|
|
47
|
+
sourceTreeHash: source.sourceTreeHash, dependencies: [], dependencyLockHash: '' };
|
|
48
|
+
});
|
|
49
|
+
const refToKey = new Map(entries.map((entry) => [entry.revision.skillRef, entry.entryKey]));
|
|
50
|
+
if (refToKey.size !== entries.length)
|
|
51
|
+
throw new ProjectSkillsError('duplicate_identity', 'Duplicate skill reference');
|
|
52
|
+
for (const entry of entries)
|
|
53
|
+
if (entry.revision.kind === 'source')
|
|
54
|
+
entry.dependencies = (required.get(entry.entryKey) ?? []).map((ref) => {
|
|
55
|
+
const key = refToKey.get(ref);
|
|
56
|
+
if (!key)
|
|
57
|
+
throw new ProjectSkillsError('dependency_unresolved', ref);
|
|
58
|
+
return key;
|
|
59
|
+
});
|
|
60
|
+
for (const entry of entries)
|
|
61
|
+
entry.dependencyLockHash = dependencyDigest(entries, entry.dependencies);
|
|
62
|
+
const lock = { lockVersion: 3, declarationHash: declarationDigest(declaration), entries };
|
|
63
|
+
validateProjectSkillsSnapshot(declaration, lock);
|
|
64
|
+
return { declaration, lock, artifacts };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=local-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-snapshot.js","sourceRoot":"","sources":["../../src/project-skills/local-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ProjectSkillDeclaration, type ProjectSkillFile, type ProjectSkillLockEntry, type ProjectSkillsLockV3, type ProjectSkillSurface } from './types.js';
|
|
2
|
+
export declare function isProjectRelativePath(value: string): boolean;
|
|
3
|
+
/** Locale-independent serialization, also used for server-side revalidation. */
|
|
4
|
+
export declare function canonicalProjectSkillsJson(value: unknown): string;
|
|
5
|
+
export declare function projectSkillsDigest(value: unknown): string;
|
|
6
|
+
export declare function parseProjectSkillDeclaration(value: unknown): ProjectSkillDeclaration;
|
|
7
|
+
export declare function parseProjectSkillsLock(value: unknown): ProjectSkillsLockV3;
|
|
8
|
+
export declare function declarationDigest(declaration: ProjectSkillDeclaration): string;
|
|
9
|
+
/** Hash raw bytes and relative filenames, not a Git commit or normalized artifact. */
|
|
10
|
+
export declare function sourceTreeDigest(files: readonly ProjectSkillFile[]): string;
|
|
11
|
+
export declare function sourceRevision(files: readonly ProjectSkillFile[]): string;
|
|
12
|
+
export declare function dependencyDigest(entries: readonly ProjectSkillLockEntry[], keys: readonly string[]): string;
|
|
13
|
+
/** Validates disabled entries too; an incomplete snapshot must never be adopted. */
|
|
14
|
+
export declare function validateProjectSkillsSnapshot(declarationInput: unknown, lockInput: unknown): {
|
|
15
|
+
declaration: ProjectSkillDeclaration;
|
|
16
|
+
lock: ProjectSkillsLockV3;
|
|
17
|
+
};
|
|
18
|
+
export declare function effectiveProjectSkills(declarationInput: unknown, lockInput: unknown, surface: ProjectSkillSurface, deniedRefs?: ReadonlySet<string>): ProjectSkillLockEntry[];
|
|
19
|
+
/** Configuration change retains every exact revision, including disabled entries. */
|
|
20
|
+
export declare function setProjectSkillEnabled(declarationInput: unknown, lockInput: unknown, entryKey: string, enabled: boolean): {
|
|
21
|
+
declaration: {
|
|
22
|
+
entries: import("./types.js").ProjectSkillEntry[];
|
|
23
|
+
schemaVersion: 1;
|
|
24
|
+
};
|
|
25
|
+
lock: {
|
|
26
|
+
declarationHash: string;
|
|
27
|
+
lockVersion: 3;
|
|
28
|
+
entries: ProjectSkillLockEntry[];
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/project-skills/protocol.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,uBAAuB,EAAE,KAAK,gBAAgB,EACnD,KAAK,qBAAqB,EAAE,KAAK,mBAAmB,EAAE,KAAK,mBAAmB,EAC/E,MAAM,YAAY,CAAC;AAOpB,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAI5D;AA6BD,gFAAgF;AAChF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAYjE;AACD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE1D;AAWD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAOpF;AACD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAK1E;AACD,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,uBAAuB,GAAG,MAAM,CAE9E;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM,CAa3E;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM,CAEzE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAQ3G;AAED,oFAAoF;AACpF,wBAAgB,6BAA6B,CAAC,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG;IAC5F,WAAW,EAAE,uBAAuB,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAC;CACjE,CAmCA;AAED,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAC3E,UAAU,GAAE,WAAW,CAAC,MAAM,CAAa,GAC1C,qBAAqB,EAAE,CAmBzB;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;;;;;;;;;;EAKvH"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { PROJECT_SKILL_SURFACES, ProjectSkillsError, } from './types.js';
|
|
4
|
+
const hash = z.string().regex(/^[a-f0-9]{64}$/);
|
|
5
|
+
const ref = z.string().regex(/^[a-z0-9][a-z0-9_-]*\/[a-z0-9][a-z0-9_-]*$/).max(257);
|
|
6
|
+
const version = z.string().regex(/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/).max(32);
|
|
7
|
+
const key = z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/).max(160);
|
|
8
|
+
export function isProjectRelativePath(value) {
|
|
9
|
+
return value.length > 0 && value.length <= 1024 && value.trim() === value &&
|
|
10
|
+
!/[\\\x00-\x1f\x7f:*?<>|]/.test(value) &&
|
|
11
|
+
value.split('/').every((part) => part !== '' && part !== '.' && part !== '..' && part !== '.git');
|
|
12
|
+
}
|
|
13
|
+
const path = z.string().refine(isProjectRelativePath, 'Expected a safe project-relative path');
|
|
14
|
+
const declarationSchema = z.strictObject({
|
|
15
|
+
schemaVersion: z.literal(1),
|
|
16
|
+
entries: z.array(z.strictObject({
|
|
17
|
+
entryKey: key,
|
|
18
|
+
source: z.discriminatedUnion('kind', [
|
|
19
|
+
z.strictObject({ kind: z.literal('registry'), skillRef: ref, version }),
|
|
20
|
+
z.strictObject({ kind: z.literal('repository'), root: path, skillRef: ref.optional() }),
|
|
21
|
+
]),
|
|
22
|
+
enabled: z.boolean(),
|
|
23
|
+
surface: z.enum(PROJECT_SKILL_SURFACES),
|
|
24
|
+
projectFiles: z.array(path).max(512).optional(),
|
|
25
|
+
})).max(512),
|
|
26
|
+
});
|
|
27
|
+
const lockSchema = z.strictObject({
|
|
28
|
+
lockVersion: z.literal(3), declarationHash: hash,
|
|
29
|
+
entries: z.array(z.strictObject({
|
|
30
|
+
entryKey: key,
|
|
31
|
+
revision: z.discriminatedUnion('kind', [
|
|
32
|
+
z.strictObject({ kind: z.literal('release'), skillRef: ref, version, artifactHash: hash }),
|
|
33
|
+
z.strictObject({ kind: z.literal('source'), skillRef: ref,
|
|
34
|
+
sourceRevision: z.string().regex(/^src-v1-sha256:[a-f0-9]{64}$/), artifactHash: hash }),
|
|
35
|
+
]),
|
|
36
|
+
sourceTreeHash: hash.optional(), dependencyLockHash: hash,
|
|
37
|
+
dependencies: z.array(key).max(512),
|
|
38
|
+
})).max(512),
|
|
39
|
+
});
|
|
40
|
+
/** Locale-independent serialization, also used for server-side revalidation. */
|
|
41
|
+
export function canonicalProjectSkillsJson(value) {
|
|
42
|
+
if (Array.isArray(value))
|
|
43
|
+
return `[${value.map(canonicalProjectSkillsJson).join(',')}]`;
|
|
44
|
+
if (value !== null && typeof value === 'object') {
|
|
45
|
+
return `{${Object.entries(value).filter(([, item]) => item !== undefined)
|
|
46
|
+
.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)
|
|
47
|
+
.map(([name, item]) => `${JSON.stringify(name)}:${canonicalProjectSkillsJson(item)}`).join(',')}}`;
|
|
48
|
+
}
|
|
49
|
+
const result = JSON.stringify(value);
|
|
50
|
+
if (result === undefined || (typeof value === 'number' && !Number.isFinite(value))) {
|
|
51
|
+
throw new ProjectSkillsError('invalid_json', 'Non-JSON configuration value');
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
export function projectSkillsDigest(value) {
|
|
56
|
+
return createHash('sha256').update(canonicalProjectSkillsJson(value)).digest('hex');
|
|
57
|
+
}
|
|
58
|
+
function parseJson(value) {
|
|
59
|
+
if (typeof value !== 'string')
|
|
60
|
+
return value;
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(value);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
throw new ProjectSkillsError('invalid_json', 'Malformed project skills JSON');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function uniqueKeys(entries) {
|
|
69
|
+
if (new Set(entries.map((entry) => entry.entryKey)).size !== entries.length) {
|
|
70
|
+
throw new ProjectSkillsError('duplicate_entry', 'Duplicate project skill entry key');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export function parseProjectSkillDeclaration(value) {
|
|
74
|
+
const result = declarationSchema.safeParse(parseJson(value));
|
|
75
|
+
if (!result.success)
|
|
76
|
+
throw new ProjectSkillsError('invalid_declaration', result.error.message);
|
|
77
|
+
uniqueKeys(result.data.entries);
|
|
78
|
+
const roots = result.data.entries.flatMap((entry) => entry.source.kind === 'repository' ? [entry.source.root] : []);
|
|
79
|
+
if (new Set(roots).size !== roots.length)
|
|
80
|
+
throw new ProjectSkillsError('duplicate_source', 'Repository source declared twice');
|
|
81
|
+
return result.data;
|
|
82
|
+
}
|
|
83
|
+
export function parseProjectSkillsLock(value) {
|
|
84
|
+
const result = lockSchema.safeParse(parseJson(value));
|
|
85
|
+
if (!result.success)
|
|
86
|
+
throw new ProjectSkillsError('invalid_lock', result.error.message);
|
|
87
|
+
uniqueKeys(result.data.entries);
|
|
88
|
+
return result.data;
|
|
89
|
+
}
|
|
90
|
+
export function declarationDigest(declaration) {
|
|
91
|
+
return projectSkillsDigest(parseProjectSkillDeclaration(declaration));
|
|
92
|
+
}
|
|
93
|
+
/** Hash raw bytes and relative filenames, not a Git commit or normalized artifact. */
|
|
94
|
+
export function sourceTreeDigest(files) {
|
|
95
|
+
const sorted = [...files].sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
|
|
96
|
+
const seen = new Set();
|
|
97
|
+
const digest = createHash('sha256').update('playcraft-source-tree-v1\0');
|
|
98
|
+
for (const file of sorted) {
|
|
99
|
+
if (!isProjectRelativePath(file.path) || seen.has(file.path)) {
|
|
100
|
+
throw new ProjectSkillsError('invalid_source_path', `Invalid or duplicate source path: ${file.path}`);
|
|
101
|
+
}
|
|
102
|
+
seen.add(file.path);
|
|
103
|
+
const name = Buffer.from(file.path);
|
|
104
|
+
digest.update(`${name.length}:`).update(name).update(`${file.content.byteLength}:`).update(file.content);
|
|
105
|
+
}
|
|
106
|
+
return digest.digest('hex');
|
|
107
|
+
}
|
|
108
|
+
export function sourceRevision(files) {
|
|
109
|
+
return `src-v1-sha256:${sourceTreeDigest(files)}`;
|
|
110
|
+
}
|
|
111
|
+
export function dependencyDigest(entries, keys) {
|
|
112
|
+
const byKey = new Map(entries.map((entry) => [entry.entryKey, entry]));
|
|
113
|
+
if (new Set(keys).size !== keys.length)
|
|
114
|
+
throw new ProjectSkillsError('duplicate_dependency', 'Duplicate dependency');
|
|
115
|
+
return projectSkillsDigest([...keys].sort().map((entryKey) => {
|
|
116
|
+
const entry = byKey.get(entryKey);
|
|
117
|
+
if (!entry)
|
|
118
|
+
throw new ProjectSkillsError('missing_dependency', `Missing dependency ${entryKey}`);
|
|
119
|
+
return { entryKey, revision: entry.revision, dependencies: [...entry.dependencies].sort() };
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
/** Validates disabled entries too; an incomplete snapshot must never be adopted. */
|
|
123
|
+
export function validateProjectSkillsSnapshot(declarationInput, lockInput) {
|
|
124
|
+
const declaration = parseProjectSkillDeclaration(declarationInput);
|
|
125
|
+
const lock = parseProjectSkillsLock(lockInput);
|
|
126
|
+
if (lock.declarationHash !== declarationDigest(declaration)) {
|
|
127
|
+
throw new ProjectSkillsError('stale_lock', 'Declaration and lock belong to different revisions');
|
|
128
|
+
}
|
|
129
|
+
const byKey = new Map(lock.entries.map((entry) => [entry.entryKey, entry]));
|
|
130
|
+
if (byKey.size !== declaration.entries.length)
|
|
131
|
+
throw new ProjectSkillsError('incomplete_lock', 'Lock must contain every declaration entry');
|
|
132
|
+
for (const item of declaration.entries) {
|
|
133
|
+
const locked = byKey.get(item.entryKey);
|
|
134
|
+
if (!locked)
|
|
135
|
+
throw new ProjectSkillsError('incomplete_lock', `Missing ${item.entryKey}`);
|
|
136
|
+
if (item.source.kind === 'registry' && (locked.revision.kind !== 'release' ||
|
|
137
|
+
locked.revision.skillRef !== item.source.skillRef || locked.revision.version !== item.source.version)) {
|
|
138
|
+
throw new ProjectSkillsError('revision_mismatch', `Registry revision differs: ${item.entryKey}`);
|
|
139
|
+
}
|
|
140
|
+
if (item.source.kind === 'repository' && (locked.revision.kind !== 'source' || !locked.sourceTreeHash ||
|
|
141
|
+
locked.revision.sourceRevision !== `src-v1-sha256:${locked.sourceTreeHash}` ||
|
|
142
|
+
(item.source.skillRef && item.source.skillRef !== locked.revision.skillRef))) {
|
|
143
|
+
throw new ProjectSkillsError('revision_mismatch', `Repository revision differs: ${item.entryKey}`);
|
|
144
|
+
}
|
|
145
|
+
if (dependencyDigest(lock.entries, locked.dependencies) !== locked.dependencyLockHash) {
|
|
146
|
+
throw new ProjectSkillsError('dependency_mismatch', `Dependencies changed: ${item.entryKey}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const visited = new Set();
|
|
150
|
+
const visiting = new Set();
|
|
151
|
+
const visit = (entryKey) => {
|
|
152
|
+
if (visiting.has(entryKey))
|
|
153
|
+
throw new ProjectSkillsError('dependency_cycle', `Dependency cycle at ${entryKey}`);
|
|
154
|
+
if (visited.has(entryKey))
|
|
155
|
+
return;
|
|
156
|
+
visiting.add(entryKey);
|
|
157
|
+
for (const child of byKey.get(entryKey).dependencies)
|
|
158
|
+
visit(child);
|
|
159
|
+
visiting.delete(entryKey);
|
|
160
|
+
visited.add(entryKey);
|
|
161
|
+
};
|
|
162
|
+
for (const entry of lock.entries)
|
|
163
|
+
visit(entry.entryKey);
|
|
164
|
+
return { declaration, lock };
|
|
165
|
+
}
|
|
166
|
+
export function effectiveProjectSkills(declarationInput, lockInput, surface, deniedRefs = new Set()) {
|
|
167
|
+
const { declaration, lock } = validateProjectSkillsSnapshot(declarationInput, lockInput);
|
|
168
|
+
const declarations = new Map(declaration.entries.map((entry) => [entry.entryKey, entry]));
|
|
169
|
+
const byKey = new Map(lock.entries.map((entry) => [entry.entryKey, entry]));
|
|
170
|
+
const selected = new Set();
|
|
171
|
+
const visit = (entryKey) => {
|
|
172
|
+
if (selected.has(entryKey))
|
|
173
|
+
return;
|
|
174
|
+
const item = declarations.get(entryKey);
|
|
175
|
+
const locked = byKey.get(entryKey);
|
|
176
|
+
if (!item.enabled || item.surface !== surface || deniedRefs.has(locked.revision.skillRef)) {
|
|
177
|
+
throw new ProjectSkillsError('dependency_disabled', `Required skill is unavailable: ${entryKey}`);
|
|
178
|
+
}
|
|
179
|
+
for (const child of locked.dependencies)
|
|
180
|
+
visit(child);
|
|
181
|
+
selected.add(entryKey);
|
|
182
|
+
};
|
|
183
|
+
for (const item of declaration.entries) {
|
|
184
|
+
if (item.enabled && item.surface === surface && !deniedRefs.has(byKey.get(item.entryKey).revision.skillRef))
|
|
185
|
+
visit(item.entryKey);
|
|
186
|
+
}
|
|
187
|
+
return [...selected].map((entryKey) => byKey.get(entryKey));
|
|
188
|
+
}
|
|
189
|
+
/** Configuration change retains every exact revision, including disabled entries. */
|
|
190
|
+
export function setProjectSkillEnabled(declarationInput, lockInput, entryKey, enabled) {
|
|
191
|
+
const { declaration, lock } = validateProjectSkillsSnapshot(declarationInput, lockInput);
|
|
192
|
+
if (!declaration.entries.some((item) => item.entryKey === entryKey))
|
|
193
|
+
throw new ProjectSkillsError('unknown_entry', entryKey);
|
|
194
|
+
const next = { ...declaration, entries: declaration.entries.map((item) => item.entryKey === entryKey ? { ...item, enabled } : item) };
|
|
195
|
+
return { declaration: next, lock: { ...lock, declarationHash: declarationDigest(next) } };
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/project-skills/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
type NativeClient = {
|
|
3
|
+
session: {
|
|
4
|
+
get: (input: {
|
|
5
|
+
path: {
|
|
6
|
+
id: string;
|
|
7
|
+
};
|
|
8
|
+
}) => Promise<{
|
|
9
|
+
data?: {
|
|
10
|
+
id: string;
|
|
11
|
+
parentID?: string;
|
|
12
|
+
};
|
|
13
|
+
}>;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Bundled by the supervisor, outside the writable project. The supervisor owns
|
|
18
|
+
* both this file and the manifest. Native directory discovery is never used here.
|
|
19
|
+
*/
|
|
20
|
+
export default function managedSkillsPlugin(input?: {
|
|
21
|
+
client?: NativeClient;
|
|
22
|
+
}): Promise<{
|
|
23
|
+
tool: {
|
|
24
|
+
skill: {
|
|
25
|
+
description: string;
|
|
26
|
+
args: {
|
|
27
|
+
name: z.ZodString;
|
|
28
|
+
};
|
|
29
|
+
execute(args: {
|
|
30
|
+
name: string;
|
|
31
|
+
}, context: {
|
|
32
|
+
sessionID: string;
|
|
33
|
+
metadata: (value: unknown) => void;
|
|
34
|
+
}): Promise<{
|
|
35
|
+
title: string;
|
|
36
|
+
output: string;
|
|
37
|
+
metadata: {
|
|
38
|
+
playcraftSkill: {
|
|
39
|
+
schemaVersion: number;
|
|
40
|
+
runtimeId: string;
|
|
41
|
+
lockId: string;
|
|
42
|
+
skillVersionId: string;
|
|
43
|
+
artifactHash: string;
|
|
44
|
+
skillRef: string;
|
|
45
|
+
nativeSessionId: string;
|
|
46
|
+
rootNativeSessionId: string;
|
|
47
|
+
bodyHash: string;
|
|
48
|
+
packageRoot: string;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
}>;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
'tool.definition': (input: {
|
|
55
|
+
toolID: string;
|
|
56
|
+
}, output: {
|
|
57
|
+
description: string;
|
|
58
|
+
}) => Promise<void>;
|
|
59
|
+
'experimental.chat.system.transform': (input: {
|
|
60
|
+
sessionID?: string;
|
|
61
|
+
}, output: {
|
|
62
|
+
system: string[];
|
|
63
|
+
}) => Promise<void>;
|
|
64
|
+
}>;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=runtime-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-plugin.d.ts","sourceRoot":"","sources":["../../src/project-skills/runtime-plugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,KAAK,YAAY,GAAG;IAAE,OAAO,EAAE;QAAE,GAAG,EAAE,CAAC,KAAK,EAAE;YAAE,IAAI,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,KAAK,OAAO,CAAC;YAAE,IAAI,CAAC,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC,CAAA;KAAE,CAAA;CAAE,CAAC;AAGrI;;;GAGG;AACH,wBAA8B,mBAAmB,CAAC,KAAK,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,YAAY,CAAA;CAAE;;;;;;;0BA+CvD;gBAAE,IAAI,EAAE,MAAM,CAAA;aAAE,WAAW;gBAAE,SAAS,EAAE,MAAM,CAAC;gBAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;aAAE;;;;;;;;;;;;;;;;;;;;+BAiB3E;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,UAAU;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;kDAGhC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,UAAU;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;GAM3G"}
|