@sema-agent/core 1.334.0 → 1.336.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.
Files changed (43) hide show
  1. package/dist/agents/subagent.d.ts.map +1 -1
  2. package/dist/agents/subagent.js +2 -0
  3. package/dist/agents/subagent.js.map +1 -1
  4. package/dist/core/runner/prepare-task.d.ts +2 -0
  5. package/dist/core/runner/prepare-task.d.ts.map +1 -1
  6. package/dist/core/runner/prepare-task.js +53 -2
  7. package/dist/core/runner/prepare-task.js.map +1 -1
  8. package/dist/core/types.d.ts +3 -0
  9. package/dist/core/types.d.ts.map +1 -1
  10. package/dist/engine/harness/types.d.ts +2 -0
  11. package/dist/engine/harness/types.d.ts.map +1 -1
  12. package/dist/engine/harness/types.js.map +1 -1
  13. package/dist/engine/session/session.d.ts +3 -7
  14. package/dist/engine/session/session.d.ts.map +1 -1
  15. package/dist/engine/session/session.js.map +1 -1
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +2 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/orchestration/run-workflow-tool.d.ts.map +1 -1
  21. package/dist/orchestration/run-workflow-tool.js +2 -0
  22. package/dist/orchestration/run-workflow-tool.js.map +1 -1
  23. package/dist/orchestration/workflow.d.ts +2 -0
  24. package/dist/orchestration/workflow.d.ts.map +1 -1
  25. package/dist/orchestration/workflow.js +2 -0
  26. package/dist/orchestration/workflow.js.map +1 -1
  27. package/dist/prompt-assembly/artifact-store.d.ts +80 -0
  28. package/dist/prompt-assembly/artifact-store.d.ts.map +1 -0
  29. package/dist/prompt-assembly/artifact-store.js +153 -0
  30. package/dist/prompt-assembly/artifact-store.js.map +1 -0
  31. package/dist/prompt-assembly/artifact.d.ts +68 -0
  32. package/dist/prompt-assembly/artifact.d.ts.map +1 -0
  33. package/dist/prompt-assembly/artifact.js +170 -0
  34. package/dist/prompt-assembly/artifact.js.map +1 -0
  35. package/dist/prompt-assembly/assemble.d.ts +3 -1
  36. package/dist/prompt-assembly/assemble.d.ts.map +1 -1
  37. package/dist/prompt-assembly/assemble.js +59 -34
  38. package/dist/prompt-assembly/assemble.js.map +1 -1
  39. package/dist/prompt-assembly/epoch.d.ts +3 -0
  40. package/dist/prompt-assembly/epoch.d.ts.map +1 -1
  41. package/dist/prompt-assembly/epoch.js +0 -0
  42. package/dist/prompt-assembly/epoch.js.map +1 -1
  43. package/package.json +1 -1
@@ -0,0 +1,153 @@
1
+ import { mkdirSync, promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { verifyPromptArtifact, } from "./artifact.js";
4
+ export class MemoryPromptArtifactStore {
5
+ byDigest = new Map();
6
+ async get(artifactDigest, opts) {
7
+ const bytes = this.byDigest.get(artifactDigest);
8
+ if (bytes === undefined)
9
+ return undefined;
10
+ let parsed;
11
+ try {
12
+ parsed = JSON.parse(bytes);
13
+ }
14
+ catch {
15
+ return undefined;
16
+ }
17
+ const v = verifyPromptArtifact(parsed, opts);
18
+ if (!v.ok || v.artifact.artifactDigest !== artifactDigest)
19
+ return undefined;
20
+ return parsed;
21
+ }
22
+ async put(envelope) {
23
+ this.byDigest.set(envelope.artifact.artifactDigest, JSON.stringify(envelope));
24
+ }
25
+ }
26
+ export class FilePromptArtifactStore {
27
+ dir;
28
+ constructor(dir) {
29
+ this.dir = dir;
30
+ mkdirSync(path.join(dir, "artifacts"), { recursive: true });
31
+ }
32
+ fileFor(artifactDigest) {
33
+ const m = /^sha256:([0-9a-f]{64})$/.exec(artifactDigest);
34
+ return m ? path.join(this.dir, "artifacts", `${m[1]}.json`) : undefined;
35
+ }
36
+ async get(artifactDigest, opts) {
37
+ const file = this.fileFor(artifactDigest);
38
+ if (file === undefined)
39
+ return undefined;
40
+ let bytes;
41
+ try {
42
+ bytes = await fs.readFile(file, "utf8");
43
+ }
44
+ catch {
45
+ return undefined;
46
+ }
47
+ let parsed;
48
+ try {
49
+ parsed = JSON.parse(bytes);
50
+ }
51
+ catch {
52
+ return undefined;
53
+ }
54
+ const v = verifyPromptArtifact(parsed, opts);
55
+ if (!v.ok || v.artifact.artifactDigest !== artifactDigest)
56
+ return undefined;
57
+ return parsed;
58
+ }
59
+ async put(envelope) {
60
+ const file = this.fileFor(envelope.artifact.artifactDigest);
61
+ if (file === undefined)
62
+ throw new Error(`prompt-artifact store: malformed digest ${JSON.stringify(envelope.artifact.artifactDigest).slice(0, 120)}`);
63
+ const tmp = `${file}.tmp-${process.pid}-${Date.now()}`;
64
+ await fs.writeFile(tmp, JSON.stringify(envelope), "utf8");
65
+ await fs.rename(tmp, file);
66
+ }
67
+ }
68
+ export class MemoryPromptSourceStateStore {
69
+ state;
70
+ async load() {
71
+ return this.state;
72
+ }
73
+ async save(state) {
74
+ this.state = state;
75
+ }
76
+ }
77
+ export class FilePromptSourceStateStore {
78
+ file;
79
+ constructor(dir) {
80
+ mkdirSync(dir, { recursive: true });
81
+ this.file = path.join(dir, "source-state.json");
82
+ }
83
+ async load() {
84
+ let bytes;
85
+ try {
86
+ bytes = await fs.readFile(this.file, "utf8");
87
+ }
88
+ catch {
89
+ return undefined;
90
+ }
91
+ try {
92
+ const raw = JSON.parse(bytes);
93
+ if (raw?.state === "active" && typeof raw.artifactDigest === "string" && typeof raw.sourceRevision === "string") {
94
+ return { state: "active", artifactDigest: raw.artifactDigest, sourceRevision: raw.sourceRevision };
95
+ }
96
+ if (raw?.state === "disabled" && typeof raw.sourceRevision === "string") {
97
+ return { state: "disabled", sourceRevision: raw.sourceRevision };
98
+ }
99
+ }
100
+ catch {
101
+ }
102
+ return undefined;
103
+ }
104
+ async save(state) {
105
+ const tmp = `${this.file}.tmp-${process.pid}-${Date.now()}`;
106
+ await fs.writeFile(tmp, JSON.stringify(state), "utf8");
107
+ await fs.rename(tmp, this.file);
108
+ }
109
+ }
110
+ export class CenterPromptSource {
111
+ store;
112
+ stateStore;
113
+ engineVersion;
114
+ candidate;
115
+ constructor(opts) {
116
+ this.store = opts.store;
117
+ this.stateStore = opts.stateStore ?? new MemoryPromptSourceStateStore();
118
+ this.engineVersion = opts.engineVersion;
119
+ }
120
+ current() {
121
+ return this.candidate;
122
+ }
123
+ async get(artifactDigest) {
124
+ if (this.candidate?.artifact.artifactDigest === artifactDigest)
125
+ return this.candidate.artifact;
126
+ const env = await this.store.get(artifactDigest, { engineVersion: this.engineVersion });
127
+ return env?.artifact;
128
+ }
129
+ async restore() {
130
+ const state = await this.stateStore.load();
131
+ if (state?.state !== "active") {
132
+ this.candidate = undefined;
133
+ return;
134
+ }
135
+ const env = await this.store.get(state.artifactDigest, { engineVersion: this.engineVersion });
136
+ this.candidate = env !== undefined ? { artifact: env.artifact, sourceRevision: state.sourceRevision } : undefined;
137
+ }
138
+ async applySnapshot(raw) {
139
+ const v = verifyPromptArtifact(raw, { engineVersion: this.engineVersion });
140
+ if (!v.ok)
141
+ return v;
142
+ const envelope = raw;
143
+ await this.store.put(envelope);
144
+ await this.stateStore.save({ state: "active", artifactDigest: v.artifact.artifactDigest, sourceRevision: envelope.sourceRevision });
145
+ this.candidate = { artifact: v.artifact, sourceRevision: envelope.sourceRevision };
146
+ return { ok: true, artifactDigest: v.artifact.artifactDigest };
147
+ }
148
+ async applyDisabled(sourceRevision) {
149
+ await this.stateStore.save({ state: "disabled", sourceRevision });
150
+ this.candidate = undefined;
151
+ }
152
+ }
153
+ //# sourceMappingURL=artifact-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-store.js","sourceRoot":"","sources":["../../src/prompt-assembly/artifact-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { PromptTextDeclaration } from "../prompts/default.js";
2
+ export type CenterOverlaySlot = "identity" | "scenario" | "behavior";
3
+ export interface CenterOverlaySection {
4
+ id: string;
5
+ slot: CenterOverlaySlot;
6
+ text: string;
7
+ contentHash: string;
8
+ }
9
+ export interface PromptCatalogSnapshot {
10
+ packId: string;
11
+ sections: ReadonlyArray<CenterOverlaySection>;
12
+ }
13
+ export interface PromptDependencyClosure {
14
+ basePackId: string;
15
+ promptCatalog: PromptCatalogSnapshot;
16
+ }
17
+ export interface CoreCompatRange {
18
+ minCore?: string;
19
+ maxCoreExclusive?: string;
20
+ }
21
+ export interface PromptEpochArtifactPayload {
22
+ schemaVersion: 1;
23
+ assemblyApi: 1;
24
+ catalogDigest: string;
25
+ compatibleCore?: CoreCompatRange;
26
+ closure: PromptDependencyClosure;
27
+ }
28
+ export interface PromptEpochArtifact {
29
+ payload: PromptEpochArtifactPayload;
30
+ artifactDigest: string;
31
+ }
32
+ export interface PublishedPromptArtifactEnvelope {
33
+ artifact: PromptEpochArtifact;
34
+ sourceRevision: string;
35
+ }
36
+ export declare const ARTIFACT_LIMITS: {
37
+ readonly maxSections: 64;
38
+ readonly maxSectionBytes: 32000;
39
+ readonly maxTotalBytes: 131072;
40
+ readonly maxIdLength: 128;
41
+ readonly maxPackIdLength: 200;
42
+ };
43
+ export declare function sha256Hex(text: string): string;
44
+ export declare function computeCatalogDigest(catalog: PromptCatalogSnapshot): string;
45
+ export declare function computeArtifactDigest(payload: PromptEpochArtifactPayload): string;
46
+ export type ArtifactVerifyResult = {
47
+ ok: true;
48
+ artifact: PromptEpochArtifact;
49
+ } | {
50
+ ok: false;
51
+ code: string;
52
+ reason: string;
53
+ };
54
+ export declare function verifyPromptArtifact(raw: unknown, opts: {
55
+ engineVersion: string;
56
+ }): ArtifactVerifyResult;
57
+ export declare function artifactDeclarations(artifact: PromptEpochArtifact): PromptTextDeclaration[];
58
+ export declare function buildPromptArtifactEnvelope(opts: {
59
+ packId: string;
60
+ sections: ReadonlyArray<{
61
+ id: string;
62
+ slot: CenterOverlaySlot;
63
+ text: string;
64
+ }>;
65
+ sourceRevision: string;
66
+ compatibleCore?: CoreCompatRange;
67
+ }): PublishedPromptArtifactEnvelope;
68
+ //# sourceMappingURL=artifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../src/prompt-assembly/artifact.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGnE,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,oBAAoB;IAEnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,iBAAiB,CAAC;IAExB,IAAI,EAAE,MAAM,CAAC;IAGb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IAEpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,uBAAuB;IAEtC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,qBAAqB,CAAC;CACtC;AAGD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,CAAC,CAAC;IACjB,WAAW,EAAE,CAAC,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,uBAAuB,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,0BAA0B,CAAC;IACpC,cAAc,EAAE,MAAM,CAAC;CACxB;AAID,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,mBAAmB,CAAC;IAG9B,cAAc,EAAE,MAAM,CAAC;CACxB;AAID,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAC;AAMX,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAE3E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,CAEjF;AAgBD,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE,GAC3C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAOhD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,oBAAoB,CAiGxG;AAMD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,qBAAqB,EAAE,CAO3F;AAID,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,iBAAiB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,eAAe,CAAC;CAClC,GAAG,+BAA+B,CAgBlC"}
@@ -0,0 +1,170 @@
1
+ import { createHash } from "node:crypto";
2
+ import { canonical } from "./epoch.js";
3
+ export const ARTIFACT_LIMITS = {
4
+ maxSections: 64,
5
+ maxSectionBytes: 32_000,
6
+ maxTotalBytes: 131_072,
7
+ maxIdLength: 128,
8
+ maxPackIdLength: 200,
9
+ };
10
+ const ID_RE = /^[a-z0-9][a-z0-9/._-]*$/;
11
+ const DIGEST_RE = /^sha256:[0-9a-f]{64}$/;
12
+ const SLOTS = new Set(["identity", "scenario", "behavior"]);
13
+ export function sha256Hex(text) {
14
+ return `sha256:${createHash("sha256").update(text, "utf8").digest("hex")}`;
15
+ }
16
+ export function computeCatalogDigest(catalog) {
17
+ return sha256Hex(canonical(catalog));
18
+ }
19
+ export function computeArtifactDigest(payload) {
20
+ return sha256Hex(canonical(payload));
21
+ }
22
+ function triple(v) {
23
+ const m = /^(\d+)\.(\d+)\.(\d+)$/.exec(v.trim());
24
+ if (!m)
25
+ return undefined;
26
+ return [Number(m[1]), Number(m[2]), Number(m[3])];
27
+ }
28
+ function tripleCmp(a, b) {
29
+ for (let i = 0; i < 3; i++) {
30
+ if (a[i] !== b[i])
31
+ return a[i] < b[i] ? -1 : 1;
32
+ }
33
+ return 0;
34
+ }
35
+ export function verifyPromptArtifact(raw, opts) {
36
+ const fail = (code, reason) => ({ ok: false, code, reason });
37
+ if (raw === null || typeof raw !== "object")
38
+ return fail("shape", "envelope is not an object");
39
+ const env = raw;
40
+ if (typeof env.sourceRevision !== "string" || !env.sourceRevision || env.sourceRevision.length > 500) {
41
+ return fail("shape", "sourceRevision missing/oversized");
42
+ }
43
+ const art = env.artifact;
44
+ if (art === null || typeof art !== "object")
45
+ return fail("shape", "artifact is not an object");
46
+ const payload = art.payload;
47
+ if (payload === null || typeof payload !== "object")
48
+ return fail("shape", "payload is not an object");
49
+ if (payload.schemaVersion !== 1)
50
+ return fail("schema", `unsupported schemaVersion ${String(payload.schemaVersion)}`);
51
+ if (payload.assemblyApi !== 1)
52
+ return fail("schema", `unsupported assemblyApi ${String(payload.assemblyApi)}`);
53
+ if (typeof payload.catalogDigest !== "string" || !DIGEST_RE.test(payload.catalogDigest))
54
+ return fail("shape", "catalogDigest malformed");
55
+ let compatibleCore;
56
+ if (payload.compatibleCore !== undefined) {
57
+ const cc = payload.compatibleCore;
58
+ if (cc === null || typeof cc !== "object")
59
+ return fail("shape", "compatibleCore malformed");
60
+ compatibleCore = {};
61
+ for (const key of ["minCore", "maxCoreExclusive"]) {
62
+ const v = cc[key];
63
+ if (v === undefined)
64
+ continue;
65
+ if (typeof v !== "string" || triple(v) === undefined)
66
+ return fail("shape", `compatibleCore.${key} is not a dotted triple`);
67
+ compatibleCore[key] = v;
68
+ }
69
+ const engine = triple(opts.engineVersion);
70
+ if (engine === undefined)
71
+ return fail("core-range", `engine version "${opts.engineVersion}" is not a dotted triple`);
72
+ if (compatibleCore.minCore !== undefined && tripleCmp(engine, triple(compatibleCore.minCore)) < 0) {
73
+ return fail("core-range", `engine ${opts.engineVersion} < minCore ${compatibleCore.minCore}`);
74
+ }
75
+ if (compatibleCore.maxCoreExclusive !== undefined && tripleCmp(engine, triple(compatibleCore.maxCoreExclusive)) >= 0) {
76
+ return fail("core-range", `engine ${opts.engineVersion} >= maxCoreExclusive ${compatibleCore.maxCoreExclusive}`);
77
+ }
78
+ }
79
+ const closure = payload.closure;
80
+ if (closure === null || typeof closure !== "object")
81
+ return fail("shape", "closure is not an object");
82
+ if (closure.basePackId !== "sema-default@1") {
83
+ return fail("base-pack", `unsupported basePackId ${JSON.stringify(closure.basePackId).slice(0, 120)} (v1: bundled base only)`);
84
+ }
85
+ const catalog = closure.promptCatalog;
86
+ if (catalog === null || typeof catalog !== "object")
87
+ return fail("shape", "promptCatalog is not an object");
88
+ if (typeof catalog.packId !== "string" || !catalog.packId.trim() || catalog.packId.length > ARTIFACT_LIMITS.maxPackIdLength) {
89
+ return fail("shape", "promptCatalog.packId missing/oversized");
90
+ }
91
+ if (!Array.isArray(catalog.sections))
92
+ return fail("shape", "promptCatalog.sections is not an array");
93
+ if (catalog.sections.length === 0)
94
+ return fail("shape", "promptCatalog.sections is empty — publish at least one section, or disable the source instead");
95
+ if (catalog.sections.length > ARTIFACT_LIMITS.maxSections) {
96
+ return fail("limits", `${catalog.sections.length} sections > max ${ARTIFACT_LIMITS.maxSections}`);
97
+ }
98
+ const ids = new Set();
99
+ let totalBytes = 0;
100
+ const sections = [];
101
+ for (const rawSection of catalog.sections) {
102
+ if (rawSection === null || typeof rawSection !== "object")
103
+ return fail("shape", "section is not an object");
104
+ const s = rawSection;
105
+ if (typeof s.id !== "string" || s.id.startsWith("core/") || s.id.length > ARTIFACT_LIMITS.maxIdLength || !ID_RE.test(s.id)) {
106
+ return fail("shape", `invalid section id ${JSON.stringify(s.id).slice(0, 120)}`);
107
+ }
108
+ if (ids.has(s.id))
109
+ return fail("shape", `duplicate section id "${s.id}"`);
110
+ ids.add(s.id);
111
+ if (typeof s.slot !== "string" || !SLOTS.has(s.slot))
112
+ return fail("shape", `unknown slot ${JSON.stringify(s.slot).slice(0, 60)} ("${s.id}")`);
113
+ if (typeof s.text !== "string" || s.text.length === 0)
114
+ return fail("shape", `empty/missing text ("${s.id}")`);
115
+ const bytes = Buffer.byteLength(s.text, "utf8");
116
+ if (bytes > ARTIFACT_LIMITS.maxSectionBytes)
117
+ return fail("limits", `section "${s.id}" ${bytes} bytes > max ${ARTIFACT_LIMITS.maxSectionBytes}`);
118
+ totalBytes += bytes;
119
+ if (typeof s.contentHash !== "string" || !DIGEST_RE.test(s.contentHash))
120
+ return fail("shape", `contentHash missing/malformed ("${s.id}")`);
121
+ if (s.contentHash !== sha256Hex(s.text))
122
+ return fail("content-hash", `contentHash does not match text ("${s.id}")`);
123
+ sections.push({ id: s.id, slot: s.slot, text: s.text, contentHash: s.contentHash });
124
+ }
125
+ if (totalBytes > ARTIFACT_LIMITS.maxTotalBytes)
126
+ return fail("limits", `catalog ${totalBytes} bytes > max ${ARTIFACT_LIMITS.maxTotalBytes}`);
127
+ const normalizedCatalog = { packId: catalog.packId, sections };
128
+ const normalizedPayload = {
129
+ schemaVersion: 1,
130
+ assemblyApi: 1,
131
+ catalogDigest: payload.catalogDigest,
132
+ ...(compatibleCore !== undefined ? { compatibleCore } : {}),
133
+ closure: { basePackId: "sema-default@1", promptCatalog: normalizedCatalog },
134
+ };
135
+ if (computeCatalogDigest(normalizedCatalog) !== payload.catalogDigest) {
136
+ return fail("digest", "catalogDigest does not match canonical(promptCatalog)");
137
+ }
138
+ if (typeof art.artifactDigest !== "string" || !DIGEST_RE.test(art.artifactDigest))
139
+ return fail("shape", "artifactDigest malformed");
140
+ if (computeArtifactDigest(normalizedPayload) !== art.artifactDigest) {
141
+ return fail("digest", "artifactDigest does not match canonical(payload)");
142
+ }
143
+ return { ok: true, artifact: { payload: normalizedPayload, artifactDigest: art.artifactDigest } };
144
+ }
145
+ export function artifactDeclarations(artifact) {
146
+ return artifact.payload.closure.promptCatalog.sections.map((s) => ({
147
+ id: s.id,
148
+ slot: s.slot,
149
+ text: s.text,
150
+ contentHash: s.contentHash,
151
+ }));
152
+ }
153
+ export function buildPromptArtifactEnvelope(opts) {
154
+ const catalog = {
155
+ packId: opts.packId,
156
+ sections: opts.sections.map((s) => ({ ...s, contentHash: sha256Hex(s.text) })),
157
+ };
158
+ const payload = {
159
+ schemaVersion: 1,
160
+ assemblyApi: 1,
161
+ catalogDigest: computeCatalogDigest(catalog),
162
+ ...(opts.compatibleCore !== undefined ? { compatibleCore: opts.compatibleCore } : {}),
163
+ closure: { basePackId: "sema-default@1", promptCatalog: catalog },
164
+ };
165
+ return {
166
+ artifact: { payload, artifactDigest: computeArtifactDigest(payload) },
167
+ sourceRevision: opts.sourceRevision,
168
+ };
169
+ }
170
+ //# sourceMappingURL=artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact.js","sourceRoot":"","sources":["../../src/prompt-assembly/artifact.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { AgentTool } from "../internal/harness.js";
2
- import { type PromptProvider } from "../prompts/default.js";
2
+ import { type PromptProvider, type PromptTextDeclaration } from "../prompts/default.js";
3
3
  import type { CompiledSection, CompiledSystemBlock, PromptRuntimeFacts } from "./types.js";
4
4
  export interface AssembleInputs {
5
5
  provider: PromptProvider;
@@ -13,10 +13,12 @@ export interface AssembleInputs {
13
13
  buildEnvBlock: (date: string) => string | undefined;
14
14
  date: string;
15
15
  modelGuidance?: string;
16
+ centerDeclarations?: PromptTextDeclaration[];
16
17
  onWarn?: (message: string, phase: "prompt-constitution" | "prompt-cache") => void;
17
18
  }
18
19
  export interface AssembledPrompt {
19
20
  constitution: "core" | "replaced" | "provider-assembled" | "legacy";
21
+ centerMounted?: boolean;
20
22
  renderWithDate?: (date: string) => string;
21
23
  systemPrompt: string;
22
24
  legacyBlocks: Array<{
@@ -1 +1 @@
1
- {"version":3,"file":"assemble.d.ts","sourceRoot":"","sources":["../../src/prompt-assembly/assemble.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAwF,KAAK,cAAc,EAA8B,MAAM,uBAAuB,CAAC;AAG9K,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAc,kBAAkB,EAAuB,MAAM,YAAY,CAAC;AAE5H,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IAGzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAEpD,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,cAAc,KAAK,IAAI,CAAC;CACnF;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,oBAAoB,GAAG,QAAQ,CAAC;IAEpE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAE1C,YAAY,EAAE,MAAM,CAAC;IAErB,YAAY,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAElD,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAG7B,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACtC;AAsCD,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,CAgPtE"}
1
+ {"version":3,"file":"assemble.d.ts","sourceRoot":"","sources":["../../src/prompt-assembly/assemble.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAwF,KAAK,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAG9K,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAc,kBAAkB,EAAuB,MAAM,YAAY,CAAC;AAE5H,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IAGzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAEpD,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IAMvB,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAE7C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,cAAc,KAAK,IAAI,CAAC;CACnF;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,oBAAoB,GAAG,QAAQ,CAAC;IAIpE,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAE1C,YAAY,EAAE,MAAM,CAAC;IAErB,YAAY,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAElD,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAG7B,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACtC;AAwFD,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,CAqPtE"}
@@ -25,6 +25,43 @@ function verifyDeclaredContentHash(d, onWarn) {
25
25
  onWarn?.(`prompt-provider stableBlocks: contentHash on "${d.id}" does not match sha256 of its text (expected shape sha256:<64 lowercase hex>) — dropped from the manifest`, "prompt-constitution");
26
26
  return undefined;
27
27
  }
28
+ function mountDeclarations(basePack, decls, onWarn) {
29
+ const SLOT_BASE = { identity: 100, scenario: 350, behavior: 460 };
30
+ const counters = {};
31
+ const extra = [];
32
+ let replacesRoleBase = false;
33
+ for (const d of decls) {
34
+ if (!d.id || d.id.startsWith("core/") || d.id.length > 128 || !/^[a-z0-9][a-z0-9/._-]*$/.test(d.id)) {
35
+ throw new Error(`prompt-provider stableBlocks: invalid section id ${JSON.stringify(d.id).slice(0, 140)} (must match ^[a-z0-9][a-z0-9/._-]*$, ≤128 chars, non-core/)`);
36
+ }
37
+ const base = SLOT_BASE[d.slot];
38
+ if (base === undefined)
39
+ throw new Error(`prompt-provider stableBlocks: unknown slot "${String(d.slot)}" ("${d.id}")`);
40
+ if (d.slot === "identity")
41
+ replacesRoleBase = true;
42
+ const n = (counters[d.slot] = (counters[d.slot] ?? 0) + 1);
43
+ const declaredContentHash = verifyDeclaredContentHash(d, onWarn);
44
+ extra.push({
45
+ id: d.id,
46
+ slot: d.slot,
47
+ rank: base + n * 0.001,
48
+ owner: "deployment",
49
+ trust: "operator",
50
+ mutability: "replaceable",
51
+ cadence: "epoch",
52
+ cacheClass: "prefix-stable",
53
+ carrier: "system.block",
54
+ content: () => d.text,
55
+ legacyBlockId: d.id,
56
+ ...(declaredContentHash !== undefined ? { declaredContentHash } : {}),
57
+ origin: "provider",
58
+ });
59
+ }
60
+ return {
61
+ ...basePack,
62
+ sections: [...basePack.sections.filter((s) => !(replacesRoleBase && s.id === "core/role.base")), ...extra],
63
+ };
64
+ }
28
65
  export function assemblePrompt(inputs) {
29
66
  const { provider, facts } = inputs;
30
67
  const onWarn = inputs.onWarn
@@ -45,6 +82,9 @@ export function assemblePrompt(inputs) {
45
82
  ...facts,
46
83
  };
47
84
  if (!inputs.isDefaultProvider && !provider.stableBlocks && !provider.stableSystem && provider.system) {
85
+ if (inputs.centerDeclarations && inputs.centerDeclarations.length > 0) {
86
+ onWarn?.("prompt-constitution: a center prompt artifact is adopted but this PromptProvider uses the legacy free-form system() hook, which owns the whole prompt — the center sections cannot mount on this path. Upgrade to stableBlocks/stableSystem to compose center content.", "prompt-constitution");
87
+ }
48
88
  let systemPrompt = provider.system({ ...stableCtx, memoryBlock: inputs.memoryBlock });
49
89
  const memTrim = inputs.memoryBlock?.trim();
50
90
  if (memTrim && systemPrompt.includes(memTrim) && !systemPrompt.trimEnd().endsWith(memTrim)) {
@@ -61,6 +101,7 @@ export function assemblePrompt(inputs) {
61
101
  let roleBase = inputs.userSystemPrompt ?? DEFAULT_SYSTEM_PROMPT;
62
102
  let roleBaseFromProvider = false;
63
103
  let constitution = "core";
104
+ let centerMounted = false;
64
105
  if (!inputs.isDefaultProvider && provider.stableBlocks) {
65
106
  const decls = provider.stableBlocks(stableCtx).map((d) => ({
66
107
  id: d.id,
@@ -71,6 +112,9 @@ export function assemblePrompt(inputs) {
71
112
  const assembledIdentity = decls.find((d) => d.slot === "identity" && d.text.includes(CYBER_RISK) && d.text.includes(URL_SAFETY) && d.text.includes("# Harness"));
72
113
  if (assembledIdentity) {
73
114
  onWarn?.("prompt-constitution: a stableBlocks identity declaration carries an already-assembled prompt (constitution anchors found). Passed through un-doubled — provide ONLY the role layer in identity blocks.", "prompt-constitution");
115
+ if (inputs.centerDeclarations && inputs.centerDeclarations.length > 0) {
116
+ onWarn?.("prompt-constitution: a center prompt artifact is adopted but the provider's assembled-identity pass-through owns the prompt — the center sections cannot mount on this migration path.", "prompt-constitution");
117
+ }
74
118
  const renderInputsPT = (date) => ({
75
119
  roleBase: assembledIdentity.text,
76
120
  facts,
@@ -88,6 +132,7 @@ export function assemblePrompt(inputs) {
88
132
  let lastPT = compose(ptPack, renderInputsPT(inputs.date));
89
133
  return {
90
134
  constitution: "provider-assembled",
135
+ centerMounted: false,
91
136
  renderWithDate: (date) => {
92
137
  lastPT = compose(ptPack, renderInputsPT(date));
93
138
  return lastPT.text;
@@ -106,41 +151,16 @@ export function assemblePrompt(inputs) {
106
151
  },
107
152
  };
108
153
  }
109
- const SLOT_BASE = { identity: 100, scenario: 350, behavior: 460 };
110
- const counters = {};
111
- const extra = [];
112
- let replacesRoleBase = false;
113
- for (const d of decls) {
114
- if (!d.id || d.id.startsWith("core/") || d.id.length > 128 || !/^[a-z0-9][a-z0-9/._-]*$/.test(d.id)) {
115
- throw new Error(`prompt-provider stableBlocks: invalid section id ${JSON.stringify(d.id).slice(0, 140)} (must match ^[a-z0-9][a-z0-9/._-]*$, ≤128 chars, non-core/)`);
154
+ const providerIds = new Set(decls.map((d) => d.id));
155
+ const centerDecls = (inputs.centerDeclarations ?? []).filter((c) => {
156
+ if (providerIds.has(c.id)) {
157
+ onWarn?.(`prompt-constitution: center section "${c.id}" collides with a provider stableBlocks declaration of the same id — the provider declaration wins (deployment-local SHADOW); the center section is not mounted this run.`, "prompt-constitution");
158
+ return false;
116
159
  }
117
- const base = SLOT_BASE[d.slot];
118
- if (base === undefined)
119
- throw new Error(`prompt-provider stableBlocks: unknown slot "${String(d.slot)}" ("${d.id}")`);
120
- if (d.slot === "identity")
121
- replacesRoleBase = true;
122
- const n = (counters[d.slot] = (counters[d.slot] ?? 0) + 1);
123
- const declaredContentHash = verifyDeclaredContentHash(d, onWarn);
124
- extra.push({
125
- id: d.id,
126
- slot: d.slot,
127
- rank: base + n * 0.001,
128
- owner: "deployment",
129
- trust: "operator",
130
- mutability: "replaceable",
131
- cadence: "epoch",
132
- cacheClass: "prefix-stable",
133
- carrier: "system.block",
134
- content: () => d.text,
135
- legacyBlockId: d.id,
136
- ...(declaredContentHash !== undefined ? { declaredContentHash } : {}),
137
- origin: "provider",
138
- });
139
- }
140
- pack = {
141
- ...SEMA_DEFAULT_PACK,
142
- sections: [...SEMA_DEFAULT_PACK.sections.filter((s) => !(replacesRoleBase && s.id === "core/role.base")), ...extra],
143
- };
160
+ return true;
161
+ });
162
+ centerMounted = inputs.centerDeclarations !== undefined && inputs.centerDeclarations.length > 0;
163
+ pack = mountDeclarations(SEMA_DEFAULT_PACK, [...centerDecls, ...decls], onWarn);
144
164
  }
145
165
  else if (!inputs.isDefaultProvider && provider.stableSystem) {
146
166
  const roleOut = provider.stableSystem(stableCtx);
@@ -164,6 +184,10 @@ export function assemblePrompt(inputs) {
164
184
  }
165
185
  if (!roleBaseFromProvider && facts.promptProfile !== "classic" && roleBase === CODE_SYSTEM_PROMPT)
166
186
  roleBase = CODE_AGENT_PROMPT;
187
+ if (inputs.centerDeclarations && inputs.centerDeclarations.length > 0 && !(!inputs.isDefaultProvider && provider.stableBlocks)) {
188
+ pack = mountDeclarations(pack, inputs.centerDeclarations, onWarn);
189
+ centerMounted = true;
190
+ }
167
191
  const renderInputs = (date) => ({
168
192
  roleBase,
169
193
  roleAppend: inputs.userAppendSystemPrompt,
@@ -180,6 +204,7 @@ export function assemblePrompt(inputs) {
180
204
  };
181
205
  return {
182
206
  constitution,
207
+ centerMounted,
183
208
  renderWithDate,
184
209
  get systemPrompt() {
185
210
  return last.text;