@oscharko-dev/keiko-contracts 0.2.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/.tsbuildinfo +1 -0
- package/dist/bff-wire.d.ts +661 -0
- package/dist/bff-wire.d.ts.map +1 -0
- package/dist/bff-wire.js +102 -0
- package/dist/bug-investigation-events.d.ts +92 -0
- package/dist/bug-investigation-events.d.ts.map +1 -0
- package/dist/bug-investigation-events.js +18 -0
- package/dist/coding-context.d.ts +76 -0
- package/dist/coding-context.d.ts.map +1 -0
- package/dist/coding-context.js +158 -0
- package/dist/connected-context.d.ts +174 -0
- package/dist/connected-context.d.ts.map +1 -0
- package/dist/connected-context.js +636 -0
- package/dist/conversation-budget.d.ts +37 -0
- package/dist/conversation-budget.d.ts.map +1 -0
- package/dist/conversation-budget.js +97 -0
- package/dist/editor-agent.d.ts +131 -0
- package/dist/editor-agent.d.ts.map +1 -0
- package/dist/editor-agent.js +197 -0
- package/dist/editor-completion.d.ts +62 -0
- package/dist/editor-completion.d.ts.map +1 -0
- package/dist/editor-completion.js +147 -0
- package/dist/editor-dirty-close.d.ts +17 -0
- package/dist/editor-dirty-close.d.ts.map +1 -0
- package/dist/editor-dirty-close.js +8 -0
- package/dist/editor-hot-exit.d.ts +18 -0
- package/dist/editor-hot-exit.d.ts.map +1 -0
- package/dist/editor-hot-exit.js +42 -0
- package/dist/editor-inline-completion.d.ts +70 -0
- package/dist/editor-inline-completion.d.ts.map +1 -0
- package/dist/editor-inline-completion.js +215 -0
- package/dist/editor-layout.d.ts +105 -0
- package/dist/editor-layout.d.ts.map +1 -0
- package/dist/editor-layout.js +479 -0
- package/dist/editor-patch-apply.d.ts +77 -0
- package/dist/editor-patch-apply.d.ts.map +1 -0
- package/dist/editor-patch-apply.js +122 -0
- package/dist/editor-session.d.ts +31 -0
- package/dist/editor-session.d.ts.map +1 -0
- package/dist/editor-session.js +75 -0
- package/dist/editor-test-generation.d.ts +104 -0
- package/dist/editor-test-generation.d.ts.map +1 -0
- package/dist/editor-test-generation.js +211 -0
- package/dist/evaluations.d.ts +75 -0
- package/dist/evaluations.d.ts.map +1 -0
- package/dist/evaluations.js +16 -0
- package/dist/evidence.d.ts +297 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +9 -0
- package/dist/gateway.d.ts +129 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +66 -0
- package/dist/harness.d.ts +274 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +38 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/language-service.d.ts +145 -0
- package/dist/language-service.d.ts.map +1 -0
- package/dist/language-service.js +161 -0
- package/dist/local-knowledge-large-document-validation.d.ts +7 -0
- package/dist/local-knowledge-large-document-validation.d.ts.map +1 -0
- package/dist/local-knowledge-large-document-validation.js +161 -0
- package/dist/local-knowledge-large-document.d.ts +113 -0
- package/dist/local-knowledge-large-document.d.ts.map +1 -0
- package/dist/local-knowledge-large-document.js +142 -0
- package/dist/local-knowledge-paths.d.ts +3 -0
- package/dist/local-knowledge-paths.d.ts.map +1 -0
- package/dist/local-knowledge-paths.js +65 -0
- package/dist/local-knowledge-records.d.ts +190 -0
- package/dist/local-knowledge-records.d.ts.map +1 -0
- package/dist/local-knowledge-records.js +36 -0
- package/dist/local-knowledge-schema-validation.d.ts +19 -0
- package/dist/local-knowledge-schema-validation.d.ts.map +1 -0
- package/dist/local-knowledge-schema-validation.js +115 -0
- package/dist/local-knowledge-schema.d.ts +14 -0
- package/dist/local-knowledge-schema.d.ts.map +1 -0
- package/dist/local-knowledge-schema.js +715 -0
- package/dist/local-knowledge-validation.d.ts +20 -0
- package/dist/local-knowledge-validation.d.ts.map +1 -0
- package/dist/local-knowledge-validation.js +487 -0
- package/dist/local-knowledge.d.ts +158 -0
- package/dist/local-knowledge.d.ts.map +1 -0
- package/dist/local-knowledge.js +63 -0
- package/dist/memory-audit-events.d.ts +73 -0
- package/dist/memory-audit-events.d.ts.map +1 -0
- package/dist/memory-audit-events.js +44 -0
- package/dist/memory-audit-validation.d.ts +4 -0
- package/dist/memory-audit-validation.d.ts.map +1 -0
- package/dist/memory-audit-validation.js +151 -0
- package/dist/memory-barrel.d.ts +15 -0
- package/dist/memory-barrel.d.ts.map +1 -0
- package/dist/memory-barrel.js +20 -0
- package/dist/memory-internal.d.ts +26 -0
- package/dist/memory-internal.d.ts.map +1 -0
- package/dist/memory-internal.js +104 -0
- package/dist/memory-operations-validation.d.ts +12 -0
- package/dist/memory-operations-validation.d.ts.map +1 -0
- package/dist/memory-operations-validation.js +267 -0
- package/dist/memory-operations.d.ts +156 -0
- package/dist/memory-operations.d.ts.map +1 -0
- package/dist/memory-operations.js +29 -0
- package/dist/memory-record-validation.d.ts +10 -0
- package/dist/memory-record-validation.d.ts.map +1 -0
- package/dist/memory-record-validation.js +101 -0
- package/dist/memory-records.d.ts +66 -0
- package/dist/memory-records.d.ts.map +1 -0
- package/dist/memory-records.js +22 -0
- package/dist/memory-retrieval-validation.d.ts +6 -0
- package/dist/memory-retrieval-validation.d.ts.map +1 -0
- package/dist/memory-retrieval-validation.js +108 -0
- package/dist/memory-validation.d.ts +31 -0
- package/dist/memory-validation.d.ts.map +1 -0
- package/dist/memory-validation.js +318 -0
- package/dist/memory-workflow-port.d.ts +26 -0
- package/dist/memory-workflow-port.d.ts.map +1 -0
- package/dist/memory-workflow-port.js +13 -0
- package/dist/memory.d.ts +81 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +104 -0
- package/dist/prompt-enhancer-analyzer.d.ts +7 -0
- package/dist/prompt-enhancer-analyzer.d.ts.map +1 -0
- package/dist/prompt-enhancer-analyzer.js +745 -0
- package/dist/prompt-enhancer-bff.d.ts +67 -0
- package/dist/prompt-enhancer-bff.d.ts.map +1 -0
- package/dist/prompt-enhancer-bff.js +156 -0
- package/dist/prompt-enhancer-critic.d.ts +46 -0
- package/dist/prompt-enhancer-critic.d.ts.map +1 -0
- package/dist/prompt-enhancer-critic.js +35 -0
- package/dist/prompt-enhancer-grounding.d.ts +19 -0
- package/dist/prompt-enhancer-grounding.d.ts.map +1 -0
- package/dist/prompt-enhancer-grounding.js +235 -0
- package/dist/prompt-enhancer-safety.d.ts +66 -0
- package/dist/prompt-enhancer-safety.d.ts.map +1 -0
- package/dist/prompt-enhancer-safety.js +446 -0
- package/dist/prompt-enhancer-validation.d.ts +28 -0
- package/dist/prompt-enhancer-validation.d.ts.map +1 -0
- package/dist/prompt-enhancer-validation.js +931 -0
- package/dist/prompt-enhancer.d.ts +184 -0
- package/dist/prompt-enhancer.d.ts.map +1 -0
- package/dist/prompt-enhancer.js +350 -0
- package/dist/qualityIntelligence/assertNever.d.ts +2 -0
- package/dist/qualityIntelligence/assertNever.d.ts.map +1 -0
- package/dist/qualityIntelligence/assertNever.js +7 -0
- package/dist/qualityIntelligence/auditSummary.d.ts +25 -0
- package/dist/qualityIntelligence/auditSummary.d.ts.map +1 -0
- package/dist/qualityIntelligence/auditSummary.js +7 -0
- package/dist/qualityIntelligence/bffWire.d.ts +356 -0
- package/dist/qualityIntelligence/bffWire.d.ts.map +1 -0
- package/dist/qualityIntelligence/bffWire.js +22 -0
- package/dist/qualityIntelligence/coverageMap.d.ts +21 -0
- package/dist/qualityIntelligence/coverageMap.d.ts.map +1 -0
- package/dist/qualityIntelligence/coverageMap.js +29 -0
- package/dist/qualityIntelligence/editableRevision.d.ts +21 -0
- package/dist/qualityIntelligence/editableRevision.d.ts.map +1 -0
- package/dist/qualityIntelligence/editableRevision.js +8 -0
- package/dist/qualityIntelligence/evidenceAtom.d.ts +35 -0
- package/dist/qualityIntelligence/evidenceAtom.d.ts.map +1 -0
- package/dist/qualityIntelligence/evidenceAtom.js +29 -0
- package/dist/qualityIntelligence/exportBundle.d.ts +28 -0
- package/dist/qualityIntelligence/exportBundle.d.ts.map +1 -0
- package/dist/qualityIntelligence/exportBundle.js +46 -0
- package/dist/qualityIntelligence/handoffEnvelope.d.ts +23 -0
- package/dist/qualityIntelligence/handoffEnvelope.d.ts.map +1 -0
- package/dist/qualityIntelligence/handoffEnvelope.js +8 -0
- package/dist/qualityIntelligence/ids.d.ts +58 -0
- package/dist/qualityIntelligence/ids.d.ts.map +1 -0
- package/dist/qualityIntelligence/ids.js +93 -0
- package/dist/qualityIntelligence/index.d.ts +29 -0
- package/dist/qualityIntelligence/index.d.ts.map +1 -0
- package/dist/qualityIntelligence/index.js +20 -0
- package/dist/qualityIntelligence/reviewRecord.d.ts +19 -0
- package/dist/qualityIntelligence/reviewRecord.d.ts.map +1 -0
- package/dist/qualityIntelligence/reviewRecord.js +20 -0
- package/dist/qualityIntelligence/runPlanAndEvents.d.ts +84 -0
- package/dist/qualityIntelligence/runPlanAndEvents.d.ts.map +1 -0
- package/dist/qualityIntelligence/runPlanAndEvents.js +51 -0
- package/dist/qualityIntelligence/sourceEnvelope.d.ts +77 -0
- package/dist/qualityIntelligence/sourceEnvelope.d.ts.map +1 -0
- package/dist/qualityIntelligence/sourceEnvelope.js +118 -0
- package/dist/qualityIntelligence/testCaseCandidate.d.ts +21 -0
- package/dist/qualityIntelligence/testCaseCandidate.d.ts.map +1 -0
- package/dist/qualityIntelligence/testCaseCandidate.js +21 -0
- package/dist/qualityIntelligence/testQualityRubric.d.ts +17 -0
- package/dist/qualityIntelligence/testQualityRubric.d.ts.map +1 -0
- package/dist/qualityIntelligence/testQualityRubric.js +32 -0
- package/dist/qualityIntelligence/validationFinding.d.ts +48 -0
- package/dist/qualityIntelligence/validationFinding.d.ts.map +1 -0
- package/dist/qualityIntelligence/validationFinding.js +36 -0
- package/dist/relationships-validation.d.ts +13 -0
- package/dist/relationships-validation.d.ts.map +1 -0
- package/dist/relationships-validation.js +422 -0
- package/dist/relationships.d.ts +79 -0
- package/dist/relationships.d.ts.map +1 -0
- package/dist/relationships.js +307 -0
- package/dist/text-safety.d.ts +7 -0
- package/dist/text-safety.d.ts.map +1 -0
- package/dist/text-safety.js +58 -0
- package/dist/tools.d.ts +153 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +118 -0
- package/dist/unit-test-events.d.ts +87 -0
- package/dist/unit-test-events.d.ts.map +1 -0
- package/dist/unit-test-events.js +14 -0
- package/dist/verification-summary.d.ts +38 -0
- package/dist/verification-summary.d.ts.map +1 -0
- package/dist/verification-summary.js +5 -0
- package/dist/verification.d.ts +64 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +13 -0
- package/dist/workflow-descriptor.d.ts +21 -0
- package/dist/workflow-descriptor.d.ts.map +1 -0
- package/dist/workflow-descriptor.js +8 -0
- package/dist/workflow-handoff.d.ts +69 -0
- package/dist/workflow-handoff.d.ts.map +1 -0
- package/dist/workflow-handoff.js +381 -0
- package/dist/workspace-descriptors.d.ts +21 -0
- package/dist/workspace-descriptors.d.ts.map +1 -0
- package/dist/workspace-descriptors.js +180 -0
- package/dist/workspace-ui.d.ts +119 -0
- package/dist/workspace-ui.d.ts.map +1 -0
- package/dist/workspace-ui.js +105 -0
- package/dist/workspace.d.ts +104 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +27 -0
- package/package.json +71 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Public type contracts for the Local Knowledge Connector surface (Epic #189, Issue #191).
|
|
2
|
+
// Pure types and pure validators only — no IO, no clock reads, no hashing, no randomness, no
|
|
3
|
+
// filesystem access. Leaf-package rule (ADR-0019 direction 1): no `@oscharko-dev/keiko-*`
|
|
4
|
+
// imports may appear in this module. The schemaVersion discriminant follows the same
|
|
5
|
+
// evolution rule as CONNECTED_CONTEXT_SCHEMA_VERSION (ADR-0010 D2): a breaking change
|
|
6
|
+
// introduces a NEW literal member rather than mutating "1".
|
|
7
|
+
//
|
|
8
|
+
// Foundry IQ composition (issue #191): KnowledgeSource, KnowledgeCapsule, and CapsuleSet are
|
|
9
|
+
// modelled as three separate concepts. Every document-derived record (DocumentRecord,
|
|
10
|
+
// ChunkRecord, VectorRecord, CitationReference, RetrievalReference) carries explicit
|
|
11
|
+
// capsuleId + sourceId + documentId lineage so a single global knowledge pool is
|
|
12
|
+
// unrepresentable in the type system.
|
|
13
|
+
//
|
|
14
|
+
// Browser safety: `ChunkRecord` carries `safeExcerptHash`, not raw extracted text, so the
|
|
15
|
+
// contract surface remains safe to send to a browser surface without re-redaction. Raw
|
|
16
|
+
// content lives only inside the local-knowledge runtime, never on the wire.
|
|
17
|
+
// ─── Schema version ───────────────────────────────────────────────────────────
|
|
18
|
+
export const LOCAL_KNOWLEDGE_SCHEMA_VERSION = "1";
|
|
19
|
+
export const EMBEDDING_VECTOR_METRICS = [
|
|
20
|
+
"cosine",
|
|
21
|
+
"euclidean",
|
|
22
|
+
"dot",
|
|
23
|
+
];
|
|
24
|
+
export const KNOWLEDGE_SOURCE_SCOPE_KINDS = [
|
|
25
|
+
"folder",
|
|
26
|
+
"repository",
|
|
27
|
+
"files",
|
|
28
|
+
];
|
|
29
|
+
export const CAPSULE_LIFECYCLE_STATES = [
|
|
30
|
+
"draft",
|
|
31
|
+
"indexing",
|
|
32
|
+
"ready",
|
|
33
|
+
"stale",
|
|
34
|
+
"deleting",
|
|
35
|
+
"error",
|
|
36
|
+
];
|
|
37
|
+
export const CAPSULE_RETRIEVAL_EFFORTS = [
|
|
38
|
+
"minimal",
|
|
39
|
+
"default",
|
|
40
|
+
"deep",
|
|
41
|
+
];
|
|
42
|
+
export const CAPSULE_OUTPUT_MODES = [
|
|
43
|
+
"answers",
|
|
44
|
+
"snippets",
|
|
45
|
+
"raw",
|
|
46
|
+
];
|
|
47
|
+
export const CAPSULE_ANSWER_GROUNDING_POLICIES = [
|
|
48
|
+
"require-citations",
|
|
49
|
+
"require-citations-or-state-no-evidence",
|
|
50
|
+
"best-effort",
|
|
51
|
+
];
|
|
52
|
+
// ─── Capsule management wire types (Slice 4 / Issue #189) ─────────────────────
|
|
53
|
+
// Bounded limits matching the spec (≤16 keys, key ≤128, value ≤1024 chars).
|
|
54
|
+
export const CAPSULE_METADATA_MAX_KEYS = 16;
|
|
55
|
+
export const CAPSULE_METADATA_KEY_MAX_CHARS = 128;
|
|
56
|
+
export const CAPSULE_METADATA_VALUE_MAX_CHARS = 1024;
|
|
57
|
+
// Maximum members in a capsule set (non-destructive composition cap).
|
|
58
|
+
export const CAPSULE_SET_MAX_MEMBERS = 16;
|
|
59
|
+
export const CONNECTOR_NODE_KINDS = [
|
|
60
|
+
"files-window",
|
|
61
|
+
"local-knowledge",
|
|
62
|
+
"conversation-center",
|
|
63
|
+
];
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { MemoryAuditInitiatorSurface, MemoryId, MemoryScope } from "./memory-barrel.js";
|
|
2
|
+
export declare const MEMORY_AUDIT_EVENT_SCHEMA_VERSION: "1";
|
|
3
|
+
export declare const MEMORY_AUDIT_EVENT_SUMMARY_MAX_CHARS = 240;
|
|
4
|
+
export type MemoryAuditEventKind = "memory:proposed" | "memory:accepted" | "memory:rejected" | "memory:updated" | "memory:superseded" | "memory:pinned" | "memory:unpinned" | "memory:archived" | "memory:forgotten" | "memory:retrieved" | "memory:workflow-used" | "memory:workflow-omitted" | "memory:workflow-write-candidate";
|
|
5
|
+
export declare const MEMORY_AUDIT_EVENT_KINDS: readonly MemoryAuditEventKind[];
|
|
6
|
+
interface MemoryAuditEventEnvelope {
|
|
7
|
+
readonly schemaVersion: typeof MEMORY_AUDIT_EVENT_SCHEMA_VERSION;
|
|
8
|
+
readonly eventId: string;
|
|
9
|
+
readonly occurredAt: number;
|
|
10
|
+
readonly initiatorSurface: MemoryAuditInitiatorSurface;
|
|
11
|
+
readonly summary: string;
|
|
12
|
+
}
|
|
13
|
+
export type MemoryAuditEvent = (MemoryAuditEventEnvelope & {
|
|
14
|
+
readonly kind: "memory:proposed";
|
|
15
|
+
readonly memoryId: MemoryId;
|
|
16
|
+
readonly scope: MemoryScope;
|
|
17
|
+
}) | (MemoryAuditEventEnvelope & {
|
|
18
|
+
readonly kind: "memory:accepted";
|
|
19
|
+
readonly memoryId: MemoryId;
|
|
20
|
+
readonly scope: MemoryScope;
|
|
21
|
+
}) | (MemoryAuditEventEnvelope & {
|
|
22
|
+
readonly kind: "memory:rejected";
|
|
23
|
+
readonly memoryId: MemoryId;
|
|
24
|
+
readonly scope: MemoryScope;
|
|
25
|
+
}) | (MemoryAuditEventEnvelope & {
|
|
26
|
+
readonly kind: "memory:updated";
|
|
27
|
+
readonly memoryId: MemoryId;
|
|
28
|
+
readonly scope: MemoryScope;
|
|
29
|
+
}) | (MemoryAuditEventEnvelope & {
|
|
30
|
+
readonly kind: "memory:superseded";
|
|
31
|
+
readonly oldMemoryId: MemoryId;
|
|
32
|
+
readonly newMemoryId: MemoryId;
|
|
33
|
+
readonly scope: MemoryScope;
|
|
34
|
+
}) | (MemoryAuditEventEnvelope & {
|
|
35
|
+
readonly kind: "memory:pinned";
|
|
36
|
+
readonly memoryId: MemoryId;
|
|
37
|
+
readonly scope: MemoryScope;
|
|
38
|
+
}) | (MemoryAuditEventEnvelope & {
|
|
39
|
+
readonly kind: "memory:unpinned";
|
|
40
|
+
readonly memoryId: MemoryId;
|
|
41
|
+
readonly scope: MemoryScope;
|
|
42
|
+
}) | (MemoryAuditEventEnvelope & {
|
|
43
|
+
readonly kind: "memory:archived";
|
|
44
|
+
readonly memoryId: MemoryId;
|
|
45
|
+
readonly scope: MemoryScope;
|
|
46
|
+
}) | (MemoryAuditEventEnvelope & {
|
|
47
|
+
readonly kind: "memory:forgotten";
|
|
48
|
+
readonly memoryId: MemoryId;
|
|
49
|
+
readonly scope: MemoryScope;
|
|
50
|
+
readonly tombstoned: boolean;
|
|
51
|
+
}) | (MemoryAuditEventEnvelope & {
|
|
52
|
+
readonly kind: "memory:retrieved";
|
|
53
|
+
readonly scopes: readonly MemoryScope[];
|
|
54
|
+
readonly matchedMemoryIds: readonly MemoryId[];
|
|
55
|
+
}) | (MemoryAuditEventEnvelope & {
|
|
56
|
+
readonly kind: "memory:workflow-used";
|
|
57
|
+
readonly workflowRunId: string;
|
|
58
|
+
readonly usedMemoryIds: readonly MemoryId[];
|
|
59
|
+
}) | (MemoryAuditEventEnvelope & {
|
|
60
|
+
readonly kind: "memory:workflow-omitted";
|
|
61
|
+
readonly workflowRunId: string;
|
|
62
|
+
readonly scopes: readonly MemoryScope[];
|
|
63
|
+
readonly omittedMemoryId: MemoryId;
|
|
64
|
+
readonly reason: string;
|
|
65
|
+
}) | (MemoryAuditEventEnvelope & {
|
|
66
|
+
readonly kind: "memory:workflow-write-candidate";
|
|
67
|
+
readonly workflowRunId: string;
|
|
68
|
+
readonly source: "workflow-success" | "workflow-correction";
|
|
69
|
+
readonly scope: MemoryScope;
|
|
70
|
+
readonly proposedMemoryIds: readonly MemoryId[];
|
|
71
|
+
});
|
|
72
|
+
export {};
|
|
73
|
+
//# sourceMappingURL=memory-audit-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-audit-events.d.ts","sourceRoot":"","sources":["../src/memory-audit-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Memory audit event surface for the Governed Enterprise Memory Vault (Epic #204, Issue
|
|
2
|
+
// #214). Pure types only — no IO, no clock reads, no randomness. Leaf-package rule
|
|
3
|
+
// (ADR-0019 direction 1): no `@oscharko-dev/keiko-*` imports.
|
|
4
|
+
//
|
|
5
|
+
// `MemoryAuditEvent` is the AUDIT-LAYER projection of the vault's structural `MemoryEvent`
|
|
6
|
+
// (defined inside keiko-memory-vault). The vault emits low-level state-change events
|
|
7
|
+
// ("memory:inserted", "memory:updated", "memory:deleted", "memory:tombstoned", "edge:*",
|
|
8
|
+
// "embedding:upserted"); the audit bridge (`keiko-server/memory-audit-handler`) MAPS each
|
|
9
|
+
// structural event into one of the SEMANTIC kinds in this file by reading the new record's
|
|
10
|
+
// status, comparing against a previous-status cache, and classifying the transition.
|
|
11
|
+
//
|
|
12
|
+
// Retrieval/workflow-specific kinds are NOT emitted by the vault. They are surfaced here
|
|
13
|
+
// so the audit ledger has a single closed type for every memory-touching audit signal.
|
|
14
|
+
// Retrieval and workflow integration layers emit them directly via `recordMemoryAudit(...)`.
|
|
15
|
+
// They are listed in `MEMORY_AUDIT_EVENT_KINDS` so the closed enum is stable across schema
|
|
16
|
+
// versions.
|
|
17
|
+
//
|
|
18
|
+
// Audit invariant (mirrors `MemoryAuditRecord`): NEVER carry raw memory body or payload.
|
|
19
|
+
// `summary` is a short, REDACTED rationale (bounded length). `scope` and IDs are
|
|
20
|
+
// non-secret; scope-coordinate strings are run through the audit redactor at persist time
|
|
21
|
+
// in case a user-supplied identifier happens to match a credential shape.
|
|
22
|
+
// ─── Schema version ───────────────────────────────────────────────────────────
|
|
23
|
+
// Pinned to "1". A breaking change introduces a NEW literal member rather than mutating
|
|
24
|
+
// "1" — the same evolution rule as `MEMORY_SCHEMA_VERSION` and the other contract surfaces.
|
|
25
|
+
export const MEMORY_AUDIT_EVENT_SCHEMA_VERSION = "1";
|
|
26
|
+
// Maximum length for `summary`. Audit ledger summaries are dense human-readable strings,
|
|
27
|
+
// not bodies. The bound matches `MEMORY_SUMMARY_MAX_CHARS` (240 chars) used in the audit
|
|
28
|
+
// record validator so the two audit surfaces stay aligned at the boundary.
|
|
29
|
+
export const MEMORY_AUDIT_EVENT_SUMMARY_MAX_CHARS = 240;
|
|
30
|
+
export const MEMORY_AUDIT_EVENT_KINDS = [
|
|
31
|
+
"memory:proposed",
|
|
32
|
+
"memory:accepted",
|
|
33
|
+
"memory:rejected",
|
|
34
|
+
"memory:updated",
|
|
35
|
+
"memory:superseded",
|
|
36
|
+
"memory:pinned",
|
|
37
|
+
"memory:unpinned",
|
|
38
|
+
"memory:archived",
|
|
39
|
+
"memory:forgotten",
|
|
40
|
+
"memory:retrieved",
|
|
41
|
+
"memory:workflow-used",
|
|
42
|
+
"memory:workflow-omitted",
|
|
43
|
+
"memory:workflow-write-candidate",
|
|
44
|
+
];
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { MemoryAuditRecord } from "./memory-operations.js";
|
|
2
|
+
import { type MemoryValidation } from "./memory-validation.js";
|
|
3
|
+
export declare function validateMemoryAuditRecord(input: unknown): MemoryValidation<MemoryAuditRecord>;
|
|
4
|
+
//# sourceMappingURL=memory-audit-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-audit-validation.d.ts","sourceRoot":"","sources":["../src/memory-audit-validation.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAIhE,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAgJhC,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAqB7F"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// Pure validators for the memory audit ledger envelope (Epic #204, Issue #205). Sibling
|
|
2
|
+
// of `memory-operations-validation.ts` and `memory-retrieval-validation.ts`.
|
|
3
|
+
//
|
|
4
|
+
// Audit invariant: a `MemoryAuditRecord.summary` MUST NOT carry credential-shaped content.
|
|
5
|
+
// This is defence in depth — the audit ledger persists summaries directly to evidence
|
|
6
|
+
// storage (#214), so a leaked secret would otherwise bypass body-only redaction sweeps.
|
|
7
|
+
// The shape check is `looksLikeSecretShape` from memory-validation.ts.
|
|
8
|
+
import { MEMORY_AUDIT_INITIATOR_SURFACES, MEMORY_UPDATE_FIELDS } from "./memory-operations.js";
|
|
9
|
+
import { MEMORY_AUDIT_ACTION_KINDS, MEMORY_EDGE_KINDS } from "./memory.js";
|
|
10
|
+
import { looksLikeSecretShape, validateMemoryScope, } from "./memory-validation.js";
|
|
11
|
+
import { MEMORY_REASON_MAX_CHARS, MEMORY_SUMMARY_MAX_CHARS, isFiniteNonNegativeNumber, isMember, isNonEmptyTrimmedString, isRecord, isSafeText, pushNestedErrors, validateMemoryIdString, validateSchemaVersionLiteral, } from "./memory-internal.js";
|
|
12
|
+
// Required field names per audit-action kind. Adding a new kind extends this map AND the
|
|
13
|
+
// `MemoryAuditAction` discriminated union; the validator complains when a present action
|
|
14
|
+
// is missing a required field for its kind.
|
|
15
|
+
const AUDIT_ACTION_KIND_FIELDS = new Map([
|
|
16
|
+
["proposed", ["proposalId", "scope"]],
|
|
17
|
+
["accepted", ["proposalId", "memoryId", "scope"]],
|
|
18
|
+
["rejected", ["proposalId", "reason"]],
|
|
19
|
+
["updated", ["memoryId", "fieldsChanged"]],
|
|
20
|
+
["superseded", ["oldMemoryId", "newMemoryId", "edgeId", "edgeKind"]],
|
|
21
|
+
["pinned", ["memoryId"]],
|
|
22
|
+
["unpinned", ["memoryId"]],
|
|
23
|
+
["archived", ["memoryId"]],
|
|
24
|
+
["forgotten", ["memoryId", "scope", "reason"]],
|
|
25
|
+
["retrieved", ["scopes", "matchedMemoryIds"]],
|
|
26
|
+
]);
|
|
27
|
+
function validateAuditScopeArrayField(value, errors) {
|
|
28
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
29
|
+
errors.push("action.scopes must be a non-empty array");
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
for (const scope of value) {
|
|
33
|
+
pushNestedErrors("action", validateMemoryScope(scope), errors);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function validateAuditMatchedIds(value, errors) {
|
|
37
|
+
if (!Array.isArray(value)) {
|
|
38
|
+
errors.push("action.matchedMemoryIds must be an array");
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
for (const id of value) {
|
|
42
|
+
if (!isNonEmptyTrimmedString(id)) {
|
|
43
|
+
errors.push("action.matchedMemoryIds entry must be a non-empty string");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function validateAuditFieldsChanged(value, errors) {
|
|
49
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
50
|
+
errors.push("action.fieldsChanged must be a non-empty array");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
for (const field of value) {
|
|
54
|
+
if (!isMember(field, MEMORY_UPDATE_FIELDS)) {
|
|
55
|
+
errors.push(`action.fieldsChanged entry must be one of ${MEMORY_UPDATE_FIELDS.join("|")}`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function validateAuditActionFieldShapes(action, errors) {
|
|
61
|
+
if ("scope" in action) {
|
|
62
|
+
pushNestedErrors("action", validateMemoryScope(action.scope), errors);
|
|
63
|
+
}
|
|
64
|
+
if ("scopes" in action) {
|
|
65
|
+
validateAuditScopeArrayField(action.scopes, errors);
|
|
66
|
+
}
|
|
67
|
+
if ("matchedMemoryIds" in action) {
|
|
68
|
+
validateAuditMatchedIds(action.matchedMemoryIds, errors);
|
|
69
|
+
}
|
|
70
|
+
if ("fieldsChanged" in action) {
|
|
71
|
+
validateAuditFieldsChanged(action.fieldsChanged, errors);
|
|
72
|
+
}
|
|
73
|
+
validateOptionalAuditIdField("action.proposalId", action.proposalId, errors);
|
|
74
|
+
validateOptionalAuditIdField("action.memoryId", action.memoryId, errors);
|
|
75
|
+
validateOptionalAuditIdField("action.edgeId", action.edgeId, errors);
|
|
76
|
+
validateOptionalAuditIdField("action.oldMemoryId", action.oldMemoryId, errors);
|
|
77
|
+
validateOptionalAuditIdField("action.newMemoryId", action.newMemoryId, errors);
|
|
78
|
+
if ("edgeKind" in action && !isMember(action.edgeKind, MEMORY_EDGE_KINDS)) {
|
|
79
|
+
errors.push(`action.edgeKind must be one of ${MEMORY_EDGE_KINDS.join("|")}`);
|
|
80
|
+
}
|
|
81
|
+
if ("reason" in action && !isSafeText(action.reason, MEMORY_REASON_MAX_CHARS)) {
|
|
82
|
+
errors.push("action.reason must be a bounded control-free non-empty string");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function validateOptionalAuditIdField(field, value, errors) {
|
|
86
|
+
if (value === undefined) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
validateMemoryIdString(field, value, errors);
|
|
90
|
+
}
|
|
91
|
+
function validateAuditActionKindShape(action, errors) {
|
|
92
|
+
if (!isMember(action.kind, MEMORY_AUDIT_ACTION_KINDS)) {
|
|
93
|
+
errors.push(`action.kind must be one of ${MEMORY_AUDIT_ACTION_KINDS.join("|")}`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const expected = AUDIT_ACTION_KIND_FIELDS.get(action.kind);
|
|
97
|
+
if (expected === undefined) {
|
|
98
|
+
errors.push(`action.kind ${action.kind} is missing field expectations`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
for (const field of expected) {
|
|
102
|
+
if (!(field in action)) {
|
|
103
|
+
errors.push(`action.${field} is required for kind=${action.kind}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
validateAuditActionFieldShapes(action, errors);
|
|
107
|
+
}
|
|
108
|
+
function validateAuditRecordCore(input, errors) {
|
|
109
|
+
validateSchemaVersionLiteral(input, errors);
|
|
110
|
+
validateMemoryIdString("auditRecord.id", input.id, errors);
|
|
111
|
+
if (!isMember(input.actionKind, MEMORY_AUDIT_ACTION_KINDS)) {
|
|
112
|
+
errors.push(`auditRecord.actionKind must be one of ${MEMORY_AUDIT_ACTION_KINDS.join("|")}`);
|
|
113
|
+
}
|
|
114
|
+
if (!isMember(input.initiatorSurface, MEMORY_AUDIT_INITIATOR_SURFACES)) {
|
|
115
|
+
errors.push(`auditRecord.initiatorSurface must be one of ${MEMORY_AUDIT_INITIATOR_SURFACES.join("|")}`);
|
|
116
|
+
}
|
|
117
|
+
if (input.initiatorReviewerId !== undefined &&
|
|
118
|
+
!isNonEmptyTrimmedString(input.initiatorReviewerId)) {
|
|
119
|
+
errors.push("auditRecord.initiatorReviewerId must be a non-empty string when set");
|
|
120
|
+
}
|
|
121
|
+
if (!isFiniteNonNegativeNumber(input.occurredAt)) {
|
|
122
|
+
errors.push("auditRecord.occurredAt must be a finite non-negative number");
|
|
123
|
+
}
|
|
124
|
+
if (!isSafeText(input.summary, MEMORY_SUMMARY_MAX_CHARS)) {
|
|
125
|
+
errors.push("auditRecord.summary must be a bounded control-free non-empty string");
|
|
126
|
+
}
|
|
127
|
+
else if (looksLikeSecretShape(input.summary)) {
|
|
128
|
+
errors.push("auditRecord.summary must not carry credential-shaped content");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export function validateMemoryAuditRecord(input) {
|
|
132
|
+
if (!isRecord(input)) {
|
|
133
|
+
return { ok: false, errors: ["auditRecord must be an object"] };
|
|
134
|
+
}
|
|
135
|
+
const errors = [];
|
|
136
|
+
validateAuditRecordCore(input, errors);
|
|
137
|
+
if (!isRecord(input.action)) {
|
|
138
|
+
errors.push("auditRecord.action must be an object");
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
if (isMember(input.actionKind, MEMORY_AUDIT_ACTION_KINDS) &&
|
|
142
|
+
input.action.kind !== input.actionKind) {
|
|
143
|
+
errors.push("auditRecord.action.kind must match auditRecord.actionKind");
|
|
144
|
+
}
|
|
145
|
+
validateAuditActionKindShape(input.action, errors);
|
|
146
|
+
}
|
|
147
|
+
if (errors.length > 0) {
|
|
148
|
+
return { ok: false, errors };
|
|
149
|
+
}
|
|
150
|
+
return { ok: true, value: input };
|
|
151
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type { ConversationId, EvidenceManifestId, MemoryAuditActionKind, MemoryAuditRecordId, MemoryEdgeId, MemoryEdgeKind, MemoryId, MemoryProposalId, MemoryReviewerId, MemoryScope, MemoryScopeKind, MemorySensitivity, MemorySourceKind, MemoryStatus, MemoryType, ProjectId, UserId, WorkflowDefinitionId, WorkflowRunId, WorkspaceId, } from "./memory.js";
|
|
2
|
+
export { MEMORY_AUDIT_ACTION_KINDS, MEMORY_EDGE_KINDS, MEMORY_SCHEMA_VERSION, MEMORY_SCOPE_KINDS, MEMORY_SENSITIVITIES, MEMORY_SOURCE_KINDS, MEMORY_STATUSES, MEMORY_STATUS_TRANSITIONS, MEMORY_TYPES, } from "./memory.js";
|
|
3
|
+
export type { MemoryEdge, MemoryModelIdentity, MemoryProvenance, MemoryRecord, MemoryRetentionHint, MemoryStructuredPayload, MemoryStructuredPayloadKind, MemoryValidityInterval, } from "./memory-records.js";
|
|
4
|
+
export { MEMORY_STRUCTURED_PAYLOAD_KINDS } from "./memory-records.js";
|
|
5
|
+
export type { MemoryAcceptance, MemoryArchive, MemoryAuditAction, MemoryAuditInitiatorSurface, MemoryAuditRecord, MemoryForget, MemoryPin, MemoryProposal, MemoryRejection, MemoryRetrievalRequest, MemorySupersession, MemoryUnpin, MemoryUpdate, MemoryUpdateField, } from "./memory-operations.js";
|
|
6
|
+
export { MEMORY_AUDIT_INITIATOR_SURFACES, MEMORY_UPDATE_FIELDS } from "./memory-operations.js";
|
|
7
|
+
export type { MemoryValidation, MemoryValidationFail, MemoryValidationOk, StaleModelMetadataInput, StatusTransitionCheck, } from "./memory-validation.js";
|
|
8
|
+
export { checkStatusTransition, hasStaleModelMetadata, looksLikeSecretShape, validateMemoryEdge, validateMemoryProvenance, validateMemoryScope, validateMemoryStructuredPayload, validateMemoryValidityInterval, } from "./memory-validation.js";
|
|
9
|
+
export { validateMemoryAcceptance, validateMemoryArchive, validateMemoryForget, validateMemoryPin, validateMemoryProposal, validateMemoryRejection, validateMemorySupersession, validateMemoryUnpin, validateMemoryUpdate, } from "./memory-operations-validation.js";
|
|
10
|
+
export { isScopeReachable, validateMemoryRetrievalRequest } from "./memory-retrieval-validation.js";
|
|
11
|
+
export { validateMemoryAuditRecord } from "./memory-audit-validation.js";
|
|
12
|
+
export type { MemoryAuditEvent, MemoryAuditEventKind } from "./memory-audit-events.js";
|
|
13
|
+
export { MEMORY_AUDIT_EVENT_KINDS, MEMORY_AUDIT_EVENT_SCHEMA_VERSION, MEMORY_AUDIT_EVENT_SUMMARY_MAX_CHARS, } from "./memory-audit-events.js";
|
|
14
|
+
export { assertNeverMemoryType, isMemoryEdge, isMemoryRecord, validateMemoryRecord, } from "./memory-record-validation.js";
|
|
15
|
+
//# sourceMappingURL=memory-barrel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-barrel.d.ts","sourceRoot":"","sources":["../src/memory-barrel.ts"],"names":[],"mappings":"AASA,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,SAAS,EACT,MAAM,EACN,oBAAoB,EACpB,aAAa,EACb,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,yBAAyB,EACzB,YAAY,GACb,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,uBAAuB,EACvB,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAGtE,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,2BAA2B,EAC3B,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,+BAA+B,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG/F,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,+BAA+B,EAC/B,8BAA8B,GAC/B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAGpG,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAGzE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EACL,wBAAwB,EACxB,iCAAiC,EACjC,oCAAoC,GACrC,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,oBAAoB,GACrB,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Single-import target for the Governed Enterprise Memory Vault contract surface
|
|
2
|
+
// (Epic #204, Issue #205). Downstream packages import from
|
|
3
|
+
// `@oscharko-dev/keiko-contracts/memory` and reach every memory type, every const tuple,
|
|
4
|
+
// and every pure validator from here.
|
|
5
|
+
//
|
|
6
|
+
// Re-exports use the explicit `export type` form for type-only names and `export` for
|
|
7
|
+
// value-emitting symbols because verbatimModuleSyntax is on in tsconfig.base.json.
|
|
8
|
+
export { MEMORY_AUDIT_ACTION_KINDS, MEMORY_EDGE_KINDS, MEMORY_SCHEMA_VERSION, MEMORY_SCOPE_KINDS, MEMORY_SENSITIVITIES, MEMORY_SOURCE_KINDS, MEMORY_STATUSES, MEMORY_STATUS_TRANSITIONS, MEMORY_TYPES, } from "./memory.js";
|
|
9
|
+
export { MEMORY_STRUCTURED_PAYLOAD_KINDS } from "./memory-records.js";
|
|
10
|
+
export { MEMORY_AUDIT_INITIATOR_SURFACES, MEMORY_UPDATE_FIELDS } from "./memory-operations.js";
|
|
11
|
+
export { checkStatusTransition, hasStaleModelMetadata, looksLikeSecretShape, validateMemoryEdge, validateMemoryProvenance, validateMemoryScope, validateMemoryStructuredPayload, validateMemoryValidityInterval, } from "./memory-validation.js";
|
|
12
|
+
// ─── Operation validators ─────────────────────────────────────────────────────
|
|
13
|
+
export { validateMemoryAcceptance, validateMemoryArchive, validateMemoryForget, validateMemoryPin, validateMemoryProposal, validateMemoryRejection, validateMemorySupersession, validateMemoryUnpin, validateMemoryUpdate, } from "./memory-operations-validation.js";
|
|
14
|
+
// ─── Retrieval validator + scope reachability ────────────────────────────────
|
|
15
|
+
export { isScopeReachable, validateMemoryRetrievalRequest } from "./memory-retrieval-validation.js";
|
|
16
|
+
// ─── Audit record validator ──────────────────────────────────────────────────
|
|
17
|
+
export { validateMemoryAuditRecord } from "./memory-audit-validation.js";
|
|
18
|
+
export { MEMORY_AUDIT_EVENT_KINDS, MEMORY_AUDIT_EVENT_SCHEMA_VERSION, MEMORY_AUDIT_EVENT_SUMMARY_MAX_CHARS, } from "./memory-audit-events.js";
|
|
19
|
+
// ─── Record validators + discriminator helpers ────────────────────────────────
|
|
20
|
+
export { assertNeverMemoryType, isMemoryEdge, isMemoryRecord, validateMemoryRecord, } from "./memory-record-validation.js";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const MEMORY_BODY_MAX_CHARS = 4096;
|
|
2
|
+
export declare const MEMORY_RATIONALE_MAX_CHARS = 1024;
|
|
3
|
+
export declare const MEMORY_REASON_MAX_CHARS = 1024;
|
|
4
|
+
export declare const MEMORY_TAG_MAX_CHARS = 64;
|
|
5
|
+
export declare const MEMORY_TAGS_MAX_COUNT = 32;
|
|
6
|
+
export declare const MEMORY_SUMMARY_MAX_CHARS = 512;
|
|
7
|
+
export declare const FORBIDDEN_CONTROL_RE: RegExp;
|
|
8
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
9
|
+
export declare function isNonEmptyTrimmedString(value: unknown): value is string;
|
|
10
|
+
export declare function isFiniteNonNegativeNumber(value: unknown): value is number;
|
|
11
|
+
export declare function isFinitePositiveInteger(value: unknown): value is number;
|
|
12
|
+
export declare function isUnitInterval(value: unknown): value is number;
|
|
13
|
+
export declare function isStringArray(value: unknown): value is readonly string[];
|
|
14
|
+
export declare function isMember<T extends string>(value: unknown, allowed: readonly T[]): value is T;
|
|
15
|
+
export declare function isSafeText(value: unknown, maxChars: number): value is string;
|
|
16
|
+
export declare function validateTags(field: string, input: unknown, errors: string[]): void;
|
|
17
|
+
export declare function validateRetentionHint(field: string, input: unknown, errors: string[]): void;
|
|
18
|
+
export declare function validateOptionalReference(field: string, value: unknown, errors: string[]): void;
|
|
19
|
+
export interface NestedValidation {
|
|
20
|
+
readonly ok: boolean;
|
|
21
|
+
readonly errors?: readonly string[];
|
|
22
|
+
}
|
|
23
|
+
export declare function pushNestedErrors(prefix: string, result: NestedValidation, errors: string[]): void;
|
|
24
|
+
export declare function validateMemoryIdString(field: string, value: unknown, errors: string[]): void;
|
|
25
|
+
export declare function validateSchemaVersionLiteral(input: Record<string, unknown>, errors: string[]): void;
|
|
26
|
+
//# sourceMappingURL=memory-internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-internal.d.ts","sourceRoot":"","sources":["../src/memory-internal.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAC5C,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAK5C,eAAO,MAAM,oBAAoB,QAAqC,CAAC;AAEvE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEvE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEzE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEvE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE9D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,MAAM,EAAE,CAExE;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC,CAE5F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,IAAI,MAAM,CAQ5E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAelF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAc3F;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAO/F;AAKD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAOjG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAI5F;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,EAAE,MAAM,EAAE,GACf,IAAI,CAIN"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// Internal helpers shared by the memory contract validators (Epic #204, Issue #205).
|
|
2
|
+
// NOT part of the public package surface. Other validator modules in this directory
|
|
3
|
+
// import from here so primitive guards, bounded-text caps, and the control-character
|
|
4
|
+
// safety gate stay defined exactly once.
|
|
5
|
+
// Bounded text caps. Chosen to keep audit summaries and rationales safe to ship to a
|
|
6
|
+
// browser surface without truncation, and to keep the body cap aligned with a comfortable
|
|
7
|
+
// MemoriaViva card without scrolling.
|
|
8
|
+
export const MEMORY_BODY_MAX_CHARS = 4096;
|
|
9
|
+
export const MEMORY_RATIONALE_MAX_CHARS = 1024;
|
|
10
|
+
export const MEMORY_REASON_MAX_CHARS = 1024;
|
|
11
|
+
export const MEMORY_TAG_MAX_CHARS = 64;
|
|
12
|
+
export const MEMORY_TAGS_MAX_COUNT = 32;
|
|
13
|
+
export const MEMORY_SUMMARY_MAX_CHARS = 512;
|
|
14
|
+
// Intentional control-range match — this is the safety gate. `no-control-regex` guards
|
|
15
|
+
// against accidental matches, not deliberate ones.
|
|
16
|
+
// eslint-disable-next-line no-control-regex
|
|
17
|
+
export const FORBIDDEN_CONTROL_RE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/;
|
|
18
|
+
export function isRecord(value) {
|
|
19
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
20
|
+
}
|
|
21
|
+
export function isNonEmptyTrimmedString(value) {
|
|
22
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
23
|
+
}
|
|
24
|
+
export function isFiniteNonNegativeNumber(value) {
|
|
25
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0;
|
|
26
|
+
}
|
|
27
|
+
export function isFinitePositiveInteger(value) {
|
|
28
|
+
return typeof value === "number" && Number.isInteger(value) && value > 0;
|
|
29
|
+
}
|
|
30
|
+
export function isUnitInterval(value) {
|
|
31
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 && value <= 1;
|
|
32
|
+
}
|
|
33
|
+
export function isStringArray(value) {
|
|
34
|
+
return Array.isArray(value) && value.every((entry) => typeof entry === "string");
|
|
35
|
+
}
|
|
36
|
+
export function isMember(value, allowed) {
|
|
37
|
+
return typeof value === "string" && allowed.includes(value);
|
|
38
|
+
}
|
|
39
|
+
export function isSafeText(value, maxChars) {
|
|
40
|
+
if (typeof value !== "string") {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (value.length === 0 || value.length > maxChars) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return !FORBIDDEN_CONTROL_RE.test(value);
|
|
47
|
+
}
|
|
48
|
+
export function validateTags(field, input, errors) {
|
|
49
|
+
if (!isStringArray(input)) {
|
|
50
|
+
errors.push(`${field} must be a string array`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (input.length > MEMORY_TAGS_MAX_COUNT) {
|
|
54
|
+
errors.push(`${field} must have at most ${String(MEMORY_TAGS_MAX_COUNT)} entries`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
for (const tag of input) {
|
|
58
|
+
if (tag.length === 0 || tag.length > MEMORY_TAG_MAX_CHARS || FORBIDDEN_CONTROL_RE.test(tag)) {
|
|
59
|
+
errors.push(`${field} entry must be a non-empty bounded control-free string`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function validateRetentionHint(field, input, errors) {
|
|
65
|
+
if (!isRecord(input)) {
|
|
66
|
+
errors.push(`${field} must be an object when set`);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (!isNonEmptyTrimmedString(input.policyKey)) {
|
|
70
|
+
errors.push(`${field}.policyKey must be a non-empty string`);
|
|
71
|
+
}
|
|
72
|
+
if (input.retainUntil !== undefined && !isFiniteNonNegativeNumber(input.retainUntil)) {
|
|
73
|
+
errors.push(`${field}.retainUntil must be a finite non-negative number when set`);
|
|
74
|
+
}
|
|
75
|
+
if (input.notes !== undefined && !isSafeText(input.notes, MEMORY_REASON_MAX_CHARS)) {
|
|
76
|
+
errors.push(`${field}.notes must be a bounded control-free string when set`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export function validateOptionalReference(field, value, errors) {
|
|
80
|
+
if (value === undefined) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (!isNonEmptyTrimmedString(value)) {
|
|
84
|
+
errors.push(`${field} must be a non-empty string when set`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export function pushNestedErrors(prefix, result, errors) {
|
|
88
|
+
if (result.ok) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
for (const reason of result.errors ?? []) {
|
|
92
|
+
errors.push(`${prefix}.${reason}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export function validateMemoryIdString(field, value, errors) {
|
|
96
|
+
if (!isNonEmptyTrimmedString(value)) {
|
|
97
|
+
errors.push(`${field} must be a non-empty string`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export function validateSchemaVersionLiteral(input, errors) {
|
|
101
|
+
if (input.schemaVersion !== "1") {
|
|
102
|
+
errors.push('schemaVersion must be the literal "1"');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MemoryAcceptance, MemoryArchive, MemoryForget, MemoryPin, MemoryProposal, MemoryRejection, MemorySupersession, MemoryUnpin, MemoryUpdate } from "./memory-operations.js";
|
|
2
|
+
import { type MemoryValidation } from "./memory-validation.js";
|
|
3
|
+
export declare function validateMemoryProposal(input: unknown): MemoryValidation<MemoryProposal>;
|
|
4
|
+
export declare function validateMemoryAcceptance(input: unknown): MemoryValidation<MemoryAcceptance>;
|
|
5
|
+
export declare function validateMemoryRejection(input: unknown): MemoryValidation<MemoryRejection>;
|
|
6
|
+
export declare function validateMemoryUpdate(input: unknown): MemoryValidation<MemoryUpdate>;
|
|
7
|
+
export declare function validateMemorySupersession(input: unknown): MemoryValidation<MemorySupersession>;
|
|
8
|
+
export declare function validateMemoryPin(input: unknown): MemoryValidation<MemoryPin>;
|
|
9
|
+
export declare function validateMemoryUnpin(input: unknown): MemoryValidation<MemoryUnpin>;
|
|
10
|
+
export declare function validateMemoryArchive(input: unknown): MemoryValidation<MemoryArchive>;
|
|
11
|
+
export declare function validateMemoryForget(input: unknown): MemoryValidation<MemoryForget>;
|
|
12
|
+
//# sourceMappingURL=memory-operations-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-operations-validation.d.ts","sourceRoot":"","sources":["../src/memory-operations-validation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,SAAS,EACT,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,YAAY,EACb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAoChC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAyBvF;AA0BD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAiB3F;AAGD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAkBzF;AAgDD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAyBnF;AAGD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CA6B/F;AA2BD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAE7E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAEjF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAkBrF;AAMD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAqBnF"}
|