vgxness 0.1.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/LICENSE +9 -0
- package/README.md +110 -0
- package/dist/agents/agent-activation-service.js +144 -0
- package/dist/agents/agent-registry-service.js +46 -0
- package/dist/agents/agent-resolver.js +249 -0
- package/dist/agents/agent-seed-service.js +146 -0
- package/dist/agents/manager-profile-overlay-service.js +34 -0
- package/dist/agents/profile-model-routing.js +26 -0
- package/dist/agents/renderers/claude-renderer.js +98 -0
- package/dist/agents/renderers/index.js +16 -0
- package/dist/agents/renderers/json-renderer.js +87 -0
- package/dist/agents/renderers/opencode-renderer.js +100 -0
- package/dist/agents/renderers/provider-adapter.js +6 -0
- package/dist/agents/repositories/agents.js +185 -0
- package/dist/agents/repositories/manager-profile-overlays.js +81 -0
- package/dist/agents/schema.js +1 -0
- package/dist/cli/dashboard-operational-read-models.js +153 -0
- package/dist/cli/dashboard-renderer.js +109 -0
- package/dist/cli/dashboard-screen-renderers.js +332 -0
- package/dist/cli/dashboard-tui-read-model.js +71 -0
- package/dist/cli/dashboard-tui-state.js +218 -0
- package/dist/cli/dispatcher.js +2880 -0
- package/dist/cli/index.js +27 -0
- package/dist/cli/interactive-dashboard.js +29 -0
- package/dist/cli/mcp-start-path.js +21 -0
- package/dist/cli/setup-status-renderer.js +29 -0
- package/dist/cli/setup-wizard-read-model.js +56 -0
- package/dist/cli/setup-wizard-renderer.js +148 -0
- package/dist/cli/setup-wizard-state.js +82 -0
- package/dist/cli/tui-render-helpers.js +192 -0
- package/dist/export/redaction.js +71 -0
- package/dist/harness/tools/agents.js +245 -0
- package/dist/harness/tools/memory.js +29 -0
- package/dist/mcp/client-install-opencode-contract.js +227 -0
- package/dist/mcp/client-install-opencode.js +194 -0
- package/dist/mcp/client-setup-preview.js +38 -0
- package/dist/mcp/control-plane.js +175 -0
- package/dist/mcp/doctor.js +193 -0
- package/dist/mcp/index.js +10 -0
- package/dist/mcp/opencode-default-agent-config.js +156 -0
- package/dist/mcp/opencode-visibility.js +102 -0
- package/dist/mcp/schema.js +234 -0
- package/dist/mcp/stdio-server.js +56 -0
- package/dist/mcp/validation.js +761 -0
- package/dist/memory/import/dry-run-planner.js +58 -0
- package/dist/memory/import/index.js +3 -0
- package/dist/memory/import/observation-writer.js +220 -0
- package/dist/memory/import/package.js +178 -0
- package/dist/memory/memory-service.js +126 -0
- package/dist/memory/repositories/artifacts.js +41 -0
- package/dist/memory/repositories/observations.js +133 -0
- package/dist/memory/repositories/sessions.js +105 -0
- package/dist/memory/repositories/traces.js +58 -0
- package/dist/memory/schema.js +1 -0
- package/dist/memory/search.js +11 -0
- package/dist/memory/sqlite/database.js +97 -0
- package/dist/memory/sqlite/migrations/001_initial.sql +128 -0
- package/dist/memory/sqlite/migrations/002_observation_revisions.sql +14 -0
- package/dist/memory/sqlite/migrations/003_agent_registry.sql +26 -0
- package/dist/memory/sqlite/migrations/004_run_runtime.sql +62 -0
- package/dist/memory/sqlite/migrations/005_run_approvals.sql +20 -0
- package/dist/memory/sqlite/migrations/006_run_operation_attempts.sql +32 -0
- package/dist/memory/sqlite/migrations/007_abandoned_operation_attempts.sql +46 -0
- package/dist/memory/sqlite/migrations/008_run_execution_plan_events.sql +105 -0
- package/dist/memory/sqlite/migrations/009_multiple_operation_attempts.sql +73 -0
- package/dist/memory/sqlite/migrations/010_skill_registry.sql +66 -0
- package/dist/memory/sqlite/migrations/011_skill_usage_resolution_outcomes.sql +21 -0
- package/dist/memory/sqlite/migrations/012_skill_improvement_proposals.sql +37 -0
- package/dist/memory/sqlite/migrations/013_skill_evaluation_scenarios.sql +43 -0
- package/dist/memory/sqlite/migrations/014_manager_profile_overlays.sql +14 -0
- package/dist/memory/storage-paths.js +72 -0
- package/dist/orchestrator/natural-language-planner.js +191 -0
- package/dist/orchestrator/schema.js +1 -0
- package/dist/permissions/index.js +2 -0
- package/dist/permissions/policy-evaluator.js +109 -0
- package/dist/permissions/schema.js +1 -0
- package/dist/providers/opencode/injection-preview.js +134 -0
- package/dist/providers/opencode/manager-payload.js +129 -0
- package/dist/runs/execution-planning.js +117 -0
- package/dist/runs/operation-execution.js +1 -0
- package/dist/runs/operation-retry.js +124 -0
- package/dist/runs/repositories/runs.js +611 -0
- package/dist/runs/run-insights.js +145 -0
- package/dist/runs/run-service.js +713 -0
- package/dist/runs/run-snapshot-export-service.js +31 -0
- package/dist/runs/sandbox-process-execution.js +218 -0
- package/dist/runs/sandbox-worktree-planning.js +59 -0
- package/dist/runs/schema.js +1 -0
- package/dist/sdd/artifact-portability-service.js +118 -0
- package/dist/sdd/schema.js +17 -0
- package/dist/sdd/sdd-workflow-service.js +217 -0
- package/dist/setup/backup-rollback-service.js +76 -0
- package/dist/setup/index.js +3 -0
- package/dist/setup/providers/antigravity-setup-adapter.js +18 -0
- package/dist/setup/providers/claude-setup-adapter.js +30 -0
- package/dist/setup/providers/custom-setup-adapter.js +18 -0
- package/dist/setup/providers/index.js +6 -0
- package/dist/setup/providers/opencode-setup-adapter.js +104 -0
- package/dist/setup/providers/provider-setup-adapter.js +15 -0
- package/dist/setup/providers/provider-setup-registry.js +11 -0
- package/dist/setup/schema.js +1 -0
- package/dist/setup/setup-defaults.js +11 -0
- package/dist/setup/setup-lifecycle-service.js +175 -0
- package/dist/setup/setup-plan.js +105 -0
- package/dist/skills/repositories/skill-evaluation-scenarios.js +289 -0
- package/dist/skills/repositories/skill-improvement-proposals.js +288 -0
- package/dist/skills/repositories/skills.js +430 -0
- package/dist/skills/schema.js +1 -0
- package/dist/skills/skill-payload.js +94 -0
- package/dist/skills/skill-registry-service.js +92 -0
- package/dist/skills/skill-resolver.js +191 -0
- package/dist/workflows/command-allowlist-adapter.js +70 -0
- package/dist/workflows/schema.js +4 -0
- package/dist/workflows/workflow-executor.js +345 -0
- package/dist/workflows/workflow-registry.js +66 -0
- package/docs/architecture.md +698 -0
- package/docs/cli.md +741 -0
- package/docs/funcionamiento-del-sistema.md +868 -0
- package/docs/harness-gap-analysis.md +229 -0
- package/docs/prd.md +372 -0
- package/package.json +57 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS run_operation_attempts (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
run_id TEXT NOT NULL REFERENCES runs(id) ON DELETE CASCADE,
|
|
4
|
+
approval_id TEXT REFERENCES run_approvals(id) ON DELETE CASCADE,
|
|
5
|
+
decision_event_id TEXT NOT NULL REFERENCES run_events(id) ON DELETE CASCADE,
|
|
6
|
+
pending_execution_event_id TEXT REFERENCES run_events(id) ON DELETE CASCADE,
|
|
7
|
+
category TEXT NOT NULL,
|
|
8
|
+
operation TEXT NOT NULL,
|
|
9
|
+
operation_json TEXT NOT NULL,
|
|
10
|
+
executor_name TEXT NOT NULL,
|
|
11
|
+
status TEXT NOT NULL CHECK (status IN ('reserved', 'succeeded', 'failed', 'abandoned')),
|
|
12
|
+
result_event_id TEXT REFERENCES run_events(id) ON DELETE SET NULL,
|
|
13
|
+
output_json TEXT,
|
|
14
|
+
error_json TEXT,
|
|
15
|
+
reserved_at TEXT NOT NULL,
|
|
16
|
+
updated_at TEXT NOT NULL,
|
|
17
|
+
completed_at TEXT,
|
|
18
|
+
CHECK (
|
|
19
|
+
(status = 'reserved' AND completed_at IS NULL)
|
|
20
|
+
OR (status IN ('succeeded', 'failed', 'abandoned') AND completed_at IS NOT NULL)
|
|
21
|
+
)
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
CREATE UNIQUE INDEX IF NOT EXISTS run_operation_attempts_approval_once_idx
|
|
25
|
+
ON run_operation_attempts(approval_id)
|
|
26
|
+
WHERE approval_id IS NOT NULL;
|
|
27
|
+
|
|
28
|
+
CREATE INDEX IF NOT EXISTS run_operation_attempts_run_reserved_idx
|
|
29
|
+
ON run_operation_attempts(run_id, reserved_at DESC);
|
|
30
|
+
|
|
31
|
+
CREATE INDEX IF NOT EXISTS run_operation_attempts_decision_event_idx
|
|
32
|
+
ON run_operation_attempts(decision_event_id);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS run_operation_attempts_v2 (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
run_id TEXT NOT NULL REFERENCES runs(id) ON DELETE CASCADE,
|
|
4
|
+
approval_id TEXT REFERENCES run_approvals(id) ON DELETE CASCADE,
|
|
5
|
+
decision_event_id TEXT NOT NULL REFERENCES run_events(id) ON DELETE CASCADE,
|
|
6
|
+
pending_execution_event_id TEXT REFERENCES run_events(id) ON DELETE CASCADE,
|
|
7
|
+
category TEXT NOT NULL,
|
|
8
|
+
operation TEXT NOT NULL,
|
|
9
|
+
operation_json TEXT NOT NULL,
|
|
10
|
+
executor_name TEXT NOT NULL,
|
|
11
|
+
status TEXT NOT NULL CHECK (status IN ('reserved', 'succeeded', 'failed', 'abandoned')),
|
|
12
|
+
result_event_id TEXT REFERENCES run_events(id) ON DELETE SET NULL,
|
|
13
|
+
output_json TEXT,
|
|
14
|
+
error_json TEXT,
|
|
15
|
+
reserved_at TEXT NOT NULL,
|
|
16
|
+
updated_at TEXT NOT NULL,
|
|
17
|
+
completed_at TEXT,
|
|
18
|
+
CHECK (
|
|
19
|
+
(status = 'reserved' AND completed_at IS NULL)
|
|
20
|
+
OR (status IN ('succeeded', 'failed', 'abandoned') AND completed_at IS NOT NULL)
|
|
21
|
+
)
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
INSERT OR IGNORE INTO run_operation_attempts_v2(
|
|
25
|
+
id, run_id, approval_id, decision_event_id, pending_execution_event_id,
|
|
26
|
+
category, operation, operation_json, executor_name, status, result_event_id,
|
|
27
|
+
output_json, error_json, reserved_at, updated_at, completed_at
|
|
28
|
+
)
|
|
29
|
+
SELECT
|
|
30
|
+
id, run_id, approval_id, decision_event_id, pending_execution_event_id,
|
|
31
|
+
category, operation, operation_json, executor_name, status, result_event_id,
|
|
32
|
+
output_json, error_json, reserved_at, updated_at, completed_at
|
|
33
|
+
FROM run_operation_attempts;
|
|
34
|
+
|
|
35
|
+
DROP TABLE run_operation_attempts;
|
|
36
|
+
ALTER TABLE run_operation_attempts_v2 RENAME TO run_operation_attempts;
|
|
37
|
+
|
|
38
|
+
CREATE UNIQUE INDEX IF NOT EXISTS run_operation_attempts_approval_once_idx
|
|
39
|
+
ON run_operation_attempts(approval_id)
|
|
40
|
+
WHERE approval_id IS NOT NULL;
|
|
41
|
+
|
|
42
|
+
CREATE INDEX IF NOT EXISTS run_operation_attempts_run_reserved_idx
|
|
43
|
+
ON run_operation_attempts(run_id, reserved_at DESC);
|
|
44
|
+
|
|
45
|
+
CREATE INDEX IF NOT EXISTS run_operation_attempts_decision_event_idx
|
|
46
|
+
ON run_operation_attempts(decision_event_id);
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
CREATE TABLE run_events_with_execution_plan (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
run_id TEXT NOT NULL REFERENCES runs(id) ON DELETE CASCADE,
|
|
4
|
+
sequence INTEGER NOT NULL,
|
|
5
|
+
kind TEXT NOT NULL CHECK (kind IN ('timeline', 'evidence', 'memory-operation', 'artifact-reference', 'tool-call', 'permission-decision', 'execution-plan', 'operation-execution', 'approval', 'verification')),
|
|
6
|
+
title TEXT NOT NULL,
|
|
7
|
+
payload_json TEXT NOT NULL,
|
|
8
|
+
related_type TEXT,
|
|
9
|
+
related_id TEXT,
|
|
10
|
+
created_at TEXT NOT NULL,
|
|
11
|
+
UNIQUE(run_id, sequence)
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
INSERT INTO run_events_with_execution_plan(id, run_id, sequence, kind, title, payload_json, related_type, related_id, created_at)
|
|
15
|
+
SELECT id, run_id, sequence, kind, title, payload_json, related_type, related_id, created_at
|
|
16
|
+
FROM run_events;
|
|
17
|
+
|
|
18
|
+
CREATE TEMP TABLE run_approvals_008_backup AS
|
|
19
|
+
SELECT * FROM run_approvals;
|
|
20
|
+
|
|
21
|
+
CREATE TEMP TABLE run_operation_attempts_008_backup AS
|
|
22
|
+
SELECT * FROM run_operation_attempts;
|
|
23
|
+
|
|
24
|
+
DROP TABLE run_operation_attempts;
|
|
25
|
+
DROP TABLE run_approvals;
|
|
26
|
+
DROP TABLE run_events;
|
|
27
|
+
ALTER TABLE run_events_with_execution_plan RENAME TO run_events;
|
|
28
|
+
|
|
29
|
+
CREATE INDEX IF NOT EXISTS run_events_run_sequence_idx
|
|
30
|
+
ON run_events(run_id, sequence);
|
|
31
|
+
|
|
32
|
+
CREATE INDEX IF NOT EXISTS run_events_related_idx
|
|
33
|
+
ON run_events(related_type, related_id);
|
|
34
|
+
|
|
35
|
+
CREATE TABLE run_approvals (
|
|
36
|
+
id TEXT PRIMARY KEY,
|
|
37
|
+
run_id TEXT NOT NULL REFERENCES runs(id) ON DELETE CASCADE,
|
|
38
|
+
decision_event_id TEXT NOT NULL REFERENCES run_events(id) ON DELETE CASCADE,
|
|
39
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'approved', 'rejected', 'cancelled')),
|
|
40
|
+
requested_at TEXT NOT NULL,
|
|
41
|
+
resolved_at TEXT,
|
|
42
|
+
resolved_by TEXT,
|
|
43
|
+
resolution_reason TEXT,
|
|
44
|
+
CHECK (
|
|
45
|
+
(status = 'pending' AND resolved_at IS NULL AND resolved_by IS NULL AND resolution_reason IS NULL)
|
|
46
|
+
OR (status IN ('approved', 'rejected', 'cancelled') AND resolved_at IS NOT NULL AND resolved_by IS NOT NULL)
|
|
47
|
+
)
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
INSERT INTO run_approvals(id, run_id, decision_event_id, status, requested_at, resolved_at, resolved_by, resolution_reason)
|
|
51
|
+
SELECT id, run_id, decision_event_id, status, requested_at, resolved_at, resolved_by, resolution_reason
|
|
52
|
+
FROM run_approvals_008_backup;
|
|
53
|
+
|
|
54
|
+
CREATE UNIQUE INDEX IF NOT EXISTS run_approvals_decision_event_idx
|
|
55
|
+
ON run_approvals(decision_event_id);
|
|
56
|
+
|
|
57
|
+
CREATE INDEX IF NOT EXISTS run_approvals_run_status_idx
|
|
58
|
+
ON run_approvals(run_id, status, requested_at DESC);
|
|
59
|
+
|
|
60
|
+
CREATE TABLE run_operation_attempts (
|
|
61
|
+
id TEXT PRIMARY KEY,
|
|
62
|
+
run_id TEXT NOT NULL REFERENCES runs(id) ON DELETE CASCADE,
|
|
63
|
+
approval_id TEXT REFERENCES run_approvals(id) ON DELETE CASCADE,
|
|
64
|
+
decision_event_id TEXT NOT NULL REFERENCES run_events(id) ON DELETE CASCADE,
|
|
65
|
+
pending_execution_event_id TEXT REFERENCES run_events(id) ON DELETE CASCADE,
|
|
66
|
+
category TEXT NOT NULL,
|
|
67
|
+
operation TEXT NOT NULL,
|
|
68
|
+
operation_json TEXT NOT NULL,
|
|
69
|
+
executor_name TEXT NOT NULL,
|
|
70
|
+
status TEXT NOT NULL CHECK (status IN ('reserved', 'succeeded', 'failed', 'abandoned')),
|
|
71
|
+
result_event_id TEXT REFERENCES run_events(id) ON DELETE SET NULL,
|
|
72
|
+
output_json TEXT,
|
|
73
|
+
error_json TEXT,
|
|
74
|
+
reserved_at TEXT NOT NULL,
|
|
75
|
+
updated_at TEXT NOT NULL,
|
|
76
|
+
completed_at TEXT,
|
|
77
|
+
CHECK (
|
|
78
|
+
(status = 'reserved' AND completed_at IS NULL)
|
|
79
|
+
OR (status IN ('succeeded', 'failed', 'abandoned') AND completed_at IS NOT NULL)
|
|
80
|
+
)
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
INSERT INTO run_operation_attempts(
|
|
84
|
+
id, run_id, approval_id, decision_event_id, pending_execution_event_id,
|
|
85
|
+
category, operation, operation_json, executor_name, status, result_event_id,
|
|
86
|
+
output_json, error_json, reserved_at, updated_at, completed_at
|
|
87
|
+
)
|
|
88
|
+
SELECT
|
|
89
|
+
id, run_id, approval_id, decision_event_id, pending_execution_event_id,
|
|
90
|
+
category, operation, operation_json, executor_name, status, result_event_id,
|
|
91
|
+
output_json, error_json, reserved_at, updated_at, completed_at
|
|
92
|
+
FROM run_operation_attempts_008_backup;
|
|
93
|
+
|
|
94
|
+
CREATE UNIQUE INDEX IF NOT EXISTS run_operation_attempts_approval_once_idx
|
|
95
|
+
ON run_operation_attempts(approval_id)
|
|
96
|
+
WHERE approval_id IS NOT NULL;
|
|
97
|
+
|
|
98
|
+
CREATE INDEX IF NOT EXISTS run_operation_attempts_run_reserved_idx
|
|
99
|
+
ON run_operation_attempts(run_id, reserved_at DESC);
|
|
100
|
+
|
|
101
|
+
CREATE INDEX IF NOT EXISTS run_operation_attempts_decision_event_idx
|
|
102
|
+
ON run_operation_attempts(decision_event_id);
|
|
103
|
+
|
|
104
|
+
DROP TABLE run_operation_attempts_008_backup;
|
|
105
|
+
DROP TABLE run_approvals_008_backup;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
CREATE TABLE run_operation_attempts_v3 (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
run_id TEXT NOT NULL REFERENCES runs(id) ON DELETE CASCADE,
|
|
4
|
+
approval_id TEXT REFERENCES run_approvals(id) ON DELETE CASCADE,
|
|
5
|
+
attempt_sequence INTEGER NOT NULL CHECK (attempt_sequence >= 1),
|
|
6
|
+
decision_event_id TEXT NOT NULL REFERENCES run_events(id) ON DELETE CASCADE,
|
|
7
|
+
pending_execution_event_id TEXT REFERENCES run_events(id) ON DELETE CASCADE,
|
|
8
|
+
category TEXT NOT NULL,
|
|
9
|
+
operation TEXT NOT NULL,
|
|
10
|
+
operation_json TEXT NOT NULL,
|
|
11
|
+
executor_name TEXT NOT NULL,
|
|
12
|
+
status TEXT NOT NULL CHECK (status IN ('reserved', 'succeeded', 'failed', 'abandoned')),
|
|
13
|
+
result_event_id TEXT REFERENCES run_events(id) ON DELETE SET NULL,
|
|
14
|
+
output_json TEXT,
|
|
15
|
+
error_json TEXT,
|
|
16
|
+
reserved_at TEXT NOT NULL,
|
|
17
|
+
updated_at TEXT NOT NULL,
|
|
18
|
+
completed_at TEXT,
|
|
19
|
+
CHECK (
|
|
20
|
+
(status = 'reserved' AND completed_at IS NULL)
|
|
21
|
+
OR (status IN ('succeeded', 'failed', 'abandoned') AND completed_at IS NOT NULL)
|
|
22
|
+
),
|
|
23
|
+
UNIQUE(approval_id, attempt_sequence)
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
INSERT INTO run_operation_attempts_v3(
|
|
27
|
+
id, run_id, approval_id, attempt_sequence, decision_event_id, pending_execution_event_id,
|
|
28
|
+
category, operation, operation_json, executor_name, status, result_event_id,
|
|
29
|
+
output_json, error_json, reserved_at, updated_at, completed_at
|
|
30
|
+
)
|
|
31
|
+
SELECT
|
|
32
|
+
id,
|
|
33
|
+
run_id,
|
|
34
|
+
approval_id,
|
|
35
|
+
CASE
|
|
36
|
+
WHEN approval_id IS NULL THEN 1
|
|
37
|
+
ELSE ROW_NUMBER() OVER (PARTITION BY approval_id ORDER BY reserved_at ASC, id ASC)
|
|
38
|
+
END AS attempt_sequence,
|
|
39
|
+
decision_event_id,
|
|
40
|
+
pending_execution_event_id,
|
|
41
|
+
category,
|
|
42
|
+
operation,
|
|
43
|
+
operation_json,
|
|
44
|
+
executor_name,
|
|
45
|
+
status,
|
|
46
|
+
result_event_id,
|
|
47
|
+
output_json,
|
|
48
|
+
error_json,
|
|
49
|
+
reserved_at,
|
|
50
|
+
updated_at,
|
|
51
|
+
completed_at
|
|
52
|
+
FROM run_operation_attempts;
|
|
53
|
+
|
|
54
|
+
DROP TABLE run_operation_attempts;
|
|
55
|
+
ALTER TABLE run_operation_attempts_v3 RENAME TO run_operation_attempts;
|
|
56
|
+
|
|
57
|
+
CREATE UNIQUE INDEX IF NOT EXISTS run_operation_attempts_approval_sequence_idx
|
|
58
|
+
ON run_operation_attempts(approval_id, attempt_sequence)
|
|
59
|
+
WHERE approval_id IS NOT NULL;
|
|
60
|
+
|
|
61
|
+
CREATE UNIQUE INDEX IF NOT EXISTS run_operation_attempts_approval_reserved_once_idx
|
|
62
|
+
ON run_operation_attempts(approval_id)
|
|
63
|
+
WHERE approval_id IS NOT NULL AND status = 'reserved';
|
|
64
|
+
|
|
65
|
+
CREATE INDEX IF NOT EXISTS run_operation_attempts_run_reserved_idx
|
|
66
|
+
ON run_operation_attempts(run_id, reserved_at DESC);
|
|
67
|
+
|
|
68
|
+
CREATE INDEX IF NOT EXISTS run_operation_attempts_decision_event_idx
|
|
69
|
+
ON run_operation_attempts(decision_event_id);
|
|
70
|
+
|
|
71
|
+
CREATE INDEX IF NOT EXISTS run_operation_attempts_approval_order_idx
|
|
72
|
+
ON run_operation_attempts(approval_id, attempt_sequence ASC)
|
|
73
|
+
WHERE approval_id IS NOT NULL;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS skills (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
project TEXT NOT NULL,
|
|
4
|
+
scope TEXT NOT NULL CHECK (scope IN ('project', 'personal')),
|
|
5
|
+
name TEXT NOT NULL,
|
|
6
|
+
description TEXT NOT NULL,
|
|
7
|
+
current_version_id TEXT,
|
|
8
|
+
created_at TEXT NOT NULL,
|
|
9
|
+
updated_at TEXT NOT NULL,
|
|
10
|
+
UNIQUE(project, scope, name),
|
|
11
|
+
FOREIGN KEY(current_version_id) REFERENCES skill_versions(id) ON DELETE SET NULL
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE TABLE IF NOT EXISTS skill_versions (
|
|
15
|
+
id TEXT PRIMARY KEY,
|
|
16
|
+
skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
|
|
17
|
+
version TEXT NOT NULL,
|
|
18
|
+
source_kind TEXT NOT NULL CHECK (source_kind IN ('path', 'url', 'inline')),
|
|
19
|
+
source_path TEXT,
|
|
20
|
+
source_url TEXT,
|
|
21
|
+
source_inline_metadata_json TEXT,
|
|
22
|
+
compatibility_json TEXT NOT NULL,
|
|
23
|
+
status TEXT NOT NULL CHECK (status IN ('draft', 'active', 'deprecated', 'archived')),
|
|
24
|
+
created_at TEXT NOT NULL,
|
|
25
|
+
UNIQUE(skill_id, version),
|
|
26
|
+
CHECK (
|
|
27
|
+
(source_kind = 'path' AND source_path IS NOT NULL AND source_url IS NULL)
|
|
28
|
+
OR (source_kind = 'url' AND source_url IS NOT NULL AND source_path IS NULL)
|
|
29
|
+
OR (source_kind = 'inline' AND source_path IS NULL AND source_url IS NULL)
|
|
30
|
+
)
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
CREATE TABLE IF NOT EXISTS skill_attachments (
|
|
34
|
+
id TEXT PRIMARY KEY,
|
|
35
|
+
skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
|
|
36
|
+
version_id TEXT REFERENCES skill_versions(id) ON DELETE SET NULL,
|
|
37
|
+
target_type TEXT NOT NULL CHECK (target_type IN ('agent', 'subagent', 'workflow-phase', 'provider-adapter')),
|
|
38
|
+
target_key TEXT NOT NULL,
|
|
39
|
+
metadata_json TEXT NOT NULL,
|
|
40
|
+
created_at TEXT NOT NULL,
|
|
41
|
+
UNIQUE(skill_id, target_type, target_key)
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
CREATE TABLE IF NOT EXISTS skill_usage_records (
|
|
45
|
+
id TEXT PRIMARY KEY,
|
|
46
|
+
skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
|
|
47
|
+
version_id TEXT REFERENCES skill_versions(id) ON DELETE SET NULL,
|
|
48
|
+
run_id TEXT,
|
|
49
|
+
target_type TEXT CHECK (target_type IN ('agent', 'subagent', 'workflow-phase', 'provider-adapter')),
|
|
50
|
+
target_key TEXT,
|
|
51
|
+
outcome TEXT NOT NULL CHECK (outcome IN ('selected', 'injected', 'helped', 'failed', 'neutral')),
|
|
52
|
+
notes TEXT,
|
|
53
|
+
created_at TEXT NOT NULL
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
CREATE INDEX IF NOT EXISTS skills_project_scope_name_idx
|
|
57
|
+
ON skills(project, scope, name);
|
|
58
|
+
|
|
59
|
+
CREATE INDEX IF NOT EXISTS skill_versions_skill_created_idx
|
|
60
|
+
ON skill_versions(skill_id, created_at DESC);
|
|
61
|
+
|
|
62
|
+
CREATE INDEX IF NOT EXISTS skill_attachments_target_idx
|
|
63
|
+
ON skill_attachments(target_type, target_key);
|
|
64
|
+
|
|
65
|
+
CREATE INDEX IF NOT EXISTS skill_usage_records_run_idx
|
|
66
|
+
ON skill_usage_records(run_id, created_at DESC);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS skill_usage_records_next (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
|
|
4
|
+
version_id TEXT REFERENCES skill_versions(id) ON DELETE SET NULL,
|
|
5
|
+
run_id TEXT,
|
|
6
|
+
target_type TEXT CHECK (target_type IN ('agent', 'subagent', 'workflow-phase', 'provider-adapter')),
|
|
7
|
+
target_key TEXT,
|
|
8
|
+
outcome TEXT NOT NULL CHECK (outcome IN ('selected', 'injected', 'helped', 'failed', 'neutral')),
|
|
9
|
+
notes TEXT,
|
|
10
|
+
created_at TEXT NOT NULL
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
INSERT INTO skill_usage_records_next(id, skill_id, version_id, run_id, target_type, target_key, outcome, notes, created_at)
|
|
14
|
+
SELECT id, skill_id, version_id, run_id, target_type, target_key, outcome, notes, created_at
|
|
15
|
+
FROM skill_usage_records;
|
|
16
|
+
|
|
17
|
+
DROP TABLE skill_usage_records;
|
|
18
|
+
ALTER TABLE skill_usage_records_next RENAME TO skill_usage_records;
|
|
19
|
+
|
|
20
|
+
CREATE INDEX IF NOT EXISTS skill_usage_records_run_idx
|
|
21
|
+
ON skill_usage_records(run_id, created_at DESC);
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS skill_improvement_proposals (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
|
|
4
|
+
base_version_id TEXT NOT NULL REFERENCES skill_versions(id) ON DELETE CASCADE,
|
|
5
|
+
proposed_version TEXT NOT NULL,
|
|
6
|
+
proposed_source_kind TEXT NOT NULL CHECK (proposed_source_kind IN ('path', 'url', 'inline')),
|
|
7
|
+
proposed_source_path TEXT,
|
|
8
|
+
proposed_source_url TEXT,
|
|
9
|
+
proposed_source_inline_metadata_json TEXT,
|
|
10
|
+
proposed_compatibility_json TEXT NOT NULL,
|
|
11
|
+
rationale TEXT NOT NULL,
|
|
12
|
+
source_signal_json TEXT NOT NULL,
|
|
13
|
+
diff_summary_json TEXT NOT NULL,
|
|
14
|
+
status TEXT NOT NULL CHECK (status IN ('draft', 'pending-approval', 'approved', 'rejected', 'cancelled', 'applied')),
|
|
15
|
+
created_at TEXT NOT NULL,
|
|
16
|
+
updated_at TEXT NOT NULL,
|
|
17
|
+
submitted_at TEXT,
|
|
18
|
+
submitted_by TEXT,
|
|
19
|
+
resolved_at TEXT,
|
|
20
|
+
resolved_by TEXT,
|
|
21
|
+
resolution_reason TEXT,
|
|
22
|
+
applied_at TEXT,
|
|
23
|
+
applied_by TEXT,
|
|
24
|
+
apply_reason TEXT,
|
|
25
|
+
applied_version_id TEXT REFERENCES skill_versions(id) ON DELETE SET NULL,
|
|
26
|
+
CHECK (
|
|
27
|
+
(proposed_source_kind = 'path' AND proposed_source_path IS NOT NULL AND proposed_source_url IS NULL)
|
|
28
|
+
OR (proposed_source_kind = 'url' AND proposed_source_url IS NOT NULL AND proposed_source_path IS NULL)
|
|
29
|
+
OR (proposed_source_kind = 'inline' AND proposed_source_path IS NULL AND proposed_source_url IS NULL)
|
|
30
|
+
)
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
CREATE INDEX IF NOT EXISTS skill_improvement_proposals_skill_status_idx
|
|
34
|
+
ON skill_improvement_proposals(skill_id, status, created_at DESC);
|
|
35
|
+
|
|
36
|
+
CREATE INDEX IF NOT EXISTS skill_improvement_proposals_base_version_idx
|
|
37
|
+
ON skill_improvement_proposals(base_version_id, created_at DESC);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS skill_evaluation_scenarios (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
|
|
4
|
+
name TEXT NOT NULL,
|
|
5
|
+
normalized_name TEXT NOT NULL,
|
|
6
|
+
criteria_json TEXT NOT NULL,
|
|
7
|
+
proposal_id TEXT REFERENCES skill_improvement_proposals(id) ON DELETE SET NULL,
|
|
8
|
+
proposal_context_key TEXT NOT NULL,
|
|
9
|
+
version_id TEXT REFERENCES skill_versions(id) ON DELETE SET NULL,
|
|
10
|
+
version_context_key TEXT NOT NULL,
|
|
11
|
+
created_by TEXT NOT NULL,
|
|
12
|
+
created_at TEXT NOT NULL,
|
|
13
|
+
updated_at TEXT NOT NULL,
|
|
14
|
+
UNIQUE(skill_id, normalized_name, proposal_context_key, version_context_key)
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
CREATE INDEX IF NOT EXISTS skill_evaluation_scenarios_skill_context_idx
|
|
18
|
+
ON skill_evaluation_scenarios(skill_id, proposal_context_key, version_context_key, normalized_name ASC);
|
|
19
|
+
|
|
20
|
+
CREATE INDEX IF NOT EXISTS skill_evaluation_scenarios_proposal_idx
|
|
21
|
+
ON skill_evaluation_scenarios(proposal_id, normalized_name ASC);
|
|
22
|
+
|
|
23
|
+
CREATE TABLE IF NOT EXISTS skill_evaluation_results (
|
|
24
|
+
id TEXT PRIMARY KEY,
|
|
25
|
+
scenario_id TEXT NOT NULL REFERENCES skill_evaluation_scenarios(id) ON DELETE CASCADE,
|
|
26
|
+
status TEXT NOT NULL CHECK (status IN ('passed', 'failed', 'needs-review', 'not-applicable')),
|
|
27
|
+
result_json TEXT NOT NULL,
|
|
28
|
+
observed_behavior TEXT NOT NULL,
|
|
29
|
+
evaluator TEXT NOT NULL,
|
|
30
|
+
proposal_id TEXT REFERENCES skill_improvement_proposals(id) ON DELETE SET NULL,
|
|
31
|
+
version_id TEXT REFERENCES skill_versions(id) ON DELETE SET NULL,
|
|
32
|
+
notes TEXT,
|
|
33
|
+
created_at TEXT NOT NULL
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
CREATE INDEX IF NOT EXISTS skill_evaluation_results_scenario_idx
|
|
37
|
+
ON skill_evaluation_results(scenario_id, created_at ASC, id ASC);
|
|
38
|
+
|
|
39
|
+
CREATE INDEX IF NOT EXISTS skill_evaluation_results_proposal_idx
|
|
40
|
+
ON skill_evaluation_results(proposal_id, created_at ASC, id ASC);
|
|
41
|
+
|
|
42
|
+
CREATE INDEX IF NOT EXISTS skill_evaluation_results_status_evaluator_idx
|
|
43
|
+
ON skill_evaluation_results(status, evaluator, created_at ASC, id ASC);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS manager_profile_overlays (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
project TEXT NOT NULL,
|
|
4
|
+
scope TEXT NOT NULL CHECK (scope IN ('project', 'personal')),
|
|
5
|
+
manager_name TEXT NOT NULL,
|
|
6
|
+
instructions TEXT,
|
|
7
|
+
created_at TEXT NOT NULL,
|
|
8
|
+
updated_at TEXT NOT NULL,
|
|
9
|
+
UNIQUE(project, scope, manager_name),
|
|
10
|
+
CHECK (instructions IS NOT NULL AND length(trim(instructions)) > 0)
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
CREATE INDEX IF NOT EXISTS manager_profile_overlays_project_scope_idx
|
|
14
|
+
ON manager_profile_overlays(project, scope, manager_name);
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { mkdirSync } from 'node:fs';
|
|
2
|
+
import path, { dirname, resolve } from 'node:path';
|
|
3
|
+
export function resolveMemoryDatabasePath(input) {
|
|
4
|
+
if (hasPathValue(input.explicitPath)) {
|
|
5
|
+
return { ok: true, value: { path: absolutePath(input.cwd, input.explicitPath), source: 'flag' } };
|
|
6
|
+
}
|
|
7
|
+
if (hasPathValue(input.env.VGXNESS_DB_PATH)) {
|
|
8
|
+
return { ok: true, value: { path: absolutePath(input.cwd, input.env.VGXNESS_DB_PATH), source: 'environment' } };
|
|
9
|
+
}
|
|
10
|
+
const globalPath = defaultGlobalMemoryDatabasePath({ env: input.env, platform: input.platform });
|
|
11
|
+
return globalPath.ok
|
|
12
|
+
? { ok: true, value: { path: globalPath.value, source: 'global-default' } }
|
|
13
|
+
: globalPath;
|
|
14
|
+
}
|
|
15
|
+
export function defaultGlobalMemoryDatabasePath(input) {
|
|
16
|
+
const platform = input.platform ?? process.platform;
|
|
17
|
+
if (platform === 'darwin')
|
|
18
|
+
return homeRelativePath(input.env, ['Library', 'Application Support', 'vgxness', 'memory.sqlite']);
|
|
19
|
+
if (platform === 'win32')
|
|
20
|
+
return windowsAppDataPath(input.env);
|
|
21
|
+
return linuxDataPath(input.env);
|
|
22
|
+
}
|
|
23
|
+
export function prepareMemoryDatabasePath(databasePath) {
|
|
24
|
+
try {
|
|
25
|
+
mkdirSync(dirname(databasePath), { recursive: true });
|
|
26
|
+
return { ok: true, value: databasePath };
|
|
27
|
+
}
|
|
28
|
+
catch (cause) {
|
|
29
|
+
return {
|
|
30
|
+
ok: false,
|
|
31
|
+
error: {
|
|
32
|
+
code: 'store_unavailable',
|
|
33
|
+
message: `Unable to prepare local memory store directory at ${dirname(databasePath)}`,
|
|
34
|
+
cause,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function linuxDataPath(env) {
|
|
40
|
+
if (hasPathValue(env.XDG_DATA_HOME))
|
|
41
|
+
return { ok: true, value: path.join(env.XDG_DATA_HOME, 'vgxness', 'memory.sqlite') };
|
|
42
|
+
return homeRelativePath(env, ['.local', 'share', 'vgxness', 'memory.sqlite']);
|
|
43
|
+
}
|
|
44
|
+
function windowsAppDataPath(env) {
|
|
45
|
+
if (!hasPathValue(env.APPDATA))
|
|
46
|
+
return missingBase('APPDATA');
|
|
47
|
+
return { ok: true, value: path.win32.join(env.APPDATA, 'vgxness', 'memory.sqlite') };
|
|
48
|
+
}
|
|
49
|
+
function homeRelativePath(env, segments) {
|
|
50
|
+
const home = userHome(env);
|
|
51
|
+
if (!hasPathValue(home))
|
|
52
|
+
return missingBase('HOME');
|
|
53
|
+
return { ok: true, value: path.join(home, ...segments) };
|
|
54
|
+
}
|
|
55
|
+
function userHome(env) {
|
|
56
|
+
return env.HOME;
|
|
57
|
+
}
|
|
58
|
+
function missingBase(variable) {
|
|
59
|
+
return {
|
|
60
|
+
ok: false,
|
|
61
|
+
error: {
|
|
62
|
+
code: 'store_unavailable',
|
|
63
|
+
message: `Unable to resolve global memory store path because ${variable} is not set. Provide --db or VGXNESS_DB_PATH to select an explicit database.`,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function absolutePath(cwd, configuredPath) {
|
|
68
|
+
return path.isAbsolute(configuredPath) ? configuredPath : resolve(cwd, configuredPath);
|
|
69
|
+
}
|
|
70
|
+
function hasPathValue(value) {
|
|
71
|
+
return value !== undefined && value.trim().length > 0;
|
|
72
|
+
}
|