@voybio/ace-swarm 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/CHANGELOG.md +109 -0
- package/LICENSE +186 -0
- package/README.md +229 -0
- package/assets/.agents/ACE/ACE-Init/AGENTS.md +210 -0
- package/assets/.agents/ACE/ACE-Init/instructions.md +118 -0
- package/assets/.agents/ACE/ACE_coders/AGENTS.md +154 -0
- package/assets/.agents/ACE/ACE_coders/INSTRUCTIONS.md +216 -0
- package/assets/.agents/ACE/AGENT_REGISTRY.md +70 -0
- package/assets/.agents/ACE/AGENT_REGISTRY_7.md +9 -0
- package/assets/.agents/ACE/DIRECTIVE_KERNEL.md +234 -0
- package/assets/.agents/ACE/UI/AGENTS.md +115 -0
- package/assets/.agents/ACE/UI/instructions.md +178 -0
- package/assets/.agents/ACE/VOS/ACE_VOS_MISSING_INFO_MATRIX.md +42 -0
- package/assets/.agents/ACE/VOS/AGENTS.md +72 -0
- package/assets/.agents/ACE/VOS/instructions.md +211 -0
- package/assets/.agents/ACE/agent-astgrep/AGENTS.md +123 -0
- package/assets/.agents/ACE/agent-astgrep/instructions.md +91 -0
- package/assets/.agents/ACE/agent-builder/AGENTS.md +172 -0
- package/assets/.agents/ACE/agent-builder/instructions.md +137 -0
- package/assets/.agents/ACE/agent-docs/AGENTS.md +159 -0
- package/assets/.agents/ACE/agent-docs/instructions.md +133 -0
- package/assets/.agents/ACE/agent-eval/AGENTS.md +46 -0
- package/assets/.agents/ACE/agent-eval/instructions.md +56 -0
- package/assets/.agents/ACE/agent-memory/AGENTS.md +49 -0
- package/assets/.agents/ACE/agent-memory/instructions.md +50 -0
- package/assets/.agents/ACE/agent-observability/AGENTS.md +46 -0
- package/assets/.agents/ACE/agent-observability/instructions.md +50 -0
- package/assets/.agents/ACE/agent-ops/AGENTS.md +201 -0
- package/assets/.agents/ACE/agent-ops/instructions.md +136 -0
- package/assets/.agents/ACE/agent-qa/AGENTS.md +189 -0
- package/assets/.agents/ACE/agent-qa/instructions.md +121 -0
- package/assets/.agents/ACE/agent-release/AGENTS.md +48 -0
- package/assets/.agents/ACE/agent-release/instructions.md +49 -0
- package/assets/.agents/ACE/agent-research/AGENTS.md +160 -0
- package/assets/.agents/ACE/agent-research/instructions.md +118 -0
- package/assets/.agents/ACE/agent-security/AGENTS.md +48 -0
- package/assets/.agents/ACE/agent-security/instructions.md +50 -0
- package/assets/.agents/ACE/agent-skeptic/AGENTS.md +178 -0
- package/assets/.agents/ACE/agent-skeptic/instructions.md +196 -0
- package/assets/.agents/ACE/agent-spec/AGENTS.md +169 -0
- package/assets/.agents/ACE/agent-spec/instructions.md +116 -0
- package/assets/.agents/ACE/orchestrator/AGENTS.md +365 -0
- package/assets/.agents/ACE/orchestrator/instructions.md +231 -0
- package/assets/.agents/skills/ace-orchestrator/SKILL.md +63 -0
- package/assets/.agents/skills/ace-orchestrator/references/engineering-bootstrap-playbook.md +360 -0
- package/assets/.agents/skills/astgrep-index/SKILL.md +58 -0
- package/assets/.agents/skills/codemunch/SKILL.md +65 -0
- package/assets/.agents/skills/codemunch/references/ast-driven-protocol.md +543 -0
- package/assets/.agents/skills/codesnipe/SKILL.md +64 -0
- package/assets/.agents/skills/codesnipe/references/dual-codebase-playbook.md +671 -0
- package/assets/.agents/skills/eval-harness/SKILL.md +203 -0
- package/assets/.agents/skills/handoff-lint/SKILL.md +164 -0
- package/assets/.agents/skills/incident-commander/SKILL.md +174 -0
- package/assets/.agents/skills/landing-review-watcher/SKILL.md +68 -0
- package/assets/.agents/skills/memory-curator/SKILL.md +179 -0
- package/assets/.agents/skills/problem-triage/SKILL.md +57 -0
- package/assets/.agents/skills/problem-triage/agents/openai.yaml +3 -0
- package/assets/.agents/skills/release-sentry/SKILL.md +189 -0
- package/assets/.agents/skills/risk-quant/SKILL.md +190 -0
- package/assets/.agents/skills/schema-forge/SKILL.md +174 -0
- package/assets/.agents/skills/skill-auditor/SKILL.md +52 -0
- package/assets/.agents/skills/state-auditor/SKILL.md +182 -0
- package/assets/.github/hooks/ace-copilot.json +68 -0
- package/assets/agent-state/ACE_WORKFLOW.md +131 -0
- package/assets/agent-state/ARTIFACT_MANIFEST.json +5 -0
- package/assets/agent-state/AST_GREP_COMMANDS.md +121 -0
- package/assets/agent-state/AST_GREP_INDEX.json +13 -0
- package/assets/agent-state/AST_GREP_INDEX.md +15 -0
- package/assets/agent-state/DECISIONS.md +7 -0
- package/assets/agent-state/EVIDENCE_LOG.md +7 -0
- package/assets/agent-state/HANDOFF.json +24 -0
- package/assets/agent-state/INTERFACE_REGISTRY.md +75 -0
- package/assets/agent-state/MODULES/gates/gate-autonomy.json +7 -0
- package/assets/agent-state/MODULES/gates/gate-completeness.json +7 -0
- package/assets/agent-state/MODULES/gates/gate-correctness.json +7 -0
- package/assets/agent-state/MODULES/gates/gate-evaluation.json +7 -0
- package/assets/agent-state/MODULES/gates/gate-operability.json +7 -0
- package/assets/agent-state/MODULES/gates/gate-security.json +7 -0
- package/assets/agent-state/MODULES/gates/gate-typescript-public-surface.json +7 -0
- package/assets/agent-state/MODULES/registry.json +41 -0
- package/assets/agent-state/MODULES/roles/capability-astgrep.json +49 -0
- package/assets/agent-state/MODULES/roles/capability-build.json +39 -0
- package/assets/agent-state/MODULES/roles/capability-docs.json +38 -0
- package/assets/agent-state/MODULES/roles/capability-eval.json +20 -0
- package/assets/agent-state/MODULES/roles/capability-memory.json +20 -0
- package/assets/agent-state/MODULES/roles/capability-observability.json +20 -0
- package/assets/agent-state/MODULES/roles/capability-ops.json +45 -0
- package/assets/agent-state/MODULES/roles/capability-qa.json +40 -0
- package/assets/agent-state/MODULES/roles/capability-release.json +21 -0
- package/assets/agent-state/MODULES/roles/capability-research.json +44 -0
- package/assets/agent-state/MODULES/roles/capability-security.json +21 -0
- package/assets/agent-state/MODULES/roles/capability-skeptic.json +48 -0
- package/assets/agent-state/MODULES/roles/capability-spec.json +42 -0
- package/assets/agent-state/MODULES/schemas/ACE_RUNTIME_PROFILE.schema.json +289 -0
- package/assets/agent-state/MODULES/schemas/ARTIFACT_MANIFEST.schema.json +185 -0
- package/assets/agent-state/MODULES/schemas/HANDOFF.agent-state.schema.json +124 -0
- package/assets/agent-state/MODULES/schemas/HANDOFF.schema.json +55 -0
- package/assets/agent-state/MODULES/schemas/RUNTIME_EXECUTOR_SESSION_REGISTRY.schema.json +290 -0
- package/assets/agent-state/MODULES/schemas/RUNTIME_TOOL_SPEC_REGISTRY.schema.json +144 -0
- package/assets/agent-state/MODULES/schemas/STATUS_EVENT.schema.json +84 -0
- package/assets/agent-state/MODULES/schemas/SWARM_HANDOFF.schema.json +138 -0
- package/assets/agent-state/MODULES/schemas/TRACKER_SNAPSHOT.schema.json +134 -0
- package/assets/agent-state/MODULES/schemas/VERICIFY_BRIDGE_SNAPSHOT.schema.json +157 -0
- package/assets/agent-state/MODULES/schemas/VERICIFY_PROCESS_POST_LOG.schema.json +93 -0
- package/assets/agent-state/MODULES/schemas/WORKSPACE_SESSION_REGISTRY.schema.json +133 -0
- package/assets/agent-state/PROVENANCE_LOG.md +28 -0
- package/assets/agent-state/QUALITY_GATES.md +15 -0
- package/assets/agent-state/RISKS.md +8 -0
- package/assets/agent-state/SCOPE.md +20 -0
- package/assets/agent-state/SKILL_CATALOG.md +48 -0
- package/assets/agent-state/STATUS.md +8 -0
- package/assets/agent-state/STATUS_EVENTS.ndjson +1 -0
- package/assets/agent-state/TASK.md +18 -0
- package/assets/agent-state/TEAL_CONFIG.md +117 -0
- package/assets/agent-state/handoff-registry.json +5 -0
- package/assets/agent-state/index-fingerprints.json +7 -0
- package/assets/agent-state/index.json +32 -0
- package/assets/agent-state/run-ledger.json +5 -0
- package/assets/agent-state/runtime-executor-sessions.json +5 -0
- package/assets/agent-state/runtime-tool-specs.json +5 -0
- package/assets/agent-state/runtime-workspaces.json +5 -0
- package/assets/agent-state/todo-state.json +7 -0
- package/assets/agent-state/tracker-snapshot.json +7 -0
- package/assets/agent-state/vericify/ace-bridge.json +60 -0
- package/assets/agent-state/vericify/process-posts.json +5 -0
- package/assets/instructions/ACE.instructions.md +187 -0
- package/assets/instructions/ACE_Coder.instructions.md +146 -0
- package/assets/instructions/ACE_UI.instructions.md +178 -0
- package/assets/instructions/ACE_VOS.instructions.md +211 -0
- package/assets/scripts/ace-hook-dispatch.mjs +538 -0
- package/assets/scripts/bootstrap-workspace.sh +27 -0
- package/assets/scripts/copilot-hook-dispatch.mjs +3 -0
- package/assets/scripts/eval-harness.sh +68 -0
- package/assets/scripts/render-mcp-configs.sh +396 -0
- package/assets/tasks/README.md +48 -0
- package/assets/tasks/SWARM_HANDOFF.example.json +53 -0
- package/assets/tasks/SWARM_HANDOFF.example_ui_to_coders.json +55 -0
- package/assets/tasks/SWARM_HANDOFF.example_vos_to_ui.json +55 -0
- package/assets/tasks/SWARM_HANDOFF.template.json +52 -0
- package/assets/tasks/cli_work_split.md +22 -0
- package/assets/tasks/lessons.md +17 -0
- package/assets/tasks/role_tasks.md +206 -0
- package/assets/tasks/todo.md +23 -0
- package/dist/ace-autonomy.d.ts +137 -0
- package/dist/ace-autonomy.js +472 -0
- package/dist/ace-context.d.ts +29 -0
- package/dist/ace-context.js +240 -0
- package/dist/ace-internal-tools.d.ts +8 -0
- package/dist/ace-internal-tools.js +76 -0
- package/dist/ace-server-instructions.d.ts +12 -0
- package/dist/ace-server-instructions.js +324 -0
- package/dist/agent-runtime/role-adapters.d.ts +29 -0
- package/dist/agent-runtime/role-adapters.js +573 -0
- package/dist/astgrep-index.d.ts +24 -0
- package/dist/astgrep-index.js +476 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +591 -0
- package/dist/git-ops.d.ts +53 -0
- package/dist/git-ops.js +238 -0
- package/dist/handoff-registry.d.ts +71 -0
- package/dist/handoff-registry.js +422 -0
- package/dist/helpers.d.ts +126 -0
- package/dist/helpers.js +1687 -0
- package/dist/index-store.d.ts +51 -0
- package/dist/index-store.js +328 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +7 -0
- package/dist/internal-tool-runtime.d.ts +21 -0
- package/dist/internal-tool-runtime.js +136 -0
- package/dist/job-scheduler.d.ts +175 -0
- package/dist/job-scheduler.js +1217 -0
- package/dist/kanban.d.ts +27 -0
- package/dist/kanban.js +339 -0
- package/dist/local-model-runtime.d.ts +40 -0
- package/dist/local-model-runtime.js +174 -0
- package/dist/model-bridge.d.ts +54 -0
- package/dist/model-bridge.js +587 -0
- package/dist/orchestrator-supervisor.d.ts +100 -0
- package/dist/orchestrator-supervisor.js +399 -0
- package/dist/problem-triage.d.ts +23 -0
- package/dist/problem-triage.js +448 -0
- package/dist/prompts.d.ts +7 -0
- package/dist/prompts.js +628 -0
- package/dist/public-surface.d.ts +30 -0
- package/dist/public-surface.js +316 -0
- package/dist/resources.d.ts +7 -0
- package/dist/resources.js +545 -0
- package/dist/run-ledger.d.ts +36 -0
- package/dist/run-ledger.js +257 -0
- package/dist/runtime-command.d.ts +18 -0
- package/dist/runtime-command.js +76 -0
- package/dist/runtime-executor.d.ts +104 -0
- package/dist/runtime-executor.js +985 -0
- package/dist/runtime-profile.d.ts +116 -0
- package/dist/runtime-profile.js +532 -0
- package/dist/runtime-tool-specs.d.ts +68 -0
- package/dist/runtime-tool-specs.js +527 -0
- package/dist/safe-edit.d.ts +52 -0
- package/dist/safe-edit.js +255 -0
- package/dist/schemas.d.ts +44 -0
- package/dist/schemas.js +830 -0
- package/dist/semantic-cache.d.ts +147 -0
- package/dist/semantic-cache.js +552 -0
- package/dist/semantic-hash.d.ts +83 -0
- package/dist/semantic-hash.js +346 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.js +46 -0
- package/dist/shared.d.ts +136 -0
- package/dist/shared.js +269 -0
- package/dist/skill-auditor.d.ts +26 -0
- package/dist/skill-auditor.js +184 -0
- package/dist/skill-catalog.d.ts +60 -0
- package/dist/skill-catalog.js +305 -0
- package/dist/status-events.d.ts +40 -0
- package/dist/status-events.js +269 -0
- package/dist/store/ace-packed-store.d.ts +69 -0
- package/dist/store/ace-packed-store.js +434 -0
- package/dist/store/bootstrap-store.d.ts +46 -0
- package/dist/store/bootstrap-store.js +242 -0
- package/dist/store/catalog-builder.d.ts +21 -0
- package/dist/store/catalog-builder.js +68 -0
- package/dist/store/importer.d.ts +19 -0
- package/dist/store/importer.js +157 -0
- package/dist/store/knowledge-bake.d.ts +59 -0
- package/dist/store/knowledge-bake.js +339 -0
- package/dist/store/materializers/hook-context-materializer.d.ts +25 -0
- package/dist/store/materializers/hook-context-materializer.js +100 -0
- package/dist/store/materializers/host-file-materializer.d.ts +37 -0
- package/dist/store/materializers/host-file-materializer.js +271 -0
- package/dist/store/materializers/todo-syncer.d.ts +30 -0
- package/dist/store/materializers/todo-syncer.js +140 -0
- package/dist/store/materializers/vericify-projector.d.ts +38 -0
- package/dist/store/materializers/vericify-projector.js +239 -0
- package/dist/store/repositories/discovery-repository.d.ts +24 -0
- package/dist/store/repositories/discovery-repository.js +58 -0
- package/dist/store/repositories/handoff-repository.d.ts +31 -0
- package/dist/store/repositories/handoff-repository.js +67 -0
- package/dist/store/repositories/ledger-repository.d.ts +26 -0
- package/dist/store/repositories/ledger-repository.js +49 -0
- package/dist/store/repositories/runtime-kv-repository.d.ts +16 -0
- package/dist/store/repositories/runtime-kv-repository.js +36 -0
- package/dist/store/repositories/scheduler-repository.d.ts +50 -0
- package/dist/store/repositories/scheduler-repository.js +123 -0
- package/dist/store/repositories/session-repository.d.ts +33 -0
- package/dist/store/repositories/session-repository.js +82 -0
- package/dist/store/repositories/todo-repository.d.ts +31 -0
- package/dist/store/repositories/todo-repository.js +77 -0
- package/dist/store/repositories/tracker-repository.d.ts +25 -0
- package/dist/store/repositories/tracker-repository.js +43 -0
- package/dist/store/repositories/vericify-repository.d.ts +32 -0
- package/dist/store/repositories/vericify-repository.js +58 -0
- package/dist/store/skills-install.d.ts +28 -0
- package/dist/store/skills-install.js +86 -0
- package/dist/store/state-reader.d.ts +49 -0
- package/dist/store/state-reader.js +111 -0
- package/dist/store/store-artifacts.d.ts +12 -0
- package/dist/store/store-artifacts.js +138 -0
- package/dist/store/store-snapshot.d.ts +19 -0
- package/dist/store/store-snapshot.js +140 -0
- package/dist/store/topology-bake.d.ts +15 -0
- package/dist/store/topology-bake.js +215 -0
- package/dist/store/types.d.ts +155 -0
- package/dist/store/types.js +35 -0
- package/dist/store/workspace-snapshot.d.ts +26 -0
- package/dist/store/workspace-snapshot.js +107 -0
- package/dist/store/write-queue.d.ts +7 -0
- package/dist/store/write-queue.js +26 -0
- package/dist/todo-state.d.ts +41 -0
- package/dist/todo-state.js +399 -0
- package/dist/tools-agent.d.ts +7 -0
- package/dist/tools-agent.js +1542 -0
- package/dist/tools-discovery.d.ts +6 -0
- package/dist/tools-discovery.js +178 -0
- package/dist/tools-drift.d.ts +13 -0
- package/dist/tools-drift.js +357 -0
- package/dist/tools-files.d.ts +6 -0
- package/dist/tools-files.js +679 -0
- package/dist/tools-framework.d.ts +7 -0
- package/dist/tools-framework.js +1414 -0
- package/dist/tools-git.d.ts +6 -0
- package/dist/tools-git.js +183 -0
- package/dist/tools-handoff.d.ts +32 -0
- package/dist/tools-handoff.js +489 -0
- package/dist/tools-lifecycle.d.ts +6 -0
- package/dist/tools-lifecycle.js +205 -0
- package/dist/tools-memory.d.ts +6 -0
- package/dist/tools-memory.js +260 -0
- package/dist/tools-scheduler.d.ts +6 -0
- package/dist/tools-scheduler.js +228 -0
- package/dist/tools-skills.d.ts +3 -0
- package/dist/tools-skills.js +104 -0
- package/dist/tools-todo.d.ts +6 -0
- package/dist/tools-todo.js +154 -0
- package/dist/tools.d.ts +9 -0
- package/dist/tools.js +33 -0
- package/dist/tracker-adapters.d.ts +74 -0
- package/dist/tracker-adapters.js +776 -0
- package/dist/tracker-sync.d.ts +10 -0
- package/dist/tracker-sync.js +84 -0
- package/dist/tui/agent-runner.d.ts +137 -0
- package/dist/tui/agent-runner.js +466 -0
- package/dist/tui/agent-worker.d.ts +10 -0
- package/dist/tui/agent-worker.js +347 -0
- package/dist/tui/chat.d.ts +84 -0
- package/dist/tui/chat.js +368 -0
- package/dist/tui/commands.d.ts +57 -0
- package/dist/tui/commands.js +432 -0
- package/dist/tui/dashboard.d.ts +24 -0
- package/dist/tui/dashboard.js +110 -0
- package/dist/tui/index.d.ts +114 -0
- package/dist/tui/index.js +1059 -0
- package/dist/tui/input.d.ts +49 -0
- package/dist/tui/input.js +336 -0
- package/dist/tui/layout.d.ts +116 -0
- package/dist/tui/layout.js +367 -0
- package/dist/tui/ollama.d.ts +116 -0
- package/dist/tui/ollama.js +192 -0
- package/dist/tui/openai-compatible.d.ts +63 -0
- package/dist/tui/openai-compatible.js +370 -0
- package/dist/tui/provider-discovery.d.ts +59 -0
- package/dist/tui/provider-discovery.js +530 -0
- package/dist/tui/renderer.d.ts +166 -0
- package/dist/tui/renderer.js +304 -0
- package/dist/tui/tabs.d.ts +70 -0
- package/dist/tui/tabs.js +208 -0
- package/dist/tui/telemetry.d.ts +56 -0
- package/dist/tui/telemetry.js +106 -0
- package/dist/vericify-bridge.d.ts +146 -0
- package/dist/vericify-bridge.js +571 -0
- package/dist/vericify-context.d.ts +10 -0
- package/dist/vericify-context.js +72 -0
- package/dist/workspace-manager.d.ts +107 -0
- package/dist/workspace-manager.js +636 -0
- package/package.json +83 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SchedulerRepository — state/scheduler/
|
|
3
|
+
* Replaces: job-queue.json, job-locks.json, scheduler-lease.json
|
|
4
|
+
*/
|
|
5
|
+
import { ContentSource, EntityKind } from "../types.js";
|
|
6
|
+
const QUEUE_KEY = "state/scheduler/queue";
|
|
7
|
+
const LOCKS_KEY = "state/scheduler/locks";
|
|
8
|
+
const LEASE_KEY = "state/scheduler/lease";
|
|
9
|
+
export class SchedulerRepository {
|
|
10
|
+
store;
|
|
11
|
+
constructor(store) {
|
|
12
|
+
this.store = store;
|
|
13
|
+
}
|
|
14
|
+
// ── Jobs ──────────────────────────────────────────────────────────────────
|
|
15
|
+
async enqueue(job) {
|
|
16
|
+
const record = { ...job, status: "queued", created_at: Date.now() };
|
|
17
|
+
const queue = await this.store.getJSON(QUEUE_KEY) ?? [];
|
|
18
|
+
queue.push(record);
|
|
19
|
+
await this.store.setJSON(QUEUE_KEY, queue);
|
|
20
|
+
await this.store.appendEntry({
|
|
21
|
+
kind: EntityKind.SchedulerTick,
|
|
22
|
+
content_source: ContentSource.Runtime,
|
|
23
|
+
key: QUEUE_KEY,
|
|
24
|
+
payload: { op: "enqueue", job_id: job.id },
|
|
25
|
+
});
|
|
26
|
+
return record;
|
|
27
|
+
}
|
|
28
|
+
async listJobs(filter) {
|
|
29
|
+
const queue = await this.store.getJSON(QUEUE_KEY) ?? [];
|
|
30
|
+
return queue.filter((j) => {
|
|
31
|
+
if (filter?.status && j.status !== filter.status)
|
|
32
|
+
return false;
|
|
33
|
+
if (filter?.role && j.role !== filter.role)
|
|
34
|
+
return false;
|
|
35
|
+
return true;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async updateJob(id, patch) {
|
|
39
|
+
const queue = await this.store.getJSON(QUEUE_KEY) ?? [];
|
|
40
|
+
const idx = queue.findIndex((j) => j.id === id);
|
|
41
|
+
if (idx === -1)
|
|
42
|
+
throw new Error(`SchedulerRepository: job not found: ${id}`);
|
|
43
|
+
queue[idx] = { ...queue[idx], ...patch };
|
|
44
|
+
await this.store.setJSON(QUEUE_KEY, queue);
|
|
45
|
+
return queue[idx];
|
|
46
|
+
}
|
|
47
|
+
async completeJob(id, result) {
|
|
48
|
+
return this.updateJob(id, { status: "done", completed_at: Date.now(), result });
|
|
49
|
+
}
|
|
50
|
+
async failJob(id, reason) {
|
|
51
|
+
return this.updateJob(id, {
|
|
52
|
+
status: "failed",
|
|
53
|
+
completed_at: Date.now(),
|
|
54
|
+
metadata: { failure_reason: reason },
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async dispatchReady() {
|
|
58
|
+
const queue = await this.listJobs({ status: "queued" });
|
|
59
|
+
const done = new Set((await this.listJobs({ status: "done" })).map((j) => j.id));
|
|
60
|
+
return queue.filter((j) => {
|
|
61
|
+
if (!j.depends_on?.length)
|
|
62
|
+
return true;
|
|
63
|
+
return j.depends_on.every((dep) => done.has(dep));
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// ── Resource locks ────────────────────────────────────────────────────────
|
|
67
|
+
async acquireLock(resource, holder, ttlMs) {
|
|
68
|
+
const locks = await this.store.getJSON(LOCKS_KEY) ?? [];
|
|
69
|
+
const existing = locks.find((l) => l.resource === resource);
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
if (existing) {
|
|
72
|
+
if (!existing.expires_at || existing.expires_at > now) {
|
|
73
|
+
throw new Error(`SchedulerRepository: resource locked by ${existing.holder}: ${resource}`);
|
|
74
|
+
}
|
|
75
|
+
// Expired lock — remove it
|
|
76
|
+
const next = locks.filter((l) => l.resource !== resource);
|
|
77
|
+
next.push({ resource, holder, acquired_at: now, expires_at: ttlMs ? now + ttlMs : undefined });
|
|
78
|
+
await this.store.setJSON(LOCKS_KEY, next);
|
|
79
|
+
return next.find((l) => l.resource === resource);
|
|
80
|
+
}
|
|
81
|
+
locks.push({ resource, holder, acquired_at: now, expires_at: ttlMs ? now + ttlMs : undefined });
|
|
82
|
+
await this.store.setJSON(LOCKS_KEY, locks);
|
|
83
|
+
return locks.find((l) => l.resource === resource);
|
|
84
|
+
}
|
|
85
|
+
async releaseLock(resource, holder) {
|
|
86
|
+
const locks = await this.store.getJSON(LOCKS_KEY) ?? [];
|
|
87
|
+
const next = locks.filter((l) => !(l.resource === resource && l.holder === holder));
|
|
88
|
+
if (next.length === locks.length)
|
|
89
|
+
return false;
|
|
90
|
+
await this.store.setJSON(LOCKS_KEY, next);
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
async getLocks() {
|
|
94
|
+
return (await this.store.getJSON(LOCKS_KEY)) ?? [];
|
|
95
|
+
}
|
|
96
|
+
// ── Scheduler lease ───────────────────────────────────────────────────────
|
|
97
|
+
async acquireLease(holder, ttlMs = 60_000, runId) {
|
|
98
|
+
const existing = await this.getLease();
|
|
99
|
+
const now = Date.now();
|
|
100
|
+
if (existing && existing.expires_at > now) {
|
|
101
|
+
throw new Error(`SchedulerRepository: lease held by ${existing.holder}`);
|
|
102
|
+
}
|
|
103
|
+
const lease = {
|
|
104
|
+
holder,
|
|
105
|
+
acquired_at: now,
|
|
106
|
+
expires_at: now + ttlMs,
|
|
107
|
+
run_id: runId,
|
|
108
|
+
};
|
|
109
|
+
await this.store.setJSON(LEASE_KEY, lease);
|
|
110
|
+
return lease;
|
|
111
|
+
}
|
|
112
|
+
async releaseLease(holder) {
|
|
113
|
+
const lease = await this.getLease();
|
|
114
|
+
if (!lease || lease.holder !== holder)
|
|
115
|
+
return false;
|
|
116
|
+
await this.store.delete(LEASE_KEY);
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
async getLease() {
|
|
120
|
+
return this.store.getJSON(LEASE_KEY);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=scheduler-repository.js.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionRepository — state/runtime/sessions
|
|
3
|
+
* Replaces: agent-state/index.json session tracking
|
|
4
|
+
*/
|
|
5
|
+
import { AcePackedStore } from "../ace-packed-store.js";
|
|
6
|
+
export interface SessionRecord {
|
|
7
|
+
id: string;
|
|
8
|
+
agent: string;
|
|
9
|
+
role: string;
|
|
10
|
+
workspace_root: string;
|
|
11
|
+
status: "active" | "idle" | "stopped" | "error";
|
|
12
|
+
started_at: number;
|
|
13
|
+
last_active_at: number;
|
|
14
|
+
stopped_at?: number;
|
|
15
|
+
metadata?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export declare class SessionRepository {
|
|
18
|
+
private store;
|
|
19
|
+
constructor(store: AcePackedStore);
|
|
20
|
+
private key;
|
|
21
|
+
create(session: Omit<SessionRecord, "started_at" | "last_active_at" | "status">): Promise<SessionRecord>;
|
|
22
|
+
get(id: string): Promise<SessionRecord | undefined>;
|
|
23
|
+
touch(id: string): Promise<void>;
|
|
24
|
+
stop(id: string): Promise<SessionRecord | undefined>;
|
|
25
|
+
list(filter?: {
|
|
26
|
+
agent?: string;
|
|
27
|
+
status?: SessionRecord["status"];
|
|
28
|
+
}): Promise<SessionRecord[]>;
|
|
29
|
+
remove(id: string): Promise<boolean>;
|
|
30
|
+
private _addToIndex;
|
|
31
|
+
private _removeFromIndex;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=session-repository.d.ts.map
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionRepository — state/runtime/sessions
|
|
3
|
+
* Replaces: agent-state/index.json session tracking
|
|
4
|
+
*/
|
|
5
|
+
import { ContentSource, EntityKind } from "../types.js";
|
|
6
|
+
const INDEX_KEY = "state/runtime/sessions/index";
|
|
7
|
+
export class SessionRepository {
|
|
8
|
+
store;
|
|
9
|
+
constructor(store) {
|
|
10
|
+
this.store = store;
|
|
11
|
+
}
|
|
12
|
+
key(id) {
|
|
13
|
+
return `state/runtime/sessions/${id}`;
|
|
14
|
+
}
|
|
15
|
+
async create(session) {
|
|
16
|
+
const now = Date.now();
|
|
17
|
+
const record = {
|
|
18
|
+
...session,
|
|
19
|
+
status: "active",
|
|
20
|
+
started_at: now,
|
|
21
|
+
last_active_at: now,
|
|
22
|
+
};
|
|
23
|
+
await this.store.setJSON(this.key(session.id), record);
|
|
24
|
+
await this.store.appendEntry({
|
|
25
|
+
kind: EntityKind.SessionEvent,
|
|
26
|
+
content_source: ContentSource.Runtime,
|
|
27
|
+
key: this.key(session.id),
|
|
28
|
+
payload: { op: "create", session_id: session.id },
|
|
29
|
+
});
|
|
30
|
+
await this._addToIndex(session.id);
|
|
31
|
+
return record;
|
|
32
|
+
}
|
|
33
|
+
async get(id) {
|
|
34
|
+
return this.store.getJSON(this.key(id));
|
|
35
|
+
}
|
|
36
|
+
async touch(id) {
|
|
37
|
+
const s = await this.get(id);
|
|
38
|
+
if (!s)
|
|
39
|
+
return;
|
|
40
|
+
await this.store.setJSON(this.key(id), { ...s, last_active_at: Date.now() });
|
|
41
|
+
}
|
|
42
|
+
async stop(id) {
|
|
43
|
+
const s = await this.get(id);
|
|
44
|
+
if (!s)
|
|
45
|
+
return undefined;
|
|
46
|
+
const updated = { ...s, status: "stopped", stopped_at: Date.now() };
|
|
47
|
+
await this.store.setJSON(this.key(id), updated);
|
|
48
|
+
return updated;
|
|
49
|
+
}
|
|
50
|
+
async list(filter) {
|
|
51
|
+
const index = await this.store.getJSON(INDEX_KEY) ?? [];
|
|
52
|
+
const sessions = [];
|
|
53
|
+
for (const id of index) {
|
|
54
|
+
const s = await this.get(id);
|
|
55
|
+
if (!s)
|
|
56
|
+
continue;
|
|
57
|
+
if (filter?.agent && s.agent !== filter.agent)
|
|
58
|
+
continue;
|
|
59
|
+
if (filter?.status && s.status !== filter.status)
|
|
60
|
+
continue;
|
|
61
|
+
sessions.push(s);
|
|
62
|
+
}
|
|
63
|
+
return sessions.sort((a, b) => b.started_at - a.started_at);
|
|
64
|
+
}
|
|
65
|
+
async remove(id) {
|
|
66
|
+
await this.store.delete(this.key(id));
|
|
67
|
+
await this._removeFromIndex(id);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
async _addToIndex(id) {
|
|
71
|
+
const index = await this.store.getJSON(INDEX_KEY) ?? [];
|
|
72
|
+
if (!index.includes(id)) {
|
|
73
|
+
index.push(id);
|
|
74
|
+
await this.store.setJSON(INDEX_KEY, index);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async _removeFromIndex(id) {
|
|
78
|
+
const index = await this.store.getJSON(INDEX_KEY) ?? [];
|
|
79
|
+
await this.store.setJSON(INDEX_KEY, index.filter((i) => i !== id));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=session-repository.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TodoRepository — state/todo/
|
|
3
|
+
* Replaces: agent-state/todo-state.json
|
|
4
|
+
*/
|
|
5
|
+
import { AcePackedStore } from "../ace-packed-store.js";
|
|
6
|
+
export interface TodoNode {
|
|
7
|
+
id: string;
|
|
8
|
+
title: string;
|
|
9
|
+
status: "pending" | "in_progress" | "done" | "blocked" | "cancelled";
|
|
10
|
+
priority?: "high" | "medium" | "low";
|
|
11
|
+
assigned_to?: string;
|
|
12
|
+
depends_on?: string[];
|
|
13
|
+
created_at: number;
|
|
14
|
+
updated_at: number;
|
|
15
|
+
notes?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class TodoRepository {
|
|
18
|
+
private store;
|
|
19
|
+
constructor(store: AcePackedStore);
|
|
20
|
+
private key;
|
|
21
|
+
create(todo: Omit<TodoNode, "created_at" | "updated_at">): Promise<TodoNode>;
|
|
22
|
+
get(id: string): Promise<TodoNode | undefined>;
|
|
23
|
+
update(id: string, patch: Partial<TodoNode>): Promise<TodoNode>;
|
|
24
|
+
list(filter?: {
|
|
25
|
+
status?: TodoNode["status"];
|
|
26
|
+
assigned_to?: string;
|
|
27
|
+
}): Promise<TodoNode[]>;
|
|
28
|
+
getAll(): Promise<TodoNode[]>;
|
|
29
|
+
private _updateIndex;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=todo-repository.d.ts.map
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TodoRepository — state/todo/
|
|
3
|
+
* Replaces: agent-state/todo-state.json
|
|
4
|
+
*/
|
|
5
|
+
import { ContentSource, EntityKind } from "../types.js";
|
|
6
|
+
const TODO_INDEX_KEY = "state/todo/index";
|
|
7
|
+
export class TodoRepository {
|
|
8
|
+
store;
|
|
9
|
+
constructor(store) {
|
|
10
|
+
this.store = store;
|
|
11
|
+
}
|
|
12
|
+
key(id) {
|
|
13
|
+
return `state/todo/${id}`;
|
|
14
|
+
}
|
|
15
|
+
async create(todo) {
|
|
16
|
+
const now = Date.now();
|
|
17
|
+
const record = { ...todo, created_at: now, updated_at: now };
|
|
18
|
+
await this.store.setJSON(this.key(todo.id), record);
|
|
19
|
+
await this.store.appendEntry({
|
|
20
|
+
kind: EntityKind.Todo,
|
|
21
|
+
content_source: ContentSource.Runtime,
|
|
22
|
+
key: this.key(todo.id),
|
|
23
|
+
payload: record,
|
|
24
|
+
});
|
|
25
|
+
await this._updateIndex(record, "add");
|
|
26
|
+
return record;
|
|
27
|
+
}
|
|
28
|
+
async get(id) {
|
|
29
|
+
return this.store.getJSON(this.key(id));
|
|
30
|
+
}
|
|
31
|
+
async update(id, patch) {
|
|
32
|
+
const existing = await this.get(id);
|
|
33
|
+
if (!existing)
|
|
34
|
+
throw new Error(`TodoRepository: todo not found: ${id}`);
|
|
35
|
+
const updated = { ...existing, ...patch, updated_at: Date.now() };
|
|
36
|
+
await this.store.setJSON(this.key(id), updated);
|
|
37
|
+
await this.store.appendEntry({
|
|
38
|
+
kind: EntityKind.Todo,
|
|
39
|
+
content_source: ContentSource.Runtime,
|
|
40
|
+
key: this.key(id),
|
|
41
|
+
payload: updated,
|
|
42
|
+
});
|
|
43
|
+
await this._updateIndex(updated, "update");
|
|
44
|
+
return updated;
|
|
45
|
+
}
|
|
46
|
+
async list(filter) {
|
|
47
|
+
const index = await this.store.getJSON(TODO_INDEX_KEY) ?? [];
|
|
48
|
+
const todos = [];
|
|
49
|
+
for (const id of index) {
|
|
50
|
+
const todo = await this.get(id);
|
|
51
|
+
if (!todo)
|
|
52
|
+
continue;
|
|
53
|
+
if (filter?.status && todo.status !== filter.status)
|
|
54
|
+
continue;
|
|
55
|
+
if (filter?.assigned_to && todo.assigned_to !== filter.assigned_to)
|
|
56
|
+
continue;
|
|
57
|
+
todos.push(todo);
|
|
58
|
+
}
|
|
59
|
+
return todos;
|
|
60
|
+
}
|
|
61
|
+
async getAll() {
|
|
62
|
+
return this.list();
|
|
63
|
+
}
|
|
64
|
+
async _updateIndex(todo, op) {
|
|
65
|
+
const index = await this.store.getJSON(TODO_INDEX_KEY) ?? [];
|
|
66
|
+
if (op === "add" && !index.includes(todo.id)) {
|
|
67
|
+
index.push(todo.id);
|
|
68
|
+
await this.store.setJSON(TODO_INDEX_KEY, index);
|
|
69
|
+
}
|
|
70
|
+
else if (op === "remove") {
|
|
71
|
+
const next = index.filter((id) => id !== todo.id);
|
|
72
|
+
await this.store.setJSON(TODO_INDEX_KEY, next);
|
|
73
|
+
}
|
|
74
|
+
// update: no index change needed
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=todo-repository.js.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TrackerRepository — state/tracker/
|
|
3
|
+
* Replaces: agent-state/STATUS_EVENTS.ndjson
|
|
4
|
+
*/
|
|
5
|
+
import { AcePackedStore } from "../ace-packed-store.js";
|
|
6
|
+
export interface StatusEvent {
|
|
7
|
+
id: string;
|
|
8
|
+
ts: number;
|
|
9
|
+
kind: string;
|
|
10
|
+
agent?: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
metadata?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export declare class TrackerRepository {
|
|
15
|
+
private store;
|
|
16
|
+
constructor(store: AcePackedStore);
|
|
17
|
+
emit(event: Omit<StatusEvent, "id" | "ts">): Promise<StatusEvent>;
|
|
18
|
+
list(filter?: {
|
|
19
|
+
kind?: string;
|
|
20
|
+
agent?: string;
|
|
21
|
+
since?: number;
|
|
22
|
+
limit?: number;
|
|
23
|
+
}): Promise<StatusEvent[]>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=tracker-repository.d.ts.map
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TrackerRepository — state/tracker/
|
|
3
|
+
* Replaces: agent-state/STATUS_EVENTS.ndjson
|
|
4
|
+
*/
|
|
5
|
+
import { ContentSource, EntityKind } from "../types.js";
|
|
6
|
+
const TRACKER_SEQ_KEY = "state/tracker/__seq";
|
|
7
|
+
export class TrackerRepository {
|
|
8
|
+
store;
|
|
9
|
+
constructor(store) {
|
|
10
|
+
this.store = store;
|
|
11
|
+
}
|
|
12
|
+
async emit(event) {
|
|
13
|
+
const current = (await this.store.getJSON(TRACKER_SEQ_KEY)) ?? 0;
|
|
14
|
+
const next = current + 1;
|
|
15
|
+
await this.store.setJSON(TRACKER_SEQ_KEY, next);
|
|
16
|
+
const id = `se-${String(next).padStart(10, "0")}`;
|
|
17
|
+
const record = { ...event, id, ts: Date.now() };
|
|
18
|
+
const key = `state/tracker/${id}`;
|
|
19
|
+
await this.store.setJSON(key, record);
|
|
20
|
+
await this.store.appendEntry({
|
|
21
|
+
kind: EntityKind.SessionEvent,
|
|
22
|
+
content_source: ContentSource.Runtime,
|
|
23
|
+
key,
|
|
24
|
+
payload: record,
|
|
25
|
+
});
|
|
26
|
+
return record;
|
|
27
|
+
}
|
|
28
|
+
async list(filter) {
|
|
29
|
+
const entries = await this.store.getEntries({
|
|
30
|
+
kind: EntityKind.SessionEvent,
|
|
31
|
+
since: filter?.since,
|
|
32
|
+
keyPrefix: "state/tracker/",
|
|
33
|
+
});
|
|
34
|
+
let events = entries.map((e) => e.payload).filter(Boolean);
|
|
35
|
+
if (filter?.kind)
|
|
36
|
+
events = events.filter((e) => e.kind === filter.kind);
|
|
37
|
+
if (filter?.agent)
|
|
38
|
+
events = events.filter((e) => e.agent === filter.agent);
|
|
39
|
+
events.sort((a, b) => a.ts - b.ts);
|
|
40
|
+
return filter?.limit ? events.slice(-filter.limit) : events;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=tracker-repository.js.map
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VericifyRepository — state/vericify/
|
|
3
|
+
* Replaces: agent-state/vericify/process-posts.json
|
|
4
|
+
*
|
|
5
|
+
* Also triggers Vericify projection file writes on mutation.
|
|
6
|
+
*/
|
|
7
|
+
import { AcePackedStore } from "../ace-packed-store.js";
|
|
8
|
+
export interface VericifyPost {
|
|
9
|
+
id: string;
|
|
10
|
+
run_id: string;
|
|
11
|
+
agent_id: string;
|
|
12
|
+
kind: "intent" | "progress" | "completion" | "blocker" | "handoff_note" | "stale_ack";
|
|
13
|
+
summary: string;
|
|
14
|
+
ts: number;
|
|
15
|
+
metadata?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export declare class VericifyRepository {
|
|
18
|
+
private store;
|
|
19
|
+
private onMutation?;
|
|
20
|
+
constructor(store: AcePackedStore, opts?: {
|
|
21
|
+
onMutation?: () => Promise<void>;
|
|
22
|
+
});
|
|
23
|
+
private key;
|
|
24
|
+
appendPost(post: Omit<VericifyPost, "id" | "ts">): Promise<VericifyPost>;
|
|
25
|
+
list(filter?: {
|
|
26
|
+
run_id?: string;
|
|
27
|
+
agent_id?: string;
|
|
28
|
+
kind?: VericifyPost["kind"];
|
|
29
|
+
}): Promise<VericifyPost[]>;
|
|
30
|
+
private _addToIndex;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=vericify-repository.d.ts.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VericifyRepository — state/vericify/
|
|
3
|
+
* Replaces: agent-state/vericify/process-posts.json
|
|
4
|
+
*
|
|
5
|
+
* Also triggers Vericify projection file writes on mutation.
|
|
6
|
+
*/
|
|
7
|
+
import { ContentSource, EntityKind } from "../types.js";
|
|
8
|
+
const INDEX_KEY = "state/vericify/posts/index";
|
|
9
|
+
export class VericifyRepository {
|
|
10
|
+
store;
|
|
11
|
+
onMutation;
|
|
12
|
+
constructor(store, opts) {
|
|
13
|
+
this.store = store;
|
|
14
|
+
this.onMutation = opts?.onMutation;
|
|
15
|
+
}
|
|
16
|
+
key(id) {
|
|
17
|
+
return `state/vericify/posts/${id}`;
|
|
18
|
+
}
|
|
19
|
+
async appendPost(post) {
|
|
20
|
+
const id = `vp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
21
|
+
const record = { ...post, id, ts: Date.now() };
|
|
22
|
+
await this.store.setJSON(this.key(id), record);
|
|
23
|
+
await this.store.appendEntry({
|
|
24
|
+
kind: EntityKind.VericifyPost,
|
|
25
|
+
content_source: ContentSource.Runtime,
|
|
26
|
+
key: this.key(id),
|
|
27
|
+
payload: record,
|
|
28
|
+
});
|
|
29
|
+
await this._addToIndex(id);
|
|
30
|
+
await this.onMutation?.();
|
|
31
|
+
return record;
|
|
32
|
+
}
|
|
33
|
+
async list(filter) {
|
|
34
|
+
const index = await this.store.getJSON(INDEX_KEY) ?? [];
|
|
35
|
+
const posts = [];
|
|
36
|
+
for (const id of index) {
|
|
37
|
+
const post = await this.store.getJSON(this.key(id));
|
|
38
|
+
if (!post)
|
|
39
|
+
continue;
|
|
40
|
+
if (filter?.run_id && post.run_id !== filter.run_id)
|
|
41
|
+
continue;
|
|
42
|
+
if (filter?.agent_id && post.agent_id !== filter.agent_id)
|
|
43
|
+
continue;
|
|
44
|
+
if (filter?.kind && post.kind !== filter.kind)
|
|
45
|
+
continue;
|
|
46
|
+
posts.push(post);
|
|
47
|
+
}
|
|
48
|
+
return posts.sort((a, b) => a.ts - b.ts);
|
|
49
|
+
}
|
|
50
|
+
async _addToIndex(id) {
|
|
51
|
+
const index = await this.store.getJSON(INDEX_KEY) ?? [];
|
|
52
|
+
if (!index.includes(id)) {
|
|
53
|
+
index.push(id);
|
|
54
|
+
await this.store.setJSON(INDEX_KEY, index);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=vericify-repository.js.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* skills-install.ts — Phase 9
|
|
3
|
+
*
|
|
4
|
+
* `npx @voybio/ace-swarm add skills [bundle]`
|
|
5
|
+
*
|
|
6
|
+
* Installs skill packs into ace-state.zarr on demand.
|
|
7
|
+
* Skills are also baked at ace init; this command is retained for repair/reinstall.
|
|
8
|
+
*
|
|
9
|
+
* What install does:
|
|
10
|
+
* 1. Resolve the requested skill from assets/
|
|
11
|
+
* 2. Write skill_definition entries into knowledge/skills/{skill}/
|
|
12
|
+
* 3. Update topology skill_bindings if requested agents are specified
|
|
13
|
+
* 4. Compact if the install materially expands the store (>50% dead space)
|
|
14
|
+
*/
|
|
15
|
+
export interface InstallResult {
|
|
16
|
+
skill: string;
|
|
17
|
+
files: number;
|
|
18
|
+
compacted: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function installSkillPack(workspaceRoot: string, skillName: string): Promise<InstallResult>;
|
|
21
|
+
export declare function installAllSkills(workspaceRoot: string): Promise<InstallResult[]>;
|
|
22
|
+
export declare function listInstalledSkills(workspaceRoot: string): Promise<string[]>;
|
|
23
|
+
export declare function listAvailableSkillPacks(workspaceRoot: string): Promise<{
|
|
24
|
+
installed: string[];
|
|
25
|
+
available: string[];
|
|
26
|
+
notInstalled: string[];
|
|
27
|
+
}>;
|
|
28
|
+
//# sourceMappingURL=skills-install.d.ts.map
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* skills-install.ts — Phase 9
|
|
3
|
+
*
|
|
4
|
+
* `npx @voybio/ace-swarm add skills [bundle]`
|
|
5
|
+
*
|
|
6
|
+
* Installs skill packs into ace-state.zarr on demand.
|
|
7
|
+
* Skills are also baked at ace init; this command is retained for repair/reinstall.
|
|
8
|
+
*
|
|
9
|
+
* What install does:
|
|
10
|
+
* 1. Resolve the requested skill from assets/
|
|
11
|
+
* 2. Write skill_definition entries into knowledge/skills/{skill}/
|
|
12
|
+
* 3. Update topology skill_bindings if requested agents are specified
|
|
13
|
+
* 4. Compact if the install materially expands the store (>50% dead space)
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync } from "fs";
|
|
16
|
+
import { join, dirname, resolve } from "path";
|
|
17
|
+
import { fileURLToPath } from "url";
|
|
18
|
+
import { openStore } from "./ace-packed-store.js";
|
|
19
|
+
import { bakeSkillPack, listAvailableSkills } from "./knowledge-bake.js";
|
|
20
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
function getAssetsRoot() {
|
|
22
|
+
const candidate = resolve(__dirname, "..", "..", "assets");
|
|
23
|
+
if (existsSync(candidate))
|
|
24
|
+
return candidate;
|
|
25
|
+
return resolve(__dirname, "..", "..", "..", "assets");
|
|
26
|
+
}
|
|
27
|
+
export async function installSkillPack(workspaceRoot, skillName) {
|
|
28
|
+
const storePath = join(workspaceRoot, ".agents", "ACE", "ace-state.zarr");
|
|
29
|
+
if (!existsSync(storePath)) {
|
|
30
|
+
throw new Error(`No store found at ${storePath}. Run 'ace init' first.`);
|
|
31
|
+
}
|
|
32
|
+
const assetsRoot = getAssetsRoot();
|
|
33
|
+
const available = await listAvailableSkills(assetsRoot);
|
|
34
|
+
if (!available.includes(skillName)) {
|
|
35
|
+
throw new Error(`Skill pack '${skillName}' not found. Available: ${available.join(", ")}`);
|
|
36
|
+
}
|
|
37
|
+
const store = await openStore(storePath);
|
|
38
|
+
let compacted = false;
|
|
39
|
+
try {
|
|
40
|
+
// Check if already installed
|
|
41
|
+
const existing = await store.listSkills();
|
|
42
|
+
if (existing.includes(skillName)) {
|
|
43
|
+
console.log(`[skills-install] '${skillName}' already installed — reinstalling`);
|
|
44
|
+
}
|
|
45
|
+
const files = await bakeSkillPack(store, assetsRoot, skillName);
|
|
46
|
+
await store.commit();
|
|
47
|
+
// Compact if dead space > 50%
|
|
48
|
+
if (store.deadSpaceRatio > 0.5) {
|
|
49
|
+
await store.compact();
|
|
50
|
+
compacted = true;
|
|
51
|
+
}
|
|
52
|
+
return { skill: skillName, files, compacted };
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await store.close();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export async function installAllSkills(workspaceRoot) {
|
|
59
|
+
const assetsRoot = getAssetsRoot();
|
|
60
|
+
const available = await listAvailableSkills(assetsRoot);
|
|
61
|
+
const results = [];
|
|
62
|
+
for (const skill of available) {
|
|
63
|
+
results.push(await installSkillPack(workspaceRoot, skill));
|
|
64
|
+
}
|
|
65
|
+
return results;
|
|
66
|
+
}
|
|
67
|
+
export async function listInstalledSkills(workspaceRoot) {
|
|
68
|
+
const storePath = join(workspaceRoot, ".agents", "ACE", "ace-state.zarr");
|
|
69
|
+
if (!existsSync(storePath))
|
|
70
|
+
return [];
|
|
71
|
+
const store = await openStore(storePath);
|
|
72
|
+
try {
|
|
73
|
+
return await store.listSkills();
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
await store.close();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export async function listAvailableSkillPacks(workspaceRoot) {
|
|
80
|
+
const assetsRoot = getAssetsRoot();
|
|
81
|
+
const available = await listAvailableSkills(assetsRoot);
|
|
82
|
+
const installed = await listInstalledSkills(workspaceRoot);
|
|
83
|
+
const notInstalled = available.filter((s) => !installed.includes(s));
|
|
84
|
+
return { installed, available, notInstalled };
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=skills-install.js.map
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateReader — read-only projection over AcePackedStore
|
|
3
|
+
*
|
|
4
|
+
* The TUI uses StateReader for dashboard ingestion.
|
|
5
|
+
* The TUI never opens the store for writing.
|
|
6
|
+
*
|
|
7
|
+
* Opens the store in a read-compatible mode (no write lock needed for reads).
|
|
8
|
+
*/
|
|
9
|
+
import { HandoffRepository } from "./repositories/handoff-repository.js";
|
|
10
|
+
import { TodoRepository } from "./repositories/todo-repository.js";
|
|
11
|
+
import { LedgerRepository } from "./repositories/ledger-repository.js";
|
|
12
|
+
import { SchedulerRepository } from "./repositories/scheduler-repository.js";
|
|
13
|
+
import { SessionRepository } from "./repositories/session-repository.js";
|
|
14
|
+
import { TrackerRepository } from "./repositories/tracker-repository.js";
|
|
15
|
+
import { DiscoveryRepository } from "./repositories/discovery-repository.js";
|
|
16
|
+
import { VericifyRepository } from "./repositories/vericify-repository.js";
|
|
17
|
+
export interface DashboardSnapshot {
|
|
18
|
+
handoffs: Awaited<ReturnType<HandoffRepository["list"]>>;
|
|
19
|
+
todos: Awaited<ReturnType<TodoRepository["getAll"]>>;
|
|
20
|
+
ledger: Awaited<ReturnType<LedgerRepository["recent"]>>;
|
|
21
|
+
jobs: Awaited<ReturnType<SchedulerRepository["listJobs"]>>;
|
|
22
|
+
sessions: Awaited<ReturnType<SessionRepository["list"]>>;
|
|
23
|
+
events: Awaited<ReturnType<TrackerRepository["list"]>>;
|
|
24
|
+
providers: Awaited<ReturnType<DiscoveryRepository["listAll"]>>;
|
|
25
|
+
posts: Awaited<ReturnType<VericifyRepository["list"]>>;
|
|
26
|
+
snapped_at: number;
|
|
27
|
+
}
|
|
28
|
+
export declare class StoreStateReader {
|
|
29
|
+
private store;
|
|
30
|
+
private get repos();
|
|
31
|
+
open(storePath: string): Promise<void>;
|
|
32
|
+
close(): Promise<void>;
|
|
33
|
+
snapshot(): Promise<DashboardSnapshot>;
|
|
34
|
+
handoffs(): Promise<import("./repositories/handoff-repository.js").HandoffRecord[]>;
|
|
35
|
+
todos(): Promise<import("./repositories/todo-repository.js").TodoNode[]>;
|
|
36
|
+
ledger(): Promise<import("./repositories/ledger-repository.js").LedgerEvent[]>;
|
|
37
|
+
schedulerState(): Promise<import("./repositories/scheduler-repository.js").Job[]>;
|
|
38
|
+
sessions(): Promise<import("./repositories/session-repository.js").SessionRecord[]>;
|
|
39
|
+
statusEvents(): Promise<import("./repositories/tracker-repository.js").StatusEvent[]>;
|
|
40
|
+
providerDiscovery(): Promise<import("./repositories/discovery-repository.js").DiscoveryResult[]>;
|
|
41
|
+
vericifyPosts(): Promise<import("./repositories/vericify-repository.js").VericifyPost[]>;
|
|
42
|
+
domainDocs(_domain: string): Promise<never[]>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Poll the store on an interval and call the callback with snapshots.
|
|
46
|
+
* TUI dashboard ingestion pattern.
|
|
47
|
+
*/
|
|
48
|
+
export declare function pollStore(storePath: string, intervalMs: number, onSnapshot: (snapshot: DashboardSnapshot) => void, onError?: (err: Error) => void): () => void;
|
|
49
|
+
//# sourceMappingURL=state-reader.d.ts.map
|