@nacre.work/api 0.28.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters.d.ts +9 -0
- package/dist/adapters.d.ts.map +1 -1
- package/dist/adapters.js +1 -1
- package/dist/adapters.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/main.js +2 -0
- package/dist/main.js.map +1 -1
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +267 -2
- package/dist/server.js.map +1 -1
- package/dist/skills.d.ts +155 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +371 -0
- package/dist/skills.js.map +1 -0
- package/package.json +2 -2
package/dist/skills.d.ts
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills: storage, who sees which, who writes which. docs/skills.md is the
|
|
3
|
+
* specification and every rule below is quoted from it rather than restated.
|
|
4
|
+
*
|
|
5
|
+
* One port for every surface. The REST handlers, the MCP tools and the
|
|
6
|
+
* `instructions` an agent reads on connecting all ask this, so "who may see a
|
|
7
|
+
* layer's skill" has one answer and it is the resolver's — the same
|
|
8
|
+
* `contextFor` the document paths use, which is the whole argument for this
|
|
9
|
+
* file reaching into `adapters.ts` for it rather than holding a second copy.
|
|
10
|
+
*/
|
|
11
|
+
import { type SkillFiles } from '@nacre.work/core';
|
|
12
|
+
import type { Pool } from 'pg';
|
|
13
|
+
import { type PrincipalsCache } from './adapters.js';
|
|
14
|
+
import { type AuthContext } from './auth.js';
|
|
15
|
+
import { type Page, type PageResult } from './pagination.js';
|
|
16
|
+
/** Which skill. The installation's belongs to no organization. */
|
|
17
|
+
export type SkillLevel = {
|
|
18
|
+
readonly kind: 'installation';
|
|
19
|
+
} | {
|
|
20
|
+
readonly kind: 'organization';
|
|
21
|
+
} | {
|
|
22
|
+
readonly kind: 'layer';
|
|
23
|
+
readonly layerId: string;
|
|
24
|
+
};
|
|
25
|
+
/** Through which door a write came — recorded on the version, see docs/skills.md. */
|
|
26
|
+
export type SkillSurface = 'rest' | 'mcp' | 'mcp-admin';
|
|
27
|
+
export interface SkillVersionMeta {
|
|
28
|
+
readonly version: number;
|
|
29
|
+
readonly name: string | null;
|
|
30
|
+
readonly description: string | null;
|
|
31
|
+
readonly hasScripts: boolean;
|
|
32
|
+
readonly fileCount: number;
|
|
33
|
+
/** `{type}:{id}`, as the access log writes it. */
|
|
34
|
+
readonly principal: string;
|
|
35
|
+
readonly surface: SkillSurface;
|
|
36
|
+
readonly connectionId: string | null;
|
|
37
|
+
/**
|
|
38
|
+
* Written by an agent rather than by a person at a screen: through MCP,
|
|
39
|
+
* through a delegation, or by a service account. What the console and the
|
|
40
|
+
* panel mark, because a skill is instructions every later agent follows.
|
|
41
|
+
*/
|
|
42
|
+
readonly byAgent: boolean;
|
|
43
|
+
readonly restoredFrom: number | null;
|
|
44
|
+
readonly createdAt: string;
|
|
45
|
+
}
|
|
46
|
+
export interface SkillVersion extends SkillVersionMeta {
|
|
47
|
+
readonly files: SkillFiles;
|
|
48
|
+
}
|
|
49
|
+
/** One entry of what a caller sees — the base skill, or a layer's. */
|
|
50
|
+
export interface SkillEntry {
|
|
51
|
+
readonly level: 'default' | 'installation' | 'organization' | 'layer';
|
|
52
|
+
readonly layerId: string | null;
|
|
53
|
+
readonly layerSlug: string | null;
|
|
54
|
+
readonly name: string;
|
|
55
|
+
readonly description: string;
|
|
56
|
+
readonly version: number | null;
|
|
57
|
+
readonly hasScripts: boolean;
|
|
58
|
+
readonly paths: readonly string[];
|
|
59
|
+
}
|
|
60
|
+
export interface EffectiveBase extends SkillEntry {
|
|
61
|
+
readonly files: SkillFiles;
|
|
62
|
+
}
|
|
63
|
+
export type SkillWrite = {
|
|
64
|
+
readonly kind: 'written';
|
|
65
|
+
readonly version: SkillVersionMeta;
|
|
66
|
+
readonly cleared: boolean;
|
|
67
|
+
}
|
|
68
|
+
/** No such level, or one the caller may not see — one answer, invariant 4. */
|
|
69
|
+
| {
|
|
70
|
+
readonly kind: 'not_found';
|
|
71
|
+
}
|
|
72
|
+
/** Visible, and the caller may not write it. */
|
|
73
|
+
| {
|
|
74
|
+
readonly kind: 'forbidden';
|
|
75
|
+
}
|
|
76
|
+
/** `based_on` is not the current version; nothing was written. */
|
|
77
|
+
| {
|
|
78
|
+
readonly kind: 'conflict';
|
|
79
|
+
readonly current: number;
|
|
80
|
+
} | {
|
|
81
|
+
readonly kind: 'refused';
|
|
82
|
+
readonly reason: string;
|
|
83
|
+
};
|
|
84
|
+
export interface Skills {
|
|
85
|
+
/** The base skill for this caller: organization ?? installation ?? default. */
|
|
86
|
+
base(auth: AuthContext): Promise<EffectiveBase>;
|
|
87
|
+
/**
|
|
88
|
+
* The base skill and a page of the layer skills the caller may see, in the
|
|
89
|
+
* order layers were created. Paged, because a listing that answers the first
|
|
90
|
+
* fifty of a million layers and says nothing reads as the whole set.
|
|
91
|
+
*/
|
|
92
|
+
list(auth: AuthContext, page: Page): Promise<{
|
|
93
|
+
readonly base: SkillEntry;
|
|
94
|
+
readonly layers: PageResult<SkillEntry>;
|
|
95
|
+
}>;
|
|
96
|
+
/** A layer id for a slug the caller may see a skill on, or `undefined`. */
|
|
97
|
+
layerBySlug(auth: AuthContext, slug: string): Promise<string | undefined>;
|
|
98
|
+
/** The current version, or `undefined` when there is none or the caller may not see it. */
|
|
99
|
+
current(auth: AuthContext, level: SkillLevel): Promise<SkillVersion | undefined>;
|
|
100
|
+
/** History, newest first. `undefined` unless the caller may write the level. */
|
|
101
|
+
versions(auth: AuthContext, level: SkillLevel, page: Page): Promise<PageResult<SkillVersionMeta> | undefined>;
|
|
102
|
+
version(auth: AuthContext, level: SkillLevel, n: number): Promise<SkillVersion | undefined>;
|
|
103
|
+
write(auth: AuthContext, level: SkillLevel, files: unknown, basedOn: number, surface: SkillSurface): Promise<SkillWrite>;
|
|
104
|
+
restore(auth: AuthContext, level: SkillLevel, n: number, basedOn: number, surface: SkillSurface): Promise<SkillWrite>;
|
|
105
|
+
}
|
|
106
|
+
/** Bytes above which `instructions` carry a pointer rather than the body. */
|
|
107
|
+
export declare const INSTRUCTIONS_SKILL_LIMIT: number;
|
|
108
|
+
export declare class PostgresSkills implements Skills {
|
|
109
|
+
private readonly pool;
|
|
110
|
+
private readonly role?;
|
|
111
|
+
private readonly principalsCache?;
|
|
112
|
+
constructor(pool: Pool, role?: string | undefined, principalsCache?: PrincipalsCache | undefined);
|
|
113
|
+
private get scope();
|
|
114
|
+
/**
|
|
115
|
+
* The layers whose skill this caller sees: any permission on the layer,
|
|
116
|
+
* `write` included, within the delegation's narrowing for that permission.
|
|
117
|
+
*
|
|
118
|
+
* `admin` implies both, so asking `read` and `write` covers it. A grant on a
|
|
119
|
+
* single document is not a permission on its layer and does not count — the
|
|
120
|
+
* skill describes the layer, and a document grant says nothing about it.
|
|
121
|
+
*/
|
|
122
|
+
private visibleLayers;
|
|
123
|
+
/**
|
|
124
|
+
* `may_write_layer_skill` in docs/skills.md: `admin` resolved on the layer,
|
|
125
|
+
* and for a delegation the layer inside its narrowing for `admin`.
|
|
126
|
+
*
|
|
127
|
+
* The consent screen's per-layer `skill` box is the second clause of the
|
|
128
|
+
* specification's disjunction and arrives with it; until then a delegation
|
|
129
|
+
* writes a layer's skill only where its ceiling holds `admin` there, which
|
|
130
|
+
* the ordinary consent screen never sets.
|
|
131
|
+
*/
|
|
132
|
+
private mayWriteLayer;
|
|
133
|
+
private mayReadLevel;
|
|
134
|
+
private mayWriteLevel;
|
|
135
|
+
private latest;
|
|
136
|
+
private live;
|
|
137
|
+
base(auth: AuthContext): Promise<EffectiveBase>;
|
|
138
|
+
private entry;
|
|
139
|
+
list(auth: AuthContext, page: Page): Promise<{
|
|
140
|
+
base: SkillEntry;
|
|
141
|
+
layers: PageResult<SkillEntry>;
|
|
142
|
+
}>;
|
|
143
|
+
layerBySlug(auth: AuthContext, slug: string): Promise<string | undefined>;
|
|
144
|
+
current(auth: AuthContext, level: SkillLevel): Promise<SkillVersion | undefined>;
|
|
145
|
+
versions(auth: AuthContext, level: SkillLevel, page: Page): Promise<PageResult<SkillVersionMeta> | undefined>;
|
|
146
|
+
version(auth: AuthContext, level: SkillLevel, n: number): Promise<SkillVersion | undefined>;
|
|
147
|
+
private at;
|
|
148
|
+
write(auth: AuthContext, level: SkillLevel, files: unknown, basedOn: number, surface: SkillSurface): Promise<SkillWrite>;
|
|
149
|
+
restore(auth: AuthContext, level: SkillLevel, n: number, basedOn: number, surface: SkillSurface): Promise<SkillWrite>;
|
|
150
|
+
/** Visibility and permission, in that order, so an invisible level is `not_found`. */
|
|
151
|
+
private gate;
|
|
152
|
+
private insert;
|
|
153
|
+
private insertIn;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/skills.js
ADDED
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills: storage, who sees which, who writes which. docs/skills.md is the
|
|
3
|
+
* specification and every rule below is quoted from it rather than restated.
|
|
4
|
+
*
|
|
5
|
+
* One port for every surface. The REST handlers, the MCP tools and the
|
|
6
|
+
* `instructions` an agent reads on connecting all ask this, so "who may see a
|
|
7
|
+
* layer's skill" has one answer and it is the resolver's — the same
|
|
8
|
+
* `contextFor` the document paths use, which is the whole argument for this
|
|
9
|
+
* file reaching into `adapters.ts` for it rather than holding a second copy.
|
|
10
|
+
*/
|
|
11
|
+
import { activeResolver, checkSkill, DEFAULT_SKILL, withOrg, } from '@nacre.work/core';
|
|
12
|
+
import { contextFor } from './adapters.js';
|
|
13
|
+
import { administers, administersTenants, delegatedLayers, withinDelegation } from './auth.js';
|
|
14
|
+
import { encodeCursor } from './pagination.js';
|
|
15
|
+
/** Bytes above which `instructions` carry a pointer rather than the body. */
|
|
16
|
+
export const INSTRUCTIONS_SKILL_LIMIT = 16 * 1024;
|
|
17
|
+
const projection = (alias = '') => ['version', 'files', 'name', 'description', 'has_scripts', 'principal', 'surface', 'connection_id', 'restored_from']
|
|
18
|
+
.map((column) => `${alias}${column}`)
|
|
19
|
+
.concat(`${alias}created_at::text AS created_at_text`)
|
|
20
|
+
.join(', ');
|
|
21
|
+
/** `installation_skill_versions` has no `connection_id`; it reads as NULL. */
|
|
22
|
+
const PROJECTION = projection();
|
|
23
|
+
const INSTALLATION_PROJECTION = PROJECTION.replace('connection_id', 'NULL::uuid AS connection_id');
|
|
24
|
+
const byAgent = (row) => row.surface !== 'rest' || row.connection_id !== null || row.principal.startsWith('service_account:');
|
|
25
|
+
const meta = (row) => ({
|
|
26
|
+
version: row.version,
|
|
27
|
+
name: row.name,
|
|
28
|
+
description: row.description,
|
|
29
|
+
hasScripts: row.has_scripts,
|
|
30
|
+
fileCount: Object.keys(row.files).length,
|
|
31
|
+
principal: row.principal,
|
|
32
|
+
surface: row.surface,
|
|
33
|
+
connectionId: row.connection_id,
|
|
34
|
+
byAgent: byAgent(row),
|
|
35
|
+
restoredFrom: row.restored_from,
|
|
36
|
+
createdAt: row.created_at_text,
|
|
37
|
+
});
|
|
38
|
+
const full = (row) => ({ ...meta(row), files: row.files });
|
|
39
|
+
const actor = (auth) => `${auth.principal.type}:${auth.principal.id}`;
|
|
40
|
+
/** A catalog entry, which names a skill's files and does not carry them. */
|
|
41
|
+
function withoutFiles(skill) {
|
|
42
|
+
const { files, ...entry } = skill;
|
|
43
|
+
void files;
|
|
44
|
+
return entry;
|
|
45
|
+
}
|
|
46
|
+
/** The default skill as an entry, for an installation nobody has configured. */
|
|
47
|
+
function defaultEntry() {
|
|
48
|
+
const check = checkSkill({ ...DEFAULT_SKILL });
|
|
49
|
+
// `skill.test.ts` holds this; a default the format refuses is a release bug.
|
|
50
|
+
if (check.kind !== 'skill')
|
|
51
|
+
throw new Error('the default skill does not pass checkSkill');
|
|
52
|
+
return {
|
|
53
|
+
level: 'default',
|
|
54
|
+
layerId: null,
|
|
55
|
+
layerSlug: null,
|
|
56
|
+
name: check.skill.name,
|
|
57
|
+
description: check.skill.description,
|
|
58
|
+
version: null,
|
|
59
|
+
hasScripts: check.skill.hasScripts,
|
|
60
|
+
paths: Object.keys(DEFAULT_SKILL),
|
|
61
|
+
files: DEFAULT_SKILL,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export class PostgresSkills {
|
|
65
|
+
pool;
|
|
66
|
+
role;
|
|
67
|
+
principalsCache;
|
|
68
|
+
constructor(pool, role, principalsCache) {
|
|
69
|
+
this.pool = pool;
|
|
70
|
+
this.role = role;
|
|
71
|
+
this.principalsCache = principalsCache;
|
|
72
|
+
}
|
|
73
|
+
get scope() {
|
|
74
|
+
return this.role === undefined ? {} : { role: this.role };
|
|
75
|
+
}
|
|
76
|
+
// ── who sees and who writes ────────────────────────────────────────────────
|
|
77
|
+
/**
|
|
78
|
+
* The layers whose skill this caller sees: any permission on the layer,
|
|
79
|
+
* `write` included, within the delegation's narrowing for that permission.
|
|
80
|
+
*
|
|
81
|
+
* `admin` implies both, so asking `read` and `write` covers it. A grant on a
|
|
82
|
+
* single document is not a permission on its layer and does not count — the
|
|
83
|
+
* skill describes the layer, and a document grant says nothing about it.
|
|
84
|
+
*/
|
|
85
|
+
async visibleLayers(client, auth) {
|
|
86
|
+
// Rule 2: administering tenants is not access to one tenant's anything.
|
|
87
|
+
if (administersTenants(auth))
|
|
88
|
+
return new Set();
|
|
89
|
+
const ctx = await contextFor(client, auth, this.principalsCache);
|
|
90
|
+
const live = async () => {
|
|
91
|
+
const { rows } = await client.query('SELECT id FROM layers WHERE org_id = $1 AND deleted_at IS NULL', [auth.orgId]);
|
|
92
|
+
return rows.map((r) => r.id);
|
|
93
|
+
};
|
|
94
|
+
let all;
|
|
95
|
+
const seen = new Set();
|
|
96
|
+
for (const permission of ['read', 'write']) {
|
|
97
|
+
const plan = activeResolver().resolve(ctx, permission);
|
|
98
|
+
if (plan.kind === 'none')
|
|
99
|
+
continue;
|
|
100
|
+
const reached = plan.kind === 'all' ? (all ??= await live()) : plan.layers;
|
|
101
|
+
const narrowing = delegatedLayers(auth, permission);
|
|
102
|
+
for (const id of reached)
|
|
103
|
+
if (narrowing === undefined || narrowing.includes(id))
|
|
104
|
+
seen.add(id);
|
|
105
|
+
}
|
|
106
|
+
if (seen.size === 0)
|
|
107
|
+
return seen;
|
|
108
|
+
// Deleted layers are not there, whatever a grant still names.
|
|
109
|
+
const { rows } = await client.query('SELECT id FROM layers WHERE org_id = $1 AND deleted_at IS NULL AND id = ANY($2::uuid[])', [auth.orgId, [...seen]]);
|
|
110
|
+
return new Set(rows.map((r) => r.id));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* `may_write_layer_skill` in docs/skills.md: `admin` resolved on the layer,
|
|
114
|
+
* and for a delegation the layer inside its narrowing for `admin`.
|
|
115
|
+
*
|
|
116
|
+
* The consent screen's per-layer `skill` box is the second clause of the
|
|
117
|
+
* specification's disjunction and arrives with it; until then a delegation
|
|
118
|
+
* writes a layer's skill only where its ceiling holds `admin` there, which
|
|
119
|
+
* the ordinary consent screen never sets.
|
|
120
|
+
*/
|
|
121
|
+
async mayWriteLayer(client, auth, layerId) {
|
|
122
|
+
if (administersTenants(auth))
|
|
123
|
+
return false;
|
|
124
|
+
const plan = activeResolver().resolve(await contextFor(client, auth, this.principalsCache), 'admin');
|
|
125
|
+
if (plan.kind === 'none')
|
|
126
|
+
return false;
|
|
127
|
+
if (plan.kind === 'scoped' && !plan.layers.includes(layerId))
|
|
128
|
+
return false;
|
|
129
|
+
return withinDelegation(auth, layerId, 'admin');
|
|
130
|
+
}
|
|
131
|
+
mayReadLevel = async (client, auth, level) => {
|
|
132
|
+
switch (level.kind) {
|
|
133
|
+
case 'installation':
|
|
134
|
+
// Read by everybody it applies to, which is everybody: it is the base
|
|
135
|
+
// skill of every organization that has not set its own.
|
|
136
|
+
return true;
|
|
137
|
+
case 'organization':
|
|
138
|
+
return !administersTenants(auth);
|
|
139
|
+
case 'layer':
|
|
140
|
+
return (await this.visibleLayers(client, auth)).has(level.layerId);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
mayWriteLevel = async (client, auth, level) => {
|
|
144
|
+
switch (level.kind) {
|
|
145
|
+
case 'installation':
|
|
146
|
+
return administersTenants(auth);
|
|
147
|
+
case 'organization':
|
|
148
|
+
return administers(auth);
|
|
149
|
+
case 'layer':
|
|
150
|
+
return this.mayWriteLayer(client, auth, level.layerId);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
// ── reading ────────────────────────────────────────────────────────────────
|
|
154
|
+
async latest(client, auth, level) {
|
|
155
|
+
if (level.kind === 'installation') {
|
|
156
|
+
const { rows } = await client.query(`SELECT ${INSTALLATION_PROJECTION} FROM installation_skill_versions ORDER BY version DESC LIMIT 1`);
|
|
157
|
+
return rows[0];
|
|
158
|
+
}
|
|
159
|
+
const { rows } = await client.query(`SELECT ${PROJECTION} FROM skill_versions
|
|
160
|
+
WHERE org_id = $1 AND layer_id IS NOT DISTINCT FROM $2
|
|
161
|
+
ORDER BY version DESC LIMIT 1`, [auth.orgId, level.kind === 'layer' ? level.layerId : null]);
|
|
162
|
+
return rows[0];
|
|
163
|
+
}
|
|
164
|
+
live = (row) => row !== undefined && row.name !== null;
|
|
165
|
+
async base(auth) {
|
|
166
|
+
return withOrg(this.pool, auth.orgId, async (client) => {
|
|
167
|
+
const own = administersTenants(auth) ? undefined : await this.latest(client, auth, { kind: 'organization' });
|
|
168
|
+
if (this.live(own))
|
|
169
|
+
return this.entry(own, 'organization', null, null);
|
|
170
|
+
const installation = await this.latest(client, auth, { kind: 'installation' });
|
|
171
|
+
if (this.live(installation))
|
|
172
|
+
return this.entry(installation, 'installation', null, null);
|
|
173
|
+
return defaultEntry();
|
|
174
|
+
}, this.scope);
|
|
175
|
+
}
|
|
176
|
+
entry(row, level, layerId, layerSlug) {
|
|
177
|
+
return {
|
|
178
|
+
level,
|
|
179
|
+
layerId,
|
|
180
|
+
layerSlug,
|
|
181
|
+
name: row.name ?? '',
|
|
182
|
+
description: row.description ?? '',
|
|
183
|
+
version: row.version,
|
|
184
|
+
hasScripts: row.has_scripts,
|
|
185
|
+
paths: Object.keys(row.files),
|
|
186
|
+
files: row.files,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
async list(auth, page) {
|
|
190
|
+
const base = withoutFiles(await this.base(auth));
|
|
191
|
+
const layers = await withOrg(this.pool, auth.orgId, async (client) => {
|
|
192
|
+
const visible = await this.visibleLayers(client, auth);
|
|
193
|
+
if (visible.size === 0)
|
|
194
|
+
return { items: [], nextCursor: null };
|
|
195
|
+
// The newest version per layer, and only layers whose newest is live:
|
|
196
|
+
// a cleared layer skill is no layer skill. Seeking on the layer's own
|
|
197
|
+
// `(created_at, id)`, so a page boundary does not move when a skill is
|
|
198
|
+
// written in the middle of a walk.
|
|
199
|
+
const { rows } = await client.query(`SELECT * FROM (
|
|
200
|
+
SELECT DISTINCT ON (v.layer_id) v.layer_id, l.slug, l.created_at::text AS layer_created,
|
|
201
|
+
${projection('v.')}
|
|
202
|
+
FROM skill_versions v
|
|
203
|
+
JOIN layers l ON l.id = v.layer_id AND l.org_id = v.org_id AND l.deleted_at IS NULL
|
|
204
|
+
WHERE v.org_id = $1 AND v.layer_id = ANY($2::uuid[])
|
|
205
|
+
ORDER BY v.layer_id, v.version DESC
|
|
206
|
+
) newest
|
|
207
|
+
WHERE name IS NOT NULL
|
|
208
|
+
AND ($3::timestamptz IS NULL OR (layer_created::timestamptz, layer_id) > ($3::timestamptz, $4::uuid))
|
|
209
|
+
ORDER BY layer_created::timestamptz, layer_id
|
|
210
|
+
LIMIT ${String(page.limit)}`, [auth.orgId, [...visible], page.after?.createdAt ?? null, page.after?.id ?? null]);
|
|
211
|
+
const items = rows.map((r) => withoutFiles(this.entry(r, 'layer', r.layer_id, r.slug)));
|
|
212
|
+
const last = rows[rows.length - 1];
|
|
213
|
+
return {
|
|
214
|
+
items,
|
|
215
|
+
nextCursor: rows.length < page.limit || last === undefined
|
|
216
|
+
? null
|
|
217
|
+
: encodeCursor({ createdAt: last.layer_created, id: last.layer_id }),
|
|
218
|
+
};
|
|
219
|
+
}, this.scope);
|
|
220
|
+
return { base, layers };
|
|
221
|
+
}
|
|
222
|
+
async layerBySlug(auth, slug) {
|
|
223
|
+
return withOrg(this.pool, auth.orgId, async (client) => {
|
|
224
|
+
const { rows } = await client.query('SELECT id FROM layers WHERE org_id = $1 AND slug = $2 AND deleted_at IS NULL', [auth.orgId, slug]);
|
|
225
|
+
const id = rows[0]?.id;
|
|
226
|
+
if (id === undefined)
|
|
227
|
+
return undefined;
|
|
228
|
+
// A slug the caller cannot see is a slug that is not there.
|
|
229
|
+
return (await this.visibleLayers(client, auth)).has(id) ? id : undefined;
|
|
230
|
+
}, this.scope);
|
|
231
|
+
}
|
|
232
|
+
async current(auth, level) {
|
|
233
|
+
return withOrg(this.pool, auth.orgId, async (client) => {
|
|
234
|
+
if (!(await this.mayReadLevel(client, auth, level)))
|
|
235
|
+
return undefined;
|
|
236
|
+
const row = await this.latest(client, auth, level);
|
|
237
|
+
return this.live(row) ? full(row) : undefined;
|
|
238
|
+
}, this.scope);
|
|
239
|
+
}
|
|
240
|
+
async versions(auth, level, page) {
|
|
241
|
+
return withOrg(this.pool, auth.orgId, async (client) => {
|
|
242
|
+
// History says who wrote what and through which connection; it is
|
|
243
|
+
// shown to whoever may write the level, not to everybody who reads it.
|
|
244
|
+
if (!(await this.mayWriteLevel(client, auth, level)))
|
|
245
|
+
return undefined;
|
|
246
|
+
const before = page.after === undefined ? null : Number(page.after.id);
|
|
247
|
+
const { rows } = level.kind === 'installation'
|
|
248
|
+
? await client.query(`SELECT ${INSTALLATION_PROJECTION} FROM installation_skill_versions
|
|
249
|
+
WHERE ($1::int IS NULL OR version < $1) ORDER BY version DESC LIMIT ${String(page.limit)}`, [before])
|
|
250
|
+
: await client.query(`SELECT ${PROJECTION} FROM skill_versions
|
|
251
|
+
WHERE org_id = $1 AND layer_id IS NOT DISTINCT FROM $2 AND ($3::int IS NULL OR version < $3)
|
|
252
|
+
ORDER BY version DESC LIMIT ${String(page.limit)}`, [auth.orgId, level.kind === 'layer' ? level.layerId : null, before]);
|
|
253
|
+
const items = rows.map(meta);
|
|
254
|
+
const last = rows[rows.length - 1];
|
|
255
|
+
return {
|
|
256
|
+
items,
|
|
257
|
+
nextCursor: rows.length < page.limit || last === undefined
|
|
258
|
+
? null
|
|
259
|
+
: encodeCursor({ createdAt: last.created_at_text, id: String(last.version) }),
|
|
260
|
+
};
|
|
261
|
+
}, this.scope);
|
|
262
|
+
}
|
|
263
|
+
async version(auth, level, n) {
|
|
264
|
+
return withOrg(this.pool, auth.orgId, async (client) => {
|
|
265
|
+
if (!(await this.mayWriteLevel(client, auth, level)))
|
|
266
|
+
return undefined;
|
|
267
|
+
const row = await this.at(client, auth, level, n);
|
|
268
|
+
return row === undefined ? undefined : full(row);
|
|
269
|
+
}, this.scope);
|
|
270
|
+
}
|
|
271
|
+
async at(client, auth, level, n) {
|
|
272
|
+
const { rows } = level.kind === 'installation'
|
|
273
|
+
? await client.query(`SELECT ${INSTALLATION_PROJECTION} FROM installation_skill_versions WHERE version = $1`, [n])
|
|
274
|
+
: await client.query(`SELECT ${PROJECTION} FROM skill_versions
|
|
275
|
+
WHERE org_id = $1 AND layer_id IS NOT DISTINCT FROM $2 AND version = $3`, [auth.orgId, level.kind === 'layer' ? level.layerId : null, n]);
|
|
276
|
+
return rows[0];
|
|
277
|
+
}
|
|
278
|
+
// ── writing ────────────────────────────────────────────────────────────────
|
|
279
|
+
async write(auth, level, files, basedOn, surface) {
|
|
280
|
+
const check = checkSkill(files);
|
|
281
|
+
if (check.kind === 'refused')
|
|
282
|
+
return { kind: 'refused', reason: check.reason };
|
|
283
|
+
const stored = check.kind === 'skill' ? check.skill : undefined;
|
|
284
|
+
return this.insert(auth, level, basedOn, surface, stored, null);
|
|
285
|
+
}
|
|
286
|
+
async restore(auth, level, n, basedOn, surface) {
|
|
287
|
+
return withOrg(this.pool, auth.orgId, async (client) => {
|
|
288
|
+
const gate = await this.gate(client, auth, level, surface);
|
|
289
|
+
if (gate !== undefined)
|
|
290
|
+
return gate;
|
|
291
|
+
const row = await this.at(client, auth, level, n);
|
|
292
|
+
if (row === undefined)
|
|
293
|
+
return { kind: 'not_found' };
|
|
294
|
+
const check = checkSkill(row.files);
|
|
295
|
+
// A stored version passed the format when it was written; a version the
|
|
296
|
+
// format now refuses is restored as written rather than silently dropped.
|
|
297
|
+
const skill = check.kind === 'skill'
|
|
298
|
+
? check.skill
|
|
299
|
+
: check.kind === 'cleared' || row.name === null
|
|
300
|
+
? undefined
|
|
301
|
+
: { name: row.name, description: row.description ?? '', hasScripts: row.has_scripts, files: row.files };
|
|
302
|
+
return this.insertIn(client, auth, level, basedOn, surface, skill, n);
|
|
303
|
+
}, this.scope);
|
|
304
|
+
}
|
|
305
|
+
/** Visibility and permission, in that order, so an invisible level is `not_found`. */
|
|
306
|
+
async gate(client, auth, level, surface) {
|
|
307
|
+
if (level.kind === 'installation') {
|
|
308
|
+
// Rights spanning tenants stay in the API and the console, by decision.
|
|
309
|
+
if (surface !== 'rest')
|
|
310
|
+
return { kind: 'not_found' };
|
|
311
|
+
return administersTenants(auth) ? undefined : { kind: 'not_found' };
|
|
312
|
+
}
|
|
313
|
+
if (!(await this.mayReadLevel(client, auth, level)))
|
|
314
|
+
return { kind: 'not_found' };
|
|
315
|
+
if (level.kind === 'layer') {
|
|
316
|
+
const { rows } = await client.query('SELECT id FROM layers WHERE org_id = $1 AND id = $2 AND deleted_at IS NULL', [auth.orgId, level.layerId]);
|
|
317
|
+
if (rows.length === 0)
|
|
318
|
+
return { kind: 'not_found' };
|
|
319
|
+
}
|
|
320
|
+
return (await this.mayWriteLevel(client, auth, level)) ? undefined : { kind: 'forbidden' };
|
|
321
|
+
}
|
|
322
|
+
async insert(auth, level, basedOn, surface, skill, restoredFrom) {
|
|
323
|
+
return withOrg(this.pool, auth.orgId, async (client) => {
|
|
324
|
+
const gate = await this.gate(client, auth, level, surface);
|
|
325
|
+
if (gate !== undefined)
|
|
326
|
+
return gate;
|
|
327
|
+
return this.insertIn(client, auth, level, basedOn, surface, skill, restoredFrom);
|
|
328
|
+
}, this.scope);
|
|
329
|
+
}
|
|
330
|
+
async insertIn(client, auth, level, basedOn, surface, skill, restoredFrom) {
|
|
331
|
+
const current = (await this.latest(client, auth, level))?.version ?? 0;
|
|
332
|
+
// A write names the version it was based on, and any other is a conflict —
|
|
333
|
+
// checked here, and again by the unique key, which is what holds when two
|
|
334
|
+
// writers both read the same `current` and race to insert after it.
|
|
335
|
+
if (basedOn !== current)
|
|
336
|
+
return { kind: 'conflict', current };
|
|
337
|
+
const values = [
|
|
338
|
+
basedOn + 1,
|
|
339
|
+
JSON.stringify(skill?.files ?? {}),
|
|
340
|
+
skill?.name ?? null,
|
|
341
|
+
skill?.description ?? null,
|
|
342
|
+
skill?.hasScripts ?? false,
|
|
343
|
+
actor(auth),
|
|
344
|
+
surface,
|
|
345
|
+
restoredFrom,
|
|
346
|
+
];
|
|
347
|
+
try {
|
|
348
|
+
await client.query('SAVEPOINT skill_write');
|
|
349
|
+
const { rows } = level.kind === 'installation'
|
|
350
|
+
? await client.query(`INSERT INTO installation_skill_versions
|
|
351
|
+
(version, files, name, description, has_scripts, principal, surface, restored_from)
|
|
352
|
+
VALUES ($1, $2::jsonb, $3, $4, $5, $6, $7, $8) RETURNING ${INSTALLATION_PROJECTION}`, values)
|
|
353
|
+
: await client.query(`INSERT INTO skill_versions
|
|
354
|
+
(version, files, name, description, has_scripts, principal, surface, restored_from,
|
|
355
|
+
org_id, layer_id, connection_id)
|
|
356
|
+
VALUES ($1, $2::jsonb, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING ${PROJECTION}`, [...values, auth.orgId, level.kind === 'layer' ? level.layerId : null, auth.delegation?.id ?? null]);
|
|
357
|
+
await client.query('RELEASE SAVEPOINT skill_write');
|
|
358
|
+
const row = rows[0];
|
|
359
|
+
return { kind: 'written', version: meta(row), cleared: skill === undefined };
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
if (error.code === '23505') {
|
|
363
|
+
await client.query('ROLLBACK TO SAVEPOINT skill_write');
|
|
364
|
+
const now = (await this.latest(client, auth, level))?.version ?? 0;
|
|
365
|
+
return { kind: 'conflict', current: now };
|
|
366
|
+
}
|
|
367
|
+
throw error;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nacre.work/api",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0",
|
|
4
4
|
"description": "Nacre REST API and authorization service",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"jose": "^6.2.12",
|
|
31
31
|
"pg": "^8.23.0",
|
|
32
|
-
"@nacre.work/core": "0.
|
|
32
|
+
"@nacre.work/core": "0.29.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/node": "^26.6.2",
|