@sema-agent/core 1.335.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.
- package/dist/agents/subagent.d.ts.map +1 -1
- package/dist/agents/subagent.js +2 -0
- package/dist/agents/subagent.js.map +1 -1
- package/dist/core/runner/prepare-task.d.ts +2 -0
- package/dist/core/runner/prepare-task.d.ts.map +1 -1
- package/dist/core/runner/prepare-task.js +51 -1
- package/dist/core/runner/prepare-task.js.map +1 -1
- package/dist/core/types.d.ts +3 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/engine/harness/types.d.ts +2 -0
- package/dist/engine/harness/types.d.ts.map +1 -1
- package/dist/engine/harness/types.js.map +1 -1
- package/dist/engine/session/session.d.ts +3 -7
- package/dist/engine/session/session.d.ts.map +1 -1
- package/dist/engine/session/session.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/orchestration/run-workflow-tool.d.ts.map +1 -1
- package/dist/orchestration/run-workflow-tool.js +2 -0
- package/dist/orchestration/run-workflow-tool.js.map +1 -1
- package/dist/orchestration/workflow.d.ts +2 -0
- package/dist/orchestration/workflow.d.ts.map +1 -1
- package/dist/orchestration/workflow.js +2 -0
- package/dist/orchestration/workflow.js.map +1 -1
- package/dist/prompt-assembly/artifact-store.d.ts +80 -0
- package/dist/prompt-assembly/artifact-store.d.ts.map +1 -0
- package/dist/prompt-assembly/artifact-store.js +153 -0
- package/dist/prompt-assembly/artifact-store.js.map +1 -0
- package/dist/prompt-assembly/artifact.d.ts +68 -0
- package/dist/prompt-assembly/artifact.d.ts.map +1 -0
- package/dist/prompt-assembly/artifact.js +170 -0
- package/dist/prompt-assembly/artifact.js.map +1 -0
- package/dist/prompt-assembly/assemble.d.ts +3 -1
- package/dist/prompt-assembly/assemble.d.ts.map +1 -1
- package/dist/prompt-assembly/assemble.js +59 -34
- package/dist/prompt-assembly/assemble.js.map +1 -1
- package/dist/prompt-assembly/epoch.d.ts +3 -0
- package/dist/prompt-assembly/epoch.d.ts.map +1 -1
- package/dist/prompt-assembly/epoch.js +0 -0
- package/dist/prompt-assembly/epoch.js.map +1 -1
- 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,
|
|
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
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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;
|