@popmelt.com/core 0.8.4 → 0.8.6
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/THIRD_PARTY_NOTICES.md +51 -0
- package/dist/bridge-entry.mjs +116 -299
- package/dist/{chunk-RBFQCZQP.mjs → chunk-EYFN72RC.mjs} +1 -1
- package/dist/chunk-NOHXTT24.mjs +1 -0
- package/dist/cli.mjs +116 -299
- package/dist/index.d.mts +7 -4
- package/dist/index.mjs +112 -40
- package/dist/memory-legacy.d.mts +446 -0
- package/dist/memory-legacy.mjs +1 -0
- package/dist/memory-store.d.mts +1048 -0
- package/dist/memory-store.mjs +3 -0
- package/dist/memory.d.mts +662 -0
- package/dist/memory.mjs +1 -0
- package/dist/plugin-astro.mjs +1 -1
- package/dist/plugin-vite.mjs +1 -1
- package/dist/server-KCVEM3PH.mjs +242 -0
- package/dist/server.d.mts +268 -1
- package/dist/server.mjs +119 -298
- package/package.json +19 -2
- package/dist/chunk-3TS7MVTZ.mjs +0 -1
- package/dist/server-7UMGXB6S.mjs +0 -421
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
declare const MEMORY_FORMAT_VERSION: 1;
|
|
2
|
+
declare const MEMORY_SCHEMA_VERSION: 1;
|
|
3
|
+
type MemoryFormatVersion = typeof MEMORY_FORMAT_VERSION;
|
|
4
|
+
type MemorySchemaVersion = typeof MEMORY_SCHEMA_VERSION;
|
|
5
|
+
type MemoryId = string;
|
|
6
|
+
type Timestamp = string;
|
|
7
|
+
type JsonPrimitive = string | number | boolean | null;
|
|
8
|
+
type JsonValue = JsonPrimitive | JsonValue[] | {
|
|
9
|
+
[key: string]: JsonValue;
|
|
10
|
+
};
|
|
11
|
+
type SourceReferenceKind = 'thread' | 'message' | 'iteration' | 'artifact' | 'event' | 'record' | 'external';
|
|
12
|
+
type SourceReference = {
|
|
13
|
+
kind: SourceReferenceKind;
|
|
14
|
+
id: string;
|
|
15
|
+
uri?: string;
|
|
16
|
+
excerpt?: string;
|
|
17
|
+
};
|
|
18
|
+
type Provenance = {
|
|
19
|
+
id: MemoryId;
|
|
20
|
+
schemaVersion: MemorySchemaVersion;
|
|
21
|
+
projectId: MemoryId;
|
|
22
|
+
createdAt: Timestamp;
|
|
23
|
+
participantId: MemoryId;
|
|
24
|
+
sourceRefs: SourceReference[];
|
|
25
|
+
};
|
|
26
|
+
type ParticipantKind = 'human' | 'ai' | 'system' | 'integration';
|
|
27
|
+
type AuthorityLevel = 'owner' | 'delegate' | 'contributor';
|
|
28
|
+
type AuthorityMode = 'local_trusted' | 'hosted';
|
|
29
|
+
type ExecutionContext = {
|
|
30
|
+
sessionId?: string;
|
|
31
|
+
provider?: string;
|
|
32
|
+
model?: string;
|
|
33
|
+
deviceId?: string;
|
|
34
|
+
mode?: string;
|
|
35
|
+
};
|
|
36
|
+
type AuthorityContext = {
|
|
37
|
+
level: AuthorityLevel;
|
|
38
|
+
mode: AuthorityMode;
|
|
39
|
+
grantId?: MemoryId;
|
|
40
|
+
authenticatedAt?: Timestamp;
|
|
41
|
+
};
|
|
42
|
+
type ParticipantRecord = Provenance & {
|
|
43
|
+
recordType: 'participant';
|
|
44
|
+
kind: ParticipantKind;
|
|
45
|
+
displayName: string;
|
|
46
|
+
status: 'active' | 'disabled';
|
|
47
|
+
};
|
|
48
|
+
type AuthorityGrantRecord = Provenance & {
|
|
49
|
+
recordType: 'authority_grant';
|
|
50
|
+
granteeId: MemoryId;
|
|
51
|
+
level: AuthorityLevel;
|
|
52
|
+
grantedById: MemoryId;
|
|
53
|
+
subjectIds: MemoryId[];
|
|
54
|
+
startsAt: Timestamp;
|
|
55
|
+
endsAt?: Timestamp;
|
|
56
|
+
revokedAt?: Timestamp;
|
|
57
|
+
};
|
|
58
|
+
type SubjectType = 'project' | 'file' | 'route' | 'component' | 'element' | 'token' | 'interaction';
|
|
59
|
+
type SubjectLocatorKind = 'project_root' | 'source_file' | 'route_pattern' | 'file_export' | 'source_span' | 'dom_selector' | 'token_path' | 'interaction_key' | 'custom';
|
|
60
|
+
type SubjectLocator = {
|
|
61
|
+
id: MemoryId;
|
|
62
|
+
kind: SubjectLocatorKind;
|
|
63
|
+
value: string;
|
|
64
|
+
status: 'current' | 'historical' | 'unresolved';
|
|
65
|
+
validFrom: Timestamp;
|
|
66
|
+
validUntil?: Timestamp;
|
|
67
|
+
sourceRefs: SourceReference[];
|
|
68
|
+
};
|
|
69
|
+
type SubjectRecord = Provenance & {
|
|
70
|
+
recordType: 'subject';
|
|
71
|
+
subjectType: SubjectType;
|
|
72
|
+
label: string;
|
|
73
|
+
aliases: string[];
|
|
74
|
+
locators: SubjectLocator[];
|
|
75
|
+
};
|
|
76
|
+
type ParticipantStance = {
|
|
77
|
+
stance: 'supports' | 'opposes' | 'uncertain' | 'needs_evidence';
|
|
78
|
+
reason?: string;
|
|
79
|
+
};
|
|
80
|
+
type CaptureContext = {
|
|
81
|
+
route?: string;
|
|
82
|
+
subjectIds: MemoryId[];
|
|
83
|
+
artifactIds: MemoryId[];
|
|
84
|
+
};
|
|
85
|
+
type ObservationState = 'open' | 'resolved' | 'dismissed';
|
|
86
|
+
type ObservationRecord = Provenance & {
|
|
87
|
+
recordType: 'observation';
|
|
88
|
+
state: ObservationState;
|
|
89
|
+
statement: string;
|
|
90
|
+
captureContext: CaptureContext;
|
|
91
|
+
stance?: ParticipantStance;
|
|
92
|
+
resolvedByIds: MemoryId[];
|
|
93
|
+
};
|
|
94
|
+
type DecisionKind = 'principle' | 'preference' | 'rule' | 'constraint';
|
|
95
|
+
type ProposalState = 'draft' | 'pending' | 'accepted' | 'rejected' | 'withdrawn' | 'deferred';
|
|
96
|
+
type AssertionOrigin = {
|
|
97
|
+
mode: 'declared' | 'inferred';
|
|
98
|
+
sourceText?: string;
|
|
99
|
+
iterationId?: MemoryId;
|
|
100
|
+
inferredById?: MemoryId;
|
|
101
|
+
reviewedById?: MemoryId;
|
|
102
|
+
};
|
|
103
|
+
type DecisionSubject = {
|
|
104
|
+
subjectId: MemoryId;
|
|
105
|
+
role: 'governed' | 'consumer' | 'provider' | 'context';
|
|
106
|
+
};
|
|
107
|
+
type ProposalRecord = Provenance & {
|
|
108
|
+
recordType: 'proposal';
|
|
109
|
+
state: ProposalState;
|
|
110
|
+
claim: string;
|
|
111
|
+
rationale?: string;
|
|
112
|
+
proposedKind?: DecisionKind;
|
|
113
|
+
subjects: DecisionSubject[];
|
|
114
|
+
subjectSemantics?: string;
|
|
115
|
+
origin: AssertionOrigin;
|
|
116
|
+
stance?: ParticipantStance;
|
|
117
|
+
bundleId?: MemoryId;
|
|
118
|
+
};
|
|
119
|
+
type DecisionState = 'active' | 'superseded' | 'revoked';
|
|
120
|
+
type DecisionRecord = Provenance & {
|
|
121
|
+
recordType: 'decision';
|
|
122
|
+
proposalId: MemoryId;
|
|
123
|
+
acceptanceEventId: MemoryId;
|
|
124
|
+
acceptedById: MemoryId;
|
|
125
|
+
authority: AuthorityContext;
|
|
126
|
+
state: DecisionState;
|
|
127
|
+
kind: DecisionKind;
|
|
128
|
+
claim: string;
|
|
129
|
+
rationale?: string;
|
|
130
|
+
subjects: DecisionSubject[];
|
|
131
|
+
subjectSemantics?: string;
|
|
132
|
+
noChange: boolean;
|
|
133
|
+
effectiveAt?: Timestamp;
|
|
134
|
+
effectiveMilestone?: string;
|
|
135
|
+
bundleId?: MemoryId;
|
|
136
|
+
};
|
|
137
|
+
type ThreadOutcome = 'decision_created' | 'proposal_rejected' | 'observation_resolved' | 'observation_dismissed' | 'question_unresolved' | 'implementation_only' | 'no_outcome';
|
|
138
|
+
type ThreadRecord = Provenance & {
|
|
139
|
+
recordType: 'thread';
|
|
140
|
+
title?: string;
|
|
141
|
+
state: 'open' | 'resolved';
|
|
142
|
+
messageArtifactIds: MemoryId[];
|
|
143
|
+
outcome: ThreadOutcome;
|
|
144
|
+
resultRefs: EntityReference[];
|
|
145
|
+
};
|
|
146
|
+
type IterationOutcome = 'completed' | 'cancelled' | 'question_asked' | 'failed' | 'no_change';
|
|
147
|
+
type IterationRecord = Provenance & {
|
|
148
|
+
recordType: 'iteration';
|
|
149
|
+
threadIds: MemoryId[];
|
|
150
|
+
startedAt: Timestamp;
|
|
151
|
+
completedAt?: Timestamp;
|
|
152
|
+
requestSummary: string;
|
|
153
|
+
responseSummary?: string;
|
|
154
|
+
outcome: IterationOutcome;
|
|
155
|
+
execution: ExecutionContext;
|
|
156
|
+
artifactIds: MemoryId[];
|
|
157
|
+
};
|
|
158
|
+
type EvidenceKind = 'judgment' | 'artifact' | 'eval' | 'log' | 'user_feedback' | 'external_source' | 'project_state';
|
|
159
|
+
type EvidenceRecord = Provenance & {
|
|
160
|
+
recordType: 'evidence';
|
|
161
|
+
kind: EvidenceKind;
|
|
162
|
+
summary: string;
|
|
163
|
+
availability: 'available' | 'missing' | 'redacted' | 'forgotten';
|
|
164
|
+
stance?: ParticipantStance;
|
|
165
|
+
artifactIds: MemoryId[];
|
|
166
|
+
};
|
|
167
|
+
type CoverageClaim = {
|
|
168
|
+
decisionId: MemoryId;
|
|
169
|
+
coverage: 'partial' | 'full';
|
|
170
|
+
claim: string;
|
|
171
|
+
sourceRefs: SourceReference[];
|
|
172
|
+
};
|
|
173
|
+
type ImplementationState = 'planned' | 'in_progress' | 'completed' | 'failed' | 'abandoned';
|
|
174
|
+
type ImplementationAttemptRecord = Provenance & {
|
|
175
|
+
recordType: 'implementation_attempt';
|
|
176
|
+
state: ImplementationState;
|
|
177
|
+
iterationIds: MemoryId[];
|
|
178
|
+
coverageClaims: CoverageClaim[];
|
|
179
|
+
projectStateRef?: SourceReference;
|
|
180
|
+
summary: string;
|
|
181
|
+
artifactIds: MemoryId[];
|
|
182
|
+
};
|
|
183
|
+
type VerificationState = 'queued' | 'running' | 'passed' | 'failed' | 'inconclusive' | 'error' | 'cancelled';
|
|
184
|
+
type VerificationTarget = {
|
|
185
|
+
entityType: 'decision' | 'implementation_attempt' | 'model_entry';
|
|
186
|
+
entityId: MemoryId;
|
|
187
|
+
};
|
|
188
|
+
type EvalSpecState = 'draft' | 'active' | 'retired';
|
|
189
|
+
type EvalDependency = {
|
|
190
|
+
kind: 'model_path' | 'source_file' | 'route' | 'subject';
|
|
191
|
+
value: string;
|
|
192
|
+
subjectId?: MemoryId;
|
|
193
|
+
};
|
|
194
|
+
type EvalScenario = {
|
|
195
|
+
id: string;
|
|
196
|
+
label?: string;
|
|
197
|
+
route?: string;
|
|
198
|
+
routePattern?: string;
|
|
199
|
+
components?: Array<{
|
|
200
|
+
name: string;
|
|
201
|
+
sourceFile?: string;
|
|
202
|
+
exportName?: string;
|
|
203
|
+
}>;
|
|
204
|
+
subjectIds?: MemoryId[];
|
|
205
|
+
states?: Array<{
|
|
206
|
+
kind: 'viewport' | 'theme' | 'auth' | 'locale' | 'feature_flag' | 'fixture' | 'interaction' | 'custom';
|
|
207
|
+
key?: string;
|
|
208
|
+
value: string;
|
|
209
|
+
}>;
|
|
210
|
+
steps?: Array<{
|
|
211
|
+
action: 'navigate' | 'click' | 'type' | 'select';
|
|
212
|
+
target?: string;
|
|
213
|
+
value?: string;
|
|
214
|
+
}>;
|
|
215
|
+
};
|
|
216
|
+
type EvalSpecRecord = Provenance & {
|
|
217
|
+
recordType: 'eval_spec';
|
|
218
|
+
state: EvalSpecState;
|
|
219
|
+
legacyId: string;
|
|
220
|
+
replacesSpecId?: MemoryId;
|
|
221
|
+
title: string;
|
|
222
|
+
category: 'component' | 'layout' | 'copy' | 'interaction' | 'visual' | 'workflow';
|
|
223
|
+
prompt: string;
|
|
224
|
+
assertions: string[];
|
|
225
|
+
rationale: string;
|
|
226
|
+
decisionIds: MemoryId[];
|
|
227
|
+
subjectIds: MemoryId[];
|
|
228
|
+
threadRefs: string[];
|
|
229
|
+
dependencies?: EvalDependency[];
|
|
230
|
+
scenarios?: EvalScenario[];
|
|
231
|
+
targets: VerificationTarget[];
|
|
232
|
+
evaluator: {
|
|
233
|
+
kind: 'human' | 'ai' | 'test' | 'external';
|
|
234
|
+
name: string;
|
|
235
|
+
evidenceTypes: string[];
|
|
236
|
+
};
|
|
237
|
+
scope: {
|
|
238
|
+
kind: 'current_page' | 'project' | 'subject';
|
|
239
|
+
route?: string;
|
|
240
|
+
};
|
|
241
|
+
};
|
|
242
|
+
type VerificationAttemptRecord = Provenance & {
|
|
243
|
+
recordType: 'verification_attempt';
|
|
244
|
+
evalSpecId?: MemoryId;
|
|
245
|
+
scopeFingerprint?: string;
|
|
246
|
+
state: VerificationState;
|
|
247
|
+
evaluator: {
|
|
248
|
+
kind: 'human' | 'ai' | 'test' | 'eval' | 'external';
|
|
249
|
+
participantId?: MemoryId;
|
|
250
|
+
name: string;
|
|
251
|
+
};
|
|
252
|
+
targets: VerificationTarget[];
|
|
253
|
+
summary?: string;
|
|
254
|
+
evidenceIds: MemoryId[];
|
|
255
|
+
/** Compact presentation data for an eval run; raw output remains an artifact/thread detail. */
|
|
256
|
+
evalRun?: {
|
|
257
|
+
id: string;
|
|
258
|
+
threadId?: string;
|
|
259
|
+
createdAt: number;
|
|
260
|
+
completedAt: number;
|
|
261
|
+
durationMs: number;
|
|
262
|
+
scope: {
|
|
263
|
+
type: 'current_page';
|
|
264
|
+
url: string;
|
|
265
|
+
viewport: {
|
|
266
|
+
width: number;
|
|
267
|
+
height: number;
|
|
268
|
+
};
|
|
269
|
+
};
|
|
270
|
+
assertionResults: Array<{
|
|
271
|
+
assertion: string;
|
|
272
|
+
status: 'pass' | 'fail' | 'needs_review';
|
|
273
|
+
summary: string;
|
|
274
|
+
evidence: string[];
|
|
275
|
+
}>;
|
|
276
|
+
tooling: {
|
|
277
|
+
chromeDevtools: 'available' | 'unavailable' | 'unknown';
|
|
278
|
+
evidenceTypes: string[];
|
|
279
|
+
};
|
|
280
|
+
provider?: string;
|
|
281
|
+
model?: string;
|
|
282
|
+
screenshotPath?: string;
|
|
283
|
+
codeFingerprint?: string;
|
|
284
|
+
};
|
|
285
|
+
};
|
|
286
|
+
type ModelEntryRecord = Provenance & {
|
|
287
|
+
recordType: 'model_entry';
|
|
288
|
+
key: string;
|
|
289
|
+
subjectIds: MemoryId[];
|
|
290
|
+
decisionIds: MemoryId[];
|
|
291
|
+
value: JsonValue;
|
|
292
|
+
};
|
|
293
|
+
type ModelProjectionRecord = Provenance & {
|
|
294
|
+
recordType: 'model_projection';
|
|
295
|
+
state: 'applied';
|
|
296
|
+
runId: string;
|
|
297
|
+
presentationJobId?: string;
|
|
298
|
+
appliedById: MemoryId;
|
|
299
|
+
authority: AuthorityContext;
|
|
300
|
+
appliedAt: Timestamp;
|
|
301
|
+
decisionIds: MemoryId[];
|
|
302
|
+
entryIds: MemoryId[];
|
|
303
|
+
coverage: Array<{
|
|
304
|
+
decisionId: MemoryId;
|
|
305
|
+
status: 'unprojected' | 'partially_projected' | 'projected' | 'stale';
|
|
306
|
+
}>;
|
|
307
|
+
};
|
|
308
|
+
type EntityType = 'participant' | 'authority_grant' | 'subject' | 'observation' | 'proposal' | 'decision' | 'thread' | 'iteration' | 'evidence' | 'implementation_attempt' | 'eval_spec' | 'verification_attempt' | 'model_entry' | 'model_projection' | 'freshness_signal';
|
|
309
|
+
type MemoryObjectType = EntityType | 'relationship' | 'lifecycle_event' | 'artifact';
|
|
310
|
+
type EntityReference = {
|
|
311
|
+
entityType: EntityType;
|
|
312
|
+
entityId: MemoryId;
|
|
313
|
+
};
|
|
314
|
+
type RelationshipType = 'supports' | 'contradicts' | 'supersedes' | 'excepts' | 'duplicates' | 'implements' | 'verifies' | 'replaces' | 'derived_from';
|
|
315
|
+
type RelationshipRecord = Provenance & {
|
|
316
|
+
recordType: 'relationship';
|
|
317
|
+
relationshipType: RelationshipType;
|
|
318
|
+
from: EntityReference;
|
|
319
|
+
to: EntityReference;
|
|
320
|
+
reason: string;
|
|
321
|
+
authority?: AuthorityContext;
|
|
322
|
+
};
|
|
323
|
+
type FreshnessSignalType = 'subject_unresolved' | 'implementation_drift' | 'evidence_unavailable' | 'new_conflict' | 'verification_expired' | 'review_interval_elapsed' | 'schema_or_tooling_change';
|
|
324
|
+
type FreshnessTargetKind = 'subject_locator' | 'implementation_presence' | 'verification_result' | 'model_coverage' | 'evidence_reference' | 'decision_applicability';
|
|
325
|
+
type FreshnessSignalRecord = Provenance & {
|
|
326
|
+
recordType: 'freshness_signal';
|
|
327
|
+
signalType: FreshnessSignalType;
|
|
328
|
+
state: 'open' | 'resolved';
|
|
329
|
+
targetKind: FreshnessTargetKind;
|
|
330
|
+
target: EntityReference;
|
|
331
|
+
reason: string;
|
|
332
|
+
evidenceIds: MemoryId[];
|
|
333
|
+
resolvedAt?: Timestamp;
|
|
334
|
+
resolvedByEventId?: MemoryId;
|
|
335
|
+
};
|
|
336
|
+
type ProposalDeferralContext = {
|
|
337
|
+
kind: 'proposal_deferral';
|
|
338
|
+
taskContext?: string;
|
|
339
|
+
subjectIds: MemoryId[];
|
|
340
|
+
resurfaceWhen: Array<'different_action' | 'new_evidence' | 'new_conflict' | 'owner_request' | 'after_date'>;
|
|
341
|
+
revisitAfter?: Timestamp;
|
|
342
|
+
};
|
|
343
|
+
type LifecycleEvent = Provenance & {
|
|
344
|
+
recordType: 'lifecycle_event';
|
|
345
|
+
entity: EntityReference;
|
|
346
|
+
eventType: string;
|
|
347
|
+
fromState: string | null;
|
|
348
|
+
toState: string;
|
|
349
|
+
authority: AuthorityContext;
|
|
350
|
+
execution?: ExecutionContext;
|
|
351
|
+
reason?: string;
|
|
352
|
+
transitionContext?: ProposalDeferralContext;
|
|
353
|
+
};
|
|
354
|
+
type ArtifactKind = 'message' | 'screenshot' | 'image' | 'diff' | 'file_snapshot' | 'log' | 'eval_output' | 'external_document' | 'other';
|
|
355
|
+
type ArtifactManifestEntry = {
|
|
356
|
+
id: MemoryId;
|
|
357
|
+
kind: ArtifactKind;
|
|
358
|
+
mediaType?: string;
|
|
359
|
+
byteSize?: number;
|
|
360
|
+
contentHash?: string;
|
|
361
|
+
location?: string;
|
|
362
|
+
availability: 'available' | 'missing' | 'redacted' | 'forgotten';
|
|
363
|
+
};
|
|
364
|
+
type Tombstone = {
|
|
365
|
+
id: MemoryId;
|
|
366
|
+
schemaVersion: MemorySchemaVersion;
|
|
367
|
+
projectId: MemoryId;
|
|
368
|
+
objectId: MemoryId;
|
|
369
|
+
objectType: MemoryObjectType;
|
|
370
|
+
deletedAt: Timestamp;
|
|
371
|
+
deletedById: MemoryId;
|
|
372
|
+
authority: AuthorityContext;
|
|
373
|
+
reasonCategory: 'privacy' | 'legal' | 'serious_error' | 'intentional_forgetting';
|
|
374
|
+
erasureLevel: 'content' | 'content_and_evidence' | 'full_where_permitted';
|
|
375
|
+
invalidates: EntityReference[];
|
|
376
|
+
};
|
|
377
|
+
type CanonicalRecord = ParticipantRecord | AuthorityGrantRecord | SubjectRecord | ObservationRecord | ProposalRecord | DecisionRecord | ThreadRecord | IterationRecord | EvidenceRecord | ImplementationAttemptRecord | EvalSpecRecord | VerificationAttemptRecord | ModelEntryRecord | ModelProjectionRecord | FreshnessSignalRecord;
|
|
378
|
+
type MemoryFeature = 'authority' | 'subjects' | 'decisions' | 'implementations' | 'verification' | 'eval_specs' | 'model_projection' | 'freshness' | 'portable_artifacts' | 'bounded_retrieval';
|
|
379
|
+
type ProjectMemoryManifest = {
|
|
380
|
+
formatVersion: MemoryFormatVersion;
|
|
381
|
+
projectId: MemoryId;
|
|
382
|
+
createdAt: Timestamp;
|
|
383
|
+
updatedAt: Timestamp;
|
|
384
|
+
features: MemoryFeature[];
|
|
385
|
+
writer: {
|
|
386
|
+
name: string;
|
|
387
|
+
version: string;
|
|
388
|
+
};
|
|
389
|
+
};
|
|
390
|
+
type ProjectMemoryBundle = {
|
|
391
|
+
manifest: ProjectMemoryManifest;
|
|
392
|
+
records: CanonicalRecord[];
|
|
393
|
+
events: LifecycleEvent[];
|
|
394
|
+
relationships: RelationshipRecord[];
|
|
395
|
+
artifacts: ArtifactManifestEntry[];
|
|
396
|
+
tombstones: Tombstone[];
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
type SchemaIssue = {
|
|
400
|
+
path: string;
|
|
401
|
+
code: string;
|
|
402
|
+
message: string;
|
|
403
|
+
severity: 'error' | 'warning';
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
type LegacyImportIssue = {
|
|
407
|
+
severity: 'info' | 'warning' | 'error';
|
|
408
|
+
code: string;
|
|
409
|
+
source?: string;
|
|
410
|
+
message: string;
|
|
411
|
+
};
|
|
412
|
+
type LegacyImportReport = {
|
|
413
|
+
projectRoot: string;
|
|
414
|
+
source: {
|
|
415
|
+
threads: number;
|
|
416
|
+
messages: number;
|
|
417
|
+
decisionEnvelopes: number;
|
|
418
|
+
modelEntries: number;
|
|
419
|
+
artifactsReferenced: number;
|
|
420
|
+
};
|
|
421
|
+
imported: Record<string, number>;
|
|
422
|
+
unresolvedAcceptance: number;
|
|
423
|
+
deferredModelEntries: number;
|
|
424
|
+
proofCases: Array<{
|
|
425
|
+
legacyId: string;
|
|
426
|
+
threadFound: boolean;
|
|
427
|
+
decisionEnvelopeFound: boolean;
|
|
428
|
+
recordIds: string[];
|
|
429
|
+
}>;
|
|
430
|
+
issues: LegacyImportIssue[];
|
|
431
|
+
schemaIssues: SchemaIssue[];
|
|
432
|
+
};
|
|
433
|
+
type LegacyImportResult = {
|
|
434
|
+
bundle: ProjectMemoryBundle;
|
|
435
|
+
report: LegacyImportReport;
|
|
436
|
+
};
|
|
437
|
+
type LegacyImportOptions = {
|
|
438
|
+
projectRoot: string;
|
|
439
|
+
projectKey?: string;
|
|
440
|
+
proofCaseIds?: string[];
|
|
441
|
+
writerVersion?: string;
|
|
442
|
+
};
|
|
443
|
+
declare function legacyUuidV7(namespace: string, kind: string, legacyId: string, occurredAt: number): string;
|
|
444
|
+
declare function importLegacyProject(options: LegacyImportOptions): Promise<LegacyImportResult>;
|
|
445
|
+
|
|
446
|
+
export { type LegacyImportIssue, type LegacyImportOptions, type LegacyImportReport, type LegacyImportResult, importLegacyProject, legacyUuidV7 };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createHash as Me}from"crypto";import{readFile as Le,readdir as Pe,realpath as Be}from"fs/promises";import{join as X,relative as De}from"path";var Ae=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function Se(n){return Ae.test(n)}function Re(n){return{valid:!n.some(e=>e.severity==="error"),issues:n}}function d(n,e,i,m){n.push({path:e,code:i,message:m,severity:"error"})}function oe(n,e,i,m){n.push({path:e,code:i,message:m,severity:"warning"})}function I(n,e,i){Se(i)||d(n,e,"invalid_uuid_v7","Canonical IDs must be UUIDv7 values.")}function P(n,e,i){(!i||Number.isNaN(Date.parse(i)))&&d(n,e,"invalid_timestamp","Timestamps must be parseable ISO-8601 strings.")}function D(n,e,i,m=!1){m&&i.level==="contributor"&&d(n,`${e}.level`,"insufficient_authority","Contributors cannot accept or change normative product truth."),i.level==="delegate"&&!i.grantId&&d(n,`${e}.grantId`,"missing_authority_grant","Delegate authority must reference the grant used for this action.")}var Ee={observation:new Set(["null->open","open->resolved","open->dismissed","resolved->open","dismissed->open"]),proposal:new Set(["null->draft","draft->pending","pending->accepted","pending->rejected","pending->withdrawn","pending->deferred","deferred->pending"]),decision:new Set(["null->active","active->superseded","active->revoked"]),implementation_attempt:new Set(["null->planned","planned->in_progress","planned->abandoned","in_progress->completed","in_progress->failed","in_progress->abandoned"]),eval_spec:new Set(["null->draft","null->active","draft->active","draft->retired","active->retired"]),verification_attempt:new Set(["null->queued","queued->running","queued->cancelled","running->passed","running->failed","running->inconclusive","running->error","running->cancelled"]),freshness_signal:new Set(["null->open","open->resolved"])},we=new Set(["proposal:accepted","proposal:rejected","decision:superseded","decision:revoked"]);function xe(n,e,i){I(n,`${i}.id`,e.id),I(n,`${i}.projectId`,e.projectId),I(n,`${i}.participantId`,e.participantId),I(n,`${i}.entity.entityId`,e.entity.entityId),P(n,`${i}.createdAt`,e.createdAt),D(n,`${i}.authority`,e.authority);let m=Ee[e.entity.entityType],$=`${e.fromState??"null"}->${e.toState}`;m&&!m.has($)&&d(n,i,"invalid_lifecycle_transition",`${e.entity.entityType} does not allow ${$}.`);let j=`${e.entity.entityType}:${e.toState}`;if(we.has(j)&&(D(n,`${i}.authority`,e.authority,!0),e.reason?.trim()||d(n,`${i}.reason`,"missing_normative_reason","Normative acceptance, rejection, supersession, and revocation require a reason.")),e.entity.entityType==="proposal"&&e.toState==="deferred"){let g=e.transitionContext;(g?.kind!=="proposal_deferral"||g.resurfaceWhen.length===0)&&d(n,`${i}.transitionContext`,"missing_deferral_policy","Deferred proposals require structured resurfacing conditions."),g?.resurfaceWhen.includes("after_date")&&!g.revisitAfter&&d(n,`${i}.transitionContext.revisitAfter`,"missing_revisit_date","after_date resurfacing requires revisitAfter."),g?.revisitAfter&&P(n,`${i}.transitionContext.revisitAfter`,g.revisitAfter)}}function ke(n,e,i,m){I(n,`${i}.id`,e.id),I(n,`${i}.projectId`,e.projectId),I(n,`${i}.participantId`,e.participantId),P(n,`${i}.createdAt`,e.createdAt),e.projectId!==m&&d(n,`${i}.projectId`,"project_mismatch","Record belongs to another project."),"subjects"in e&&e.subjects.length===0&&d(n,`${i}.subjects`,"missing_subject","Proposals and decisions need a subject."),"subjects"in e&&e.subjects.length>1&&!e.subjectSemantics?.trim()&&d(n,`${i}.subjectSemantics`,"missing_subject_semantics","Multi-subject claims must explain why the subjects are inseparable."),e.recordType==="proposal"&&e.origin.mode==="inferred"&&(!e.origin.sourceText||!e.origin.iterationId||!e.origin.inferredById)&&d(n,`${i}.origin`,"incomplete_inference_provenance","Inferred structure requires source text, iteration, and inferring participant."),e.recordType==="decision"&&(D(n,`${i}.authority`,e.authority,!0),e.claim.trim()||d(n,`${i}.claim`,"empty_claim","Accepted decisions require a claim.")),e.recordType==="authority_grant"&&e.level==="owner"&&oe(n,`${i}.level`,"owner_grant_requires_policy_review","Owner grants are valid but should receive explicit policy review."),e.recordType==="freshness_signal"&&e.state==="resolved"&&(!e.resolvedAt||!e.resolvedByEventId)&&d(n,i,"incomplete_freshness_resolution","Resolved freshness signals need a time and resolving event."),e.recordType==="model_projection"&&(P(n,`${i}.appliedAt`,e.appliedAt),D(n,`${i}.authority`,e.authority,!0),e.entryIds.length===0&&d(n,`${i}.entryIds`,"empty_model_projection","Applied model projections need at least one model entry.")),e.recordType==="eval_spec"&&((!e.legacyId.trim()||!e.title.trim()||!e.prompt.trim())&&d(n,i,"incomplete_eval_spec","Eval specs need a stable id, title, and prompt."),(e.assertions.length===0||e.assertions.some($=>!$.trim()))&&d(n,`${i}.assertions`,"empty_eval_assertions","Eval specs need at least one non-empty assertion."),e.targets.length===0&&e.decisionIds.length===0&&oe(n,i,"unbound_eval_spec","Eval spec is not yet bound to canonical product truth."),(e.dependencies?.length??0)===0&&oe(n,`${i}.dependencies`,"unscoped_eval_spec","Eval spec has no freshness dependencies."))}function Ce(n,e,i){I(n,`${i}.id`,e.id),I(n,`${i}.projectId`,e.projectId),I(n,`${i}.participantId`,e.participantId),I(n,`${i}.from.entityId`,e.from.entityId),I(n,`${i}.to.entityId`,e.to.entityId),P(n,`${i}.createdAt`,e.createdAt),e.reason.trim()||d(n,`${i}.reason`,"missing_relationship_reason","Relationships need a reason."),new Set(["supports","contradicts","supersedes","excepts"]).has(e.relationshipType)&&((e.from.entityType!=="decision"||e.to.entityType!=="decision")&&d(n,i,"invalid_normative_relationship","Normative relationships connect decisions to decisions."),e.authority?D(n,`${i}.authority`,e.authority,!0):d(n,`${i}.authority`,"missing_relationship_authority","Normative relationships require explicit authority context.")),e.relationshipType==="implements"&&(e.from.entityType!=="implementation_attempt"||e.to.entityType!=="decision")&&d(n,i,"invalid_implements_relationship","`implements` points from an implementation attempt to a decision."),e.relationshipType==="verifies"&&(e.from.entityType!=="verification_attempt"||!["decision","implementation_attempt","model_entry"].includes(e.to.entityType))&&d(n,i,"invalid_verifies_relationship","`verifies` points from a verification attempt to a verifiable target."),e.relationshipType==="replaces"&&e.from.entityType!==e.to.entityType&&d(n,i,"invalid_replaces_relationship","`replaces` connects records of the same entity type.")}function ye(n){let e=[];I(e,"manifest.projectId",n.manifest.projectId),P(e,"manifest.createdAt",n.manifest.createdAt),P(e,"manifest.updatedAt",n.manifest.updatedAt);let i=new Map,m=(t,a)=>{let s=i.get(t);s?d(e,a,"duplicate_id",`ID is already used at ${s}.`):i.set(t,a)};n.records.forEach((t,a)=>{let s=`records[${a}]`;m(t.id,s),ke(e,t,s,n.manifest.projectId)}),n.events.forEach((t,a)=>{let s=`events[${a}]`;m(t.id,s),xe(e,t,s),t.projectId!==n.manifest.projectId&&d(e,`${s}.projectId`,"project_mismatch","Event belongs to another project.")}),n.relationships.forEach((t,a)=>{let s=`relationships[${a}]`;m(t.id,s),Ce(e,t,s),t.projectId!==n.manifest.projectId&&d(e,`${s}.projectId`,"project_mismatch","Relationship belongs to another project.")}),n.artifacts.forEach((t,a)=>{m(t.id,`artifacts[${a}]`),I(e,`artifacts[${a}].id`,t.id)}),n.tombstones.forEach((t,a)=>{let s=`tombstones[${a}]`;m(t.id,s),I(e,`${s}.id`,t.id),I(e,`${s}.objectId`,t.objectId),I(e,`${s}.deletedById`,t.deletedById),P(e,`${s}.deletedAt`,t.deletedAt),D(e,`${s}.authority`,t.authority,!0)});let $=new Set(n.records.map(t=>`${t.recordType}:${t.id}`)),j=new Set(n.tombstones.map(t=>`${t.objectType}:${t.objectId}`)),g=(t,a)=>{let s=`${t.entityType}:${t.entityId}`;!$.has(s)&&!j.has(s)&&d(e,a,"dangling_entity_reference",`No record or tombstone exists for ${s}.`)};n.events.forEach((t,a)=>g(t.entity,`events[${a}].entity`)),n.relationships.forEach((t,a)=>{g(t.from,`relationships[${a}].from`),g(t.to,`relationships[${a}].to`)});let Q=new Set(n.artifacts.map(t=>t.id)),S=(t,a)=>{Q.has(t)||d(e,a,"dangling_artifact_reference","No artifact manifest entry exists.")},u=(t,a,s)=>{!$.has(`${t}:${a}`)&&!j.has(`${t}:${a}`)&&d(e,s,"dangling_entity_reference",`No ${t} record or tombstone exists.`)};n.records.forEach((t,a)=>{let s=`records[${a}]`;switch(t.recordType){case"authority_grant":u("participant",t.granteeId,`${s}.granteeId`),u("participant",t.grantedById,`${s}.grantedById`),t.subjectIds.forEach((r,o)=>u("subject",r,`${s}.subjectIds[${o}]`));break;case"observation":t.captureContext.subjectIds.forEach((r,o)=>u("subject",r,`${s}.captureContext.subjectIds[${o}]`)),t.captureContext.artifactIds.forEach((r,o)=>S(r,`${s}.captureContext.artifactIds[${o}]`));break;case"proposal":case"decision":t.subjects.forEach((r,o)=>u("subject",r.subjectId,`${s}.subjects[${o}].subjectId`));break;case"thread":t.messageArtifactIds.forEach((r,o)=>S(r,`${s}.messageArtifactIds[${o}]`)),t.resultRefs.forEach((r,o)=>g(r,`${s}.resultRefs[${o}]`));break;case"iteration":t.threadIds.forEach((r,o)=>u("thread",r,`${s}.threadIds[${o}]`)),t.artifactIds.forEach((r,o)=>S(r,`${s}.artifactIds[${o}]`));break;case"evidence":t.artifactIds.forEach((r,o)=>S(r,`${s}.artifactIds[${o}]`));break;case"implementation_attempt":t.iterationIds.forEach((r,o)=>u("iteration",r,`${s}.iterationIds[${o}]`)),t.coverageClaims.forEach((r,o)=>u("decision",r.decisionId,`${s}.coverageClaims[${o}].decisionId`)),t.artifactIds.forEach((r,o)=>S(r,`${s}.artifactIds[${o}]`));break;case"eval_spec":t.replacesSpecId&&u("eval_spec",t.replacesSpecId,`${s}.replacesSpecId`),t.decisionIds.forEach((r,o)=>u("decision",r,`${s}.decisionIds[${o}]`)),t.subjectIds.forEach((r,o)=>u("subject",r,`${s}.subjectIds[${o}]`)),(t.dependencies??[]).forEach((r,o)=>{r.kind==="subject"&&r.subjectId&&u("subject",r.subjectId,`${s}.dependencies[${o}].subjectId`)}),(t.scenarios??[]).forEach((r,o)=>{r.subjectIds?.forEach((f,x)=>u("subject",f,`${s}.scenarios[${o}].subjectIds[${x}]`))}),t.targets.forEach((r,o)=>u(r.entityType,r.entityId,`${s}.targets[${o}]`));break;case"verification_attempt":t.evalSpecId&&u("eval_spec",t.evalSpecId,`${s}.evalSpecId`),t.targets.forEach((r,o)=>u(r.entityType,r.entityId,`${s}.targets[${o}]`)),t.evidenceIds.forEach((r,o)=>u("evidence",r,`${s}.evidenceIds[${o}]`));break;case"model_entry":t.subjectIds.forEach((r,o)=>u("subject",r,`${s}.subjectIds[${o}]`)),t.decisionIds.forEach((r,o)=>u("decision",r,`${s}.decisionIds[${o}]`));break;case"model_projection":D(e,`${s}.authority`,t.authority,!0),u("participant",t.appliedById,`${s}.appliedById`),t.decisionIds.forEach((r,o)=>u("decision",r,`${s}.decisionIds[${o}]`)),t.entryIds.forEach((r,o)=>u("model_entry",r,`${s}.entryIds[${o}]`)),t.coverage.forEach((r,o)=>u("decision",r.decisionId,`${s}.coverage[${o}].decisionId`));break;case"freshness_signal":g(t.target,`${s}.target`),t.evidenceIds.forEach((r,o)=>u("evidence",r,`${s}.evidenceIds[${o}]`));break;default:break}});let ne=new Map(n.events.map(t=>[t.id,t])),M=new Map(n.records.map(t=>[`${t.recordType}:${t.id}`,t])),q=new Map;n.events.forEach((t,a)=>{let s=`${t.entity.entityType}:${t.entity.entityId}:${t.fromState??"null"}`,r=q.get(s)??new Set;r.add(t.toState),q.set(s,r),r.size>1&&d(e,`events[${a}]`,"concurrent_incompatible_transitions","The same entity state has multiple incompatible successor states.")});let _=new Map(n.records.flatMap(t=>t.recordType==="authority_grant"?[[t.id,t]]:[])),h=(t,a,s,r,o)=>{if(t.level!=="delegate"||!t.grantId)return;let f=_.get(t.grantId);if(!f){d(e,o,"invalid_authority_grant","Delegated authority references a missing grant.");return}(f.granteeId!==a||f.level!=="delegate")&&d(e,o,"authority_grantee_mismatch","The grant does not authorize this participant as a delegate.");let x=Date.parse(s);(x<Date.parse(f.startsAt)||f.endsAt&&x>Date.parse(f.endsAt)||f.revokedAt&&x>=Date.parse(f.revokedAt))&&d(e,o,"inactive_authority_grant","The delegated authority grant was not active at this time."),f.subjectIds.length&&r.length&&!r.every(W=>f.subjectIds.includes(W))&&d(e,o,"authority_scope_mismatch","The delegated action exceeds the grant subject scope.")};for(let t of n.records)t.recordType==="decision"&&h(t.authority,t.acceptedById,t.createdAt,t.subjects.map(a=>a.subjectId),`records:${t.id}.authority`);n.events.forEach((t,a)=>{let s=M.get(`${t.entity.entityType}:${t.entity.entityId}`),r=s&&"subjects"in s?s.subjects.map(o=>o.subjectId):[];h(t.authority,t.participantId,t.createdAt,r,`events[${a}].authority`)}),n.relationships.forEach((t,a)=>{if(!t.authority)return;let s=[t.from,t.to].flatMap(r=>{let o=M.get(`${r.entityType}:${r.entityId}`);return o&&"subjects"in o?o.subjects.map(f=>f.subjectId):[]});h(t.authority,t.participantId,t.createdAt,s,`relationships[${a}].authority`)});for(let t of n.records){if(t.recordType!=="decision")continue;let a=ne.get(t.acceptanceEventId);(!a||a.entity.entityType!=="proposal"||a.entity.entityId!==t.proposalId||a.toState!=="accepted")&&d(e,`records:${t.id}.acceptanceEventId`,"invalid_acceptance_event","A decision must reference the proposal event that explicitly accepted it."),a&&a.participantId!==t.acceptedById&&d(e,`records:${t.id}.acceptedById`,"acceptor_mismatch","Decision acceptor must match the acceptance event participant."),M.has(`proposal:${t.proposalId}`)||d(e,`records:${t.id}.proposalId`,"missing_proposal","Accepted decisions must retain their proposal."),t.state==="superseded"&&(n.relationships.some(r=>r.relationshipType==="supersedes"&&r.to.entityType==="decision"&&r.to.entityId===t.id)||d(e,`records:${t.id}.state`,"missing_successor","Superseded decisions require an explicit successor relationship.")),t.state==="revoked"&&(n.events.some(r=>r.entity.entityType==="decision"&&r.entity.entityId===t.id&&r.toState==="revoked"&&!!r.reason?.trim())||d(e,`records:${t.id}.state`,"missing_revocation_event","Revoked decisions require an authorized event with a reason."))}for(let t of n.records){if(t.recordType!=="proposal"||t.state!=="accepted")continue;n.records.some(s=>s.recordType==="decision"&&s.proposalId===t.id)||d(e,`records:${t.id}.state`,"accepted_proposal_without_decision","Every accepted proposal must produce an immutable decision.")}return Re(e)}var qe=["f5258a13","31ffc15e","3eae3a70","c185e614","33930045","55e04c59","f3bb881b","f8a55928","eac95a7d","e402bdc2","2854624b","cf28ad45","6a494fab","987e901b","ad7293aa","dd1d5d77","14c429d6","48494ad3","d6bbe932","e8b94260","f56fa283","7f1f6cb3","f239f4ac","bd671e61","dbe032ec","c0808b95"];function K(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}function A(n,e=0){return new Date(Number.isFinite(n)?n:e).toISOString()}function he(...n){return n.find(e=>!!e?.trim())?.trim()}function b(n,e,i,m){let j=Math.max(0,Math.min(Math.floor(m),0xffffffffffff)).toString(16).padStart(12,"0"),g=Me("sha256").update(`${n}\0${e}\0${i}`).digest("hex"),Q=(Number.parseInt(g[3],16)&3|8).toString(16);return`${j.slice(0,8)}-${j.slice(8)}-7${g.slice(0,3)}-${Q}${g.slice(4,7)}-${g.slice(7,19)}`}async function ae(n,e){try{return JSON.parse(await Le(n,"utf8"))}catch(i){return e.push({severity:"warning",code:"source_unavailable",source:n,message:i instanceof Error?i.message:String(i)}),null}}function Ne(n){let e=K(n);if(!e)return 0;let i=0,m=$=>{let j=K($);if(!j){i+=1;return}for(let g of Object.values(j))m(g)};for(let $ of Object.values(e))m($);return i}function Oe(n){let e={};for(let i of n)e[i.recordType]=(e[i.recordType]??0)+1;return e}async function Ve(n){let e=[],i=await Be(n.projectRoot).catch(()=>n.projectRoot),m=X(i,".popmelt"),$=await ae(X(m,"threads.json"),e),j=await ae(X(m,"model.json"),e),g=K($),Q=K(g?.threads)??{},S=Object.entries(Q).map(([c,p])=>({key:c,value:K(p)})).filter(c=>!!c.value),u=X(m,"decisions"),ne=await Pe(u).catch(()=>[]),M=[];for(let c of ne.filter(p=>p.endsWith(".json")).sort()){let p=K(await ae(X(u,c),e));p&&M.push({file:c,value:p})}let q=S.flatMap(({value:c})=>[c.createdAt,c.updatedAt]).filter(c=>typeof c=="number"&&Number.isFinite(c)),_=q.length?Math.min(...q):0,h=n.projectKey??i;n.projectKey||e.push({severity:"info",code:"path_derived_project_identity",message:"Canonical project identity is stable for this path; pass projectKey to preserve it across moves."});let t=b(h,"project",h,_),a=b(h,"participant","legacy-owner",_),s=b(h,"participant","legacy-agent",_),r=b(h,"subject","project",_),o=A(Math.max(_,...q)),f=[],x=[],W=new Map,z=new Map,ce=new Map(M.map(c=>[c.value.id??c.file.replace(/^d-|\.json$/g,""),c.value])),ie=new Map,Y=(c,p,l,v,R)=>{let k=W.get(l);if(k)return k;let L=b(h,"artifact",c,v);return x.push({id:L,kind:p,mediaType:R,location:l,availability:"available"}),W.set(l,L),L};for(let{file:c,value:p}of M){let l=p.id??c.replace(/^d-|\.json$/g,""),v=p.createdAt??_,R=[Y(`${l}:envelope`,"other",`.popmelt/decisions/${c}`,v,"application/json")];p.screenshotPath&&R.push(Y(`${l}:screenshot`,"screenshot",`.popmelt/${p.screenshotPath.replace(/^\.popmelt\//,"")}`,v,p.screenshotPath.endsWith(".png")?"image/png":"image/webp"));for(let[k,L]of(p.pastedImagePaths??[]).entries())R.push(Y(`${l}:image:${k}`,"image",L,v));ie.set(l,R)}let C=(c,p,l)=>({id:c,schemaVersion:1,projectId:t,createdAt:o,participantId:p,sourceRefs:l}),Z=(c,p)=>{f.push(p);let l=z.get(c)??[];l.push(p.id),z.set(c,l)},Ie=[{...C(a,a,[]),recordType:"participant",kind:"human",displayName:"Legacy project owner",status:"active"},{...C(s,s,[]),recordType:"participant",kind:"ai",displayName:"Legacy coding agent",status:"active"}];f.push(...Ie),f.push({...C(r,a,[]),recordType:"subject",subjectType:"project",label:De(process.cwd(),i)||i,aliases:[],locators:[{id:b(h,"locator",i,_),kind:"project_root",value:i,status:"current",validFrom:A(_),sourceRefs:[]}]});let de=new Map,pe=(c,p)=>{let l=de.get(c);if(l)return l;let v=b(h,"subject",c,p),R={...C(v,a,[{kind:"external",id:c}]),createdAt:A(p),recordType:"subject",subjectType:"element",label:c,aliases:[],locators:[{id:b(h,"locator",c,p),kind:"dom_selector",value:c,status:"current",validFrom:A(p),sourceRefs:[{kind:"external",id:c}]}]};return f.push(R),de.set(c,v),v};for(let{key:c,value:p}of S){let l=p.id??c,v=p.createdAt??_,R=b(h,"thread",l,v),k={kind:"thread",id:l},L=[],H=[],ue=Array.isArray(p.messages)?p.messages:[],N,se,me=0;ue.forEach((y,O)=>{let T=y.timestamp??v,B=b(h,"artifact",`${l}:message:${O}`,T);if(L.push(B),x.push({id:B,kind:"message",mediaType:"application/json",location:`.popmelt/threads.json#/threads/${l}/messages/${O}`,availability:"available"}),W.set(`.popmelt/threads.json#/threads/${l}/messages/${O}`,B),y.screenshotPath&&Y(`${l}:message:${O}:screenshot`,"screenshot",y.screenshotPath,T),y.role==="human"){N=y;let E=y.feedbackSummary??y.replyToQuestion;if(E?.trim()){let w=b(h,"observation",`${l}:${O}`,T),U=p.elementIdentifiers??[],te={...C(w,a,[k,{kind:"message",id:B}]),createdAt:A(T),recordType:"observation",state:"open",statement:E,captureContext:{subjectIds:U.map(G=>pe(G,v)),artifactIds:[B]},resolvedByIds:[]};Z(l,te),se=w,H.push({entityType:"observation",entityId:w})}return}if(y.role!=="assistant")return;let V=y.jobId??`${l}:${O}`,F=b(h,"iteration",V,T),J=ce.get(V),je=y.cancelled?"cancelled":y.error?"failed":y.question?"question_asked":(y.resolutions?.length??0)>0?"completed":"no_change",_e={...C(F,s,[k,{kind:"message",id:B},...(ie.get(V)??[]).map(E=>({kind:"artifact",id:E}))]),createdAt:A(T),recordType:"iteration",threadIds:[R],startedAt:A(N?.timestamp,T),completedAt:A(T),requestSummary:he(N?.feedbackSummary,N?.replyToQuestion)??"[legacy request unavailable]",responseSummary:y.question??y.error??y.responseText?.slice(0,1e3),outcome:je,execution:{provider:y.provider??J?.provider,model:y.model??J?.model,sessionId:y.sessionId??J?.sessionId},artifactIds:[B,...ie.get(V)??[]]};Z(l,_e),H.push({entityType:"iteration",entityId:F});let re=y.resolutions??J?.resolutions??[];for(let[E,w]of re.entries()){if(w.status!=="resolved"||!w.summary?.trim())continue;let U=p.elementIdentifiers??[],te=(U.length?U:[i]).map(ge=>({subjectId:ge===i?r:pe(ge,v),role:"governed"})),G=b(h,"proposal",`${V}:${w.annotationId??"resolution"}:${E}`,T),Te={...C(G,s,[k,{kind:"iteration",id:F}]),createdAt:A(T),recordType:"proposal",state:"pending",claim:w.summary,subjects:te,subjectSemantics:te.length>1?"Legacy thread grouped these selected elements; independent scope requires owner review.":void 0,origin:{mode:"inferred",sourceText:he(N?.feedbackSummary,N?.replyToQuestion,w.summary),iterationId:F,inferredById:s}};Z(l,Te),H.push({entityType:"proposal",entityId:G}),e.push({severity:"warning",code:"acceptance_unresolved",source:l,message:`Proposal ${G} remains pending; legacy resolved status proves an outcome, not explicit acceptance.`})}if(re.some(E=>E.status==="resolved")||J?.gitDiff){let E=b(h,"implementation",V,T),w={...C(E,s,[k,{kind:"iteration",id:F}]),createdAt:A(T),recordType:"implementation_attempt",state:"completed",iterationIds:[F],coverageClaims:[],summary:re.map(U=>U.summary).filter(Boolean).join(" ")||"Legacy implementation outcome.",artifactIds:[]};Z(l,w),H.push({entityType:"implementation_attempt",entityId:E}),me+=1}se&&(se=void 0)});let fe=ue.at(-1),$e={...C(R,a,[k]),createdAt:A(v),recordType:"thread",state:fe?.question?"open":"resolved",messageArtifactIds:L,outcome:fe?.question?"question_unresolved":me?"implementation_only":"no_outcome",resultRefs:H};f.push($e),z.set(l,[R,...z.get(l)??[]])}let ee=Ne(j);ee&&e.push({severity:"warning",code:"model_entries_deferred",source:".popmelt/model.json",message:`${ee} model values were not promoted because their accepted decision provenance is unresolved.`});let le={manifest:{formatVersion:1,projectId:t,createdAt:A(_),updatedAt:o,features:["authority","subjects","implementations","eval_specs","portable_artifacts","bounded_retrieval"],writer:{name:"@popmelt.com/core legacy importer",version:n.writerVersion??"0.8.4-dev"}},records:f,events:[],relationships:[],artifacts:x,tombstones:[]},ve=ye(le),be=(n.proofCaseIds??qe).map(c=>({legacyId:c,threadFound:S.some(({key:p,value:l})=>(l.id??p)===c),decisionEnvelopeFound:ce.has(c),recordIds:z.get(c)??[]}));return{bundle:le,report:{projectRoot:i,source:{threads:S.length,messages:S.reduce((c,p)=>c+(p.value.messages?.length??0),0),decisionEnvelopes:M.length,modelEntries:ee,artifactsReferenced:x.length},imported:Oe(f),unresolvedAcceptance:e.filter(c=>c.code==="acceptance_unresolved").length,deferredModelEntries:ee,proofCases:be,issues:e,schemaIssues:ve.issues}}}export{Ve as importLegacyProject,b as legacyUuidV7};
|