@dsh-enhanced/assistant-growth-contract 0.1.48 → 0.1.49

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/README.md CHANGED
@@ -25,5 +25,22 @@ Preference/Memory promotion 协议只允许 `memory.retention=long-term` 和固
25
25
  共享 contract 同时持有 producer 的进程内可撤销 brand,使 Memory 无需加载可选的 Preference 插件即可验真;
26
26
  它只定义 registration 与 content-free wire,不提供自由文本、Memory 写权限或无审批降级。
27
27
 
28
- 本包只使用 Node `crypto` 计算 canonical SHA-256,不访问网络、文件系统、子进程、凭据或
28
+ 普通事实/经验候选使用独立的 `MemoryLearningReviewRequest`:Host 固定 owner lineage、
29
+ 原任务及正文摘要、提取会话,模型仅提供有限 `mutation/evidenceQuote`。经验必须关联明确的
30
+ canonical 任务结果,替换/删除必须指定记录版本;模型不能设置 namespace、trust、TTL 或权限。
31
+ 严格 DTO 校验和摘要仅保证传递内容一致,Verifier 仍须独立回读原文与当前结果,Memory 仍须
32
+ 验证审查回执、有限授权与来源后才能采用。本库不自动提取、审批或写入记忆。
33
+
34
+ 创建插件的私有 `SourceGrowthRunBinding` 固定实际成长模型与其来源、原生预算准入、
35
+ 任务修订、真实生成会话及模型/工具上限。合同必须由 Host 回读持久成长回合来核验;
36
+ 模型参数、格式校验或摘要都不能证明来源。生成期限不延长后续构建、验收或采用的授权,
37
+ 此记录也不是独立行为验收回执。本库不注册 producer 或调度创建。
38
+
39
+ `isSourceOwnerContinuation` 只比较已认证的当前 route 与冻结来源 owner:稳定身份和授权必须完全一致,代次不能倒退,同代次的 binding 版本必须相同。它允许普通来源在同一主人 `/new` 后继续保留原证据,不延长期限或授予 Agent 权限;调用者仍须回读原任务、canonical 修订及实际当前 Agent。
40
+
41
+ 可选 `creationAcceptance` 在作者模型开始前固定 Host 的验收政策引用;历史 run 保持可读,不能后补验收资格。
42
+ `PluginCreationVerificationCertificate` 绑定任务来源、精确制品、私有用例摘要、观察身份和两次独立会话,
43
+ 使用 Ed25519 验签。验签函数只确认签名、政策和有效期,消费者必须重新检查当前来源;凭证不授予审批或采用权限。
44
+
45
+ 本包只使用 Node `crypto` 计算 canonical SHA-256 与验签,不访问网络、文件系统、子进程、凭据或
29
46
  浏览器,也没有 install script。
@@ -0,0 +1,81 @@
1
+ /** Owner policy reference frozen before a Growth Agent can write a candidate. */
2
+ export interface CreationAcceptanceAuthorityRef {
3
+ protocol: 'assistant-growth/creation-acceptance-authority/v1';
4
+ authorityId: string;
5
+ keyId: string;
6
+ authorityDigest: string;
7
+ namePrefix: string;
8
+ expiresAt: number;
9
+ }
10
+ /** Independent checks of a task-derived contract, never a task-success rating. */
11
+ export interface PluginCreationVerificationCertificate {
12
+ protocol: 'assistant-growth/creation-verification/v1';
13
+ verificationId: string;
14
+ authority: CreationAcceptanceAuthorityRef;
15
+ plan: {
16
+ id: string;
17
+ digest: string;
18
+ name: string;
19
+ sourceTreeDigest: string;
20
+ sourcePatchDigest: string;
21
+ artifactSha256: string;
22
+ artifactBytes: number;
23
+ generatorDigest: string;
24
+ };
25
+ source: {
26
+ referenceDigest: string;
27
+ ownerDigest: string;
28
+ growthRunDigest: string;
29
+ };
30
+ contractDigest: string;
31
+ schemaDigest: string;
32
+ environment: {
33
+ node: string;
34
+ cordis: string;
35
+ tools: string;
36
+ systemPrompt: string;
37
+ };
38
+ model: {
39
+ provider: string;
40
+ model: string;
41
+ reasoningEffort?: string;
42
+ };
43
+ budget: {
44
+ modelCalls: 2;
45
+ maxOutputTokens: number;
46
+ maxDurationMs: number;
47
+ maxCases: number;
48
+ };
49
+ sessions: {
50
+ contract: string;
51
+ sourceReview: string;
52
+ };
53
+ observations: readonly {
54
+ caseId: string;
55
+ jobId: string;
56
+ operationDigest: string;
57
+ observationDigest: string;
58
+ }[];
59
+ reviewDigest: string;
60
+ verifiedAt: number;
61
+ expiresAt: number;
62
+ signature: string;
63
+ }
64
+ /** Host-only request; the producer rereads every source and artifact binding. */
65
+ export interface PluginCreationVerificationRequest {
66
+ protocol: 'assistant-growth/creation-verification-request/v1';
67
+ planId: string;
68
+ }
69
+ export type PluginCreationVerificationResult = {
70
+ status: 'verified';
71
+ certificate: PluginCreationVerificationCertificate;
72
+ } | {
73
+ status: 'rejected' | 'unknown';
74
+ reason: string;
75
+ };
76
+ export declare function validateCreationAcceptanceAuthorityRef(value: unknown): asserts value is CreationAcceptanceAuthorityRef;
77
+ export declare function validatePluginCreationVerificationCertificate(value: unknown): asserts value is PluginCreationVerificationCertificate;
78
+ export declare function pluginCreationVerificationSigningPayload(value: Omit<PluginCreationVerificationCertificate, 'signature'>): string;
79
+ /** Signature and authority equality only; consumers must also recheck provenance. */
80
+ export declare function verifyPluginCreationVerificationCertificate(value: unknown, authority: CreationAcceptanceAuthorityRef, publicKey: string, now?: number): value is PluginCreationVerificationCertificate;
81
+ //# sourceMappingURL=creation-verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creation-verification.d.ts","sourceRoot":"","sources":["../src/creation-verification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import { createPublicKey, verify } from 'node:crypto';
2
+ import { canonicalGrowthJson } from './canonical.js';
3
+ const digest = /^[a-f0-9]{64}$/u;
4
+ const identifier = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,199}$/u;
5
+ function fail(label) { throw new Error(`invalid plugin creation verification ${label}`); }
6
+ function record(value, keys, label) {
7
+ if (!value || typeof value !== 'object' || Array.isArray(value)
8
+ || Object.getPrototypeOf(value) !== Object.prototype || Object.getOwnPropertySymbols(value).length
9
+ || !Object.values(Object.getOwnPropertyDescriptors(value)).every(item => item.enumerable && 'value' in item)
10
+ || Object.keys(value).sort().join('\0') !== [...keys].sort().join('\0'))
11
+ fail(label);
12
+ return value;
13
+ }
14
+ function id(value, label) {
15
+ if (typeof value !== 'string' || !identifier.test(value) || value.normalize('NFC') !== value)
16
+ fail(label);
17
+ }
18
+ function text(value, label, maximum = 500) {
19
+ if (typeof value !== 'string' || !value || !value.isWellFormed() || value.normalize('NFC').trim() !== value
20
+ || Buffer.byteLength(value) > maximum || /[\p{Cc}]/u.test(value))
21
+ fail(label);
22
+ }
23
+ function sha(value, label) { if (typeof value !== 'string' || !digest.test(value))
24
+ fail(label); }
25
+ function integer(value, label, min = 1, max = Number.MAX_SAFE_INTEGER) {
26
+ if (!Number.isSafeInteger(value) || Number(value) < min || Number(value) > max)
27
+ fail(label);
28
+ }
29
+ export function validateCreationAcceptanceAuthorityRef(value) {
30
+ const ref = record(value, ['protocol', 'authorityId', 'keyId', 'authorityDigest', 'namePrefix', 'expiresAt'], 'authority');
31
+ if (ref.protocol !== 'assistant-growth/creation-acceptance-authority/v1')
32
+ fail('authority protocol');
33
+ id(ref.authorityId, 'authorityId');
34
+ id(ref.keyId, 'keyId');
35
+ sha(ref.authorityDigest, 'authorityDigest');
36
+ if (typeof ref.namePrefix !== 'string' || ref.namePrefix.length < 2 || ref.namePrefix.length > 48
37
+ || !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*-$/u.test(ref.namePrefix))
38
+ fail('namePrefix');
39
+ integer(ref.expiresAt, 'authority expiry', 1, 8_640_000_000_000_000);
40
+ }
41
+ export function validatePluginCreationVerificationCertificate(value) {
42
+ const item = record(value, ['protocol', 'verificationId', 'authority', 'plan', 'source', 'contractDigest', 'schemaDigest',
43
+ 'environment', 'model', 'budget', 'sessions', 'observations', 'reviewDigest', 'verifiedAt', 'expiresAt', 'signature'], 'certificate');
44
+ if (item.protocol !== 'assistant-growth/creation-verification/v1')
45
+ fail('protocol');
46
+ id(item.verificationId, 'verificationId');
47
+ validateCreationAcceptanceAuthorityRef(item.authority);
48
+ const plan = record(item.plan, ['id', 'digest', 'name', 'sourceTreeDigest', 'sourcePatchDigest', 'artifactSha256',
49
+ 'artifactBytes', 'generatorDigest'], 'plan');
50
+ id(plan.id, 'plan id');
51
+ if (typeof plan.name !== 'string' || plan.name.length > 64 || !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u.test(plan.name)
52
+ || !plan.name.startsWith(item.authority.namePrefix))
53
+ fail('plan name');
54
+ for (const key of ['digest', 'sourceTreeDigest', 'sourcePatchDigest', 'artifactSha256', 'generatorDigest'])
55
+ sha(plan[key], key);
56
+ integer(plan.artifactBytes, 'artifact bytes', 1, 512 * 1024);
57
+ const source = record(item.source, ['referenceDigest', 'ownerDigest', 'growthRunDigest'], 'source');
58
+ for (const key of ['referenceDigest', 'ownerDigest', 'growthRunDigest'])
59
+ sha(source[key], key);
60
+ for (const key of ['contractDigest', 'schemaDigest', 'reviewDigest'])
61
+ sha(item[key], key);
62
+ const env = record(item.environment, ['node', 'cordis', 'tools', 'systemPrompt'], 'environment');
63
+ for (const key of ['node', 'cordis', 'tools', 'systemPrompt']) {
64
+ if (typeof env[key] !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9.+-]{0,63}$/u.test(env[key]))
65
+ fail(key);
66
+ }
67
+ const selected = record(item.model, ['provider', 'model',
68
+ ...(item.model && typeof item.model === 'object' && Object.hasOwn(item.model, 'reasoningEffort') ? ['reasoningEffort'] : [])], 'model');
69
+ text(selected.provider, 'provider');
70
+ text(selected.model, 'model');
71
+ if (Object.hasOwn(selected, 'reasoningEffort'))
72
+ text(selected.reasoningEffort, 'reasoningEffort');
73
+ const budget = record(item.budget, ['modelCalls', 'maxOutputTokens', 'maxDurationMs', 'maxCases'], 'budget');
74
+ if (budget.modelCalls !== 2)
75
+ fail('model calls');
76
+ integer(budget.maxOutputTokens, 'output tokens', 1, 32_768);
77
+ integer(budget.maxDurationMs, 'duration', 1_000, 1_800_000);
78
+ integer(budget.maxCases, 'cases', 2, 8);
79
+ const sessions = record(item.sessions, ['contract', 'sourceReview'], 'sessions');
80
+ id(sessions.contract, 'contract session');
81
+ id(sessions.sourceReview, 'review session');
82
+ if (sessions.contract === sessions.sourceReview)
83
+ fail('fresh review sessions');
84
+ if (!Array.isArray(item.observations) || item.observations.length < 2 || item.observations.length > Number(budget.maxCases))
85
+ fail('observations');
86
+ if (Object.getPrototypeOf(item.observations) !== Array.prototype || Object.getOwnPropertySymbols(item.observations).length
87
+ || Object.getOwnPropertyNames(item.observations).length !== item.observations.length + 1
88
+ || !Object.entries(Object.getOwnPropertyDescriptors(item.observations)).every(([key, value]) => key === 'length'
89
+ || /^(0|[1-9][0-9]*)$/u.test(key) && value.enumerable && 'value' in value)
90
+ || !Array.from({ length: item.observations.length }, (_, index) => Object.hasOwn(item.observations, index)).every(Boolean))
91
+ fail('observation array');
92
+ const seen = new Set(), jobs = new Set();
93
+ for (const entry of item.observations) {
94
+ const row = record(entry, ['caseId', 'jobId', 'operationDigest', 'observationDigest'], 'observation');
95
+ id(row.caseId, 'caseId');
96
+ id(row.jobId, 'jobId');
97
+ sha(row.operationDigest, 'operationDigest');
98
+ sha(row.observationDigest, 'observationDigest');
99
+ if (seen.has(String(row.caseId)) || jobs.has(String(row.jobId)))
100
+ fail('duplicate case or observation job');
101
+ seen.add(String(row.caseId));
102
+ jobs.add(String(row.jobId));
103
+ }
104
+ integer(item.verifiedAt, 'verifiedAt', 1, 8_640_000_000_000_000);
105
+ integer(item.expiresAt, 'expiresAt', 1, 8_640_000_000_000_000);
106
+ if (Number(item.expiresAt) <= Number(item.verifiedAt) || Number(item.expiresAt) > item.authority.expiresAt)
107
+ fail('certificate expiry');
108
+ if (typeof item.signature !== 'string' || !/^[A-Za-z0-9_-]{86}$/u.test(item.signature)
109
+ || Buffer.from(item.signature, 'base64url').length !== 64
110
+ || Buffer.from(item.signature, 'base64url').toString('base64url') !== item.signature)
111
+ fail('signature');
112
+ if (Buffer.byteLength(canonicalGrowthJson(item)) > 65_536)
113
+ fail('certificate bytes');
114
+ }
115
+ export function pluginCreationVerificationSigningPayload(value) {
116
+ return canonicalGrowthJson(value);
117
+ }
118
+ /** Signature and authority equality only; consumers must also recheck provenance. */
119
+ export function verifyPluginCreationVerificationCertificate(value, authority, publicKey, now = Date.now()) {
120
+ try {
121
+ validateCreationAcceptanceAuthorityRef(authority);
122
+ validatePluginCreationVerificationCertificate(value);
123
+ if (!Number.isSafeInteger(now) || value.verifiedAt > now || value.expiresAt <= now
124
+ || canonicalGrowthJson(value.authority) !== canonicalGrowthJson(authority))
125
+ return false;
126
+ const { signature, ...body } = value;
127
+ const key = createPublicKey(publicKey);
128
+ return key.asymmetricKeyType === 'ed25519' && verify(null, Buffer.from(pluginCreationVerificationSigningPayload(body)), key, Buffer.from(signature, 'base64url'));
129
+ }
130
+ catch {
131
+ return false;
132
+ }
133
+ }
134
+ //# sourceMappingURL=creation-verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creation-verification.js","sourceRoot":"","sources":["../src/creation-verification.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -3,5 +3,11 @@ export * from './canonical.js';
3
3
  export * from './automation.js';
4
4
  export * from './preferences.js';
5
5
  export * from './promotion.js';
6
+ export * from './memory-learning.js';
7
+ export * from './source-run.js';
8
+ export * from './source-owner.js';
9
+ export * from './creation-verification.js';
10
+ export * from './revision-verification.js';
11
+ export * from './revision-regression.js';
6
12
  export { version } from './version.js';
7
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
package/lib/index.js CHANGED
@@ -3,5 +3,11 @@ export * from './canonical.js';
3
3
  export * from './automation.js';
4
4
  export * from './preferences.js';
5
5
  export * from './promotion.js';
6
+ export * from './memory-learning.js';
7
+ export * from './source-run.js';
8
+ export * from './source-owner.js';
9
+ export * from './creation-verification.js';
10
+ export * from './revision-verification.js';
11
+ export * from './revision-regression.js';
6
12
  export { version } from './version.js';
7
13
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,70 @@
1
+ /** Host-owned scope, never selected by a candidate model. */
2
+ export interface MemoryLearningOwner {
3
+ authorityId: string;
4
+ authorityHash: string;
5
+ principalId: string;
6
+ principalRecordId: string;
7
+ principalVersion: number;
8
+ workspace: string;
9
+ agentPreset: string;
10
+ }
11
+ /** Locators to reread, not an assertion that their contents are trustworthy. */
12
+ export interface MemoryLearningSource {
13
+ inboxId: string;
14
+ sourceDigest: string;
15
+ contentDigest: string;
16
+ canonical?: {
17
+ outcomeId: string;
18
+ version: number;
19
+ digest: string;
20
+ objectiveStatus: 'achieved' | 'not-achieved';
21
+ };
22
+ }
23
+ export interface MemoryLearningEntry {
24
+ kind: 'fact' | 'experience';
25
+ content: string;
26
+ knowledge?: {
27
+ claim?: {
28
+ key: string;
29
+ value: string;
30
+ };
31
+ applicability?: readonly string[];
32
+ counterexamples?: readonly string[];
33
+ };
34
+ }
35
+ /** No namespace, trust, confidence, TTL, provenance or authority is model writable. */
36
+ export type MemoryLearningMutation = {
37
+ op: 'add';
38
+ entry: MemoryLearningEntry;
39
+ } | {
40
+ op: 'replace';
41
+ id: string;
42
+ expectedVersion: number;
43
+ entry: MemoryLearningEntry;
44
+ } | {
45
+ op: 'remove';
46
+ id: string;
47
+ expectedVersion: number;
48
+ };
49
+ export interface MemoryLearningProposal {
50
+ mutation: MemoryLearningMutation;
51
+ /** Exact source quotation. Its meaning and source must be checked independently. */
52
+ evidenceQuote: string;
53
+ }
54
+ export interface MemoryLearningReviewRequest extends MemoryLearningProposal {
55
+ protocol: 'memory-learning-review/v1';
56
+ operationId: string;
57
+ extractionSessionId: string;
58
+ owner: MemoryLearningOwner;
59
+ source: MemoryLearningSource;
60
+ }
61
+ export declare class MemoryLearningContractError extends Error {
62
+ constructor(message: string);
63
+ }
64
+ export declare function validateMemoryLearningOwner(value: unknown): MemoryLearningOwner;
65
+ /** Strictly validate model data; this does not approve or apply a memory. */
66
+ export declare function validateMemoryLearningProposal(value: unknown): MemoryLearningProposal;
67
+ /** Validate a Host-assembled request. Consumers must still reread every source. */
68
+ export declare function validateMemoryLearningReviewRequest(value: unknown): MemoryLearningReviewRequest;
69
+ export declare function memoryLearningRequestDigest(value: MemoryLearningReviewRequest): string;
70
+ //# sourceMappingURL=memory-learning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-learning.d.ts","sourceRoot":"","sources":["../src/memory-learning.ts"],"names":[],"mappings":"AAGA,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE;QACV,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;QACd,eAAe,EAAE,UAAU,GAAG,cAAc,CAAA;KAC7C,CAAA;CACF;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAA;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE;QACV,KAAK,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;QACtC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;QACjC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KACpC,CAAA;CACF;AAED,uFAAuF;AACvF,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GAClF;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,sBAAsB,CAAA;IAChC,oFAAoF;IACpF,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,2BAA4B,SAAQ,sBAAsB;IACzE,QAAQ,EAAE,2BAA2B,CAAA;IACrC,WAAW,EAAE,MAAM,CAAA;IACnB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,KAAK,EAAE,mBAAmB,CAAA;IAC1B,MAAM,EAAE,oBAAoB,CAAA;CAC7B;AAED,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM;CAC5B;AA+ED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAS/E;AAED,6EAA6E;AAC7E,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAGrF;AAED,mFAAmF;AACnF,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,OAAO,GAAG,2BAA2B,CAgB/F;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,2BAA2B,GAAG,MAAM,CAEtF"}
@@ -0,0 +1,146 @@
1
+ import { isAbsolute, resolve } from 'node:path';
2
+ import { growthObjectDigest, validateExternalPrincipalId } from './canonical.js';
3
+ export class MemoryLearningContractError extends Error {
4
+ constructor(message) { super(message); this.name = 'MemoryLearningContractError'; }
5
+ }
6
+ function fail(label) { throw new MemoryLearningContractError(`Invalid memory learning ${label}`); }
7
+ /** Reject accessors before reading values, including optional and non-enumerable fields. */
8
+ function object(value, required, optional = []) {
9
+ if (!value || typeof value !== 'object' || Array.isArray(value)
10
+ || ![Object.prototype, null].includes(Object.getPrototypeOf(value)))
11
+ fail('object');
12
+ const descriptors = Object.getOwnPropertyDescriptors(value);
13
+ if (Reflect.ownKeys(value).some(key => typeof key !== 'string' || ![...required, ...optional].includes(key))
14
+ || required.some(key => !Object.hasOwn(descriptors, key))
15
+ || Object.values(descriptors).some(field => !field.enumerable || !('value' in field)))
16
+ fail('object fields');
17
+ return value;
18
+ }
19
+ function text(value, max) {
20
+ if (typeof value !== 'string' || !value.trim() || value.includes('\0')
21
+ || !value.isWellFormed() || Buffer.byteLength(value) > max)
22
+ fail('text');
23
+ }
24
+ function identifier(value) {
25
+ text(value, 256);
26
+ if (!/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$/u.test(value))
27
+ fail('identifier');
28
+ }
29
+ function digest(value) {
30
+ if (typeof value !== 'string' || !/^[a-f0-9]{64}$/u.test(value))
31
+ fail('digest');
32
+ }
33
+ function positive(value) {
34
+ if (!Number.isSafeInteger(value) || value < 1)
35
+ fail('version');
36
+ }
37
+ function phrases(value) {
38
+ if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype
39
+ || value.length < 1 || value.length > 4)
40
+ fail('knowledge list');
41
+ for (let i = 0; i < value.length; i++) {
42
+ const field = Object.getOwnPropertyDescriptor(value, String(i));
43
+ if (!field || !field.enumerable || !('value' in field))
44
+ fail('knowledge list item');
45
+ text(field.value, 256);
46
+ if (field.value !== field.value.normalize('NFC').trim())
47
+ fail('knowledge normalization');
48
+ }
49
+ if (Reflect.ownKeys(value).length !== value.length + 1 || new Set(value).size !== value.length)
50
+ fail('knowledge list fields');
51
+ }
52
+ function entry(value) {
53
+ const item = object(value, ['kind', 'content'], ['knowledge']);
54
+ if (item.kind !== 'fact' && item.kind !== 'experience')
55
+ fail('kind');
56
+ text(item.content, 4096);
57
+ if (item.content !== item.content.normalize('NFC').trim())
58
+ fail('content normalization');
59
+ if (Object.hasOwn(item, 'knowledge')) {
60
+ const knowledge = object(item.knowledge, [], ['claim', 'applicability', 'counterexamples']);
61
+ if (Object.keys(knowledge).length === 0)
62
+ fail('empty knowledge');
63
+ if (Object.hasOwn(knowledge, 'claim')) {
64
+ const claim = object(knowledge.claim, ['key', 'value']);
65
+ text(claim.key, 128);
66
+ text(claim.value, 256);
67
+ if (!/^[a-z0-9][a-z0-9._:-]*$/u.test(claim.key)
68
+ || claim.value !== claim.value.normalize('NFC').trim())
69
+ fail('claim normalization');
70
+ }
71
+ if (Object.hasOwn(knowledge, 'applicability'))
72
+ phrases(knowledge.applicability);
73
+ if (Object.hasOwn(knowledge, 'counterexamples'))
74
+ phrases(knowledge.counterexamples);
75
+ if (Buffer.byteLength(item.content) + Buffer.byteLength(JSON.stringify(knowledge)) > 4096)
76
+ fail('entry bytes');
77
+ }
78
+ }
79
+ function proposal(value, extra = []) {
80
+ const input = object(value, ['mutation', 'evidenceQuote', ...extra]);
81
+ text(input.evidenceQuote, 4096);
82
+ // Inspect the discriminant only after rejecting arbitrary accessors.
83
+ const mutation = object(input.mutation, ['op'], ['id', 'expectedVersion', 'entry']);
84
+ if (mutation.op === 'add') {
85
+ object(mutation, ['op', 'entry']);
86
+ entry(mutation.entry);
87
+ }
88
+ else if (mutation.op === 'replace' || mutation.op === 'remove') {
89
+ object(mutation, ['op', 'id', 'expectedVersion', ...(mutation.op === 'replace' ? ['entry'] : [])]);
90
+ identifier(mutation.id);
91
+ positive(mutation.expectedVersion);
92
+ if (mutation.op === 'replace')
93
+ entry(mutation.entry);
94
+ }
95
+ else
96
+ fail('operation');
97
+ }
98
+ export function validateMemoryLearningOwner(value) {
99
+ const owner = object(value, ['authorityId', 'authorityHash', 'principalId', 'principalRecordId',
100
+ 'principalVersion', 'workspace', 'agentPreset']);
101
+ identifier(owner.authorityId);
102
+ digest(owner.authorityHash);
103
+ validateExternalPrincipalId(owner.principalId);
104
+ identifier(owner.principalRecordId);
105
+ positive(owner.principalVersion);
106
+ identifier(owner.agentPreset);
107
+ text(owner.workspace, 4096);
108
+ if (!isAbsolute(owner.workspace) || resolve(owner.workspace) !== owner.workspace || owner.workspace === '/')
109
+ fail('workspace');
110
+ return structuredClone(value);
111
+ }
112
+ /** Strictly validate model data; this does not approve or apply a memory. */
113
+ export function validateMemoryLearningProposal(value) {
114
+ proposal(value);
115
+ return structuredClone(value);
116
+ }
117
+ /** Validate a Host-assembled request. Consumers must still reread every source. */
118
+ export function validateMemoryLearningReviewRequest(value) {
119
+ proposal(value, ['protocol', 'operationId', 'extractionSessionId', 'owner', 'source']);
120
+ const request = value;
121
+ if (request.protocol !== 'memory-learning-review/v1')
122
+ fail('protocol');
123
+ identifier(request.operationId);
124
+ identifier(request.extractionSessionId);
125
+ validateMemoryLearningOwner(request.owner);
126
+ const source = object(request.source, ['inboxId', 'sourceDigest', 'contentDigest'], ['canonical']);
127
+ identifier(source.inboxId);
128
+ digest(source.sourceDigest);
129
+ digest(source.contentDigest);
130
+ if (Object.hasOwn(source, 'canonical')) {
131
+ const canonical = object(source.canonical, ['outcomeId', 'version', 'digest', 'objectiveStatus']);
132
+ identifier(canonical.outcomeId);
133
+ positive(canonical.version);
134
+ digest(canonical.digest);
135
+ if (canonical.objectiveStatus !== 'achieved' && canonical.objectiveStatus !== 'not-achieved')
136
+ fail('objective status');
137
+ }
138
+ if (request.mutation.op !== 'remove'
139
+ && request.mutation.entry.kind === 'experience' && source.canonical === undefined)
140
+ fail('experience without outcome');
141
+ return structuredClone(request);
142
+ }
143
+ export function memoryLearningRequestDigest(value) {
144
+ return growthObjectDigest(validateMemoryLearningReviewRequest(value));
145
+ }
146
+ //# sourceMappingURL=memory-learning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-learning.js","sourceRoot":"","sources":["../src/memory-learning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { type PluginRevisionParentBinding, type PluginRevisionVerificationCertificate } from './revision-verification.js';
2
+ /** Independent owner policy for testing retained parent behavior before any version switch. */
3
+ export interface RevisionRegressionAcceptanceAuthorityRef {
4
+ protocol: 'assistant-growth/revision-regression-acceptance-authority/v1';
5
+ authorityId: string;
6
+ keyId: string;
7
+ authorityDigest: string;
8
+ namePrefix: string;
9
+ expiresAt: number;
10
+ }
11
+ export interface PluginRevisionRegressionCertificate {
12
+ protocol: 'assistant-growth/revision-regression/v1';
13
+ verificationId: string;
14
+ authority: RevisionRegressionAcceptanceAuthorityRef;
15
+ plan: PluginRevisionVerificationCertificate['plan'];
16
+ parent: PluginRevisionParentBinding;
17
+ source: PluginRevisionVerificationCertificate['source'];
18
+ /** Digest of the actual retained, independent parent cases; consumers check it against the parent certificate. */
19
+ contractDigest: string;
20
+ schemaDigest: string;
21
+ environment: PluginRevisionVerificationCertificate['environment'];
22
+ model: PluginRevisionVerificationCertificate['model'];
23
+ candidateVerificationDigest: string;
24
+ sourceDigest: string;
25
+ schemaCompatibilityDigest: string;
26
+ budget: {
27
+ maxCases: number;
28
+ maxDurationMs: number;
29
+ maxRuns: number;
30
+ };
31
+ observations: readonly {
32
+ caseId: string;
33
+ parent: {
34
+ jobId: string;
35
+ operationDigest: string;
36
+ observationDigest: string;
37
+ };
38
+ candidate: {
39
+ jobId: string;
40
+ operationDigest: string;
41
+ observationDigest: string;
42
+ };
43
+ }[];
44
+ verifiedAt: number;
45
+ expiresAt: number;
46
+ signature: string;
47
+ }
48
+ export interface PluginRevisionRegressionRequest {
49
+ protocol: 'assistant-growth/revision-regression-request/v1';
50
+ planId: string;
51
+ }
52
+ export type PluginRevisionRegressionResult = {
53
+ status: 'verified';
54
+ certificate: PluginRevisionRegressionCertificate;
55
+ } | {
56
+ status: 'rejected' | 'unknown';
57
+ reason: string;
58
+ };
59
+ export declare function validateRevisionRegressionAcceptanceAuthorityRef(value: unknown): asserts value is RevisionRegressionAcceptanceAuthorityRef;
60
+ export declare function validatePluginRevisionRegressionRequest(value: unknown): asserts value is PluginRevisionRegressionRequest;
61
+ export declare function validatePluginRevisionRegressionCertificate(value: unknown): asserts value is PluginRevisionRegressionCertificate;
62
+ export declare function pluginRevisionRegressionSigningPayload(value: Omit<PluginRevisionRegressionCertificate, 'signature'>): string;
63
+ /** Signature and authority equality only; consumers must recheck parent certificate bindings, provenance and source currency. */
64
+ export declare function verifyPluginRevisionRegressionCertificate(value: unknown, authority: RevisionRegressionAcceptanceAuthorityRef, publicKey: string, now?: number): value is PluginRevisionRegressionCertificate;
65
+ //# sourceMappingURL=revision-regression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-regression.d.ts","sourceRoot":"","sources":["../src/revision-regression.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuC,KAAK,2BAA2B,EAC5E,KAAK,qCAAqC,EAAE,MAAM,4BAA4B,CAAA;AAEhF,+FAA+F;AAC/F,MAAM,WAAW,wCAAwC;IACvD,QAAQ,EAAE,8DAA8D,CAAA;IACxE,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,mCAAmC;IAClD,QAAQ,EAAE,yCAAyC,CAAA;IACnD,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,wCAAwC,CAAA;IACnD,IAAI,EAAE,qCAAqC,CAAC,MAAM,CAAC,CAAA;IACnD,MAAM,EAAE,2BAA2B,CAAA;IACnC,MAAM,EAAE,qCAAqC,CAAC,QAAQ,CAAC,CAAA;IACvD,kHAAkH;IAClH,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,qCAAqC,CAAC,aAAa,CAAC,CAAA;IACjE,KAAK,EAAE,qCAAqC,CAAC,OAAO,CAAC,CAAA;IACrD,2BAA2B,EAAE,MAAM,CAAA;IACnC,YAAY,EAAE,MAAM,CAAA;IACpB,yBAAyB,EAAE,MAAM,CAAA;IACjC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACpE,YAAY,EAAE,SAAS;QACrB,MAAM,EAAE,MAAM,CAAA;QACd,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAC;YAAC,iBAAiB,EAAE,MAAM,CAAA;SAAE,CAAA;QAC7E,SAAS,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAC;YAAC,iBAAiB,EAAE,MAAM,CAAA;SAAE,CAAA;KACjF,EAAE,CAAA;IACH,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,iDAAiD,CAAA;IAC3D,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,MAAM,8BAA8B,GACtC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,mCAAmC,CAAA;CAAE,GACxE;IAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAwCtD,wBAAgB,gDAAgD,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,wCAAwC,CAO1I;AAED,wBAAgB,uCAAuC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,+BAA+B,CAIxH;AAED,wBAAgB,2CAA2C,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,mCAAmC,CAqDhI;AAED,wBAAgB,sCAAsC,CAAC,KAAK,EAAE,IAAI,CAAC,mCAAmC,EAAE,WAAW,CAAC,GAAG,MAAM,CAI5H;AAED,iIAAiI;AACjI,wBAAgB,yCAAyC,CAAC,KAAK,EAAE,OAAO,EACtE,SAAS,EAAE,wCAAwC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,KAAK,IAAI,mCAAmC,CAWxI"}