@devflow-tools/database 0.16.21 → 0.16.23
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/CHANGELOG.md +23 -0
- package/__tests__/database.learning-candidates.test.ts +93 -0
- package/__tests__/database.workflow-workers.test.ts +60 -0
- package/dist/database.d.ts +42 -0
- package/dist/database.js +623 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +12 -1
- package/dist/learning-candidates.d.ts +87 -0
- package/dist/learning-candidates.js +81 -0
- package/dist/work-queue.d.ts +1 -1
- package/dist/workflow-workers.d.ts +97 -0
- package/dist/workflow-workers.js +90 -0
- package/package.json +2 -2
- package/src/database.ts +848 -0
- package/src/index.ts +35 -0
- package/src/learning-candidates.ts +181 -0
- package/src/work-queue.ts +6 -0
- package/src/workflow-workers.ts +198 -0
- package/tsconfig.tsbuildinfo +1 -0
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.normalizeTurnId = exports.mapSessionObligationRow = exports.isRetrievalSessionState = exports.RETRIEVAL_MAX_CYCLES = exports.serializeHostActionReport = exports.mapHostActionRow = exports.isHostActionState = exports.hostActionReportsEqual = exports.openGlobalDevFlowDatabase = exports.getGlobalDevFlowDbPath = exports.DevFlowDatabase = void 0;
|
|
3
|
+
exports.stableLearningJson = exports.mapLearningVersionRow = exports.mapLearningEvidenceRow = exports.mapLearningCandidateRow = exports.mapWorkflowWorkerRow = exports.mapWorkflowWorkerEventRow = exports.mapWorkflowMergeRow = exports.TERMINAL_WORKFLOW_WORKER_STATES = exports.LEGAL_WORKFLOW_WORKER_TRANSITIONS = exports.normalizeTurnId = exports.mapSessionObligationRow = exports.isRetrievalSessionState = exports.RETRIEVAL_MAX_CYCLES = exports.serializeHostActionReport = exports.mapHostActionRow = exports.isHostActionState = exports.hostActionReportsEqual = exports.openGlobalDevFlowDatabase = exports.getGlobalDevFlowDbPath = exports.DevFlowDatabase = void 0;
|
|
4
4
|
var database_1 = require("./database");
|
|
5
5
|
Object.defineProperty(exports, "DevFlowDatabase", { enumerable: true, get: function () { return database_1.DevFlowDatabase; } });
|
|
6
6
|
Object.defineProperty(exports, "getGlobalDevFlowDbPath", { enumerable: true, get: function () { return database_1.getGlobalDevFlowDbPath; } });
|
|
@@ -16,3 +16,14 @@ Object.defineProperty(exports, "isRetrievalSessionState", { enumerable: true, ge
|
|
|
16
16
|
var obligation_ledger_1 = require("./obligation-ledger");
|
|
17
17
|
Object.defineProperty(exports, "mapSessionObligationRow", { enumerable: true, get: function () { return obligation_ledger_1.mapSessionObligationRow; } });
|
|
18
18
|
Object.defineProperty(exports, "normalizeTurnId", { enumerable: true, get: function () { return obligation_ledger_1.normalizeTurnId; } });
|
|
19
|
+
var workflow_workers_1 = require("./workflow-workers");
|
|
20
|
+
Object.defineProperty(exports, "LEGAL_WORKFLOW_WORKER_TRANSITIONS", { enumerable: true, get: function () { return workflow_workers_1.LEGAL_WORKFLOW_WORKER_TRANSITIONS; } });
|
|
21
|
+
Object.defineProperty(exports, "TERMINAL_WORKFLOW_WORKER_STATES", { enumerable: true, get: function () { return workflow_workers_1.TERMINAL_WORKFLOW_WORKER_STATES; } });
|
|
22
|
+
Object.defineProperty(exports, "mapWorkflowMergeRow", { enumerable: true, get: function () { return workflow_workers_1.mapWorkflowMergeRow; } });
|
|
23
|
+
Object.defineProperty(exports, "mapWorkflowWorkerEventRow", { enumerable: true, get: function () { return workflow_workers_1.mapWorkflowWorkerEventRow; } });
|
|
24
|
+
Object.defineProperty(exports, "mapWorkflowWorkerRow", { enumerable: true, get: function () { return workflow_workers_1.mapWorkflowWorkerRow; } });
|
|
25
|
+
var learning_candidates_1 = require("./learning-candidates");
|
|
26
|
+
Object.defineProperty(exports, "mapLearningCandidateRow", { enumerable: true, get: function () { return learning_candidates_1.mapLearningCandidateRow; } });
|
|
27
|
+
Object.defineProperty(exports, "mapLearningEvidenceRow", { enumerable: true, get: function () { return learning_candidates_1.mapLearningEvidenceRow; } });
|
|
28
|
+
Object.defineProperty(exports, "mapLearningVersionRow", { enumerable: true, get: function () { return learning_candidates_1.mapLearningVersionRow; } });
|
|
29
|
+
Object.defineProperty(exports, "stableLearningJson", { enumerable: true, get: function () { return learning_candidates_1.stableLearningJson; } });
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export type LearningCandidateState = 'observed' | 'candidate' | 'shadow' | 'evaluated' | 'active' | 'rejected' | 'retired';
|
|
2
|
+
export type LearningCandidateKind = 'convention' | 'workflow' | 'tool_preference' | 'correction';
|
|
3
|
+
export type LearningEvidencePolarity = 'supporting' | 'contradicting';
|
|
4
|
+
export type LearningOutcomeState = 'positive' | 'negative' | 'unknown';
|
|
5
|
+
export interface LearningCandidateRecord {
|
|
6
|
+
id: string;
|
|
7
|
+
projectRoot: string;
|
|
8
|
+
scope: 'project' | 'global';
|
|
9
|
+
state: LearningCandidateState;
|
|
10
|
+
kind: LearningCandidateKind;
|
|
11
|
+
trigger: Record<string, unknown>;
|
|
12
|
+
instruction: string;
|
|
13
|
+
confidence: number;
|
|
14
|
+
overlayVersion: number;
|
|
15
|
+
supportingSessions: number;
|
|
16
|
+
successfulOutcomes: number;
|
|
17
|
+
contradictions: number;
|
|
18
|
+
manualOnly: boolean;
|
|
19
|
+
risk: 'low' | 'medium' | 'high';
|
|
20
|
+
graderReceipt?: string;
|
|
21
|
+
expiresAt?: number;
|
|
22
|
+
createdAt: number;
|
|
23
|
+
updatedAt: number;
|
|
24
|
+
}
|
|
25
|
+
export interface LearningCandidateVersionRecord {
|
|
26
|
+
candidateId: string;
|
|
27
|
+
version: number;
|
|
28
|
+
trigger: Record<string, unknown>;
|
|
29
|
+
instruction: string;
|
|
30
|
+
createdAt: number;
|
|
31
|
+
}
|
|
32
|
+
export interface LearningCandidateEvidenceRecord {
|
|
33
|
+
id: string;
|
|
34
|
+
candidateId: string;
|
|
35
|
+
projectRoot: string;
|
|
36
|
+
sessionId: string;
|
|
37
|
+
executionId?: string;
|
|
38
|
+
memoryObservationId?: string;
|
|
39
|
+
outcomeId?: string;
|
|
40
|
+
sourceType: 'memory' | 'correction' | 'workflow_outcome' | 'tool_preference' | 'convention' | 'grader' | 'manual';
|
|
41
|
+
polarity: LearningEvidencePolarity;
|
|
42
|
+
outcome: LearningOutcomeState;
|
|
43
|
+
evidenceHash: string;
|
|
44
|
+
receipt?: string;
|
|
45
|
+
payload: Record<string, unknown>;
|
|
46
|
+
createdAt: number;
|
|
47
|
+
resolvedAt?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface UpsertLearningCandidateInput {
|
|
50
|
+
id: string;
|
|
51
|
+
projectRoot: string;
|
|
52
|
+
scope: 'project' | 'global';
|
|
53
|
+
kind: LearningCandidateKind;
|
|
54
|
+
trigger: Record<string, unknown>;
|
|
55
|
+
instruction: string;
|
|
56
|
+
confidence: number;
|
|
57
|
+
manualOnly?: boolean;
|
|
58
|
+
risk?: 'low' | 'medium' | 'high';
|
|
59
|
+
expiresAt?: number;
|
|
60
|
+
}
|
|
61
|
+
export interface AddLearningCandidateEvidenceInput {
|
|
62
|
+
id: string;
|
|
63
|
+
candidateId: string;
|
|
64
|
+
projectRoot: string;
|
|
65
|
+
sessionId: string;
|
|
66
|
+
executionId?: string;
|
|
67
|
+
memoryObservationId?: string;
|
|
68
|
+
outcomeId?: string;
|
|
69
|
+
sourceType: LearningCandidateEvidenceRecord['sourceType'];
|
|
70
|
+
polarity: LearningEvidencePolarity;
|
|
71
|
+
outcome?: LearningOutcomeState;
|
|
72
|
+
evidenceHash: string;
|
|
73
|
+
receipt?: string;
|
|
74
|
+
payload?: Record<string, unknown>;
|
|
75
|
+
createdAt?: number;
|
|
76
|
+
}
|
|
77
|
+
export interface TransitionLearningCandidateInput {
|
|
78
|
+
target: LearningCandidateState;
|
|
79
|
+
reason: string;
|
|
80
|
+
graderReceipt?: string;
|
|
81
|
+
manualApproval?: boolean;
|
|
82
|
+
changedAt?: number;
|
|
83
|
+
}
|
|
84
|
+
export declare function mapLearningCandidateRow(row: Record<string, unknown>): LearningCandidateRecord;
|
|
85
|
+
export declare function mapLearningEvidenceRow(row: Record<string, unknown>): LearningCandidateEvidenceRecord;
|
|
86
|
+
export declare function mapLearningVersionRow(row: Record<string, unknown>): LearningCandidateVersionRecord;
|
|
87
|
+
export declare function stableLearningJson(value: unknown): string;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapLearningCandidateRow = mapLearningCandidateRow;
|
|
4
|
+
exports.mapLearningEvidenceRow = mapLearningEvidenceRow;
|
|
5
|
+
exports.mapLearningVersionRow = mapLearningVersionRow;
|
|
6
|
+
exports.stableLearningJson = stableLearningJson;
|
|
7
|
+
function mapLearningCandidateRow(row) {
|
|
8
|
+
return {
|
|
9
|
+
id: String(row.id),
|
|
10
|
+
projectRoot: String(row.project_root),
|
|
11
|
+
scope: row.scope === 'global' ? 'global' : 'project',
|
|
12
|
+
state: row.state,
|
|
13
|
+
kind: row.kind,
|
|
14
|
+
trigger: parseRecord(row.trigger_json),
|
|
15
|
+
instruction: String(row.instruction),
|
|
16
|
+
confidence: Number(row.confidence),
|
|
17
|
+
overlayVersion: Number(row.overlay_version),
|
|
18
|
+
supportingSessions: Number(row.supporting_sessions),
|
|
19
|
+
successfulOutcomes: Number(row.successful_outcomes),
|
|
20
|
+
contradictions: Number(row.contradictions),
|
|
21
|
+
manualOnly: Number(row.manual_only) === 1,
|
|
22
|
+
risk: row.risk === 'high' ? 'high' : row.risk === 'medium' ? 'medium' : 'low',
|
|
23
|
+
graderReceipt: optionalString(row.grader_receipt),
|
|
24
|
+
expiresAt: optionalNumber(row.expires_at),
|
|
25
|
+
createdAt: Number(row.created_at),
|
|
26
|
+
updatedAt: Number(row.updated_at),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function mapLearningEvidenceRow(row) {
|
|
30
|
+
return {
|
|
31
|
+
id: String(row.id),
|
|
32
|
+
candidateId: String(row.candidate_id),
|
|
33
|
+
projectRoot: String(row.project_root),
|
|
34
|
+
sessionId: String(row.session_id),
|
|
35
|
+
executionId: optionalString(row.execution_id),
|
|
36
|
+
memoryObservationId: optionalString(row.memory_observation_id),
|
|
37
|
+
outcomeId: optionalString(row.outcome_id),
|
|
38
|
+
sourceType: row.source_type,
|
|
39
|
+
polarity: row.polarity,
|
|
40
|
+
outcome: row.outcome,
|
|
41
|
+
evidenceHash: String(row.evidence_hash),
|
|
42
|
+
receipt: optionalString(row.receipt),
|
|
43
|
+
payload: parseRecord(row.payload_json),
|
|
44
|
+
createdAt: Number(row.created_at),
|
|
45
|
+
resolvedAt: optionalNumber(row.resolved_at),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function mapLearningVersionRow(row) {
|
|
49
|
+
return {
|
|
50
|
+
candidateId: String(row.candidate_id),
|
|
51
|
+
version: Number(row.version),
|
|
52
|
+
trigger: parseRecord(row.trigger_json),
|
|
53
|
+
instruction: String(row.instruction),
|
|
54
|
+
createdAt: Number(row.created_at),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function stableLearningJson(value) {
|
|
58
|
+
if (Array.isArray(value))
|
|
59
|
+
return `[${value.map(stableLearningJson).join(',')}]`;
|
|
60
|
+
if (!value || typeof value !== 'object')
|
|
61
|
+
return JSON.stringify(value) ?? 'null';
|
|
62
|
+
const record = value;
|
|
63
|
+
return `{${Object.keys(record).sort().map(key => `${JSON.stringify(key)}:${stableLearningJson(record[key])}`).join(',')}}`;
|
|
64
|
+
}
|
|
65
|
+
function parseRecord(value) {
|
|
66
|
+
try {
|
|
67
|
+
const parsed = typeof value === 'string' ? JSON.parse(value) : value;
|
|
68
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
69
|
+
? parsed
|
|
70
|
+
: {};
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return {};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function optionalString(value) {
|
|
77
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
78
|
+
}
|
|
79
|
+
function optionalNumber(value) {
|
|
80
|
+
return value === null || value === undefined ? undefined : Number(value);
|
|
81
|
+
}
|
package/dist/work-queue.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type WorkKind = 'memory.explicit_commit' | 'memory.explicit_enrichment' | 'memory.turn_capture' | 'memory.turn_distill' | 'memory.vector_backfill' | 'context.prefetch' | 'session.bootstrap' | 'session.finalize' | 'telemetry.reconcile';
|
|
1
|
+
export type WorkKind = 'memory.explicit_commit' | 'memory.explicit_enrichment' | 'memory.turn_capture' | 'memory.turn_distill' | 'memory.vector_backfill' | 'context.prefetch' | 'learning.analyze_session' | 'workflow.worker_start' | 'workflow.worker_monitor' | 'workflow.worker_verify' | 'workflow.worker_merge' | 'workflow.worker_cleanup' | 'session.bootstrap' | 'session.finalize' | 'telemetry.reconcile';
|
|
2
2
|
export type WorkState = 'pending' | 'leased' | 'completed' | 'failed' | 'dead_letter';
|
|
3
3
|
export interface WorkError {
|
|
4
4
|
category: string;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export type WorkflowWorkerState = 'planned' | 'leased' | 'starting' | 'running' | 'reported' | 'verifying' | 'merge_ready' | 'merged' | 'hold' | 'failed' | 'cancelled';
|
|
2
|
+
export type WorkflowMergeState = 'waiting' | 'ready' | 'conflict' | 'merged' | 'rejected';
|
|
3
|
+
export interface WorkflowWorkerRecord {
|
|
4
|
+
workerId: string;
|
|
5
|
+
runId: string;
|
|
6
|
+
stepId: string;
|
|
7
|
+
projectRoot: string;
|
|
8
|
+
branch: string;
|
|
9
|
+
worktreePath: string;
|
|
10
|
+
host: string;
|
|
11
|
+
state: WorkflowWorkerState;
|
|
12
|
+
leaseOwner?: string;
|
|
13
|
+
leaseExpiresAt?: number;
|
|
14
|
+
heartbeatAt?: number;
|
|
15
|
+
contextReceipt: string;
|
|
16
|
+
retrievalSessionId?: string;
|
|
17
|
+
sessionId?: string;
|
|
18
|
+
executionId?: string;
|
|
19
|
+
baseRevision: string;
|
|
20
|
+
finalRevision?: string;
|
|
21
|
+
allowedFiles: string[];
|
|
22
|
+
handoff: Record<string, unknown>;
|
|
23
|
+
holdReason?: string;
|
|
24
|
+
failureReason?: string;
|
|
25
|
+
createdAt: number;
|
|
26
|
+
updatedAt: number;
|
|
27
|
+
finishedAt?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface CreateWorkflowWorkerInput {
|
|
30
|
+
workerId?: string;
|
|
31
|
+
runId: string;
|
|
32
|
+
stepId: string;
|
|
33
|
+
projectRoot: string;
|
|
34
|
+
branch: string;
|
|
35
|
+
worktreePath: string;
|
|
36
|
+
host: string;
|
|
37
|
+
contextReceipt: string;
|
|
38
|
+
retrievalSessionId?: string;
|
|
39
|
+
sessionId?: string;
|
|
40
|
+
executionId?: string;
|
|
41
|
+
baseRevision: string;
|
|
42
|
+
allowedFiles?: string[];
|
|
43
|
+
handoff?: Record<string, unknown>;
|
|
44
|
+
}
|
|
45
|
+
export interface TransitionWorkflowWorkerInput {
|
|
46
|
+
projectRoot: string;
|
|
47
|
+
workerId: string;
|
|
48
|
+
target: WorkflowWorkerState;
|
|
49
|
+
leaseOwner?: string;
|
|
50
|
+
leaseExpiresAt?: number;
|
|
51
|
+
heartbeatAt?: number;
|
|
52
|
+
finalRevision?: string;
|
|
53
|
+
handoff?: Record<string, unknown>;
|
|
54
|
+
reason?: string;
|
|
55
|
+
now?: number;
|
|
56
|
+
}
|
|
57
|
+
export interface WorkflowWorkerEventRecord {
|
|
58
|
+
eventId: string;
|
|
59
|
+
workerId: string;
|
|
60
|
+
projectRoot: string;
|
|
61
|
+
fromState?: WorkflowWorkerState;
|
|
62
|
+
toState: WorkflowWorkerState;
|
|
63
|
+
reason?: string;
|
|
64
|
+
payload: Record<string, unknown>;
|
|
65
|
+
createdAt: number;
|
|
66
|
+
}
|
|
67
|
+
export interface WorkflowMergeRecord {
|
|
68
|
+
mergeId: string;
|
|
69
|
+
workerId: string;
|
|
70
|
+
projectRoot: string;
|
|
71
|
+
state: WorkflowMergeState;
|
|
72
|
+
baseRevision: string;
|
|
73
|
+
parentRevision: string;
|
|
74
|
+
candidateRevision: string;
|
|
75
|
+
graderReceipts: string[];
|
|
76
|
+
simulationHash?: string;
|
|
77
|
+
mergeCommit?: string;
|
|
78
|
+
reason?: string;
|
|
79
|
+
createdAt: number;
|
|
80
|
+
updatedAt: number;
|
|
81
|
+
finishedAt?: number;
|
|
82
|
+
}
|
|
83
|
+
export interface EnqueueWorkflowMergeInput {
|
|
84
|
+
mergeId?: string;
|
|
85
|
+
workerId: string;
|
|
86
|
+
projectRoot: string;
|
|
87
|
+
baseRevision: string;
|
|
88
|
+
parentRevision: string;
|
|
89
|
+
candidateRevision: string;
|
|
90
|
+
graderReceipts?: string[];
|
|
91
|
+
simulationHash?: string;
|
|
92
|
+
}
|
|
93
|
+
export declare const TERMINAL_WORKFLOW_WORKER_STATES: Set<WorkflowWorkerState>;
|
|
94
|
+
export declare const LEGAL_WORKFLOW_WORKER_TRANSITIONS: Record<WorkflowWorkerState, WorkflowWorkerState[]>;
|
|
95
|
+
export declare function mapWorkflowWorkerRow(row: any): WorkflowWorkerRecord;
|
|
96
|
+
export declare function mapWorkflowWorkerEventRow(row: any): WorkflowWorkerEventRecord;
|
|
97
|
+
export declare function mapWorkflowMergeRow(row: any): WorkflowMergeRecord;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LEGAL_WORKFLOW_WORKER_TRANSITIONS = exports.TERMINAL_WORKFLOW_WORKER_STATES = void 0;
|
|
4
|
+
exports.mapWorkflowWorkerRow = mapWorkflowWorkerRow;
|
|
5
|
+
exports.mapWorkflowWorkerEventRow = mapWorkflowWorkerEventRow;
|
|
6
|
+
exports.mapWorkflowMergeRow = mapWorkflowMergeRow;
|
|
7
|
+
exports.TERMINAL_WORKFLOW_WORKER_STATES = new Set([
|
|
8
|
+
'merged', 'failed', 'cancelled',
|
|
9
|
+
]);
|
|
10
|
+
exports.LEGAL_WORKFLOW_WORKER_TRANSITIONS = {
|
|
11
|
+
planned: ['leased', 'cancelled', 'hold', 'failed'],
|
|
12
|
+
leased: ['starting', 'hold', 'cancelled', 'failed'],
|
|
13
|
+
starting: ['running', 'reported', 'hold', 'cancelled', 'failed'],
|
|
14
|
+
running: ['reported', 'hold', 'cancelled', 'failed'],
|
|
15
|
+
reported: ['verifying', 'hold', 'cancelled', 'failed'],
|
|
16
|
+
verifying: ['merge_ready', 'hold', 'cancelled', 'failed'],
|
|
17
|
+
merge_ready: ['merged', 'hold', 'cancelled', 'failed'],
|
|
18
|
+
merged: [],
|
|
19
|
+
hold: ['leased', 'cancelled', 'failed'],
|
|
20
|
+
failed: [],
|
|
21
|
+
cancelled: [],
|
|
22
|
+
};
|
|
23
|
+
function mapWorkflowWorkerRow(row) {
|
|
24
|
+
return {
|
|
25
|
+
workerId: row.worker_id,
|
|
26
|
+
runId: row.run_id,
|
|
27
|
+
stepId: row.step_id,
|
|
28
|
+
projectRoot: row.project_root,
|
|
29
|
+
branch: row.branch,
|
|
30
|
+
worktreePath: row.worktree_path,
|
|
31
|
+
host: row.host,
|
|
32
|
+
state: row.state,
|
|
33
|
+
leaseOwner: row.lease_owner ?? undefined,
|
|
34
|
+
leaseExpiresAt: row.lease_expires_at ?? undefined,
|
|
35
|
+
heartbeatAt: row.heartbeat_at ?? undefined,
|
|
36
|
+
contextReceipt: row.context_receipt,
|
|
37
|
+
retrievalSessionId: row.retrieval_session_id ?? undefined,
|
|
38
|
+
sessionId: row.session_id ?? undefined,
|
|
39
|
+
executionId: row.execution_id ?? undefined,
|
|
40
|
+
baseRevision: row.base_revision,
|
|
41
|
+
finalRevision: row.final_revision ?? undefined,
|
|
42
|
+
allowedFiles: parseJson(row.allowed_files, []),
|
|
43
|
+
handoff: parseJson(row.handoff_json, {}),
|
|
44
|
+
holdReason: row.hold_reason ?? undefined,
|
|
45
|
+
failureReason: row.failure_reason ?? undefined,
|
|
46
|
+
createdAt: row.created_at,
|
|
47
|
+
updatedAt: row.updated_at,
|
|
48
|
+
finishedAt: row.finished_at ?? undefined,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function mapWorkflowWorkerEventRow(row) {
|
|
52
|
+
return {
|
|
53
|
+
eventId: row.event_id,
|
|
54
|
+
workerId: row.worker_id,
|
|
55
|
+
projectRoot: row.project_root,
|
|
56
|
+
fromState: row.from_state ?? undefined,
|
|
57
|
+
toState: row.to_state,
|
|
58
|
+
reason: row.reason ?? undefined,
|
|
59
|
+
payload: parseJson(row.payload_json, {}),
|
|
60
|
+
createdAt: row.created_at,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function mapWorkflowMergeRow(row) {
|
|
64
|
+
return {
|
|
65
|
+
mergeId: row.merge_id,
|
|
66
|
+
workerId: row.worker_id,
|
|
67
|
+
projectRoot: row.project_root,
|
|
68
|
+
state: row.state,
|
|
69
|
+
baseRevision: row.base_revision,
|
|
70
|
+
parentRevision: row.parent_revision,
|
|
71
|
+
candidateRevision: row.candidate_revision,
|
|
72
|
+
graderReceipts: parseJson(row.grader_receipts, []),
|
|
73
|
+
simulationHash: row.simulation_hash ?? undefined,
|
|
74
|
+
mergeCommit: row.merge_commit ?? undefined,
|
|
75
|
+
reason: row.reason ?? undefined,
|
|
76
|
+
createdAt: row.created_at,
|
|
77
|
+
updatedAt: row.updated_at,
|
|
78
|
+
finishedAt: row.finished_at ?? undefined,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function parseJson(value, fallback) {
|
|
82
|
+
if (typeof value !== 'string' || value.length === 0)
|
|
83
|
+
return fallback;
|
|
84
|
+
try {
|
|
85
|
+
return JSON.parse(value);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return fallback;
|
|
89
|
+
}
|
|
90
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/database",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.23",
|
|
4
4
|
"description": "DevFlow SQLite database package",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -13,5 +13,5 @@
|
|
|
13
13
|
"typescript": "^5.5.0",
|
|
14
14
|
"vitest": "^2.0.0"
|
|
15
15
|
},
|
|
16
|
-
"gitHead": "
|
|
16
|
+
"gitHead": "9cace27e1c380cc2bd73a57fa2709f04e197f25b"
|
|
17
17
|
}
|