@sentropic/artifacts 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +13 -3
  3. package/dist/adapters/postgres.js +11 -4
  4. package/dist/http.d.ts +3 -2
  5. package/dist/http.js +221 -36
  6. package/dist/mcp-core.d.ts +3 -3
  7. package/dist/mcp-core.js +19 -9
  8. package/dist/profile/contracts.d.ts +15 -5
  9. package/dist/profile/contracts.js +9 -6
  10. package/dist/profile/index.js +33 -4
  11. package/dist/profile/radar.js +4 -1
  12. package/dist/profile/schemas.js +31 -5
  13. package/dist/profile/validation.d.ts +3 -1
  14. package/dist/profile/validation.js +32 -13
  15. package/dist/server/access.d.ts +8 -0
  16. package/dist/server/command-identity.d.ts +4 -2
  17. package/dist/server/command-identity.js +5 -5
  18. package/dist/server/commit/coordinator.js +12 -9
  19. package/dist/server/commit/types.d.ts +4 -0
  20. package/dist/server/edits.d.ts +17 -0
  21. package/dist/server/edits.js +43 -0
  22. package/dist/server/failures.d.ts +31 -2
  23. package/dist/server/failures.js +14 -3
  24. package/dist/server/lifecycle.d.ts +2 -0
  25. package/dist/server/lifecycle.js +3 -0
  26. package/dist/server/management.d.ts +1 -0
  27. package/dist/server/management.js +9 -2
  28. package/dist/server/outcome-projection.d.ts +2 -2
  29. package/dist/server/outcome-projection.js +25 -9
  30. package/dist/server/publication.d.ts +18 -1
  31. package/dist/server/publication.js +54 -5
  32. package/dist/server/result-schema.d.ts +14 -0
  33. package/dist/server/result-schema.js +35 -0
  34. package/dist/server/service.d.ts +2 -0
  35. package/dist/server/service.js +2 -0
  36. package/dist/server/summary.d.ts +4 -3
  37. package/dist/server/summary.js +4 -3
  38. package/dist/server/templates.js +24 -3
  39. package/dist/server/versions.d.ts +29 -0
  40. package/dist/server/versions.js +39 -0
  41. package/docs/migration-l6.md +8 -1
  42. package/migrations/0005_metadata.sql +14 -0
  43. package/package.json +2 -2
@@ -0,0 +1,39 @@
1
+ import { ArtifactOperationError } from './failures.js';
2
+ const order = (a, b) => a.createdAt.localeCompare(b.createdAt) || a.releaseId.localeCompare(b.releaseId);
3
+ /** A cursor fixes the release boundary and is bound to the authorized artifact and scope. */
4
+ export async function artifactVersions(input) {
5
+ const releases = [...input.releases].sort((a, b) => order(b, a));
6
+ let snapshot = releases[0];
7
+ let after;
8
+ if (input.cursor !== undefined) {
9
+ try {
10
+ const parsed = JSON.parse(Buffer.from(input.cursor, 'base64url').toString('utf8'));
11
+ const position = (value) => value && typeof value.createdAt === 'string' &&
12
+ typeof value.releaseId === 'string' && releases.some(release => order(release, value) === 0);
13
+ if (parsed.artifactId !== input.artifactId || parsed.storageScopeId !== input.storageScopeId ||
14
+ !position(parsed.snapshot) || !position(parsed.after) || order(parsed.after, parsed.snapshot) > 0)
15
+ throw new Error();
16
+ snapshot = parsed.snapshot;
17
+ after = parsed.after;
18
+ }
19
+ catch {
20
+ throw new ArtifactOperationError('invalid_request');
21
+ }
22
+ }
23
+ const available = releases.filter(release => snapshot && order(release, snapshot) <= 0 &&
24
+ (!after || order(release, after) < 0));
25
+ const page = available.slice(0, input.limit ?? 20);
26
+ const versions = await Promise.all(page.map(async (release) => {
27
+ const state = await input.state(release.releaseId);
28
+ return { releaseId: release.releaseId, createdAt: release.createdAt, state,
29
+ authorPrincipalId: release.authorPrincipalId ?? null, parentReleaseId: release.parentReleaseId ?? null,
30
+ revertedFromReleaseId: release.revertedFromReleaseId ?? null, digest: release.manifestDigest,
31
+ isCurrent: release.releaseId === input.currentReleaseId,
32
+ pinnedUrl: state === 'purged' ? null : input.urls?.(input.artifactId, release.releaseId).pinnedUrl ?? null };
33
+ }));
34
+ const last = page.at(-1);
35
+ const position = (value) => ({ createdAt: value.createdAt, releaseId: value.releaseId });
36
+ return { artifactId: input.artifactId, currentReleaseId: input.currentReleaseId, versions,
37
+ nextCursor: last && available.length > page.length ? Buffer.from(JSON.stringify({ artifactId: input.artifactId,
38
+ storageScopeId: input.storageScopeId, snapshot: position(snapshot), after: position(last) })).toString('base64url') : null };
39
+ }
@@ -108,7 +108,14 @@ claim completion. Do not pass a raw pool to transaction-scoped deletion claims.
108
108
  ## Durable state and failures
109
109
 
110
110
  Stop old writers before enabling the new composition. Apply migrations
111
- `0001_artifacts.sql`, `0002_lifecycle.sql` and additive `0003_coordinator.sql`.
111
+ `0001_artifacts.sql`, `0002_lifecycle.sql`, additive `0003_coordinator.sql`,
112
+ `0004_terminal_controls.sql`, and `0005_metadata.sql` (metadata and release lineage).
113
+ Preserve the existing host journal prefix, including activation assets, on upgrades.
114
+
115
+ R2 bindings explicitly select `profileRevisionId`, `requireExpectedCurrentReleaseId`
116
+ and `resultEnvelopeVersion`. The compatible p0b profile keeps full-bundle publication
117
+ and root results. The CAS switchover can keep result version 1; activate part 1 only
118
+ after qualification of result version 2. IMMO owns both switchovers and activation.
112
119
  Preserve historical rows and objects. Supply `legacyRecords`, using
113
120
  `createPostgresLegacyArtifactRecords(pool)` for PostgreSQL. An empty inventory
114
121
  reader is appropriate only for a verified fresh store.
@@ -0,0 +1,14 @@
1
+ -- Parity P0 — artifact display metadata (title/description/icon).
2
+ --
3
+ -- Additive upgrade after 0004_terminal_controls: no column is dropped or narrowed, existing
4
+ -- rows keep working (default '{}' preserves "no metadata" semantics). The host
5
+ -- applies this file through its existing migration journal.
6
+
7
+ ALTER TABLE artifacts.artifacts
8
+ ADD COLUMN IF NOT EXISTS metadata JSONB NOT NULL DEFAULT '{}'::jsonb;
9
+
10
+ -- Historical authors and lineage remain unknown; populate these on new commits only.
11
+ ALTER TABLE artifacts.releases
12
+ ADD COLUMN IF NOT EXISTS author_principal_id TEXT,
13
+ ADD COLUMN IF NOT EXISTS parent_release_id UUID,
14
+ ADD COLUMN IF NOT EXISTS reverted_from_release_id UUID;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentropic/artifacts",
3
- "version": "0.2.5",
3
+ "version": "0.2.6",
4
4
  "description": "Generic configurable artifacts MCP and artifact service: StorageScope/Artifact/Binding/Release model, canonical manifests, object authorization, idempotent intents (spec-v8 §9).",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -208,7 +208,7 @@
208
208
  },
209
209
  "peerDependencies": {
210
210
  "@aws-sdk/client-s3": "^3.980.0",
211
- "@sentropic/mcp-platform": ">=0.3.0 <0.5.0",
211
+ "@sentropic/mcp-platform": ">=0.4.1 <0.5.0",
212
212
  "pg": "^8.12.0"
213
213
  },
214
214
  "peerDependenciesMeta": {