atabey 0.0.32 → 0.0.33
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/bin/cli.js +5 -5
- package/dist/atabey/src/cli/commands/check.js +4 -1
- package/dist/atabey/src/cli/commands/check.js.map +1 -1
- package/dist/atabey/src/cli/commands/dashboard.js +60 -21
- package/dist/atabey/src/cli/commands/dashboard.js.map +1 -1
- package/dist/atabey/src/cli/commands/hitl.d.ts +16 -0
- package/dist/atabey/src/cli/commands/hitl.js +152 -0
- package/dist/atabey/src/cli/commands/hitl.js.map +1 -0
- package/dist/atabey/src/cli/commands/init/languages.d.ts +33 -0
- package/dist/atabey/src/cli/commands/init/languages.js +114 -0
- package/dist/atabey/src/cli/commands/init/languages.js.map +1 -0
- package/dist/atabey/src/cli/commands/init/scaffold-app.d.ts +26 -0
- package/dist/atabey/src/cli/commands/init/scaffold-app.js +555 -0
- package/dist/atabey/src/cli/commands/init/scaffold-app.js.map +1 -0
- package/dist/atabey/src/cli/commands/init/scaffold-core.d.ts +1 -0
- package/dist/atabey/src/cli/commands/init/scaffold-core.js +1 -0
- package/dist/atabey/src/cli/commands/init/scaffold-core.js.map +1 -1
- package/dist/atabey/src/cli/commands/init/scaffold-standards.js +1 -0
- package/dist/atabey/src/cli/commands/init/scaffold-standards.js.map +1 -1
- package/dist/atabey/src/cli/commands/init.d.ts +3 -0
- package/dist/atabey/src/cli/commands/init.js +49 -20
- package/dist/atabey/src/cli/commands/init.js.map +1 -1
- package/dist/atabey/src/cli/commands/knowledge.js +37 -5
- package/dist/atabey/src/cli/commands/knowledge.js.map +1 -1
- package/dist/atabey/src/cli/commands/log.d.ts +4 -0
- package/dist/atabey/src/cli/commands/log.js +33 -1
- package/dist/atabey/src/cli/commands/log.js.map +1 -1
- package/dist/atabey/src/cli/commands/orchestrate.d.ts +6 -6
- package/dist/atabey/src/cli/index.js +68 -10
- package/dist/atabey/src/cli/index.js.map +1 -1
- package/dist/atabey/src/cli/platforms/core.d.ts +1 -1
- package/dist/atabey/src/cli/platforms/core.js +1 -0
- package/dist/atabey/src/cli/platforms/core.js.map +1 -1
- package/dist/atabey/src/cli/platforms/scaffold.js +4 -1
- package/dist/atabey/src/cli/platforms/scaffold.js.map +1 -1
- package/dist/atabey/src/cli/platforms/utils.js +7 -1
- package/dist/atabey/src/cli/platforms/utils.js.map +1 -1
- package/dist/atabey/src/cli/shims.js +10 -0
- package/dist/atabey/src/cli/shims.js.map +1 -1
- package/dist/atabey/src/cli/utils/config-schema.d.ts +1 -1
- package/dist/atabey/src/cli/utils/pkg.js +3 -4
- package/dist/atabey/src/cli/utils/pkg.js.map +1 -1
- package/dist/atabey/src/cli/utils/schemas.d.ts +10 -10
- package/dist/atabey/src/contracts/tasks.d.ts +2 -2
- package/dist/atabey/src/modules/agents/definitions.d.ts +2 -1
- package/dist/atabey/src/modules/agents/definitions.js +18 -0
- package/dist/atabey/src/modules/agents/definitions.js.map +1 -1
- package/dist/atabey/src/modules/agents/registry/native.js +14 -8
- package/dist/atabey/src/modules/agents/registry/native.js.map +1 -1
- package/dist/atabey/src/modules/contracts/api.d.ts +6 -6
- package/dist/atabey/src/modules/engines/quality-gate.js +4 -4
- package/dist/atabey/src/modules/engines/quality-gate.js.map +1 -1
- package/dist/atabey/src/modules/engines/risk-engine.js +10 -0
- package/dist/atabey/src/modules/engines/risk-engine.js.map +1 -1
- package/dist/atabey/src/modules/engines/routing-engine.js +8 -0
- package/dist/atabey/src/modules/engines/routing-engine.js.map +1 -1
- package/dist/atabey/src/modules/memory/core.js +12 -3
- package/dist/atabey/src/modules/memory/core.js.map +1 -1
- package/dist/atabey/src/modules/providers/definitions.js +51 -0
- package/dist/atabey/src/modules/providers/definitions.js.map +1 -1
- package/dist/atabey/src/modules/providers/types.d.ts +1 -1
- package/dist/atabey/src/modules/providers/types.js +1 -1
- package/dist/atabey/src/modules/providers/types.js.map +1 -1
- package/dist/atabey/src/modules/skills/adapter-skills.js +81 -0
- package/dist/atabey/src/modules/skills/adapter-skills.js.map +1 -1
- package/dist/atabey/src/shared/storage.d.ts +2 -149
- package/dist/atabey/src/shared/storage.js +2 -342
- package/dist/atabey/src/shared/storage.js.map +1 -1
- package/dist/shared/src/constants.d.ts +5 -2
- package/dist/shared/src/constants.js +5 -0
- package/dist/shared/src/constants.js.map +1 -1
- package/dist/shared/src/index.d.ts +1 -0
- package/dist/shared/src/index.js +1 -0
- package/dist/shared/src/index.js.map +1 -1
- package/dist/shared/src/lock.js +6 -3
- package/dist/shared/src/lock.js.map +1 -1
- package/dist/shared/src/pii.js +16 -12
- package/dist/shared/src/pii.js.map +1 -1
- package/dist/{atabey-mcp/src/shared → shared/src}/storage.d.ts +98 -0
- package/dist/shared/src/storage.js +724 -0
- package/dist/shared/src/storage.js.map +1 -0
- package/package.json +7 -7
- package/templates/standards/llm-governance.md +1 -0
- package/templates/standards/native-standards.md +67 -0
- package/dist/atabey/src/modules/engines/worker-script.d.ts +0 -8
- package/dist/atabey/src/modules/engines/worker-script.js +0 -99
- package/dist/atabey/src/modules/engines/worker-script.js.map +0 -1
- package/dist/atabey-mcp/src/mcp/utils/auth.d.ts +0 -40
- package/dist/atabey-mcp/src/mcp/utils/auth.js +0 -154
- package/dist/atabey-mcp/src/mcp/utils/auth.js.map +0 -1
- package/dist/atabey-mcp/src/mcp/utils/auto-rollback.d.ts +0 -71
- package/dist/atabey-mcp/src/mcp/utils/auto-rollback.js +0 -375
- package/dist/atabey-mcp/src/mcp/utils/auto-rollback.js.map +0 -1
- package/dist/atabey-mcp/src/mcp/utils/context-optimizer.d.ts +0 -110
- package/dist/atabey-mcp/src/mcp/utils/context-optimizer.js +0 -391
- package/dist/atabey-mcp/src/mcp/utils/context-optimizer.js.map +0 -1
- package/dist/atabey-mcp/src/mcp/utils/discipline.d.ts +0 -69
- package/dist/atabey-mcp/src/mcp/utils/discipline.js +0 -257
- package/dist/atabey-mcp/src/mcp/utils/discipline.js.map +0 -1
- package/dist/atabey-mcp/src/mcp/utils/finops.d.ts +0 -139
- package/dist/atabey-mcp/src/mcp/utils/finops.js +0 -324
- package/dist/atabey-mcp/src/mcp/utils/finops.js.map +0 -1
- package/dist/atabey-mcp/src/mcp/utils/license-scanner.d.ts +0 -71
- package/dist/atabey-mcp/src/mcp/utils/license-scanner.js +0 -284
- package/dist/atabey-mcp/src/mcp/utils/license-scanner.js.map +0 -1
- package/dist/atabey-mcp/src/mcp/utils/loop-detector.d.ts +0 -106
- package/dist/atabey-mcp/src/mcp/utils/loop-detector.js +0 -413
- package/dist/atabey-mcp/src/mcp/utils/loop-detector.js.map +0 -1
- package/dist/atabey-mcp/src/mcp/utils/memory.d.ts +0 -3
- package/dist/atabey-mcp/src/mcp/utils/memory.js +0 -75
- package/dist/atabey-mcp/src/mcp/utils/memory.js.map +0 -1
- package/dist/atabey-mcp/src/mcp/utils/rules-engine.d.ts +0 -78
- package/dist/atabey-mcp/src/mcp/utils/rules-engine.js +0 -232
- package/dist/atabey-mcp/src/mcp/utils/rules-engine.js.map +0 -1
- package/dist/atabey-mcp/src/mcp/utils/telemetry-streamer.d.ts +0 -133
- package/dist/atabey-mcp/src/mcp/utils/telemetry-streamer.js +0 -397
- package/dist/atabey-mcp/src/mcp/utils/telemetry-streamer.js.map +0 -1
- package/dist/atabey-mcp/src/shared/logger.d.ts +0 -1
- package/dist/atabey-mcp/src/shared/logger.js +0 -2
- package/dist/atabey-mcp/src/shared/logger.js.map +0 -1
- package/dist/atabey-mcp/src/shared/pii.d.ts +0 -1
- package/dist/atabey-mcp/src/shared/pii.js +0 -2
- package/dist/atabey-mcp/src/shared/pii.js.map +0 -1
- package/dist/atabey-mcp/src/shared/storage.js +0 -346
- package/dist/atabey-mcp/src/shared/storage.js.map +0 -1
- package/dist/atabey-mcp/src/shared/types.d.ts +0 -1
- package/dist/atabey-mcp/src/shared/types.js +0 -2
- package/dist/atabey-mcp/src/shared/types.js.map +0 -1
- package/dist/src/cli/commands/approve.d.ts +0 -1
- package/dist/src/cli/commands/approve.js +0 -64
- package/dist/src/cli/commands/approve.js.map +0 -1
- package/dist/src/cli/commands/check.d.ts +0 -1
- package/dist/src/cli/commands/check.js +0 -339
- package/dist/src/cli/commands/check.js.map +0 -1
- package/dist/src/cli/commands/compliance.d.ts +0 -5
- package/dist/src/cli/commands/compliance.js +0 -43
- package/dist/src/cli/commands/compliance.js.map +0 -1
- package/dist/src/cli/commands/contract.d.ts +0 -10
- package/dist/src/cli/commands/contract.js +0 -52
- package/dist/src/cli/commands/contract.js.map +0 -1
- package/dist/src/cli/commands/coverage.d.ts +0 -1
- package/dist/src/cli/commands/coverage.js +0 -121
- package/dist/src/cli/commands/coverage.js.map +0 -1
- package/dist/src/cli/commands/dashboard.d.ts +0 -5
- package/dist/src/cli/commands/dashboard.js +0 -753
- package/dist/src/cli/commands/dashboard.js.map +0 -1
- package/dist/src/cli/commands/explorer.d.ts +0 -2
- package/dist/src/cli/commands/explorer.js +0 -44
- package/dist/src/cli/commands/explorer.js.map +0 -1
- package/dist/src/cli/commands/git.d.ts +0 -2
- package/dist/src/cli/commands/git.js +0 -40
- package/dist/src/cli/commands/git.js.map +0 -1
- package/dist/src/cli/commands/index-codebase.d.ts +0 -4
- package/dist/src/cli/commands/index-codebase.js +0 -63
- package/dist/src/cli/commands/index-codebase.js.map +0 -1
- package/dist/src/cli/commands/init/create-agent.d.ts +0 -4
- package/dist/src/cli/commands/init/create-agent.js +0 -59
- package/dist/src/cli/commands/init/create-agent.js.map +0 -1
- package/dist/src/cli/commands/init/scaffold-core.d.ts +0 -13
- package/dist/src/cli/commands/init/scaffold-core.js +0 -188
- package/dist/src/cli/commands/init/scaffold-core.js.map +0 -1
- package/dist/src/cli/commands/init/scaffold-docs.d.ts +0 -4
- package/dist/src/cli/commands/init/scaffold-docs.js +0 -36
- package/dist/src/cli/commands/init/scaffold-docs.js.map +0 -1
- package/dist/src/cli/commands/init/scaffold-ops.d.ts +0 -1
- package/dist/src/cli/commands/init/scaffold-ops.js +0 -81
- package/dist/src/cli/commands/init/scaffold-ops.js.map +0 -1
- package/dist/src/cli/commands/init/scaffold-standards.d.ts +0 -2
- package/dist/src/cli/commands/init/scaffold-standards.js +0 -84
- package/dist/src/cli/commands/init/scaffold-standards.js.map +0 -1
- package/dist/src/cli/commands/init.d.ts +0 -11
- package/dist/src/cli/commands/init.js +0 -371
- package/dist/src/cli/commands/init.js.map +0 -1
- package/dist/src/cli/commands/knowledge.d.ts +0 -2
- package/dist/src/cli/commands/knowledge.js +0 -16
- package/dist/src/cli/commands/knowledge.js.map +0 -1
- package/dist/src/cli/commands/lint.d.ts +0 -4
- package/dist/src/cli/commands/lint.js +0 -24
- package/dist/src/cli/commands/lint.js.map +0 -1
- package/dist/src/cli/commands/log.d.ts +0 -10
- package/dist/src/cli/commands/log.js +0 -14
- package/dist/src/cli/commands/log.js.map +0 -1
- package/dist/src/cli/commands/mcp.d.ts +0 -11
- package/dist/src/cli/commands/mcp.js +0 -128
- package/dist/src/cli/commands/mcp.js.map +0 -1
- package/dist/src/cli/commands/memory.d.ts +0 -1
- package/dist/src/cli/commands/memory.js +0 -5
- package/dist/src/cli/commands/memory.js.map +0 -1
- package/dist/src/cli/commands/orchestrate.d.ts +0 -62
- package/dist/src/cli/commands/orchestrate.js +0 -263
- package/dist/src/cli/commands/orchestrate.js.map +0 -1
- package/dist/src/cli/commands/plan.d.ts +0 -11
- package/dist/src/cli/commands/plan.js +0 -120
- package/dist/src/cli/commands/plan.js.map +0 -1
- package/dist/src/cli/commands/quickstart.d.ts +0 -9
- package/dist/src/cli/commands/quickstart.js +0 -60
- package/dist/src/cli/commands/quickstart.js.map +0 -1
- package/dist/src/cli/commands/script.d.ts +0 -1
- package/dist/src/cli/commands/script.js +0 -28
- package/dist/src/cli/commands/script.js.map +0 -1
- package/dist/src/cli/commands/security.d.ts +0 -1
- package/dist/src/cli/commands/security.js +0 -34
- package/dist/src/cli/commands/security.js.map +0 -1
- package/dist/src/cli/commands/status.d.ts +0 -4
- package/dist/src/cli/commands/status.js +0 -122
- package/dist/src/cli/commands/status.js.map +0 -1
- package/dist/src/cli/commands/trace.d.ts +0 -10
- package/dist/src/cli/commands/trace.js +0 -108
- package/dist/src/cli/commands/trace.js.map +0 -1
- package/dist/src/cli/index.d.ts +0 -2
- package/dist/src/cli/index.js +0 -289
- package/dist/src/cli/index.js.map +0 -1
- package/dist/src/cli/platforms/core.d.ts +0 -16
- package/dist/src/cli/platforms/core.js +0 -77
- package/dist/src/cli/platforms/core.js.map +0 -1
- package/dist/src/cli/platforms/index.d.ts +0 -5
- package/dist/src/cli/platforms/index.js +0 -6
- package/dist/src/cli/platforms/index.js.map +0 -1
- package/dist/src/cli/platforms/paths.d.ts +0 -15
- package/dist/src/cli/platforms/paths.js +0 -102
- package/dist/src/cli/platforms/paths.js.map +0 -1
- package/dist/src/cli/platforms/scaffold.d.ts +0 -2
- package/dist/src/cli/platforms/scaffold.js +0 -73
- package/dist/src/cli/platforms/scaffold.js.map +0 -1
- package/dist/src/cli/platforms/utils.d.ts +0 -4
- package/dist/src/cli/platforms/utils.js +0 -76
- package/dist/src/cli/platforms/utils.js.map +0 -1
- package/dist/src/cli/shims.d.ts +0 -1
- package/dist/src/cli/shims.js +0 -67
- package/dist/src/cli/shims.js.map +0 -1
- package/dist/src/cli/utils/claude.d.ts +0 -8
- package/dist/src/cli/utils/claude.js +0 -58
- package/dist/src/cli/utils/claude.js.map +0 -1
- package/dist/src/cli/utils/compliance.d.ts +0 -42
- package/dist/src/cli/utils/compliance.js +0 -150
- package/dist/src/cli/utils/compliance.js.map +0 -1
- package/dist/src/cli/utils/config-schema.d.ts +0 -256
- package/dist/src/cli/utils/config-schema.js +0 -67
- package/dist/src/cli/utils/config-schema.js.map +0 -1
- package/dist/src/cli/utils/fs.d.ts +0 -10
- package/dist/src/cli/utils/fs.js +0 -139
- package/dist/src/cli/utils/fs.js.map +0 -1
- package/dist/src/cli/utils/i18n.d.ts +0 -21
- package/dist/src/cli/utils/i18n.js +0 -36
- package/dist/src/cli/utils/i18n.js.map +0 -1
- package/dist/src/cli/utils/memory.d.ts +0 -45
- package/dist/src/cli/utils/memory.js +0 -339
- package/dist/src/cli/utils/memory.js.map +0 -1
- package/dist/src/cli/utils/pkg.d.ts +0 -42
- package/dist/src/cli/utils/pkg.js +0 -281
- package/dist/src/cli/utils/pkg.js.map +0 -1
- package/dist/src/cli/utils/quality.d.ts +0 -25
- package/dist/src/cli/utils/quality.js +0 -61
- package/dist/src/cli/utils/quality.js.map +0 -1
- package/dist/src/cli/utils/schemas.d.ts +0 -49
- package/dist/src/cli/utils/schemas.js +0 -20
- package/dist/src/cli/utils/schemas.js.map +0 -1
- package/dist/src/cli/utils/string.d.ts +0 -7
- package/dist/src/cli/utils/string.js +0 -50
- package/dist/src/cli/utils/string.js.map +0 -1
- package/dist/src/cli/utils/time.d.ts +0 -2
- package/dist/src/cli/utils/time.js +0 -28
- package/dist/src/cli/utils/time.js.map +0 -1
- package/dist/src/cli/utils/ui.d.ts +0 -53
- package/dist/src/cli/utils/ui.js +0 -101
- package/dist/src/cli/utils/ui.js.map +0 -1
- package/dist/src/cli/utils/validate-registry.d.ts +0 -4
- package/dist/src/cli/utils/validate-registry.js +0 -130
- package/dist/src/cli/utils/validate-registry.js.map +0 -1
- package/dist/src/contracts/index.d.ts +0 -1
- package/dist/src/contracts/index.js +0 -2
- package/dist/src/contracts/index.js.map +0 -1
- package/dist/src/contracts/tasks.d.ts +0 -44
- package/dist/src/contracts/tasks.js +0 -21
- package/dist/src/contracts/tasks.js.map +0 -1
- package/dist/src/modules/agents/definitions.d.ts +0 -26
- package/dist/src/modules/agents/definitions.js +0 -559
- package/dist/src/modules/agents/definitions.js.map +0 -1
- package/dist/src/modules/agents/registry/analyst.d.ts +0 -2
- package/dist/src/modules/agents/registry/analyst.js +0 -40
- package/dist/src/modules/agents/registry/analyst.js.map +0 -1
- package/dist/src/modules/agents/registry/architect.d.ts +0 -2
- package/dist/src/modules/agents/registry/architect.js +0 -43
- package/dist/src/modules/agents/registry/architect.js.map +0 -1
- package/dist/src/modules/agents/registry/backend.d.ts +0 -2
- package/dist/src/modules/agents/registry/backend.js +0 -51
- package/dist/src/modules/agents/registry/backend.js.map +0 -1
- package/dist/src/modules/agents/registry/database.d.ts +0 -2
- package/dist/src/modules/agents/registry/database.js +0 -46
- package/dist/src/modules/agents/registry/database.js.map +0 -1
- package/dist/src/modules/agents/registry/devops.d.ts +0 -2
- package/dist/src/modules/agents/registry/devops.js +0 -46
- package/dist/src/modules/agents/registry/devops.js.map +0 -1
- package/dist/src/modules/agents/registry/explorer.d.ts +0 -2
- package/dist/src/modules/agents/registry/explorer.js +0 -38
- package/dist/src/modules/agents/registry/explorer.js.map +0 -1
- package/dist/src/modules/agents/registry/frontend.d.ts +0 -2
- package/dist/src/modules/agents/registry/frontend.js +0 -53
- package/dist/src/modules/agents/registry/frontend.js.map +0 -1
- package/dist/src/modules/agents/registry/git.d.ts +0 -2
- package/dist/src/modules/agents/registry/git.js +0 -37
- package/dist/src/modules/agents/registry/git.js.map +0 -1
- package/dist/src/modules/agents/registry/manager.d.ts +0 -2
- package/dist/src/modules/agents/registry/manager.js +0 -65
- package/dist/src/modules/agents/registry/manager.js.map +0 -1
- package/dist/src/modules/agents/registry/mobile.d.ts +0 -2
- package/dist/src/modules/agents/registry/mobile.js +0 -42
- package/dist/src/modules/agents/registry/mobile.js.map +0 -1
- package/dist/src/modules/agents/registry/native.d.ts +0 -2
- package/dist/src/modules/agents/registry/native.js +0 -42
- package/dist/src/modules/agents/registry/native.js.map +0 -1
- package/dist/src/modules/agents/registry/quality.d.ts +0 -2
- package/dist/src/modules/agents/registry/quality.js +0 -44
- package/dist/src/modules/agents/registry/quality.js.map +0 -1
- package/dist/src/modules/agents/registry/security.d.ts +0 -2
- package/dist/src/modules/agents/registry/security.js +0 -43
- package/dist/src/modules/agents/registry/security.js.map +0 -1
- package/dist/src/modules/agents/types.d.ts +0 -33
- package/dist/src/modules/agents/types.js +0 -2
- package/dist/src/modules/agents/types.js.map +0 -1
- package/dist/src/modules/contracts/api.d.ts +0 -178
- package/dist/src/modules/contracts/api.js +0 -56
- package/dist/src/modules/contracts/api.js.map +0 -1
- package/dist/src/modules/contracts/index.d.ts +0 -5
- package/dist/src/modules/contracts/index.js +0 -6
- package/dist/src/modules/contracts/index.js.map +0 -1
- package/dist/src/modules/engines/agent-executor.d.ts +0 -46
- package/dist/src/modules/engines/agent-executor.js +0 -241
- package/dist/src/modules/engines/agent-executor.js.map +0 -1
- package/dist/src/modules/engines/agent-loop.d.ts +0 -34
- package/dist/src/modules/engines/agent-loop.js +0 -102
- package/dist/src/modules/engines/agent-loop.js.map +0 -1
- package/dist/src/modules/engines/contract-engine.d.ts +0 -46
- package/dist/src/modules/engines/contract-engine.js +0 -116
- package/dist/src/modules/engines/contract-engine.js.map +0 -1
- package/dist/src/modules/engines/crud-governance.d.ts +0 -66
- package/dist/src/modules/engines/crud-governance.js +0 -219
- package/dist/src/modules/engines/crud-governance.js.map +0 -1
- package/dist/src/modules/engines/discovery-engine.d.ts +0 -42
- package/dist/src/modules/engines/discovery-engine.js +0 -161
- package/dist/src/modules/engines/discovery-engine.js.map +0 -1
- package/dist/src/modules/engines/evaluation-engine.d.ts +0 -18
- package/dist/src/modules/engines/evaluation-engine.js +0 -171
- package/dist/src/modules/engines/evaluation-engine.js.map +0 -1
- package/dist/src/modules/engines/file-lock.d.ts +0 -41
- package/dist/src/modules/engines/file-lock.js +0 -168
- package/dist/src/modules/engines/file-lock.js.map +0 -1
- package/dist/src/modules/engines/health-engine.d.ts +0 -22
- package/dist/src/modules/engines/health-engine.js +0 -127
- package/dist/src/modules/engines/health-engine.js.map +0 -1
- package/dist/src/modules/engines/phase-engine.d.ts +0 -82
- package/dist/src/modules/engines/phase-engine.js +0 -211
- package/dist/src/modules/engines/phase-engine.js.map +0 -1
- package/dist/src/modules/engines/planning-engine.d.ts +0 -25
- package/dist/src/modules/engines/planning-engine.js +0 -80
- package/dist/src/modules/engines/planning-engine.js.map +0 -1
- package/dist/src/modules/engines/policy-engine.d.ts +0 -63
- package/dist/src/modules/engines/policy-engine.js +0 -186
- package/dist/src/modules/engines/policy-engine.js.map +0 -1
- package/dist/src/modules/engines/quality-gate.d.ts +0 -31
- package/dist/src/modules/engines/quality-gate.js +0 -95
- package/dist/src/modules/engines/quality-gate.js.map +0 -1
- package/dist/src/modules/engines/risk-engine.d.ts +0 -34
- package/dist/src/modules/engines/risk-engine.js +0 -201
- package/dist/src/modules/engines/risk-engine.js.map +0 -1
- package/dist/src/modules/engines/routing-engine.d.ts +0 -96
- package/dist/src/modules/engines/routing-engine.js +0 -505
- package/dist/src/modules/engines/routing-engine.js.map +0 -1
- package/dist/src/modules/engines/session-engine.d.ts +0 -68
- package/dist/src/modules/engines/session-engine.js +0 -141
- package/dist/src/modules/engines/session-engine.js.map +0 -1
- package/dist/src/modules/engines/types.d.ts +0 -51
- package/dist/src/modules/engines/types.js +0 -2
- package/dist/src/modules/engines/types.js.map +0 -1
- package/dist/src/modules/memory/core.d.ts +0 -42
- package/dist/src/modules/memory/core.js +0 -100
- package/dist/src/modules/memory/core.js.map +0 -1
- package/dist/src/modules/memory/embedding.d.ts +0 -28
- package/dist/src/modules/memory/embedding.js +0 -131
- package/dist/src/modules/memory/embedding.js.map +0 -1
- package/dist/src/modules/memory/types.d.ts +0 -18
- package/dist/src/modules/memory/types.js +0 -2
- package/dist/src/modules/memory/types.js.map +0 -1
- package/dist/src/modules/memory/vector-store.d.ts +0 -13
- package/dist/src/modules/memory/vector-store.js +0 -75
- package/dist/src/modules/memory/vector-store.js.map +0 -1
- package/dist/src/modules/providers/definitions.d.ts +0 -9
- package/dist/src/modules/providers/definitions.js +0 -141
- package/dist/src/modules/providers/definitions.js.map +0 -1
- package/dist/src/modules/providers/llm-provider.d.ts +0 -87
- package/dist/src/modules/providers/llm-provider.js +0 -242
- package/dist/src/modules/providers/llm-provider.js.map +0 -1
- package/dist/src/modules/providers/registry.d.ts +0 -12
- package/dist/src/modules/providers/registry.js +0 -19
- package/dist/src/modules/providers/registry.js.map +0 -1
- package/dist/src/modules/providers/shared.d.ts +0 -1
- package/dist/src/modules/providers/shared.js +0 -104
- package/dist/src/modules/providers/shared.js.map +0 -1
- package/dist/src/modules/providers/types.d.ts +0 -14
- package/dist/src/modules/providers/types.js +0 -2
- package/dist/src/modules/providers/types.js.map +0 -1
- package/dist/src/modules/skills/adapter-skills.d.ts +0 -70
- package/dist/src/modules/skills/adapter-skills.js +0 -450
- package/dist/src/modules/skills/adapter-skills.js.map +0 -1
- package/dist/src/modules/skills/definitions.d.ts +0 -48
- package/dist/src/modules/skills/definitions.js +0 -71
- package/dist/src/modules/skills/definitions.js.map +0 -1
- package/dist/src/shared/audit.d.ts +0 -1
- package/dist/src/shared/audit.js +0 -2
- package/dist/src/shared/audit.js.map +0 -1
- package/dist/src/shared/constants.d.ts +0 -1
- package/dist/src/shared/constants.js +0 -2
- package/dist/src/shared/constants.js.map +0 -1
- package/dist/src/shared/errors.d.ts +0 -1
- package/dist/src/shared/errors.js +0 -2
- package/dist/src/shared/errors.js.map +0 -1
- package/dist/src/shared/fs.d.ts +0 -1
- package/dist/src/shared/fs.js +0 -2
- package/dist/src/shared/fs.js.map +0 -1
- package/dist/src/shared/lock.d.ts +0 -1
- package/dist/src/shared/lock.js +0 -2
- package/dist/src/shared/lock.js.map +0 -1
- package/dist/src/shared/logger.d.ts +0 -1
- package/dist/src/shared/logger.js +0 -2
- package/dist/src/shared/logger.js.map +0 -1
- package/dist/src/shared/pii.d.ts +0 -1
- package/dist/src/shared/pii.js +0 -2
- package/dist/src/shared/pii.js.map +0 -1
- package/dist/src/shared/retention.d.ts +0 -1
- package/dist/src/shared/retention.js +0 -2
- package/dist/src/shared/retention.js.map +0 -1
- package/dist/src/shared/storage.d.ts +0 -141
- package/dist/src/shared/storage.js +0 -332
- package/dist/src/shared/storage.js.map +0 -1
- package/dist/src/shared/string.d.ts +0 -1
- package/dist/src/shared/string.js +0 -2
- package/dist/src/shared/string.js.map +0 -1
- package/dist/src/shared/types.d.ts +0 -1
- package/dist/src/shared/types.js +0 -2
- package/dist/src/shared/types.js.map +0 -1
|
@@ -0,0 +1,724 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { AUDIT_CHAIN_GENESIS, buildAgentLogChainPayload, sha256Hex, verifyHashChain } from "./audit-chain.js";
|
|
5
|
+
import { databaseHolder } from "./database.js";
|
|
6
|
+
import { logger } from "./logger.js";
|
|
7
|
+
import { maskText } from "./pii.js";
|
|
8
|
+
import { asAgentID, asLogID, asMessageID, asTaskID, } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Resolves the framework directory (.atabey) intelligently by ascending the directory tree,
|
|
11
|
+
* preventing subpackages and test runners from spraying databases in random subfolders.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveFrameworkDir() {
|
|
14
|
+
const testDir = process.env.ATABEY_TEST_DIR || process.env.ATABEY_FRAMEWORK_DIR;
|
|
15
|
+
if (testDir)
|
|
16
|
+
return testDir;
|
|
17
|
+
let cur = process.cwd();
|
|
18
|
+
while (cur !== path.parse(cur).root) {
|
|
19
|
+
const candidate = path.join(cur, ".atabey");
|
|
20
|
+
if (fs.existsSync(candidate))
|
|
21
|
+
return candidate;
|
|
22
|
+
const pkgJson = path.join(cur, "package.json");
|
|
23
|
+
if (fs.existsSync(pkgJson)) {
|
|
24
|
+
try {
|
|
25
|
+
const pkg = JSON.parse(fs.readFileSync(pkgJson, "utf8"));
|
|
26
|
+
if (pkg.name === "atabey-monorepo" || (pkg.workspaces && Array.isArray(pkg.workspaces))) {
|
|
27
|
+
return path.join(cur, ".atabey");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch { /* ignore */ }
|
|
31
|
+
}
|
|
32
|
+
cur = path.dirname(cur);
|
|
33
|
+
}
|
|
34
|
+
return path.join(process.cwd(), ".atabey");
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* [DB] Canonical Atabey Storage Engine (Single Source of Truth)
|
|
38
|
+
* Central SQLite database for enterprise-scale multi-agent state management.
|
|
39
|
+
*/
|
|
40
|
+
export class AtabeyStorage {
|
|
41
|
+
static db = null;
|
|
42
|
+
static getDB() {
|
|
43
|
+
if (!this.db) {
|
|
44
|
+
const frameworkDir = resolveFrameworkDir();
|
|
45
|
+
if (!fs.existsSync(frameworkDir)) {
|
|
46
|
+
fs.mkdirSync(frameworkDir, { recursive: true });
|
|
47
|
+
}
|
|
48
|
+
const dbPath = path.join(frameworkDir, "atabey.db");
|
|
49
|
+
this.db = new Database(dbPath, { timeout: 5000 });
|
|
50
|
+
this.db.pragma("journal_mode = WAL");
|
|
51
|
+
databaseHolder.setDB(this.db);
|
|
52
|
+
this.initializeSchema();
|
|
53
|
+
}
|
|
54
|
+
return this.db;
|
|
55
|
+
}
|
|
56
|
+
static initializeSchema() {
|
|
57
|
+
const db = this.db;
|
|
58
|
+
db.exec(`
|
|
59
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
60
|
+
name TEXT PRIMARY KEY,
|
|
61
|
+
state TEXT DEFAULT 'READY',
|
|
62
|
+
task TEXT DEFAULT 'Idle',
|
|
63
|
+
description TEXT DEFAULT '',
|
|
64
|
+
skills TEXT DEFAULT '[]',
|
|
65
|
+
last_updated DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
66
|
+
)
|
|
67
|
+
`);
|
|
68
|
+
db.exec(`
|
|
69
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
70
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
71
|
+
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
72
|
+
sender TEXT,
|
|
73
|
+
receiver TEXT,
|
|
74
|
+
category TEXT,
|
|
75
|
+
content TEXT,
|
|
76
|
+
trace_id TEXT,
|
|
77
|
+
parent_id TEXT,
|
|
78
|
+
status TEXT DEFAULT 'PENDING',
|
|
79
|
+
priority TEXT DEFAULT 'NORMAL',
|
|
80
|
+
requires_approval BOOLEAN DEFAULT 0
|
|
81
|
+
)
|
|
82
|
+
`);
|
|
83
|
+
db.exec(`
|
|
84
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
85
|
+
id TEXT PRIMARY KEY,
|
|
86
|
+
trace_id TEXT,
|
|
87
|
+
description TEXT,
|
|
88
|
+
agent TEXT,
|
|
89
|
+
status TEXT DEFAULT 'PENDING',
|
|
90
|
+
priority TEXT DEFAULT 'NORMAL',
|
|
91
|
+
dependencies TEXT,
|
|
92
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
93
|
+
)
|
|
94
|
+
`);
|
|
95
|
+
db.exec(`
|
|
96
|
+
CREATE TABLE IF NOT EXISTS logs (
|
|
97
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
98
|
+
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
99
|
+
agent TEXT,
|
|
100
|
+
action TEXT,
|
|
101
|
+
trace_id TEXT,
|
|
102
|
+
status TEXT,
|
|
103
|
+
summary TEXT,
|
|
104
|
+
findings TEXT,
|
|
105
|
+
prev_hash TEXT,
|
|
106
|
+
hash TEXT
|
|
107
|
+
)
|
|
108
|
+
`);
|
|
109
|
+
try {
|
|
110
|
+
const tableInfo = db.prepare("PRAGMA table_info(logs)").all();
|
|
111
|
+
const columnNames = tableInfo.map(c => c.name);
|
|
112
|
+
if (!columnNames.includes("prev_hash"))
|
|
113
|
+
db.exec("ALTER TABLE logs ADD COLUMN prev_hash TEXT");
|
|
114
|
+
if (!columnNames.includes("hash"))
|
|
115
|
+
db.exec("ALTER TABLE logs ADD COLUMN hash TEXT");
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
logger.error(`Failed to migrate logs table schema: ${err.message}`);
|
|
119
|
+
}
|
|
120
|
+
db.exec(`
|
|
121
|
+
CREATE TABLE IF NOT EXISTS metadata (
|
|
122
|
+
key TEXT PRIMARY KEY,
|
|
123
|
+
value TEXT
|
|
124
|
+
)
|
|
125
|
+
`);
|
|
126
|
+
db.exec(`
|
|
127
|
+
CREATE TABLE IF NOT EXISTS costs (
|
|
128
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
129
|
+
provider TEXT,
|
|
130
|
+
model TEXT,
|
|
131
|
+
input_tokens INTEGER,
|
|
132
|
+
output_tokens INTEGER,
|
|
133
|
+
cost REAL,
|
|
134
|
+
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
135
|
+
trace_id TEXT
|
|
136
|
+
)
|
|
137
|
+
`);
|
|
138
|
+
db.exec(`
|
|
139
|
+
CREATE TABLE IF NOT EXISTS knowledge (
|
|
140
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
141
|
+
filename TEXT UNIQUE,
|
|
142
|
+
content TEXT,
|
|
143
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
144
|
+
)
|
|
145
|
+
`);
|
|
146
|
+
db.exec(`
|
|
147
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
148
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
149
|
+
name TEXT UNIQUE,
|
|
150
|
+
token TEXT UNIQUE,
|
|
151
|
+
role TEXT DEFAULT 'user',
|
|
152
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
153
|
+
)
|
|
154
|
+
`);
|
|
155
|
+
db.exec(`
|
|
156
|
+
CREATE TABLE IF NOT EXISTS loop_cooldowns (
|
|
157
|
+
agent TEXT PRIMARY KEY,
|
|
158
|
+
cooldown_until INTEGER NOT NULL,
|
|
159
|
+
detail TEXT,
|
|
160
|
+
cooldown_count INTEGER DEFAULT 1,
|
|
161
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
162
|
+
)
|
|
163
|
+
`);
|
|
164
|
+
db.exec(`
|
|
165
|
+
CREATE TABLE IF NOT EXISTS approvals (
|
|
166
|
+
trace_id TEXT PRIMARY KEY,
|
|
167
|
+
tool_name TEXT NOT NULL,
|
|
168
|
+
agent TEXT NOT NULL,
|
|
169
|
+
risk_score INTEGER NOT NULL,
|
|
170
|
+
risk_level TEXT NOT NULL,
|
|
171
|
+
reason TEXT NOT NULL,
|
|
172
|
+
args TEXT NOT NULL,
|
|
173
|
+
created_at INTEGER NOT NULL,
|
|
174
|
+
expires_at INTEGER NOT NULL,
|
|
175
|
+
status TEXT DEFAULT 'PENDING',
|
|
176
|
+
passcode TEXT
|
|
177
|
+
)
|
|
178
|
+
`);
|
|
179
|
+
db.exec(`
|
|
180
|
+
CREATE TABLE IF NOT EXISTS discipline (
|
|
181
|
+
agent TEXT PRIMARY KEY,
|
|
182
|
+
total_calls INTEGER DEFAULT 0,
|
|
183
|
+
violations INTEGER DEFAULT 0,
|
|
184
|
+
last_violation TEXT,
|
|
185
|
+
cooldown_until INTEGER DEFAULT 0,
|
|
186
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
187
|
+
)
|
|
188
|
+
`);
|
|
189
|
+
}
|
|
190
|
+
// === KNOWLEDGE PERSISTENCE ===
|
|
191
|
+
static getKnowledgeList() {
|
|
192
|
+
try {
|
|
193
|
+
return this.getDB().prepare("SELECT filename, updated_at FROM knowledge ORDER BY updated_at DESC").all();
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
logger.debug(`Failed to get knowledge list: ${err.message}`);
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
static getKnowledgeFile(filename) {
|
|
201
|
+
try {
|
|
202
|
+
const row = this.getDB().prepare("SELECT * FROM knowledge WHERE filename = ?").get(filename);
|
|
203
|
+
return row || null;
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
logger.debug(`Failed to get knowledge file: ${err.message}`);
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
static saveKnowledgeFile(filename, content) {
|
|
211
|
+
this.getDB().prepare(`
|
|
212
|
+
INSERT INTO knowledge (filename, content, updated_at) VALUES (?, ?, datetime('now'))
|
|
213
|
+
ON CONFLICT(filename) DO UPDATE SET content = excluded.content, updated_at = datetime('now')
|
|
214
|
+
`).run(filename, content);
|
|
215
|
+
}
|
|
216
|
+
static deleteKnowledgeFile(filename) {
|
|
217
|
+
const info = this.getDB().prepare("DELETE FROM knowledge WHERE filename = ?").run(filename);
|
|
218
|
+
return info.changes > 0;
|
|
219
|
+
}
|
|
220
|
+
// === USER PERSISTENCE ===
|
|
221
|
+
static hasUsers() {
|
|
222
|
+
try {
|
|
223
|
+
const row = this.getDB().prepare("SELECT COUNT(*) as count FROM users").get();
|
|
224
|
+
return row.count > 0;
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
static getUsers() {
|
|
231
|
+
try {
|
|
232
|
+
return this.getDB().prepare("SELECT name, token, role FROM users ORDER BY id ASC").all();
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
logger.debug(`Failed to get users: ${err.message}`);
|
|
236
|
+
return [];
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
static getUserByToken(token) {
|
|
240
|
+
try {
|
|
241
|
+
const row = this.getDB().prepare("SELECT name, role FROM users WHERE token = ?").get(token);
|
|
242
|
+
return row || null;
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
logger.debug(`Failed to get user by token: ${err.message}`);
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
static createUser(name, token, role) {
|
|
250
|
+
this.getDB().prepare("INSERT INTO users (name, token, role) VALUES (?, ?, ?)").run(name, token, role);
|
|
251
|
+
}
|
|
252
|
+
static deleteUser(name) {
|
|
253
|
+
const info = this.getDB().prepare("DELETE FROM users WHERE name = ?").run(name);
|
|
254
|
+
return info.changes > 0;
|
|
255
|
+
}
|
|
256
|
+
// === AGENT DETAILS PERSISTENCE ===
|
|
257
|
+
static createAgent(name, description, skills) {
|
|
258
|
+
const cleanName = name.replace("@", "");
|
|
259
|
+
this.getDB().prepare(`
|
|
260
|
+
INSERT INTO agents (name, state, task, description, skills, last_updated)
|
|
261
|
+
VALUES (?, 'READY', 'Idle', ?, ?, datetime('now'))
|
|
262
|
+
ON CONFLICT(name) DO UPDATE SET description = excluded.description, skills = excluded.skills
|
|
263
|
+
`).run(cleanName, description, skills);
|
|
264
|
+
}
|
|
265
|
+
static deleteAgent(name) {
|
|
266
|
+
const cleanName = name.replace("@", "");
|
|
267
|
+
const info = this.getDB().prepare("DELETE FROM agents WHERE name = ?").run(cleanName);
|
|
268
|
+
return info.changes > 0;
|
|
269
|
+
}
|
|
270
|
+
static updateAgentDetails(name, description, state, task, skills) {
|
|
271
|
+
const cleanName = name.replace("@", "");
|
|
272
|
+
this.getDB().prepare(`
|
|
273
|
+
INSERT INTO agents (name, state, task, description, skills, last_updated)
|
|
274
|
+
VALUES (?, ?, ?, ?, ?, datetime('now'))
|
|
275
|
+
ON CONFLICT(name) DO UPDATE SET
|
|
276
|
+
description = excluded.description,
|
|
277
|
+
state = excluded.state,
|
|
278
|
+
task = excluded.task,
|
|
279
|
+
skills = excluded.skills,
|
|
280
|
+
last_updated = datetime('now')
|
|
281
|
+
`).run(cleanName, state, task, description, skills);
|
|
282
|
+
}
|
|
283
|
+
// === EVENT HOOKS FOR REAL-TIME BROADCASTS ===
|
|
284
|
+
static onMessageSaved = null;
|
|
285
|
+
static onMessageStatusUpdated = null;
|
|
286
|
+
static saveLog(log) {
|
|
287
|
+
const db = this.getDB();
|
|
288
|
+
const timestamp = new Date().toISOString();
|
|
289
|
+
const agent = log.agent.replace("@", "");
|
|
290
|
+
const maskedSummary = maskText(log.summary);
|
|
291
|
+
const maskedFindings = log.findings ? maskText(log.findings) : null;
|
|
292
|
+
const traceId = log.trace_id || "";
|
|
293
|
+
let lastId = 0;
|
|
294
|
+
const insert = db.transaction(() => {
|
|
295
|
+
let prevHash = AUDIT_CHAIN_GENESIS;
|
|
296
|
+
try {
|
|
297
|
+
const lastRow = db.prepare("SELECT hash FROM logs WHERE hash IS NOT NULL ORDER BY id DESC LIMIT 1").get();
|
|
298
|
+
if (lastRow && lastRow.hash) {
|
|
299
|
+
prevHash = lastRow.hash;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch { /* best-effort fallback to genesis */ }
|
|
303
|
+
const payload = buildAgentLogChainPayload({
|
|
304
|
+
prevHash,
|
|
305
|
+
timestamp,
|
|
306
|
+
agent,
|
|
307
|
+
action: log.action,
|
|
308
|
+
traceId: traceId || "",
|
|
309
|
+
status: log.status,
|
|
310
|
+
summary: maskedSummary,
|
|
311
|
+
});
|
|
312
|
+
const hash = sha256Hex(payload);
|
|
313
|
+
const result = db.prepare(`
|
|
314
|
+
INSERT INTO logs (timestamp, agent, action, trace_id, status, summary, findings, prev_hash, hash)
|
|
315
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
316
|
+
`).run(timestamp, agent, log.action, log.trace_id || null, log.status, maskedSummary, maskedFindings, prevHash, hash);
|
|
317
|
+
lastId = Number(result.lastInsertRowid);
|
|
318
|
+
});
|
|
319
|
+
insert();
|
|
320
|
+
return lastId;
|
|
321
|
+
}
|
|
322
|
+
static verifyLogIntegrity() {
|
|
323
|
+
const db = this.getDB();
|
|
324
|
+
try {
|
|
325
|
+
const rows = db.prepare("SELECT * FROM logs ORDER BY id ASC").all();
|
|
326
|
+
const hashed = rows.filter((r) => r.hash);
|
|
327
|
+
if (hashed.length === 0) {
|
|
328
|
+
return { valid: true, checked: 0, reason: "No hashed log rows yet" };
|
|
329
|
+
}
|
|
330
|
+
return verifyHashChain(hashed, (row, prevHash) => buildAgentLogChainPayload({
|
|
331
|
+
prevHash,
|
|
332
|
+
agent: row.agent,
|
|
333
|
+
action: row.action,
|
|
334
|
+
traceId: row.trace_id || "",
|
|
335
|
+
status: row.status,
|
|
336
|
+
summary: row.summary,
|
|
337
|
+
timestamp: row.timestamp,
|
|
338
|
+
}));
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
return { valid: false, reason: `Verification error: ${err.message}` };
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
static saveCost(cost) {
|
|
345
|
+
const db = this.getDB();
|
|
346
|
+
db.prepare(`
|
|
347
|
+
INSERT INTO costs (provider, model, input_tokens, output_tokens, cost, timestamp, trace_id)
|
|
348
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
349
|
+
`).run(cost.provider, cost.model, cost.inputTokens, cost.outputTokens, cost.cost, cost.timestamp, cost.traceId || null);
|
|
350
|
+
}
|
|
351
|
+
static getAllCosts() {
|
|
352
|
+
const db = this.getDB();
|
|
353
|
+
const rows = db.prepare("SELECT * FROM costs ORDER BY timestamp ASC").all();
|
|
354
|
+
return rows.map(r => ({
|
|
355
|
+
provider: r.provider,
|
|
356
|
+
model: r.model,
|
|
357
|
+
inputTokens: r.input_tokens,
|
|
358
|
+
outputTokens: r.output_tokens,
|
|
359
|
+
cost: r.cost,
|
|
360
|
+
timestamp: r.timestamp,
|
|
361
|
+
traceId: r.trace_id || undefined
|
|
362
|
+
}));
|
|
363
|
+
}
|
|
364
|
+
static updateAgentStatus(name, state, task, lastUpdated) {
|
|
365
|
+
const cleanName = name.replace("@", "");
|
|
366
|
+
const timestamp = lastUpdated || new Date().toISOString();
|
|
367
|
+
this.getDB().prepare(`
|
|
368
|
+
INSERT INTO agents (name, state, task, last_updated)
|
|
369
|
+
VALUES (?, ?, ?, ?)
|
|
370
|
+
ON CONFLICT(name) DO UPDATE SET
|
|
371
|
+
state = excluded.state,
|
|
372
|
+
task = excluded.task,
|
|
373
|
+
last_updated = excluded.last_updated
|
|
374
|
+
`).run(cleanName, state, task, timestamp);
|
|
375
|
+
}
|
|
376
|
+
static getAllAgents() {
|
|
377
|
+
const db = this.getDB();
|
|
378
|
+
const rows = db.prepare("SELECT * FROM agents").all();
|
|
379
|
+
return rows.map(r => ({
|
|
380
|
+
name: asAgentID(r.name),
|
|
381
|
+
state: r.state,
|
|
382
|
+
task: r.task,
|
|
383
|
+
last_updated: r.last_updated
|
|
384
|
+
}));
|
|
385
|
+
}
|
|
386
|
+
static saveMessage(msg) {
|
|
387
|
+
const from = msg.from.replace("@", "");
|
|
388
|
+
const to = msg.to.replace("@", "");
|
|
389
|
+
const cleanContent = maskText(msg.content);
|
|
390
|
+
this.getDB().prepare(`
|
|
391
|
+
INSERT INTO messages (timestamp, sender, receiver, category, content, trace_id, parent_id, status, priority, requires_approval)
|
|
392
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
393
|
+
`).run(msg.timestamp, from, to, msg.category, cleanContent, msg.traceId, msg.parentId || null, msg.status, msg.priority, msg.requiresApproval ? 1 : 0);
|
|
394
|
+
if (this.onMessageSaved) {
|
|
395
|
+
try {
|
|
396
|
+
this.onMessageSaved({ traceId: msg.traceId, category: msg.category });
|
|
397
|
+
}
|
|
398
|
+
catch (err) {
|
|
399
|
+
logger.debug(`onMessageSaved hook error: ${err.message}`);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
static getPendingMessages() {
|
|
404
|
+
const db = this.getDB();
|
|
405
|
+
const rows = db.prepare("SELECT * FROM messages WHERE status = 'PENDING'").all();
|
|
406
|
+
return rows.map(r => ({
|
|
407
|
+
id: asMessageID(r.id),
|
|
408
|
+
timestamp: r.timestamp,
|
|
409
|
+
from: asAgentID(r.sender),
|
|
410
|
+
to: asAgentID(r.receiver),
|
|
411
|
+
category: r.category,
|
|
412
|
+
content: maskText(r.content),
|
|
413
|
+
traceId: r.trace_id,
|
|
414
|
+
parentId: r.parent_id || undefined,
|
|
415
|
+
status: r.status,
|
|
416
|
+
priority: r.priority,
|
|
417
|
+
requiresApproval: r.requires_approval === 1
|
|
418
|
+
}));
|
|
419
|
+
}
|
|
420
|
+
static updateMessageStatus(id, status) {
|
|
421
|
+
this.getDB().prepare("UPDATE messages SET status = ? WHERE id = ?").run(status, id);
|
|
422
|
+
if (this.onMessageStatusUpdated) {
|
|
423
|
+
try {
|
|
424
|
+
this.onMessageStatusUpdated(id, status);
|
|
425
|
+
}
|
|
426
|
+
catch (err) {
|
|
427
|
+
logger.debug(`onMessageStatusUpdated hook error: ${err.message}`);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
static saveTask(task) {
|
|
432
|
+
const agent = task.agent;
|
|
433
|
+
const cleanDesc = task.description;
|
|
434
|
+
this.getDB().prepare(`
|
|
435
|
+
INSERT INTO tasks (id, trace_id, description, agent, status, priority, dependencies, created_at)
|
|
436
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
437
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
438
|
+
status = excluded.status,
|
|
439
|
+
priority = excluded.priority,
|
|
440
|
+
dependencies = excluded.dependencies,
|
|
441
|
+
agent = excluded.agent
|
|
442
|
+
`).run(task.id, task.traceId, cleanDesc, agent, task.status, task.priority, JSON.stringify(task.dependencies), task.createdAt || new Date().toISOString());
|
|
443
|
+
}
|
|
444
|
+
static getTasks(traceId) {
|
|
445
|
+
const db = this.getDB();
|
|
446
|
+
let rows;
|
|
447
|
+
if (traceId) {
|
|
448
|
+
rows = db.prepare("SELECT * FROM tasks WHERE trace_id = ?").all(traceId);
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
rows = db.prepare("SELECT * FROM tasks").all();
|
|
452
|
+
}
|
|
453
|
+
return rows.map(r => {
|
|
454
|
+
let deps;
|
|
455
|
+
try {
|
|
456
|
+
deps = JSON.parse(r.dependencies || "[]");
|
|
457
|
+
}
|
|
458
|
+
catch {
|
|
459
|
+
deps = [];
|
|
460
|
+
}
|
|
461
|
+
return {
|
|
462
|
+
id: asTaskID(r.id),
|
|
463
|
+
traceId: r.trace_id,
|
|
464
|
+
description: maskText(r.description),
|
|
465
|
+
agent: asAgentID(r.agent),
|
|
466
|
+
status: r.status,
|
|
467
|
+
priority: r.priority,
|
|
468
|
+
dependencies: deps,
|
|
469
|
+
createdAt: r.created_at
|
|
470
|
+
};
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
static getLogs(agentName) {
|
|
474
|
+
const db = this.getDB();
|
|
475
|
+
let rows;
|
|
476
|
+
const cleanName = agentName ? agentName.replace("@", "") : undefined;
|
|
477
|
+
if (cleanName) {
|
|
478
|
+
rows = db.prepare("SELECT * FROM logs WHERE agent = ? ORDER BY timestamp DESC").all(cleanName);
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
rows = db.prepare("SELECT * FROM logs ORDER BY timestamp DESC").all();
|
|
482
|
+
}
|
|
483
|
+
return rows.map(r => ({
|
|
484
|
+
id: asLogID(r.id),
|
|
485
|
+
timestamp: r.timestamp,
|
|
486
|
+
agent: asAgentID(r.agent),
|
|
487
|
+
action: r.action,
|
|
488
|
+
trace_id: r.trace_id || undefined,
|
|
489
|
+
status: r.status,
|
|
490
|
+
summary: maskText(r.summary),
|
|
491
|
+
findings: r.findings ? maskText(r.findings) : undefined,
|
|
492
|
+
prev_hash: r.prev_hash || undefined,
|
|
493
|
+
hash: r.hash || undefined
|
|
494
|
+
}));
|
|
495
|
+
}
|
|
496
|
+
static setMetadata(key, value) {
|
|
497
|
+
this.getDB().prepare(`
|
|
498
|
+
INSERT INTO metadata (key, value) VALUES (?, ?)
|
|
499
|
+
ON CONFLICT(key) DO UPDATE SET value = excluded.value
|
|
500
|
+
`).run(key, value);
|
|
501
|
+
}
|
|
502
|
+
static getMetadata(key) {
|
|
503
|
+
const row = this.getDB().prepare("SELECT value FROM metadata WHERE key = ?").get(key);
|
|
504
|
+
return row ? row.value : null;
|
|
505
|
+
}
|
|
506
|
+
// === LOOP COOLDOWN PERSISTENCE ===
|
|
507
|
+
static saveLoopCooldown(agent, cooldownUntil, detail, cooldownCount = 1) {
|
|
508
|
+
const cleanAgent = agent.replace("@", "");
|
|
509
|
+
this.getDB().prepare(`
|
|
510
|
+
INSERT INTO loop_cooldowns (agent, cooldown_until, detail, cooldown_count, updated_at)
|
|
511
|
+
VALUES (?, ?, ?, ?, datetime('now'))
|
|
512
|
+
ON CONFLICT(agent) DO UPDATE SET
|
|
513
|
+
cooldown_until = excluded.cooldown_until,
|
|
514
|
+
detail = excluded.detail,
|
|
515
|
+
cooldown_count = excluded.cooldown_count,
|
|
516
|
+
updated_at = datetime('now')
|
|
517
|
+
`).run(cleanAgent, cooldownUntil, detail, cooldownCount);
|
|
518
|
+
}
|
|
519
|
+
static getLoopCooldown(agent) {
|
|
520
|
+
const cleanAgent = agent.replace("@", "");
|
|
521
|
+
try {
|
|
522
|
+
const row = this.getDB().prepare("SELECT * FROM loop_cooldowns WHERE agent = ?").get(cleanAgent);
|
|
523
|
+
if (!row)
|
|
524
|
+
return null;
|
|
525
|
+
return {
|
|
526
|
+
agent: row.agent,
|
|
527
|
+
cooldownUntil: row.cooldown_until,
|
|
528
|
+
detail: row.detail,
|
|
529
|
+
cooldownCount: row.cooldown_count
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
catch (err) {
|
|
533
|
+
logger.debug(`Failed to get loop cooldown: ${err.message}`);
|
|
534
|
+
return null;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
static clearLoopCooldown(agent) {
|
|
538
|
+
const cleanAgent = agent.replace("@", "");
|
|
539
|
+
const info = this.getDB().prepare("DELETE FROM loop_cooldowns WHERE agent = ?").run(cleanAgent);
|
|
540
|
+
return info.changes > 0;
|
|
541
|
+
}
|
|
542
|
+
static clearAllLoopCooldowns() {
|
|
543
|
+
try {
|
|
544
|
+
this.getDB().prepare("DELETE FROM loop_cooldowns").run();
|
|
545
|
+
}
|
|
546
|
+
catch (err) {
|
|
547
|
+
logger.debug(`Failed to clear all loop cooldowns: ${err.message}`);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
static listActiveLoopCooldowns() {
|
|
551
|
+
const now = Date.now();
|
|
552
|
+
try {
|
|
553
|
+
const rows = this.getDB().prepare("SELECT * FROM loop_cooldowns WHERE cooldown_until > ?").all(now);
|
|
554
|
+
return rows.map(r => ({
|
|
555
|
+
agent: r.agent,
|
|
556
|
+
cooldownUntil: r.cooldown_until,
|
|
557
|
+
detail: r.detail,
|
|
558
|
+
cooldownCount: r.cooldown_count
|
|
559
|
+
}));
|
|
560
|
+
}
|
|
561
|
+
catch (err) {
|
|
562
|
+
logger.debug(`Failed to list active loop cooldowns: ${err.message}`);
|
|
563
|
+
return [];
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
static purgeExpiredLoopCooldowns() {
|
|
567
|
+
const now = Date.now();
|
|
568
|
+
try {
|
|
569
|
+
const info = this.getDB().prepare("DELETE FROM loop_cooldowns WHERE cooldown_until <= ?").run(now);
|
|
570
|
+
return info.changes;
|
|
571
|
+
}
|
|
572
|
+
catch (err) {
|
|
573
|
+
logger.debug(`Failed to purge expired loop cooldowns: ${err.message}`);
|
|
574
|
+
return 0;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
// === APPROVALS PERSISTENCE ===
|
|
578
|
+
static saveApproval(app) {
|
|
579
|
+
this.saveApprovalRequest(app);
|
|
580
|
+
}
|
|
581
|
+
static saveApprovalRequest(request) {
|
|
582
|
+
const db = this.getDB();
|
|
583
|
+
db.prepare(`
|
|
584
|
+
INSERT OR REPLACE INTO approvals (
|
|
585
|
+
trace_id, tool_name, agent, risk_score, risk_level, reason, args,
|
|
586
|
+
created_at, expires_at, status, passcode
|
|
587
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
588
|
+
`).run(request.traceId, request.toolName, request.agent, request.riskScore, request.riskLevel, request.reason, JSON.stringify(request.args), request.createdAt, request.expiresAt, request.status || "PENDING", request.passcode || null);
|
|
589
|
+
}
|
|
590
|
+
static getApproval(traceId) {
|
|
591
|
+
try {
|
|
592
|
+
const row = this.getDB().prepare("SELECT * FROM approvals WHERE trace_id = ?").get(traceId);
|
|
593
|
+
if (!row)
|
|
594
|
+
return null;
|
|
595
|
+
return {
|
|
596
|
+
traceId: row.trace_id,
|
|
597
|
+
toolName: row.tool_name,
|
|
598
|
+
agent: row.agent,
|
|
599
|
+
riskScore: row.risk_score,
|
|
600
|
+
riskLevel: row.risk_level,
|
|
601
|
+
reason: row.reason,
|
|
602
|
+
args: JSON.parse(row.args || "{}"),
|
|
603
|
+
createdAt: row.created_at,
|
|
604
|
+
expiresAt: row.expires_at,
|
|
605
|
+
status: row.status,
|
|
606
|
+
passcode: row.passcode || undefined
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
catch (err) {
|
|
610
|
+
logger.debug(`Failed to get approval: ${err.message}`);
|
|
611
|
+
return null;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
static getPendingApprovals() {
|
|
615
|
+
try {
|
|
616
|
+
const rows = this.getDB().prepare("SELECT * FROM approvals WHERE status = 'PENDING'").all();
|
|
617
|
+
return rows.map(row => ({
|
|
618
|
+
traceId: row.trace_id,
|
|
619
|
+
toolName: row.tool_name,
|
|
620
|
+
agent: row.agent,
|
|
621
|
+
riskScore: row.risk_score,
|
|
622
|
+
riskLevel: row.risk_level,
|
|
623
|
+
reason: row.reason,
|
|
624
|
+
args: JSON.parse(row.args || "{}"),
|
|
625
|
+
createdAt: row.created_at,
|
|
626
|
+
expiresAt: row.expires_at,
|
|
627
|
+
status: row.status,
|
|
628
|
+
passcode: row.passcode || undefined
|
|
629
|
+
}));
|
|
630
|
+
}
|
|
631
|
+
catch (err) {
|
|
632
|
+
logger.debug(`Failed to get pending approvals: ${err.message}`);
|
|
633
|
+
return [];
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
static updateApprovalStatus(traceId, status) {
|
|
637
|
+
this.getDB().prepare("UPDATE approvals SET status = ? WHERE trace_id = ?").run(status, traceId);
|
|
638
|
+
}
|
|
639
|
+
static clearAllApprovals() {
|
|
640
|
+
try {
|
|
641
|
+
this.getDB().prepare("DELETE FROM approvals").run();
|
|
642
|
+
}
|
|
643
|
+
catch (err) {
|
|
644
|
+
logger.debug(`Failed to clear approvals: ${err.message}`);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
// === DISCIPLINE PERSISTENCE ===
|
|
648
|
+
static saveDiscipline(agent, stats) {
|
|
649
|
+
const cleanAgent = agent.replace("@", "");
|
|
650
|
+
this.getDB().prepare(`
|
|
651
|
+
INSERT INTO discipline (agent, total_calls, violations, last_violation, cooldown_until, updated_at)
|
|
652
|
+
VALUES (?, ?, ?, ?, ?, datetime('now'))
|
|
653
|
+
ON CONFLICT(agent) DO UPDATE SET
|
|
654
|
+
total_calls = excluded.total_calls,
|
|
655
|
+
violations = excluded.violations,
|
|
656
|
+
last_violation = excluded.last_violation,
|
|
657
|
+
cooldown_until = excluded.cooldown_until,
|
|
658
|
+
updated_at = datetime('now')
|
|
659
|
+
`).run(cleanAgent, stats.totalCalls, stats.violations, stats.lastViolation, stats.cooldownUntil);
|
|
660
|
+
}
|
|
661
|
+
static getDiscipline(agent) {
|
|
662
|
+
const cleanAgent = agent.replace("@", "");
|
|
663
|
+
try {
|
|
664
|
+
const row = this.getDB().prepare("SELECT * FROM discipline WHERE agent = ?").get(cleanAgent);
|
|
665
|
+
if (!row)
|
|
666
|
+
return null;
|
|
667
|
+
return {
|
|
668
|
+
agent: row.agent,
|
|
669
|
+
totalCalls: row.total_calls,
|
|
670
|
+
violations: row.violations,
|
|
671
|
+
lastViolation: row.last_violation,
|
|
672
|
+
cooldownUntil: row.cooldown_until
|
|
673
|
+
};
|
|
674
|
+
}
|
|
675
|
+
catch (err) {
|
|
676
|
+
logger.debug(`Failed to get discipline: ${err.message}`);
|
|
677
|
+
return null;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
static getAllDiscipline() {
|
|
681
|
+
try {
|
|
682
|
+
const rows = this.getDB().prepare("SELECT * FROM discipline").all();
|
|
683
|
+
return rows.map(row => ({
|
|
684
|
+
agent: row.agent,
|
|
685
|
+
totalCalls: row.total_calls,
|
|
686
|
+
violations: row.violations,
|
|
687
|
+
lastViolation: row.last_violation,
|
|
688
|
+
cooldownUntil: row.cooldown_until
|
|
689
|
+
}));
|
|
690
|
+
}
|
|
691
|
+
catch (err) {
|
|
692
|
+
logger.debug(`Failed to get all discipline: ${err.message}`);
|
|
693
|
+
return [];
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
static clearAllDiscipline() {
|
|
697
|
+
try {
|
|
698
|
+
this.getDB().prepare("DELETE FROM discipline").run();
|
|
699
|
+
}
|
|
700
|
+
catch (err) {
|
|
701
|
+
logger.debug(`Failed to clear discipline: ${err.message}`);
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
static checkIntegrity() {
|
|
705
|
+
try {
|
|
706
|
+
const db = this.getDB();
|
|
707
|
+
const rows = db.pragma("quick_check");
|
|
708
|
+
const status = rows && rows[0] ? rows[0].quick_check : "unknown";
|
|
709
|
+
return { ok: status === "ok", message: status };
|
|
710
|
+
}
|
|
711
|
+
catch (err) {
|
|
712
|
+
return { ok: false, message: err.message };
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
static reset() {
|
|
716
|
+
if (this.db) {
|
|
717
|
+
this.db.close();
|
|
718
|
+
this.db = null;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
/** Canonical alias */
|
|
723
|
+
export const Storage = AtabeyStorage;
|
|
724
|
+
//# sourceMappingURL=storage.js.map
|