@principles/core 1.289.2 → 1.290.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/runtime-v2/activation/activation-dispatcher.d.ts +4 -0
- package/dist/runtime-v2/activation/activation-dispatcher.d.ts.map +1 -1
- package/dist/runtime-v2/activation/activation-dispatcher.js +215 -63
- package/dist/runtime-v2/activation/activation-dispatcher.js.map +1 -1
- package/dist/runtime-v2/activation/activation-types.d.ts +48 -0
- package/dist/runtime-v2/activation/activation-types.d.ts.map +1 -1
- package/dist/runtime-v2/activation/activation-types.js.map +1 -1
- package/dist/runtime-v2/activation/approval-completion-service.d.ts +9 -0
- package/dist/runtime-v2/activation/approval-completion-service.d.ts.map +1 -1
- package/dist/runtime-v2/activation/approval-completion-service.js +4 -1
- package/dist/runtime-v2/activation/approval-completion-service.js.map +1 -1
- package/dist/runtime-v2/activation/index.d.ts +4 -2
- package/dist/runtime-v2/activation/index.d.ts.map +1 -1
- package/dist/runtime-v2/activation/index.js +4 -1
- package/dist/runtime-v2/activation/index.js.map +1 -1
- package/dist/runtime-v2/activation/low-risk-writers.d.ts.map +1 -1
- package/dist/runtime-v2/activation/low-risk-writers.js +2 -1
- package/dist/runtime-v2/activation/low-risk-writers.js.map +1 -1
- package/dist/runtime-v2/activation/prompt-activation-reader-contract.d.ts +11 -0
- package/dist/runtime-v2/activation/prompt-activation-reader-contract.d.ts.map +1 -1
- package/dist/runtime-v2/activation/prompt-activation-reader-contract.js +12 -2
- package/dist/runtime-v2/activation/prompt-activation-reader-contract.js.map +1 -1
- package/dist/runtime-v2/activation/prompt-replacement.d.ts +79 -0
- package/dist/runtime-v2/activation/prompt-replacement.d.ts.map +1 -0
- package/dist/runtime-v2/activation/prompt-replacement.js +171 -0
- package/dist/runtime-v2/activation/prompt-replacement.js.map +1 -0
- package/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts +17 -1
- package/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
- package/dist/runtime-v2/activation/sqlite-activation-state-store.js +132 -0
- package/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +8 -2
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +8 -2
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/internalization/scribe-prompt-builder.d.ts +13 -1
- package/dist/runtime-v2/internalization/scribe-prompt-builder.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/scribe-prompt-builder.js +15 -2
- package/dist/runtime-v2/internalization/scribe-prompt-builder.js.map +1 -1
- package/dist/runtime-v2/intervention-evidence-normalizer.d.ts +28 -0
- package/dist/runtime-v2/intervention-evidence-normalizer.d.ts.map +1 -0
- package/dist/runtime-v2/intervention-evidence-normalizer.js +654 -0
- package/dist/runtime-v2/intervention-evidence-normalizer.js.map +1 -0
- package/dist/runtime-v2/receipt-coverage.d.ts +8 -0
- package/dist/runtime-v2/receipt-coverage.d.ts.map +1 -1
- package/dist/runtime-v2/receipt-coverage.js +18 -0
- package/dist/runtime-v2/receipt-coverage.js.map +1 -1
- package/dist/runtime-v2/store/intervention-evidence-schema.d.ts +6 -0
- package/dist/runtime-v2/store/intervention-evidence-schema.d.ts.map +1 -0
- package/dist/runtime-v2/store/intervention-evidence-schema.js +122 -0
- package/dist/runtime-v2/store/intervention-evidence-schema.js.map +1 -0
- package/dist/runtime-v2/store/sqlite-connection.d.ts +8 -0
- package/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
- package/dist/runtime-v2/store/sqlite-connection.js +62 -3
- package/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
- package/dist/runtime-v2/store/sqlite-intervention-evidence-store.d.ts +67 -0
- package/dist/runtime-v2/store/sqlite-intervention-evidence-store.d.ts.map +1 -0
- package/dist/runtime-v2/store/sqlite-intervention-evidence-store.js +737 -0
- package/dist/runtime-v2/store/sqlite-intervention-evidence-store.js.map +1 -0
- package/dist/runtime-v2/types/event-types.d.ts +6 -0
- package/dist/runtime-v2/types/event-types.d.ts.map +1 -1
- package/dist/runtime-v2/types/event-types.js +2 -0
- package/dist/runtime-v2/types/event-types.js.map +1 -1
- package/dist/runtime-v2/types/intervention-evidence-contract.d.ts +287 -0
- package/dist/runtime-v2/types/intervention-evidence-contract.d.ts.map +1 -0
- package/dist/runtime-v2/types/intervention-evidence-contract.js +84 -0
- package/dist/runtime-v2/types/intervention-evidence-contract.js.map +1 -0
- package/package.json +5 -1
|
@@ -24,5 +24,8 @@ export { createProductionGateDeps, compileHardenedRuleEvaluator } from './produc
|
|
|
24
24
|
// Story A (PRI-408): Formal approval-completion production service.
|
|
25
25
|
// Replaces demo "approve → direct writer" with structured, idempotent path.
|
|
26
26
|
export { ApprovalCompletionService } from './approval-completion-service.js';
|
|
27
|
-
|
|
27
|
+
// PD_PROMPT_CAPACITY_V1 R-B3: prompt-channel version replacement — detection,
|
|
28
|
+
// owner-revision artifact assembly, and the atomic commit types.
|
|
29
|
+
export { detectPromptReplacementTarget, buildOwnerRevisionArtifact, revisionDigest, } from './prompt-replacement.js';
|
|
30
|
+
export { RUNTIME_V2_PRINCIPLE_BUDGET, isRecord as isArtifactRecord, filterPromptActivations, resolvePrincipleFromArtifact, trimToBudget, listEntryLine, renderPrinciplesToDirectives, } from './prompt-activation-reader-contract.js';
|
|
28
31
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/index.ts"],"names":[],"mappings":"AAiCA,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,mCAAmC,EACnC,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGlE,2EAA2E;AAC3E,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAG3H,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAElF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAMpF,OAAO,EAAE,4BAA4B,EAAE,kCAAkC,EAAE,MAAM,oCAAoC,CAAC;AAEtH,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,OAAO,EAAE,6BAA6B,EAAE,iCAAiC,EAAE,MAAM,sCAAsC,CAAC;AAExH,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AAEhF,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAE7E,OAAO,EAAE,8BAA8B,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAG5J,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAGpF,4EAA4E;AAC5E,0EAA0E;AAC1E,2DAA2D;AAC3D,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAEnG,oEAAoE;AACpE,4EAA4E;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,8EAA8E;AAC9E,iEAAiE;AACjE,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,cAAc,GACf,MAAM,yBAAyB,CAAC;AAQjC,OAAO,EACL,2BAA2B,EAC3B,QAAQ,IAAI,gBAAgB,EAC5B,uBAAuB,EACvB,4BAA4B,EAC5B,YAAY,EACZ,aAAa,EACb,4BAA4B,GAC7B,MAAM,wCAAwC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"low-risk-writers.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/low-risk-writers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"low-risk-writers.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/low-risk-writers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAO7H;;;;;;;;;;;;;;;;GAgBG;AACH,iBAAS,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAwBvE;AAKD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMxE;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAExF;AAED,qBAAa,YAAa,YAAW,aAAa;IAChD,QAAQ,CAAC,OAAO,EAAG,QAAQ,CAAU;IAG/B,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAc1E;IAGK,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAMvF;CACF;AAED,qBAAa,kBAAmB,YAAW,aAAa;IACtD,QAAQ,CAAC,OAAO,EAAG,eAAe,CAAU;IAGtC,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAS1E;IAGK,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAMvF;CACF;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
1
2
|
function isRecord(value) {
|
|
2
3
|
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
3
4
|
}
|
|
@@ -111,7 +112,7 @@ export class PromptWriter {
|
|
|
111
112
|
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
112
113
|
async activate(input, _artifact) {
|
|
113
114
|
return {
|
|
114
|
-
activationId: `act_prompt_${input.principleId}`,
|
|
115
|
+
activationId: `act_prompt_${input.principleId}_${createHash('sha256').update(input.artifactId, 'utf8').digest('hex')}`,
|
|
115
116
|
action: 'prompt_activate',
|
|
116
117
|
targetRef: `ledger://${input.principleId}`,
|
|
117
118
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"low-risk-writers.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/low-risk-writers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"low-risk-writers.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/low-risk-writers.ts"],"names":[],"mappings":"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"}
|
|
@@ -71,6 +71,17 @@ export interface TrimToBudgetResult {
|
|
|
71
71
|
* statistical one. Both injection routes read the same fact, so their
|
|
72
72
|
* fairness semantics are identical.
|
|
73
73
|
*/
|
|
74
|
+
/**
|
|
75
|
+
* The single authority for the list route's serialized entry line format.
|
|
76
|
+
* `trimToBudget` measures entries through this helper; capacity prechecks and
|
|
77
|
+
* status projections must measure through it too instead of re-typing the
|
|
78
|
+
* format (PD_PROMPT_CAPACITY_V1 R-A2: costs come from the production
|
|
79
|
+
* serializer, not an approximation).
|
|
80
|
+
*/
|
|
81
|
+
export declare function listEntryLine(principle: {
|
|
82
|
+
principleId: string;
|
|
83
|
+
text: string;
|
|
84
|
+
}, escapeFn?: (s: string) => string): string;
|
|
74
85
|
export declare function trimToBudget(principles: ActivatedPrinciple[], budget: number, escapeFn?: (s: string) => string, roundKey?: number): TrimToBudgetResult;
|
|
75
86
|
export interface RenderDirectivesOptions {
|
|
76
87
|
/** XML-escape function applied to principle ids and texts. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-activation-reader-contract.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/prompt-activation-reader-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAC;IACtC,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAUD,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,sBAAsB,EAAE,GACpC,sBAAsB,EAAE,CAI1B;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,OAAO,EACpB,UAAU,EAAE,sBAAsB,GACjC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,kBAAkB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA8D9E;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAAG,uBAAuB,GAAG,kBAAkB,CAAC;AAEjF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,eAAe,EAAE,qBAAqB,CAAC;IACvC,uFAAuF;IACvF,aAAa,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B;;;OAGG;IACH,sBAAsB,EAAE,MAAM,EAAE,CAAC;CAClC;AAKD;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"prompt-activation-reader-contract.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/prompt-activation-reader-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAC;IACtC,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAUD,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,sBAAsB,EAAE,GACpC,sBAAsB,EAAE,CAI1B;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,OAAO,EACpB,UAAU,EAAE,sBAAsB,GACjC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,kBAAkB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA8D9E;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAAG,uBAAuB,GAAG,kBAAkB,CAAC;AAEjF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,eAAe,EAAE,qBAAqB,CAAC;IACvC,uFAAuF;IACvF,aAAa,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B;;;OAGG;IACH,sBAAsB,EAAE,MAAM,EAAE,CAAC;CAClC;AAKD;;;;;;;;GAQG;AACH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAChD,QAAQ,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAiB,GACzC,MAAM,CAER;AAOD,wBAAgB,YAAY,CAC1B,UAAU,EAAE,kBAAkB,EAAE,EAChC,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAiB,EAC1C,QAAQ,CAAC,EAAE,MAAM,GAChB,kBAAkB,CAmEpB;AAED,MAAM,WAAW,uBAAuB;IACtC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACjC;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EACzJ,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EACxB,OAAO,CAAC,EAAE,uBAAuB,GAChC,MAAM,CAmCR"}
|
|
@@ -74,6 +74,16 @@ const MAX_INJECTION_DIAGNOSTIC_IDS = 16;
|
|
|
74
74
|
* statistical one. Both injection routes read the same fact, so their
|
|
75
75
|
* fairness semantics are identical.
|
|
76
76
|
*/
|
|
77
|
+
/**
|
|
78
|
+
* The single authority for the list route's serialized entry line format.
|
|
79
|
+
* `trimToBudget` measures entries through this helper; capacity prechecks and
|
|
80
|
+
* status projections must measure through it too instead of re-typing the
|
|
81
|
+
* format (PD_PROMPT_CAPACITY_V1 R-A2: costs come from the production
|
|
82
|
+
* serializer, not an approximation).
|
|
83
|
+
*/
|
|
84
|
+
export function listEntryLine(principle, escapeFn = (s) => s) {
|
|
85
|
+
return `- [${escapeFn(principle.principleId)}] ${escapeFn(principle.text)}`;
|
|
86
|
+
}
|
|
77
87
|
// PRI-904: the optional roundKey extends the frozen 3-param public surface
|
|
78
88
|
// positionally rather than via an options bag — existing callers (plugin hook,
|
|
79
89
|
// console projection, tests) pass (principles, budget, escapeFn?) and must not
|
|
@@ -96,7 +106,7 @@ export function trimToBudget(principles, budget, escapeFn = (s) => s, roundKey)
|
|
|
96
106
|
// legacy_fifo_prefix_v1 — byte-identical to the pre-PRI-904 loop: greedy
|
|
97
107
|
// prefix packing, first non-fit breaks. Rollback = omit the round key.
|
|
98
108
|
for (const p of principles) {
|
|
99
|
-
const entry =
|
|
109
|
+
const entry = listEntryLine(p, escapeFn);
|
|
100
110
|
if (remaining < entry.length + 1) {
|
|
101
111
|
truncated = true;
|
|
102
112
|
// The loop breaks here, so both lists hold at most this one entry —
|
|
@@ -123,7 +133,7 @@ export function trimToBudget(principles, budget, escapeFn = (s) => s, roundKey)
|
|
|
123
133
|
const rotationStartIndex = ((roundKey % n) + n) % n;
|
|
124
134
|
const ring = principles.slice(rotationStartIndex).concat(principles.slice(0, rotationStartIndex));
|
|
125
135
|
for (const p of ring) {
|
|
126
|
-
const entry =
|
|
136
|
+
const entry = listEntryLine(p, escapeFn);
|
|
127
137
|
const cost = entry.length + 1;
|
|
128
138
|
if (cost > emptyPayloadRemaining) {
|
|
129
139
|
// Cannot fit even in an empty payload — oversize, not starvation.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-activation-reader-contract.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/prompt-activation-reader-contract.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"prompt-activation-reader-contract.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/prompt-activation-reader-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PD_PROMPT_CAPACITY_V1 R-B3: prompt-channel version replacement support.
|
|
3
|
+
*
|
|
4
|
+
* Two focused capabilities over EXISTING authorities (no new store, no new
|
|
5
|
+
* lifecycle states):
|
|
6
|
+
* 1. `detectPromptReplacementTarget` — given the artifact an Owner just
|
|
7
|
+
* approved, find the live prompt activation of a PRIOR artifact version of
|
|
8
|
+
* the same principle (revision lineage via the existing
|
|
9
|
+
* `isArtifactRevisionOf` predicate). Ambiguity fails closed: more than one
|
|
10
|
+
* live match is an error the Owner resolves manually, never a guess and
|
|
11
|
+
* never a batch migration over history.
|
|
12
|
+
* 2. `buildOwnerRevisionArtifact` — assemble the new artifact version for an
|
|
13
|
+
* Owner-submitted replacement statement: a clone of the approved scribe
|
|
14
|
+
* artifact with ONLY principleDraft.statement replaced, new lineage, new
|
|
15
|
+
* task identity (the (source_task_id, artifact_kind) unique index forbids
|
|
16
|
+
* same-task upsert — that would overwrite the old approved artifact), and
|
|
17
|
+
* validation through the REAL `DefaultScribeValidator` content contract —
|
|
18
|
+
* never a direct `validated` stamp.
|
|
19
|
+
*/
|
|
20
|
+
import type { ActivationStatusRecord, PIArtifactSnapshot } from './activation-types.js';
|
|
21
|
+
export interface PromptReplacementTarget {
|
|
22
|
+
supersededActivationId: string;
|
|
23
|
+
supersededArtifactId: string;
|
|
24
|
+
}
|
|
25
|
+
export type PromptReplacementDetection = {
|
|
26
|
+
ok: true;
|
|
27
|
+
target: PromptReplacementTarget | null;
|
|
28
|
+
} | {
|
|
29
|
+
ok: false;
|
|
30
|
+
error: string;
|
|
31
|
+
nextAction: string;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Find the single live prompt activation whose artifact is a prior version of
|
|
35
|
+
* `approvalArtifactId`'s principle. Returns target=null when the approval is
|
|
36
|
+
* not a revision of anything live (plain activation), and ok=false when more
|
|
37
|
+
* than one live activation matches (manual resolution required).
|
|
38
|
+
*/
|
|
39
|
+
export declare function detectPromptReplacementTarget(input: {
|
|
40
|
+
approvalArtifactId: string;
|
|
41
|
+
getArtifactById: (artifactId: string) => Promise<PIArtifactSnapshot | null>;
|
|
42
|
+
listPromptActivations: () => Promise<ActivationStatusRecord[]>;
|
|
43
|
+
includeHistoricalTargets?: boolean;
|
|
44
|
+
}): Promise<PromptReplacementDetection>;
|
|
45
|
+
export interface OwnerRevisionArtifactDraft {
|
|
46
|
+
artifactId: string;
|
|
47
|
+
sourceTaskId: string;
|
|
48
|
+
sourcePrincipleId?: string;
|
|
49
|
+
lineageArtifactIds: string[];
|
|
50
|
+
contentJson: string;
|
|
51
|
+
}
|
|
52
|
+
export type OwnerRevisionBuildResult = {
|
|
53
|
+
ok: true;
|
|
54
|
+
draft: OwnerRevisionArtifactDraft;
|
|
55
|
+
oldStatement: string;
|
|
56
|
+
title: string;
|
|
57
|
+
intentContract?: unknown;
|
|
58
|
+
} | {
|
|
59
|
+
ok: false;
|
|
60
|
+
error: string;
|
|
61
|
+
nextAction: string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Build the new artifact version for an Owner-submitted statement. The old
|
|
65
|
+
* approved artifact stays immutable (untouched); the new version carries
|
|
66
|
+
* lineage back to it and keeps every non-statement field — the intent fields
|
|
67
|
+
* are preserved verbatim and returned for the reviewable diff (the Owner is
|
|
68
|
+
* the semantic judge of intent consistency; the validator enforces the
|
|
69
|
+
* structural content contract).
|
|
70
|
+
*/
|
|
71
|
+
export declare function buildOwnerRevisionArtifact(input: {
|
|
72
|
+
oldArtifact: PIArtifactSnapshot;
|
|
73
|
+
newStatement: string;
|
|
74
|
+
editedBy: string;
|
|
75
|
+
now: string;
|
|
76
|
+
}): Promise<OwnerRevisionBuildResult>;
|
|
77
|
+
/** Stable digest helper for revision payloads (audit/lineage display). */
|
|
78
|
+
export declare function revisionDigest(contentJson: string): string;
|
|
79
|
+
//# sourceMappingURL=prompt-replacement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-replacement.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/prompt-replacement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAIxF,MAAM,WAAW,uBAAuB;IACtC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAAA;CAAE,GACpD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD;;;;;GAKG;AACH,wBAAsB,6BAA6B,CAAC,KAAK,EAAE;IACzD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAC5E,qBAAqB,EAAE,MAAM,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC/D,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GAAG,OAAO,CAAC,0BAA0B,CAAC,CA4CtC;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,0BAA0B,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9G;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAMrD;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,WAAW,EAAE,kBAAkB,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA8EpC;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PD_PROMPT_CAPACITY_V1 R-B3: prompt-channel version replacement support.
|
|
3
|
+
*
|
|
4
|
+
* Two focused capabilities over EXISTING authorities (no new store, no new
|
|
5
|
+
* lifecycle states):
|
|
6
|
+
* 1. `detectPromptReplacementTarget` — given the artifact an Owner just
|
|
7
|
+
* approved, find the live prompt activation of a PRIOR artifact version of
|
|
8
|
+
* the same principle (revision lineage via the existing
|
|
9
|
+
* `isArtifactRevisionOf` predicate). Ambiguity fails closed: more than one
|
|
10
|
+
* live match is an error the Owner resolves manually, never a guess and
|
|
11
|
+
* never a batch migration over history.
|
|
12
|
+
* 2. `buildOwnerRevisionArtifact` — assemble the new artifact version for an
|
|
13
|
+
* Owner-submitted replacement statement: a clone of the approved scribe
|
|
14
|
+
* artifact with ONLY principleDraft.statement replaced, new lineage, new
|
|
15
|
+
* task identity (the (source_task_id, artifact_kind) unique index forbids
|
|
16
|
+
* same-task upsert — that would overwrite the old approved artifact), and
|
|
17
|
+
* validation through the REAL `DefaultScribeValidator` content contract —
|
|
18
|
+
* never a direct `validated` stamp.
|
|
19
|
+
*/
|
|
20
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
21
|
+
import { isArtifactRevisionOf } from './activation-types.js';
|
|
22
|
+
import { DefaultScribeValidator } from '../internalization/scribe-output.js';
|
|
23
|
+
/**
|
|
24
|
+
* Find the single live prompt activation whose artifact is a prior version of
|
|
25
|
+
* `approvalArtifactId`'s principle. Returns target=null when the approval is
|
|
26
|
+
* not a revision of anything live (plain activation), and ok=false when more
|
|
27
|
+
* than one live activation matches (manual resolution required).
|
|
28
|
+
*/
|
|
29
|
+
export async function detectPromptReplacementTarget(input) {
|
|
30
|
+
const approvalArtifact = await input.getArtifactById(input.approvalArtifactId);
|
|
31
|
+
if (approvalArtifact === null) {
|
|
32
|
+
return {
|
|
33
|
+
ok: false,
|
|
34
|
+
error: `approval_artifact_unreadable: ${input.approvalArtifactId}`,
|
|
35
|
+
nextAction: 'check_pi_artifacts_table',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const matches = [];
|
|
39
|
+
const activations = await input.listPromptActivations();
|
|
40
|
+
for (const activation of activations) {
|
|
41
|
+
if (activation.deactivatedAt !== null)
|
|
42
|
+
continue;
|
|
43
|
+
if (activation.artifactId === input.approvalArtifactId)
|
|
44
|
+
continue;
|
|
45
|
+
const artifact = await input.getArtifactById(activation.artifactId);
|
|
46
|
+
if (artifact === null)
|
|
47
|
+
continue;
|
|
48
|
+
if (isArtifactRevisionOf(approvalArtifact, artifact)) {
|
|
49
|
+
if (approvalArtifact.sourcePrincipleId && artifact.sourcePrincipleId
|
|
50
|
+
&& approvalArtifact.sourcePrincipleId !== artifact.sourcePrincipleId) {
|
|
51
|
+
return { ok: false, error: 'prompt_replacement_source_principle_mismatch', nextAction: 'review the artifact lineage and source principle before approval' };
|
|
52
|
+
}
|
|
53
|
+
matches.push({ supersededActivationId: activation.activationId, supersededArtifactId: activation.artifactId });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (matches.length === 0 && input.includeHistoricalTargets === true) {
|
|
57
|
+
// Recovery of an already live revision must bind the nearest explicit
|
|
58
|
+
// lineage artifact, even when its old activation is now inactive.
|
|
59
|
+
for (const artifactId of [...approvalArtifact.lineageArtifactIds].reverse()) {
|
|
60
|
+
const historical = activations.filter((activation) => activation.artifactId === artifactId);
|
|
61
|
+
if (historical.length === 0)
|
|
62
|
+
continue;
|
|
63
|
+
if (historical.length !== 1)
|
|
64
|
+
return { ok: false, error: 'ambiguous_prompt_replacement_history', nextAction: 'inspect the bound historical artifact and activation before retrying' };
|
|
65
|
+
const [target] = historical;
|
|
66
|
+
if (target !== undefined)
|
|
67
|
+
matches.push({ supersededActivationId: target.activationId, supersededArtifactId: target.artifactId });
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (matches.length > 1) {
|
|
72
|
+
return {
|
|
73
|
+
ok: false,
|
|
74
|
+
error: `ambiguous_prompt_replacement: ${matches.length} live prompt activations match this revision (${matches.map((m) => m.supersededActivationId).join(', ')})`,
|
|
75
|
+
nextAction: 'deactivate the stale versions manually, then retry the approval — replacement never migrates history in bulk',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return { ok: true, target: matches[0] ?? null };
|
|
79
|
+
}
|
|
80
|
+
function isRecord(value) {
|
|
81
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Build the new artifact version for an Owner-submitted statement. The old
|
|
85
|
+
* approved artifact stays immutable (untouched); the new version carries
|
|
86
|
+
* lineage back to it and keeps every non-statement field — the intent fields
|
|
87
|
+
* are preserved verbatim and returned for the reviewable diff (the Owner is
|
|
88
|
+
* the semantic judge of intent consistency; the validator enforces the
|
|
89
|
+
* structural content contract).
|
|
90
|
+
*/
|
|
91
|
+
export async function buildOwnerRevisionArtifact(input) {
|
|
92
|
+
const { oldArtifact, newStatement, editedBy, now } = input;
|
|
93
|
+
const trimmed = newStatement.trim();
|
|
94
|
+
if (trimmed.length === 0) {
|
|
95
|
+
return { ok: false, error: 'statement_empty', nextAction: 'provide a non-empty replacement statement' };
|
|
96
|
+
}
|
|
97
|
+
let parsed;
|
|
98
|
+
try {
|
|
99
|
+
parsed = JSON.parse(oldArtifact.contentJson);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return { ok: false, error: 'old_artifact_content_unparseable', nextAction: 'repair the old artifact content before creating a revision' };
|
|
103
|
+
}
|
|
104
|
+
if (!isRecord(parsed)) {
|
|
105
|
+
return { ok: false, error: 'old_artifact_content_malformed', nextAction: 'repair the old artifact content before creating a revision' };
|
|
106
|
+
}
|
|
107
|
+
const oldDraft = isRecord(parsed.principleDraft) ? parsed.principleDraft : null;
|
|
108
|
+
const oldStatement = typeof oldDraft?.statement === 'string' ? oldDraft.statement : '';
|
|
109
|
+
if (oldStatement === '') {
|
|
110
|
+
return { ok: false, error: 'old_artifact_missing_statement', nextAction: 'the old artifact has no principleDraft.statement to replace' };
|
|
111
|
+
}
|
|
112
|
+
if (typeof parsed.text === 'string' && parsed.text.length > 0 && parsed.text !== oldStatement) {
|
|
113
|
+
return { ok: false, error: 'old_artifact_ambiguous_statement', nextAction: 'review the conflicting text and principleDraft.statement; the old artifact remains unchanged' };
|
|
114
|
+
}
|
|
115
|
+
if (trimmed === oldStatement.trim()) {
|
|
116
|
+
return { ok: false, error: 'statement_unchanged', nextAction: 'the replacement statement must differ from the current one' };
|
|
117
|
+
}
|
|
118
|
+
// New task identity: the (source_task_id, artifact_kind) UNIQUE index makes
|
|
119
|
+
// same-task upsert an OVERWRITE of the old approved artifact — forbidden.
|
|
120
|
+
// The suffix must stay URL-safe: artifact ids flow into approval ids
|
|
121
|
+
// (`apr_prompt_<artifactId>`) and from there into Console route paths.
|
|
122
|
+
const revisionSuffix = `ownerrev-${randomUUID()}`;
|
|
123
|
+
const sourceTaskId = `${oldArtifact.sourceTaskId}-${revisionSuffix}`;
|
|
124
|
+
const artifactId = `pi-art-${sourceTaskId}`;
|
|
125
|
+
const revisedContent = { ...parsed };
|
|
126
|
+
// The production reader prefers top-level text. Remove an identical legacy
|
|
127
|
+
// alias only in the new version so statement remains the execution authority.
|
|
128
|
+
delete revisedContent.text;
|
|
129
|
+
revisedContent.principleDraft = {
|
|
130
|
+
...(oldDraft ?? {}),
|
|
131
|
+
statement: trimmed,
|
|
132
|
+
};
|
|
133
|
+
revisedContent.taskId = sourceTaskId;
|
|
134
|
+
revisedContent.generatedAt = now;
|
|
135
|
+
// Trace the Owner edit inside the artifact's own risk notes (append-only
|
|
136
|
+
// style — never rewrite existing fields other than the statement/task bookkeeping).
|
|
137
|
+
const risks = Array.isArray(parsed.risks) && parsed.risks.every((r) => typeof r === 'string')
|
|
138
|
+
? [...(parsed.risks)]
|
|
139
|
+
: [];
|
|
140
|
+
risks.push(`owner-edited statement (${editedBy}, ${now}): revision of ${oldArtifact.artifactId} for prompt capacity`);
|
|
141
|
+
revisedContent.risks = risks;
|
|
142
|
+
// Reuse the REAL content validation contract — taskId must match the new
|
|
143
|
+
// draft's task identity; every structural requirement applies as for a
|
|
144
|
+
// scribe run. A failure means NO artifact is persisted by the caller.
|
|
145
|
+
const validation = await new DefaultScribeValidator().validate(revisedContent, sourceTaskId);
|
|
146
|
+
if (!validation.valid) {
|
|
147
|
+
return {
|
|
148
|
+
ok: false,
|
|
149
|
+
error: `revision_validation_failed: ${validation.errors.slice(0, 5).join('; ')}`,
|
|
150
|
+
nextAction: 'fix the revision content so it satisfies the scribe output contract (title/rationale/applicability/intentContract must stay intact)',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
ok: true,
|
|
155
|
+
draft: {
|
|
156
|
+
artifactId,
|
|
157
|
+
sourceTaskId,
|
|
158
|
+
...(oldArtifact.sourcePrincipleId !== undefined ? { sourcePrincipleId: oldArtifact.sourcePrincipleId } : {}),
|
|
159
|
+
lineageArtifactIds: [...oldArtifact.lineageArtifactIds, oldArtifact.artifactId],
|
|
160
|
+
contentJson: JSON.stringify(revisedContent),
|
|
161
|
+
},
|
|
162
|
+
oldStatement,
|
|
163
|
+
title: typeof oldDraft?.title === 'string' ? oldDraft.title : '',
|
|
164
|
+
intentContract: revisedContent.intentContract,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/** Stable digest helper for revision payloads (audit/lineage display). */
|
|
168
|
+
export function revisionDigest(contentJson) {
|
|
169
|
+
return `sha256:${createHash('sha256').update(contentJson, 'utf8').digest('hex')}`;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=prompt-replacement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-replacement.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/prompt-replacement.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ActivationStateReadModel, ActivationStatusRecord } from './activation-types.js';
|
|
1
|
+
import type { ActivationStateReadModel, ActivationStatusRecord, PromptReplacementCommit, PromptReplacementOutcome } from './activation-types.js';
|
|
2
2
|
import type { SqliteConnection } from '../store/sqlite-connection.js';
|
|
3
3
|
export declare class SqliteActivationStateStore implements ActivationStateReadModel {
|
|
4
4
|
private readonly connection;
|
|
@@ -9,6 +9,22 @@ export declare class SqliteActivationStateStore implements ActivationStateReadMo
|
|
|
9
9
|
listCodeToolHookActivations(includeDeactivated?: boolean): Promise<ActivationStatusRecord[]>;
|
|
10
10
|
listAllActivations(): Promise<ActivationStatusRecord[]>;
|
|
11
11
|
deactivateActivation(activationId: string, deactivatedAt: string): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* PD_PROMPT_CAPACITY_V1 R-B3: atomic prompt-version replacement — the
|
|
14
|
+
* prompt-channel sibling of the RuleCode promotion commit's supersede
|
|
15
|
+
* (sqlite-activation-safety-store.ts). ONE BEGIN IMMEDIATE transaction
|
|
16
|
+
* commits, in order: (validations) → new activation row → immutable
|
|
17
|
+
* `supersede` decision row → deactivation of the prior live activation.
|
|
18
|
+
* A failure anywhere rolls back to the OLD-ONLY state (the Owner never
|
|
19
|
+
* loses the working version); there is no stop-old-then-start-new window.
|
|
20
|
+
*
|
|
21
|
+
* Idempotent by construction: replaying after success takes the
|
|
22
|
+
* `already_replaced` branch (new row already live; old deactivation and
|
|
23
|
+
* decision row are INSERT OR IGNORE / idempotent UPDATE). It also RECOVERS
|
|
24
|
+
* the rare "new artifact activated normally earlier" state by completing
|
|
25
|
+
* the supersede inside the same transaction instead of failing.
|
|
26
|
+
*/
|
|
27
|
+
replacePromptActivation(input: PromptReplacementCommit): Promise<PromptReplacementOutcome>;
|
|
12
28
|
promoteActivation(activationId: string, promotedAt: string): Promise<boolean>;
|
|
13
29
|
}
|
|
14
30
|
//# sourceMappingURL=sqlite-activation-state-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-activation-state-store.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/sqlite-activation-state-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-activation-state-store.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/sqlite-activation-state-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjJ,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAiEtE,qBAAa,0BAA2B,YAAW,wBAAwB;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAvC,YAA6B,UAAU,EAAE,gBAAgB,EAAI;IAEvD,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAYxF;IAEK,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCpE;IAEK,qBAAqB,CAAC,kBAAkB,UAAQ,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAkBzF;IAEK,2BAA2B,CAAC,kBAAkB,UAAQ,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAe/F;IAEK,kBAAkB,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAgB5D;IAEK,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQxF;IAED;;;;;;;;;;;;;;OAcG;IACG,uBAAuB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA6F/F;IACK,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgDlF;CACF"}
|
|
@@ -1,6 +1,23 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { isArtifactRevisionOf } from './activation-types.js';
|
|
1
3
|
function isRecord(value) {
|
|
2
4
|
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
3
5
|
}
|
|
6
|
+
function readArtifactIdentity(row, artifactId) {
|
|
7
|
+
if (!isRecord(row) || typeof row.source_task_id !== 'string' || typeof row.lineage_artifact_ids !== 'string')
|
|
8
|
+
return null;
|
|
9
|
+
let lineage;
|
|
10
|
+
try {
|
|
11
|
+
lineage = JSON.parse(row.lineage_artifact_ids);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
if (!Array.isArray(lineage) || !lineage.every((id) => typeof id === 'string'))
|
|
17
|
+
return null;
|
|
18
|
+
return { artifactId, sourceTaskId: row.source_task_id, lineageArtifactIds: lineage,
|
|
19
|
+
...(typeof row.source_principle_id === 'string' ? { sourcePrincipleId: row.source_principle_id } : {}) };
|
|
20
|
+
}
|
|
4
21
|
function readStringField(row, key) {
|
|
5
22
|
if (!Object.hasOwn(row, key))
|
|
6
23
|
return null;
|
|
@@ -157,6 +174,121 @@ export class SqliteActivationStateStore {
|
|
|
157
174
|
`).run(deactivatedAt, activationId);
|
|
158
175
|
return result.changes > 0;
|
|
159
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* PD_PROMPT_CAPACITY_V1 R-B3: atomic prompt-version replacement — the
|
|
179
|
+
* prompt-channel sibling of the RuleCode promotion commit's supersede
|
|
180
|
+
* (sqlite-activation-safety-store.ts). ONE BEGIN IMMEDIATE transaction
|
|
181
|
+
* commits, in order: (validations) → new activation row → immutable
|
|
182
|
+
* `supersede` decision row → deactivation of the prior live activation.
|
|
183
|
+
* A failure anywhere rolls back to the OLD-ONLY state (the Owner never
|
|
184
|
+
* loses the working version); there is no stop-old-then-start-new window.
|
|
185
|
+
*
|
|
186
|
+
* Idempotent by construction: replaying after success takes the
|
|
187
|
+
* `already_replaced` branch (new row already live; old deactivation and
|
|
188
|
+
* decision row are INSERT OR IGNORE / idempotent UPDATE). It also RECOVERS
|
|
189
|
+
* the rare "new artifact activated normally earlier" state by completing
|
|
190
|
+
* the supersede inside the same transaction instead of failing.
|
|
191
|
+
*/
|
|
192
|
+
async replacePromptActivation(input) {
|
|
193
|
+
const db = this.connection.getDb();
|
|
194
|
+
const { newRecord } = input;
|
|
195
|
+
if (newRecord.activationId === input.supersededActivationId) {
|
|
196
|
+
throw new Error('replacePromptActivation: new and superseded activation ids must be distinct');
|
|
197
|
+
}
|
|
198
|
+
if (newRecord.channel !== 'prompt' || newRecord.action !== 'prompt_activate' || newRecord.deactivatedAt !== null) {
|
|
199
|
+
throw new Error('replacePromptActivation: replacement must be a live prompt activation');
|
|
200
|
+
}
|
|
201
|
+
if (newRecord.idempotencyKey !== `${newRecord.artifactId}::prompt`) {
|
|
202
|
+
throw new Error('replacePromptActivation: idempotency key must identify the new artifact and channel');
|
|
203
|
+
}
|
|
204
|
+
const supersedeKey = `supersede-prompt:${newRecord.activationId}:${input.supersededActivationId}`;
|
|
205
|
+
db.exec('BEGIN IMMEDIATE');
|
|
206
|
+
try {
|
|
207
|
+
const oldRows = db.prepare('SELECT * FROM activations WHERE activation_id = ? AND artifact_id = ?').all(input.supersededActivationId, input.supersededArtifactId);
|
|
208
|
+
const [oldRaw] = oldRows;
|
|
209
|
+
const old = mapRowToRecord(oldRaw);
|
|
210
|
+
if (oldRows.length !== 1 || old === null || old.channel !== 'prompt' || old.action !== 'prompt_activate'
|
|
211
|
+
|| old.artifactId !== input.supersededArtifactId) {
|
|
212
|
+
throw new Error('replacePromptActivation: superseded activation is not a live prompt activation of the expected artifact');
|
|
213
|
+
}
|
|
214
|
+
const oldArtifact = db.prepare('SELECT * FROM pi_artifacts WHERE artifact_id = ?').get(old.artifactId);
|
|
215
|
+
if (!isRecord(oldArtifact) || typeof oldArtifact.content_json !== 'string') {
|
|
216
|
+
throw new Error('replacePromptActivation: superseded artifact is unavailable');
|
|
217
|
+
}
|
|
218
|
+
const newArtifact = db.prepare('SELECT * FROM pi_artifacts WHERE artifact_id = ?').get(newRecord.artifactId);
|
|
219
|
+
if (!isRecord(newArtifact))
|
|
220
|
+
throw new Error('replacePromptActivation: new artifact is unavailable');
|
|
221
|
+
// Known source identities must agree even when lineage points at the old
|
|
222
|
+
// artifact. Missing legacy identities are not invented or migrated.
|
|
223
|
+
if (typeof oldArtifact.source_principle_id === 'string' && typeof newArtifact.source_principle_id === 'string'
|
|
224
|
+
&& oldArtifact.source_principle_id !== newArtifact.source_principle_id) {
|
|
225
|
+
throw new Error('replacePromptActivation: replacement artifacts belong to different principles');
|
|
226
|
+
}
|
|
227
|
+
const oldIdentity = readArtifactIdentity(oldArtifact, old.artifactId);
|
|
228
|
+
const newIdentity = readArtifactIdentity(newArtifact, newRecord.artifactId);
|
|
229
|
+
if (oldIdentity === null || newIdentity === null || !isArtifactRevisionOf(newIdentity, oldIdentity)) {
|
|
230
|
+
throw new Error('replacePromptActivation: artifacts have no verified revision relationship');
|
|
231
|
+
}
|
|
232
|
+
const digest = `sha256:${createHash('sha256').update(JSON.stringify({ artifact_id: old.artifactId, content_json: oldArtifact.content_json }), 'utf8').digest('hex')}`;
|
|
233
|
+
const newRaw = db.prepare('SELECT * FROM activations WHERE idempotency_key = ?').get(newRecord.idempotencyKey);
|
|
234
|
+
const existing = newRaw === undefined ? null : mapRowToRecord(newRaw);
|
|
235
|
+
if (newRaw !== undefined && (existing === null || existing.activationId !== newRecord.activationId
|
|
236
|
+
|| existing.artifactId !== newRecord.artifactId || existing.channel !== 'prompt'
|
|
237
|
+
|| existing.action !== 'prompt_activate' || existing.targetRef !== newRecord.targetRef || existing.deactivatedAt !== null)) {
|
|
238
|
+
throw new Error('replacePromptActivation: new activation identity conflicts with the stored version');
|
|
239
|
+
}
|
|
240
|
+
const decision = db.prepare('SELECT * FROM activation_decisions WHERE idempotency_key = ?').get(supersedeKey);
|
|
241
|
+
if (decision !== undefined && (!isRecord(decision) || decision.activation_id !== old.activationId
|
|
242
|
+
|| decision.artifact_id !== old.artifactId || decision.decision !== 'supersede'
|
|
243
|
+
|| decision.artifact_digest !== digest)) {
|
|
244
|
+
throw new Error('replacePromptActivation: supersede decision conflicts with this replacement');
|
|
245
|
+
}
|
|
246
|
+
if (old.deactivatedAt !== null) {
|
|
247
|
+
if (existing === null || decision === undefined) {
|
|
248
|
+
throw new Error('replacePromptActivation: superseded activation is inactive without a completed replacement');
|
|
249
|
+
}
|
|
250
|
+
db.exec('COMMIT');
|
|
251
|
+
return { status: 'already_replaced', newActivationId: existing.activationId, supersededActivationId: old.activationId, supersedeDecisionId: supersedeKey };
|
|
252
|
+
}
|
|
253
|
+
if (existing === null) {
|
|
254
|
+
const artifactExists = db.prepare('SELECT 1 FROM pi_artifacts WHERE artifact_id = ?').get(newRecord.artifactId);
|
|
255
|
+
if (artifactExists === undefined)
|
|
256
|
+
throw new Error('replacePromptActivation: new artifact is unavailable');
|
|
257
|
+
const collisions = db.prepare('SELECT 1 FROM activations WHERE activation_id = ?').all(newRecord.activationId);
|
|
258
|
+
if (collisions.length !== 0)
|
|
259
|
+
throw new Error('replacePromptActivation: new activation identity is already occupied');
|
|
260
|
+
db.prepare(`
|
|
261
|
+
INSERT INTO activations
|
|
262
|
+
(activation_id, idempotency_key, artifact_id, channel, action, target_ref, activated_at, promoted_at, deactivated_at)
|
|
263
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL)
|
|
264
|
+
`).run(newRecord.activationId, newRecord.idempotencyKey, newRecord.artifactId, newRecord.channel, newRecord.action, newRecord.targetRef, newRecord.activatedAt, newRecord.promotedAt ?? null);
|
|
265
|
+
}
|
|
266
|
+
if (decision === undefined) {
|
|
267
|
+
db.prepare(`
|
|
268
|
+
INSERT INTO activation_decisions
|
|
269
|
+
(decision_id, idempotency_key, subject_kind, activation_id, artifact_id, artifact_digest,
|
|
270
|
+
decision, principal_kind, owner_id, authentication_method, credential_id, reason_code, note, decided_at)
|
|
271
|
+
VALUES (?, ?, 'activation', ?, ?, ?, 'supersede', 'configured_owner', ?, 'system', NULL, ?, ?, ?)
|
|
272
|
+
`).run(supersedeKey, supersedeKey, old.activationId, old.artifactId, digest, input.decidedBy, input.reasonCode, `${input.note} Approved by ${input.decidedBy} via prompt approval.`, input.decidedAt);
|
|
273
|
+
}
|
|
274
|
+
const deactivationTime = isRecord(decision) && typeof decision.decided_at === 'string' ? decision.decided_at : input.decidedAt;
|
|
275
|
+
const update = db.prepare(`
|
|
276
|
+
UPDATE activations SET deactivated_at = ?
|
|
277
|
+
WHERE activation_id = ? AND artifact_id = ? AND channel = 'prompt' AND deactivated_at IS NULL
|
|
278
|
+
`).run(deactivationTime, old.activationId, old.artifactId);
|
|
279
|
+
if (update.changes !== 1)
|
|
280
|
+
throw new Error('replacePromptActivation: superseded activation changed during commit');
|
|
281
|
+
db.exec('COMMIT');
|
|
282
|
+
return { status: existing === null ? 'replaced' : 'already_replaced', newActivationId: newRecord.activationId, supersededActivationId: old.activationId, supersedeDecisionId: supersedeKey };
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
try {
|
|
286
|
+
db.exec('ROLLBACK');
|
|
287
|
+
}
|
|
288
|
+
catch { /* best effort */ }
|
|
289
|
+
throw error;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
160
292
|
async promoteActivation(activationId, promotedAt) {
|
|
161
293
|
const db = this.connection.getDb();
|
|
162
294
|
// Wrap COUNT guard + UPDATE in a single IMMEDIATE transaction (CodeRabbit
|