promptspeak-mcp-server 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/README.md +98 -0
- package/dist/agents/database.d.ts +174 -0
- package/dist/agents/database.d.ts.map +1 -0
- package/dist/agents/database.js +1029 -0
- package/dist/agents/database.js.map +1 -0
- package/dist/agents/index.d.ts +13 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +20 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/integration.d.ts +75 -0
- package/dist/agents/integration.d.ts.map +1 -0
- package/dist/agents/integration.js +166 -0
- package/dist/agents/integration.js.map +1 -0
- package/dist/agents/proposal-manager.d.ts +137 -0
- package/dist/agents/proposal-manager.d.ts.map +1 -0
- package/dist/agents/proposal-manager.js +782 -0
- package/dist/agents/proposal-manager.js.map +1 -0
- package/dist/agents/registry.d.ts +168 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +716 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/templates/index.d.ts +50 -0
- package/dist/agents/templates/index.d.ts.map +1 -0
- package/dist/agents/templates/index.js +415 -0
- package/dist/agents/templates/index.js.map +1 -0
- package/dist/agents/tools.d.ts +156 -0
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +590 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/agents/types.d.ts +513 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +20 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/auth/api-key.d.ts +37 -0
- package/dist/auth/api-key.d.ts.map +1 -0
- package/dist/auth/api-key.js +202 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oauth.d.ts +125 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +225 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/boot-camp/boot-camp-controller.d.ts +185 -0
- package/dist/boot-camp/boot-camp-controller.d.ts.map +1 -0
- package/dist/boot-camp/boot-camp-controller.js +696 -0
- package/dist/boot-camp/boot-camp-controller.js.map +1 -0
- package/dist/boot-camp/database.d.ts +79 -0
- package/dist/boot-camp/database.d.ts.map +1 -0
- package/dist/boot-camp/database.js +594 -0
- package/dist/boot-camp/database.js.map +1 -0
- package/dist/boot-camp/index.d.ts +104 -0
- package/dist/boot-camp/index.d.ts.map +1 -0
- package/dist/boot-camp/index.js +140 -0
- package/dist/boot-camp/index.js.map +1 -0
- package/dist/boot-camp/phases/base-phase.d.ts +98 -0
- package/dist/boot-camp/phases/base-phase.d.ts.map +1 -0
- package/dist/boot-camp/phases/base-phase.js +170 -0
- package/dist/boot-camp/phases/base-phase.js.map +1 -0
- package/dist/boot-camp/phases/combat.d.ts +52 -0
- package/dist/boot-camp/phases/combat.d.ts.map +1 -0
- package/dist/boot-camp/phases/combat.js +413 -0
- package/dist/boot-camp/phases/combat.js.map +1 -0
- package/dist/boot-camp/phases/conditioning.d.ts +53 -0
- package/dist/boot-camp/phases/conditioning.d.ts.map +1 -0
- package/dist/boot-camp/phases/conditioning.js +354 -0
- package/dist/boot-camp/phases/conditioning.js.map +1 -0
- package/dist/boot-camp/phases/crucible.d.ts +52 -0
- package/dist/boot-camp/phases/crucible.d.ts.map +1 -0
- package/dist/boot-camp/phases/crucible.js +442 -0
- package/dist/boot-camp/phases/crucible.js.map +1 -0
- package/dist/boot-camp/phases/graduation.d.ts +52 -0
- package/dist/boot-camp/phases/graduation.d.ts.map +1 -0
- package/dist/boot-camp/phases/graduation.js +422 -0
- package/dist/boot-camp/phases/graduation.js.map +1 -0
- package/dist/boot-camp/phases/index.d.ts +14 -0
- package/dist/boot-camp/phases/index.d.ts.map +1 -0
- package/dist/boot-camp/phases/index.js +14 -0
- package/dist/boot-camp/phases/index.js.map +1 -0
- package/dist/boot-camp/phases/marksmanship.d.ts +50 -0
- package/dist/boot-camp/phases/marksmanship.d.ts.map +1 -0
- package/dist/boot-camp/phases/marksmanship.js +373 -0
- package/dist/boot-camp/phases/marksmanship.js.map +1 -0
- package/dist/boot-camp/phases/phase-factory.d.ts +24 -0
- package/dist/boot-camp/phases/phase-factory.d.ts.map +1 -0
- package/dist/boot-camp/phases/phase-factory.js +74 -0
- package/dist/boot-camp/phases/phase-factory.js.map +1 -0
- package/dist/boot-camp/phases/receiving.d.ts +49 -0
- package/dist/boot-camp/phases/receiving.d.ts.map +1 -0
- package/dist/boot-camp/phases/receiving.js +168 -0
- package/dist/boot-camp/phases/receiving.js.map +1 -0
- package/dist/boot-camp/swarm-integration.d.ts +164 -0
- package/dist/boot-camp/swarm-integration.d.ts.map +1 -0
- package/dist/boot-camp/swarm-integration.js +405 -0
- package/dist/boot-camp/swarm-integration.js.map +1 -0
- package/dist/boot-camp/tools.d.ts +718 -0
- package/dist/boot-camp/tools.d.ts.map +1 -0
- package/dist/boot-camp/tools.js +592 -0
- package/dist/boot-camp/tools.js.map +1 -0
- package/dist/boot-camp/types.d.ts +342 -0
- package/dist/boot-camp/types.d.ts.map +1 -0
- package/dist/boot-camp/types.js +179 -0
- package/dist/boot-camp/types.js.map +1 -0
- package/dist/core/config/env.d.ts +146 -0
- package/dist/core/config/env.d.ts.map +1 -0
- package/dist/core/config/env.js +230 -0
- package/dist/core/config/env.js.map +1 -0
- package/dist/core/config/index.d.ts +23 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/index.js +31 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/errors/base.d.ts +168 -0
- package/dist/core/errors/base.d.ts.map +1 -0
- package/dist/core/errors/base.js +195 -0
- package/dist/core/errors/base.js.map +1 -0
- package/dist/core/errors/codes.d.ts +170 -0
- package/dist/core/errors/codes.d.ts.map +1 -0
- package/dist/core/errors/codes.js +460 -0
- package/dist/core/errors/codes.js.map +1 -0
- package/dist/core/errors/index.d.ts +40 -0
- package/dist/core/errors/index.d.ts.map +1 -0
- package/dist/core/errors/index.js +79 -0
- package/dist/core/errors/index.js.map +1 -0
- package/dist/core/errors/types.d.ts +708 -0
- package/dist/core/errors/types.d.ts.map +1 -0
- package/dist/core/errors/types.js +791 -0
- package/dist/core/errors/types.js.map +1 -0
- package/dist/core/http/http-client.d.ts +140 -0
- package/dist/core/http/http-client.d.ts.map +1 -0
- package/dist/core/http/http-client.js +278 -0
- package/dist/core/http/http-client.js.map +1 -0
- package/dist/core/http/index.d.ts +37 -0
- package/dist/core/http/index.d.ts.map +1 -0
- package/dist/core/http/index.js +41 -0
- package/dist/core/http/index.js.map +1 -0
- package/dist/core/http/retry-policy.d.ts +99 -0
- package/dist/core/http/retry-policy.d.ts.map +1 -0
- package/dist/core/http/retry-policy.js +152 -0
- package/dist/core/http/retry-policy.js.map +1 -0
- package/dist/core/logging/context.d.ts +84 -0
- package/dist/core/logging/context.d.ts.map +1 -0
- package/dist/core/logging/context.js +124 -0
- package/dist/core/logging/context.js.map +1 -0
- package/dist/core/logging/formatters.d.ts +48 -0
- package/dist/core/logging/formatters.d.ts.map +1 -0
- package/dist/core/logging/formatters.js +186 -0
- package/dist/core/logging/formatters.js.map +1 -0
- package/dist/core/logging/index.d.ts +49 -0
- package/dist/core/logging/index.d.ts.map +1 -0
- package/dist/core/logging/index.js +52 -0
- package/dist/core/logging/index.js.map +1 -0
- package/dist/core/logging/logger.d.ts +120 -0
- package/dist/core/logging/logger.d.ts.map +1 -0
- package/dist/core/logging/logger.js +213 -0
- package/dist/core/logging/logger.js.map +1 -0
- package/dist/core/logging/types.d.ts +64 -0
- package/dist/core/logging/types.d.ts.map +1 -0
- package/dist/core/logging/types.js +29 -0
- package/dist/core/logging/types.js.map +1 -0
- package/dist/core/patterns/index.d.ts +11 -0
- package/dist/core/patterns/index.d.ts.map +1 -0
- package/dist/core/patterns/index.js +11 -0
- package/dist/core/patterns/index.js.map +1 -0
- package/dist/core/patterns/singleton.d.ts +69 -0
- package/dist/core/patterns/singleton.d.ts.map +1 -0
- package/dist/core/patterns/singleton.js +115 -0
- package/dist/core/patterns/singleton.js.map +1 -0
- package/dist/core/result/batch.d.ts +190 -0
- package/dist/core/result/batch.d.ts.map +1 -0
- package/dist/core/result/batch.js +391 -0
- package/dist/core/result/batch.js.map +1 -0
- package/dist/core/result/builders.d.ts +310 -0
- package/dist/core/result/builders.d.ts.map +1 -0
- package/dist/core/result/builders.js +454 -0
- package/dist/core/result/builders.js.map +1 -0
- package/dist/core/result/index.d.ts +51 -0
- package/dist/core/result/index.d.ts.map +1 -0
- package/dist/core/result/index.js +83 -0
- package/dist/core/result/index.js.map +1 -0
- package/dist/core/result/mcp-adapter.d.ts +192 -0
- package/dist/core/result/mcp-adapter.d.ts.map +1 -0
- package/dist/core/result/mcp-adapter.js +255 -0
- package/dist/core/result/mcp-adapter.js.map +1 -0
- package/dist/core/result/types.d.ts +170 -0
- package/dist/core/result/types.d.ts.map +1 -0
- package/dist/core/result/types.js +21 -0
- package/dist/core/result/types.js.map +1 -0
- package/dist/core/security/index.d.ts +41 -0
- package/dist/core/security/index.d.ts.map +1 -0
- package/dist/core/security/index.js +43 -0
- package/dist/core/security/index.js.map +1 -0
- package/dist/core/security/redaction.d.ts +138 -0
- package/dist/core/security/redaction.d.ts.map +1 -0
- package/dist/core/security/redaction.js +295 -0
- package/dist/core/security/redaction.js.map +1 -0
- package/dist/core/security/secure-logging.d.ts +189 -0
- package/dist/core/security/secure-logging.d.ts.map +1 -0
- package/dist/core/security/secure-logging.js +253 -0
- package/dist/core/security/secure-logging.js.map +1 -0
- package/dist/core/types/http-types.d.ts +94 -0
- package/dist/core/types/http-types.d.ts.map +1 -0
- package/dist/core/types/http-types.js +36 -0
- package/dist/core/types/http-types.js.map +1 -0
- package/dist/core/types/id-generators.d.ts +69 -0
- package/dist/core/types/id-generators.d.ts.map +1 -0
- package/dist/core/types/id-generators.js +96 -0
- package/dist/core/types/id-generators.js.map +1 -0
- package/dist/core/types/index.d.ts +13 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +14 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/document/agent.d.ts +63 -0
- package/dist/document/agent.d.ts.map +1 -0
- package/dist/document/agent.js +245 -0
- package/dist/document/agent.js.map +1 -0
- package/dist/document/extractor.d.ts +158 -0
- package/dist/document/extractor.d.ts.map +1 -0
- package/dist/document/extractor.js +720 -0
- package/dist/document/extractor.js.map +1 -0
- package/dist/document/index.d.ts +16 -0
- package/dist/document/index.d.ts.map +1 -0
- package/dist/document/index.js +22 -0
- package/dist/document/index.js.map +1 -0
- package/dist/document/merger.d.ts +59 -0
- package/dist/document/merger.d.ts.map +1 -0
- package/dist/document/merger.js +593 -0
- package/dist/document/merger.js.map +1 -0
- package/dist/document/parser.d.ts +67 -0
- package/dist/document/parser.d.ts.map +1 -0
- package/dist/document/parser.js +359 -0
- package/dist/document/parser.js.map +1 -0
- package/dist/document/tools.d.ts +14 -0
- package/dist/document/tools.d.ts.map +1 -0
- package/dist/document/tools.js +279 -0
- package/dist/document/tools.js.map +1 -0
- package/dist/document/types.d.ts +290 -0
- package/dist/document/types.d.ts.map +1 -0
- package/dist/document/types.js +12 -0
- package/dist/document/types.js.map +1 -0
- package/dist/drift/baseline.d.ts +65 -0
- package/dist/drift/baseline.d.ts.map +1 -0
- package/dist/drift/baseline.js +179 -0
- package/dist/drift/baseline.js.map +1 -0
- package/dist/drift/circuit-breaker.d.ts +91 -0
- package/dist/drift/circuit-breaker.d.ts.map +1 -0
- package/dist/drift/circuit-breaker.js +237 -0
- package/dist/drift/circuit-breaker.js.map +1 -0
- package/dist/drift/index.d.ts +161 -0
- package/dist/drift/index.d.ts.map +1 -0
- package/dist/drift/index.js +247 -0
- package/dist/drift/index.js.map +1 -0
- package/dist/drift/monitor.d.ts +115 -0
- package/dist/drift/monitor.d.ts.map +1 -0
- package/dist/drift/monitor.js +367 -0
- package/dist/drift/monitor.js.map +1 -0
- package/dist/drift/tripwire.d.ts +81 -0
- package/dist/drift/tripwire.d.ts.map +1 -0
- package/dist/drift/tripwire.js +196 -0
- package/dist/drift/tripwire.js.map +1 -0
- package/dist/fidelity/index.d.ts +12 -0
- package/dist/fidelity/index.d.ts.map +1 -0
- package/dist/fidelity/index.js +12 -0
- package/dist/fidelity/index.js.map +1 -0
- package/dist/fidelity/refresh-hooks.d.ts +75 -0
- package/dist/fidelity/refresh-hooks.d.ts.map +1 -0
- package/dist/fidelity/refresh-hooks.js +151 -0
- package/dist/fidelity/refresh-hooks.js.map +1 -0
- package/dist/gatekeeper/checklist-generator.d.ts +45 -0
- package/dist/gatekeeper/checklist-generator.d.ts.map +1 -0
- package/dist/gatekeeper/checklist-generator.js +336 -0
- package/dist/gatekeeper/checklist-generator.js.map +1 -0
- package/dist/gatekeeper/coverage.d.ts +28 -0
- package/dist/gatekeeper/coverage.d.ts.map +1 -0
- package/dist/gatekeeper/coverage.js +234 -0
- package/dist/gatekeeper/coverage.js.map +1 -0
- package/dist/gatekeeper/hold-manager.d.ts +174 -0
- package/dist/gatekeeper/hold-manager.d.ts.map +1 -0
- package/dist/gatekeeper/hold-manager.js +723 -0
- package/dist/gatekeeper/hold-manager.js.map +1 -0
- package/dist/gatekeeper/index.d.ts +244 -0
- package/dist/gatekeeper/index.d.ts.map +1 -0
- package/dist/gatekeeper/index.js +854 -0
- package/dist/gatekeeper/index.js.map +1 -0
- package/dist/gatekeeper/interceptor.d.ts +54 -0
- package/dist/gatekeeper/interceptor.d.ts.map +1 -0
- package/dist/gatekeeper/interceptor.js +217 -0
- package/dist/gatekeeper/interceptor.js.map +1 -0
- package/dist/gatekeeper/resolver.d.ts +53 -0
- package/dist/gatekeeper/resolver.d.ts.map +1 -0
- package/dist/gatekeeper/resolver.js +314 -0
- package/dist/gatekeeper/resolver.js.map +1 -0
- package/dist/gatekeeper/validator.d.ts +26 -0
- package/dist/gatekeeper/validator.d.ts.map +1 -0
- package/dist/gatekeeper/validator.js +686 -0
- package/dist/gatekeeper/validator.js.map +1 -0
- package/dist/government/adapters/base-adapter.d.ts +366 -0
- package/dist/government/adapters/base-adapter.d.ts.map +1 -0
- package/dist/government/adapters/base-adapter.js +598 -0
- package/dist/government/adapters/base-adapter.js.map +1 -0
- package/dist/government/adapters/federal-register-adapter.d.ts +327 -0
- package/dist/government/adapters/federal-register-adapter.d.ts.map +1 -0
- package/dist/government/adapters/federal-register-adapter.js +595 -0
- package/dist/government/adapters/federal-register-adapter.js.map +1 -0
- package/dist/government/adapters/regulations-adapter.d.ts +432 -0
- package/dist/government/adapters/regulations-adapter.d.ts.map +1 -0
- package/dist/government/adapters/regulations-adapter.js +727 -0
- package/dist/government/adapters/regulations-adapter.js.map +1 -0
- package/dist/government/adapters/sam-entity-adapter.d.ts +354 -0
- package/dist/government/adapters/sam-entity-adapter.d.ts.map +1 -0
- package/dist/government/adapters/sam-entity-adapter.js +599 -0
- package/dist/government/adapters/sam-entity-adapter.js.map +1 -0
- package/dist/government/adapters/sam-opportunities-adapter.d.ts +221 -0
- package/dist/government/adapters/sam-opportunities-adapter.d.ts.map +1 -0
- package/dist/government/adapters/sam-opportunities-adapter.js +538 -0
- package/dist/government/adapters/sam-opportunities-adapter.js.map +1 -0
- package/dist/government/adapters/usaspending-adapter.d.ts +390 -0
- package/dist/government/adapters/usaspending-adapter.d.ts.map +1 -0
- package/dist/government/adapters/usaspending-adapter.js +455 -0
- package/dist/government/adapters/usaspending-adapter.js.map +1 -0
- package/dist/government/index.d.ts +128 -0
- package/dist/government/index.d.ts.map +1 -0
- package/dist/government/index.js +183 -0
- package/dist/government/index.js.map +1 -0
- package/dist/government/mappers/symbol-mapper.d.ts +87 -0
- package/dist/government/mappers/symbol-mapper.d.ts.map +1 -0
- package/dist/government/mappers/symbol-mapper.js +647 -0
- package/dist/government/mappers/symbol-mapper.js.map +1 -0
- package/dist/handlers/index.d.ts +10 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +11 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/recon-tools.d.ts +364 -0
- package/dist/handlers/recon-tools.d.ts.map +1 -0
- package/dist/handlers/recon-tools.js +678 -0
- package/dist/handlers/recon-tools.js.map +1 -0
- package/dist/handlers/tool-dispatcher.d.ts +71 -0
- package/dist/handlers/tool-dispatcher.d.ts.map +1 -0
- package/dist/handlers/tool-dispatcher.js +114 -0
- package/dist/handlers/tool-dispatcher.js.map +1 -0
- package/dist/handlers/tool-registry.d.ts +76 -0
- package/dist/handlers/tool-registry.d.ts.map +1 -0
- package/dist/handlers/tool-registry.js +636 -0
- package/dist/handlers/tool-registry.js.map +1 -0
- package/dist/http/app.d.ts +24 -0
- package/dist/http/app.d.ts.map +1 -0
- package/dist/http/app.js +35 -0
- package/dist/http/app.js.map +1 -0
- package/dist/http/config.d.ts +42 -0
- package/dist/http/config.d.ts.map +1 -0
- package/dist/http/config.js +62 -0
- package/dist/http/config.js.map +1 -0
- package/dist/http/database/index.d.ts +49 -0
- package/dist/http/database/index.d.ts.map +1 -0
- package/dist/http/database/index.js +115 -0
- package/dist/http/database/index.js.map +1 -0
- package/dist/http/middleware/auth.d.ts +28 -0
- package/dist/http/middleware/auth.d.ts.map +1 -0
- package/dist/http/middleware/auth.js +157 -0
- package/dist/http/middleware/auth.js.map +1 -0
- package/dist/http/middleware/error-handler.d.ts +47 -0
- package/dist/http/middleware/error-handler.d.ts.map +1 -0
- package/dist/http/middleware/error-handler.js +213 -0
- package/dist/http/middleware/error-handler.js.map +1 -0
- package/dist/http/middleware/index.d.ts +38 -0
- package/dist/http/middleware/index.d.ts.map +1 -0
- package/dist/http/middleware/index.js +124 -0
- package/dist/http/middleware/index.js.map +1 -0
- package/dist/http/middleware/request-logger.d.ts +8 -0
- package/dist/http/middleware/request-logger.d.ts.map +1 -0
- package/dist/http/middleware/request-logger.js +58 -0
- package/dist/http/middleware/request-logger.js.map +1 -0
- package/dist/http/routes/agent-runtime.d.ts +9 -0
- package/dist/http/routes/agent-runtime.d.ts.map +1 -0
- package/dist/http/routes/agent-runtime.js +415 -0
- package/dist/http/routes/agent-runtime.js.map +1 -0
- package/dist/http/routes/agents.d.ts +9 -0
- package/dist/http/routes/agents.d.ts.map +1 -0
- package/dist/http/routes/agents.js +503 -0
- package/dist/http/routes/agents.js.map +1 -0
- package/dist/http/routes/broadcasts.d.ts +9 -0
- package/dist/http/routes/broadcasts.d.ts.map +1 -0
- package/dist/http/routes/broadcasts.js +223 -0
- package/dist/http/routes/broadcasts.js.map +1 -0
- package/dist/http/routes/dashboard.d.ts +9 -0
- package/dist/http/routes/dashboard.d.ts.map +1 -0
- package/dist/http/routes/dashboard.js +169 -0
- package/dist/http/routes/dashboard.js.map +1 -0
- package/dist/http/routes/ebay.d.ts +15 -0
- package/dist/http/routes/ebay.d.ts.map +1 -0
- package/dist/http/routes/ebay.js +242 -0
- package/dist/http/routes/ebay.js.map +1 -0
- package/dist/http/routes/health.d.ts +8 -0
- package/dist/http/routes/health.d.ts.map +1 -0
- package/dist/http/routes/health.js +66 -0
- package/dist/http/routes/health.js.map +1 -0
- package/dist/http/routes/index.d.ts +39 -0
- package/dist/http/routes/index.d.ts.map +1 -0
- package/dist/http/routes/index.js +89 -0
- package/dist/http/routes/index.js.map +1 -0
- package/dist/http/routes/missions.d.ts +9 -0
- package/dist/http/routes/missions.d.ts.map +1 -0
- package/dist/http/routes/missions.js +587 -0
- package/dist/http/routes/missions.js.map +1 -0
- package/dist/http/routes/openapi.d.ts +8 -0
- package/dist/http/routes/openapi.d.ts.map +1 -0
- package/dist/http/routes/openapi.js +76 -0
- package/dist/http/routes/openapi.js.map +1 -0
- package/dist/http/routes/symbols.d.ts +19 -0
- package/dist/http/routes/symbols.d.ts.map +1 -0
- package/dist/http/routes/symbols.js +219 -0
- package/dist/http/routes/symbols.js.map +1 -0
- package/dist/http/server-init.d.ts +69 -0
- package/dist/http/server-init.d.ts.map +1 -0
- package/dist/http/server-init.js +270 -0
- package/dist/http/server-init.js.map +1 -0
- package/dist/http/server.d.ts +14 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +114 -0
- package/dist/http/server.js.map +1 -0
- package/dist/http/services/agent-runtime.d.ts +211 -0
- package/dist/http/services/agent-runtime.d.ts.map +1 -0
- package/dist/http/services/agent-runtime.js +603 -0
- package/dist/http/services/agent-runtime.js.map +1 -0
- package/dist/http/services/broadcasts.d.ts +142 -0
- package/dist/http/services/broadcasts.d.ts.map +1 -0
- package/dist/http/services/broadcasts.js +335 -0
- package/dist/http/services/broadcasts.js.map +1 -0
- package/dist/http/services/index.d.ts +10 -0
- package/dist/http/services/index.d.ts.map +1 -0
- package/dist/http/services/index.js +14 -0
- package/dist/http/services/index.js.map +1 -0
- package/dist/http/services/metrics.d.ts +144 -0
- package/dist/http/services/metrics.d.ts.map +1 -0
- package/dist/http/services/metrics.js +351 -0
- package/dist/http/services/metrics.js.map +1 -0
- package/dist/http/services/missions.d.ts +224 -0
- package/dist/http/services/missions.d.ts.map +1 -0
- package/dist/http/services/missions.js +701 -0
- package/dist/http/services/missions.js.map +1 -0
- package/dist/http/services/symbol.service.d.ts +62 -0
- package/dist/http/services/symbol.service.d.ts.map +1 -0
- package/dist/http/services/symbol.service.js +222 -0
- package/dist/http/services/symbol.service.js.map +1 -0
- package/dist/http/websocket/index.d.ts +50 -0
- package/dist/http/websocket/index.d.ts.map +1 -0
- package/dist/http/websocket/index.js +293 -0
- package/dist/http/websocket/index.js.map +1 -0
- package/dist/legal/__tests__/calendar-integration.test.d.ts +7 -0
- package/dist/legal/__tests__/calendar-integration.test.d.ts.map +1 -0
- package/dist/legal/__tests__/calendar-integration.test.js +643 -0
- package/dist/legal/__tests__/calendar-integration.test.js.map +1 -0
- package/dist/legal/batch-parser.d.ts +185 -0
- package/dist/legal/batch-parser.d.ts.map +1 -0
- package/dist/legal/batch-parser.js +348 -0
- package/dist/legal/batch-parser.js.map +1 -0
- package/dist/legal/calendar-integration.d.ts +209 -0
- package/dist/legal/calendar-integration.d.ts.map +1 -0
- package/dist/legal/calendar-integration.js +341 -0
- package/dist/legal/calendar-integration.js.map +1 -0
- package/dist/legal/calendar-tools.d.ts +39 -0
- package/dist/legal/calendar-tools.d.ts.map +1 -0
- package/dist/legal/calendar-tools.js +606 -0
- package/dist/legal/calendar-tools.js.map +1 -0
- package/dist/legal/calendar-types.d.ts +152 -0
- package/dist/legal/calendar-types.d.ts.map +1 -0
- package/dist/legal/calendar-types.js +88 -0
- package/dist/legal/calendar-types.js.map +1 -0
- package/dist/legal/citation-validator.d.ts +97 -0
- package/dist/legal/citation-validator.d.ts.map +1 -0
- package/dist/legal/citation-validator.js +1487 -0
- package/dist/legal/citation-validator.js.map +1 -0
- package/dist/legal/courtlistener-adapter.d.ts +156 -0
- package/dist/legal/courtlistener-adapter.d.ts.map +1 -0
- package/dist/legal/courtlistener-adapter.js +684 -0
- package/dist/legal/courtlistener-adapter.js.map +1 -0
- package/dist/legal/deadline-extractor.d.ts +71 -0
- package/dist/legal/deadline-extractor.d.ts.map +1 -0
- package/dist/legal/deadline-extractor.js +557 -0
- package/dist/legal/deadline-extractor.js.map +1 -0
- package/dist/legal/ical-generator.d.ts +83 -0
- package/dist/legal/ical-generator.d.ts.map +1 -0
- package/dist/legal/ical-generator.js +322 -0
- package/dist/legal/ical-generator.js.map +1 -0
- package/dist/legal/index.d.ts +17 -0
- package/dist/legal/index.d.ts.map +1 -0
- package/dist/legal/index.js +32 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/legal/legal-preflight.d.ts +86 -0
- package/dist/legal/legal-preflight.d.ts.map +1 -0
- package/dist/legal/legal-preflight.js +442 -0
- package/dist/legal/legal-preflight.js.map +1 -0
- package/dist/legal/types.d.ts +303 -0
- package/dist/legal/types.d.ts.map +1 -0
- package/dist/legal/types.js +38 -0
- package/dist/legal/types.js.map +1 -0
- package/dist/multi_agent/__tests__/intent-tools.test.d.ts +7 -0
- package/dist/multi_agent/__tests__/intent-tools.test.d.ts.map +1 -0
- package/dist/multi_agent/__tests__/intent-tools.test.js +604 -0
- package/dist/multi_agent/__tests__/intent-tools.test.js.map +1 -0
- package/dist/multi_agent/agent-registry.d.ts +132 -0
- package/dist/multi_agent/agent-registry.d.ts.map +1 -0
- package/dist/multi_agent/agent-registry.js +311 -0
- package/dist/multi_agent/agent-registry.js.map +1 -0
- package/dist/multi_agent/boot-camp.d.ts +159 -0
- package/dist/multi_agent/boot-camp.d.ts.map +1 -0
- package/dist/multi_agent/boot-camp.js +463 -0
- package/dist/multi_agent/boot-camp.js.map +1 -0
- package/dist/multi_agent/container.d.ts +87 -0
- package/dist/multi_agent/container.d.ts.map +1 -0
- package/dist/multi_agent/container.js +99 -0
- package/dist/multi_agent/container.js.map +1 -0
- package/dist/multi_agent/index.d.ts +32 -0
- package/dist/multi_agent/index.d.ts.map +1 -0
- package/dist/multi_agent/index.js +67 -0
- package/dist/multi_agent/index.js.map +1 -0
- package/dist/multi_agent/intent-manager.d.ts +119 -0
- package/dist/multi_agent/intent-manager.d.ts.map +1 -0
- package/dist/multi_agent/intent-manager.js +571 -0
- package/dist/multi_agent/intent-manager.js.map +1 -0
- package/dist/multi_agent/intent-tools.d.ts +370 -0
- package/dist/multi_agent/intent-tools.d.ts.map +1 -0
- package/dist/multi_agent/intent-tools.js +661 -0
- package/dist/multi_agent/intent-tools.js.map +1 -0
- package/dist/multi_agent/intent-types.d.ts +435 -0
- package/dist/multi_agent/intent-types.d.ts.map +1 -0
- package/dist/multi_agent/intent-types.js +17 -0
- package/dist/multi_agent/intent-types.js.map +1 -0
- package/dist/multi_agent/lru-cache.d.ts +140 -0
- package/dist/multi_agent/lru-cache.d.ts.map +1 -0
- package/dist/multi_agent/lru-cache.js +310 -0
- package/dist/multi_agent/lru-cache.js.map +1 -0
- package/dist/multi_agent/mission.d.ts +151 -0
- package/dist/multi_agent/mission.d.ts.map +1 -0
- package/dist/multi_agent/mission.js +439 -0
- package/dist/multi_agent/mission.js.map +1 -0
- package/dist/multi_agent/tool-dispatcher.d.ts +325 -0
- package/dist/multi_agent/tool-dispatcher.d.ts.map +1 -0
- package/dist/multi_agent/tool-dispatcher.js +108 -0
- package/dist/multi_agent/tool-dispatcher.js.map +1 -0
- package/dist/multi_agent/tools.d.ts +543 -0
- package/dist/multi_agent/tools.d.ts.map +1 -0
- package/dist/multi_agent/tools.js +1081 -0
- package/dist/multi_agent/tools.js.map +1 -0
- package/dist/notifications/webhook-dispatcher.d.ts +98 -0
- package/dist/notifications/webhook-dispatcher.d.ts.map +1 -0
- package/dist/notifications/webhook-dispatcher.js +548 -0
- package/dist/notifications/webhook-dispatcher.js.map +1 -0
- package/dist/operator/config.d.ts +128 -0
- package/dist/operator/config.d.ts.map +1 -0
- package/dist/operator/config.js +309 -0
- package/dist/operator/config.js.map +1 -0
- package/dist/operator/index.d.ts +116 -0
- package/dist/operator/index.d.ts.map +1 -0
- package/dist/operator/index.js +207 -0
- package/dist/operator/index.js.map +1 -0
- package/dist/policies/loader.d.ts +120 -0
- package/dist/policies/loader.d.ts.map +1 -0
- package/dist/policies/loader.js +193 -0
- package/dist/policies/loader.js.map +1 -0
- package/dist/recon/agent/analyst.d.ts +159 -0
- package/dist/recon/agent/analyst.d.ts.map +1 -0
- package/dist/recon/agent/analyst.js +689 -0
- package/dist/recon/agent/analyst.js.map +1 -0
- package/dist/recon/agent/performer.d.ts +175 -0
- package/dist/recon/agent/performer.d.ts.map +1 -0
- package/dist/recon/agent/performer.js +367 -0
- package/dist/recon/agent/performer.js.map +1 -0
- package/dist/recon/agent/runtime.d.ts +184 -0
- package/dist/recon/agent/runtime.d.ts.map +1 -0
- package/dist/recon/agent/runtime.js +474 -0
- package/dist/recon/agent/runtime.js.map +1 -0
- package/dist/recon/agent/veto-gate.d.ts +167 -0
- package/dist/recon/agent/veto-gate.d.ts.map +1 -0
- package/dist/recon/agent/veto-gate.js +393 -0
- package/dist/recon/agent/veto-gate.js.map +1 -0
- package/dist/recon/chat/web-chat-adapter.d.ts +190 -0
- package/dist/recon/chat/web-chat-adapter.d.ts.map +1 -0
- package/dist/recon/chat/web-chat-adapter.js +368 -0
- package/dist/recon/chat/web-chat-adapter.js.map +1 -0
- package/dist/recon/delivery/base-channel.d.ts +130 -0
- package/dist/recon/delivery/base-channel.d.ts.map +1 -0
- package/dist/recon/delivery/base-channel.js +260 -0
- package/dist/recon/delivery/base-channel.js.map +1 -0
- package/dist/recon/delivery/callback-channel.d.ts +156 -0
- package/dist/recon/delivery/callback-channel.d.ts.map +1 -0
- package/dist/recon/delivery/callback-channel.js +321 -0
- package/dist/recon/delivery/callback-channel.js.map +1 -0
- package/dist/recon/delivery/console-channel.d.ts +109 -0
- package/dist/recon/delivery/console-channel.d.ts.map +1 -0
- package/dist/recon/delivery/console-channel.js +311 -0
- package/dist/recon/delivery/console-channel.js.map +1 -0
- package/dist/recon/delivery/delivery-manager.d.ts +129 -0
- package/dist/recon/delivery/delivery-manager.d.ts.map +1 -0
- package/dist/recon/delivery/delivery-manager.js +450 -0
- package/dist/recon/delivery/delivery-manager.js.map +1 -0
- package/dist/recon/delivery/index.d.ts +52 -0
- package/dist/recon/delivery/index.d.ts.map +1 -0
- package/dist/recon/delivery/index.js +83 -0
- package/dist/recon/delivery/index.js.map +1 -0
- package/dist/recon/delivery/types.d.ts +191 -0
- package/dist/recon/delivery/types.d.ts.map +1 -0
- package/dist/recon/delivery/types.js +37 -0
- package/dist/recon/delivery/types.js.map +1 -0
- package/dist/recon/index.d.ts +86 -0
- package/dist/recon/index.d.ts.map +1 -0
- package/dist/recon/index.js +189 -0
- package/dist/recon/index.js.map +1 -0
- package/dist/recon/persistence/index.d.ts +103 -0
- package/dist/recon/persistence/index.d.ts.map +1 -0
- package/dist/recon/persistence/index.js +118 -0
- package/dist/recon/persistence/index.js.map +1 -0
- package/dist/recon/persistence/storage.d.ts +166 -0
- package/dist/recon/persistence/storage.d.ts.map +1 -0
- package/dist/recon/persistence/storage.js +793 -0
- package/dist/recon/persistence/storage.js.map +1 -0
- package/dist/recon/persistence/types.d.ts +254 -0
- package/dist/recon/persistence/types.d.ts.map +1 -0
- package/dist/recon/persistence/types.js +130 -0
- package/dist/recon/persistence/types.js.map +1 -0
- package/dist/recon/ralph-loop/executor.d.ts +122 -0
- package/dist/recon/ralph-loop/executor.d.ts.map +1 -0
- package/dist/recon/ralph-loop/executor.js +426 -0
- package/dist/recon/ralph-loop/executor.js.map +1 -0
- package/dist/recon/ralph-loop/scheduler.d.ts +145 -0
- package/dist/recon/ralph-loop/scheduler.d.ts.map +1 -0
- package/dist/recon/ralph-loop/scheduler.js +244 -0
- package/dist/recon/ralph-loop/scheduler.js.map +1 -0
- package/dist/recon/reports/formatters/index.d.ts +13 -0
- package/dist/recon/reports/formatters/index.d.ts.map +1 -0
- package/dist/recon/reports/formatters/index.js +13 -0
- package/dist/recon/reports/formatters/index.js.map +1 -0
- package/dist/recon/reports/formatters/json-formatter.d.ts +39 -0
- package/dist/recon/reports/formatters/json-formatter.d.ts.map +1 -0
- package/dist/recon/reports/formatters/json-formatter.js +260 -0
- package/dist/recon/reports/formatters/json-formatter.js.map +1 -0
- package/dist/recon/reports/formatters/markdown-formatter.d.ts +16 -0
- package/dist/recon/reports/formatters/markdown-formatter.d.ts.map +1 -0
- package/dist/recon/reports/formatters/markdown-formatter.js +332 -0
- package/dist/recon/reports/formatters/markdown-formatter.js.map +1 -0
- package/dist/recon/reports/formatters/text-formatter.d.ts +29 -0
- package/dist/recon/reports/formatters/text-formatter.d.ts.map +1 -0
- package/dist/recon/reports/formatters/text-formatter.js +360 -0
- package/dist/recon/reports/formatters/text-formatter.js.map +1 -0
- package/dist/recon/reports/index.d.ts +31 -0
- package/dist/recon/reports/index.d.ts.map +1 -0
- package/dist/recon/reports/index.js +33 -0
- package/dist/recon/reports/index.js.map +1 -0
- package/dist/recon/reports/report-generator.d.ts +147 -0
- package/dist/recon/reports/report-generator.d.ts.map +1 -0
- package/dist/recon/reports/report-generator.js +434 -0
- package/dist/recon/reports/report-generator.js.map +1 -0
- package/dist/recon/reports/sections/constraint-violations.d.ts +22 -0
- package/dist/recon/reports/sections/constraint-violations.d.ts.map +1 -0
- package/dist/recon/reports/sections/constraint-violations.js +383 -0
- package/dist/recon/reports/sections/constraint-violations.js.map +1 -0
- package/dist/recon/reports/sections/drift-analysis.d.ts +22 -0
- package/dist/recon/reports/sections/drift-analysis.d.ts.map +1 -0
- package/dist/recon/reports/sections/drift-analysis.js +270 -0
- package/dist/recon/reports/sections/drift-analysis.js.map +1 -0
- package/dist/recon/reports/sections/index.d.ts +23 -0
- package/dist/recon/reports/sections/index.d.ts.map +1 -0
- package/dist/recon/reports/sections/index.js +18 -0
- package/dist/recon/reports/sections/index.js.map +1 -0
- package/dist/recon/reports/sections/intelligence-gathered.d.ts +22 -0
- package/dist/recon/reports/sections/intelligence-gathered.d.ts.map +1 -0
- package/dist/recon/reports/sections/intelligence-gathered.js +373 -0
- package/dist/recon/reports/sections/intelligence-gathered.js.map +1 -0
- package/dist/recon/reports/sections/mission-overview.d.ts +22 -0
- package/dist/recon/reports/sections/mission-overview.d.ts.map +1 -0
- package/dist/recon/reports/sections/mission-overview.js +256 -0
- package/dist/recon/reports/sections/mission-overview.js.map +1 -0
- package/dist/recon/reports/sections/opposing-agent-profile.d.ts +22 -0
- package/dist/recon/reports/sections/opposing-agent-profile.d.ts.map +1 -0
- package/dist/recon/reports/sections/opposing-agent-profile.js +253 -0
- package/dist/recon/reports/sections/opposing-agent-profile.js.map +1 -0
- package/dist/recon/reports/sections/recommendations.d.ts +22 -0
- package/dist/recon/reports/sections/recommendations.d.ts.map +1 -0
- package/dist/recon/reports/sections/recommendations.js +341 -0
- package/dist/recon/reports/sections/recommendations.js.map +1 -0
- package/dist/recon/reports/sections/tactics-observed.d.ts +30 -0
- package/dist/recon/reports/sections/tactics-observed.d.ts.map +1 -0
- package/dist/recon/reports/sections/tactics-observed.js +275 -0
- package/dist/recon/reports/sections/tactics-observed.js.map +1 -0
- package/dist/recon/reports/types.d.ts +320 -0
- package/dist/recon/reports/types.d.ts.map +1 -0
- package/dist/recon/reports/types.js +13 -0
- package/dist/recon/reports/types.js.map +1 -0
- package/dist/recon/stealth/timing-calculator.d.ts +128 -0
- package/dist/recon/stealth/timing-calculator.d.ts.map +1 -0
- package/dist/recon/stealth/timing-calculator.js +288 -0
- package/dist/recon/stealth/timing-calculator.js.map +1 -0
- package/dist/recon/stealth/typing-simulator.d.ts +107 -0
- package/dist/recon/stealth/typing-simulator.d.ts.map +1 -0
- package/dist/recon/stealth/typing-simulator.js +376 -0
- package/dist/recon/stealth/typing-simulator.js.map +1 -0
- package/dist/recon/stealth/typo-generator.d.ts +95 -0
- package/dist/recon/stealth/typo-generator.d.ts.map +1 -0
- package/dist/recon/stealth/typo-generator.js +354 -0
- package/dist/recon/stealth/typo-generator.js.map +1 -0
- package/dist/recon/symbol/schema.d.ts +124 -0
- package/dist/recon/symbol/schema.d.ts.map +1 -0
- package/dist/recon/symbol/schema.js +441 -0
- package/dist/recon/symbol/schema.js.map +1 -0
- package/dist/recon/symbol/validator.d.ts +130 -0
- package/dist/recon/symbol/validator.d.ts.map +1 -0
- package/dist/recon/symbol/validator.js +619 -0
- package/dist/recon/symbol/validator.js.map +1 -0
- package/dist/recon/templates/customer-service/account-issue.d.ts +59 -0
- package/dist/recon/templates/customer-service/account-issue.d.ts.map +1 -0
- package/dist/recon/templates/customer-service/account-issue.js +170 -0
- package/dist/recon/templates/customer-service/account-issue.js.map +1 -0
- package/dist/recon/templates/customer-service/complaint.d.ts +60 -0
- package/dist/recon/templates/customer-service/complaint.d.ts.map +1 -0
- package/dist/recon/templates/customer-service/complaint.js +171 -0
- package/dist/recon/templates/customer-service/complaint.js.map +1 -0
- package/dist/recon/templates/customer-service/index.d.ts +21 -0
- package/dist/recon/templates/customer-service/index.d.ts.map +1 -0
- package/dist/recon/templates/customer-service/index.js +29 -0
- package/dist/recon/templates/customer-service/index.js.map +1 -0
- package/dist/recon/templates/customer-service/refund-request.d.ts +58 -0
- package/dist/recon/templates/customer-service/refund-request.d.ts.map +1 -0
- package/dist/recon/templates/customer-service/refund-request.js +161 -0
- package/dist/recon/templates/customer-service/refund-request.js.map +1 -0
- package/dist/recon/templates/index.d.ts +186 -0
- package/dist/recon/templates/index.d.ts.map +1 -0
- package/dist/recon/templates/index.js +316 -0
- package/dist/recon/templates/index.js.map +1 -0
- package/dist/recon/templates/sales/index.d.ts +20 -0
- package/dist/recon/templates/sales/index.d.ts.map +1 -0
- package/dist/recon/templates/sales/index.js +26 -0
- package/dist/recon/templates/sales/index.js.map +1 -0
- package/dist/recon/templates/sales/price-negotiation.d.ts +60 -0
- package/dist/recon/templates/sales/price-negotiation.d.ts.map +1 -0
- package/dist/recon/templates/sales/price-negotiation.js +167 -0
- package/dist/recon/templates/sales/price-negotiation.js.map +1 -0
- package/dist/recon/templates/sales/product-inquiry.d.ts +60 -0
- package/dist/recon/templates/sales/product-inquiry.d.ts.map +1 -0
- package/dist/recon/templates/sales/product-inquiry.js +167 -0
- package/dist/recon/templates/sales/product-inquiry.js.map +1 -0
- package/dist/recon/templates/support/feature-request.d.ts +60 -0
- package/dist/recon/templates/support/feature-request.d.ts.map +1 -0
- package/dist/recon/templates/support/feature-request.js +167 -0
- package/dist/recon/templates/support/feature-request.js.map +1 -0
- package/dist/recon/templates/support/index.d.ts +20 -0
- package/dist/recon/templates/support/index.d.ts.map +1 -0
- package/dist/recon/templates/support/index.js +26 -0
- package/dist/recon/templates/support/index.js.map +1 -0
- package/dist/recon/templates/support/troubleshooting.d.ts +60 -0
- package/dist/recon/templates/support/troubleshooting.d.ts.map +1 -0
- package/dist/recon/templates/support/troubleshooting.js +173 -0
- package/dist/recon/templates/support/troubleshooting.js.map +1 -0
- package/dist/recon/templates/types.d.ts +144 -0
- package/dist/recon/templates/types.d.ts.map +1 -0
- package/dist/recon/templates/types.js +40 -0
- package/dist/recon/templates/types.js.map +1 -0
- package/dist/recon/testing/index.d.ts +43 -0
- package/dist/recon/testing/index.d.ts.map +1 -0
- package/dist/recon/testing/index.js +55 -0
- package/dist/recon/testing/index.js.map +1 -0
- package/dist/recon/testing/metrics-collector.d.ts +185 -0
- package/dist/recon/testing/metrics-collector.d.ts.map +1 -0
- package/dist/recon/testing/metrics-collector.js +397 -0
- package/dist/recon/testing/metrics-collector.js.map +1 -0
- package/dist/recon/testing/mock-chatbot.d.ts +147 -0
- package/dist/recon/testing/mock-chatbot.d.ts.map +1 -0
- package/dist/recon/testing/mock-chatbot.js +500 -0
- package/dist/recon/testing/mock-chatbot.js.map +1 -0
- package/dist/recon/testing/scenario-runner.d.ts +154 -0
- package/dist/recon/testing/scenario-runner.d.ts.map +1 -0
- package/dist/recon/testing/scenario-runner.js +242 -0
- package/dist/recon/testing/scenario-runner.js.map +1 -0
- package/dist/recon/testing/test-scenarios.d.ts +135 -0
- package/dist/recon/testing/test-scenarios.d.ts.map +1 -0
- package/dist/recon/testing/test-scenarios.js +358 -0
- package/dist/recon/testing/test-scenarios.js.map +1 -0
- package/dist/recon/types.d.ts +821 -0
- package/dist/recon/types.d.ts.map +1 -0
- package/dist/recon/types.js +167 -0
- package/dist/recon/types.js.map +1 -0
- package/dist/scheduler/naics-monitor.d.ts +82 -0
- package/dist/scheduler/naics-monitor.d.ts.map +1 -0
- package/dist/scheduler/naics-monitor.js +534 -0
- package/dist/scheduler/naics-monitor.js.map +1 -0
- package/dist/server-init.d.ts +89 -0
- package/dist/server-init.d.ts.map +1 -0
- package/dist/server-init.js +242 -0
- package/dist/server-init.js.map +1 -0
- package/dist/server.d.ts +14 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +99 -0
- package/dist/server.js.map +1 -0
- package/dist/swarm/alerts/alert-engine.d.ts +64 -0
- package/dist/swarm/alerts/alert-engine.d.ts.map +1 -0
- package/dist/swarm/alerts/alert-engine.js +343 -0
- package/dist/swarm/alerts/alert-engine.js.map +1 -0
- package/dist/swarm/alerts/index.d.ts +7 -0
- package/dist/swarm/alerts/index.d.ts.map +1 -0
- package/dist/swarm/alerts/index.js +7 -0
- package/dist/swarm/alerts/index.js.map +1 -0
- package/dist/swarm/budget-allocator.d.ts +153 -0
- package/dist/swarm/budget-allocator.d.ts.map +1 -0
- package/dist/swarm/budget-allocator.js +402 -0
- package/dist/swarm/budget-allocator.js.map +1 -0
- package/dist/swarm/database.d.ts +202 -0
- package/dist/swarm/database.d.ts.map +1 -0
- package/dist/swarm/database.js +1389 -0
- package/dist/swarm/database.js.map +1 -0
- package/dist/swarm/demo/fixtures/index.d.ts +7 -0
- package/dist/swarm/demo/fixtures/index.d.ts.map +1 -0
- package/dist/swarm/demo/fixtures/index.js +7 -0
- package/dist/swarm/demo/fixtures/index.js.map +1 -0
- package/dist/swarm/demo/fixtures/sample-listings.d.ts +38 -0
- package/dist/swarm/demo/fixtures/sample-listings.d.ts.map +1 -0
- package/dist/swarm/demo/fixtures/sample-listings.js +390 -0
- package/dist/swarm/demo/fixtures/sample-listings.js.map +1 -0
- package/dist/swarm/demo/index.d.ts +9 -0
- package/dist/swarm/demo/index.d.ts.map +1 -0
- package/dist/swarm/demo/index.js +12 -0
- package/dist/swarm/demo/index.js.map +1 -0
- package/dist/swarm/demo/swarm-demo.d.ts +110 -0
- package/dist/swarm/demo/swarm-demo.d.ts.map +1 -0
- package/dist/swarm/demo/swarm-demo.js +423 -0
- package/dist/swarm/demo/swarm-demo.js.map +1 -0
- package/dist/swarm/ebay/auth.d.ts +98 -0
- package/dist/swarm/ebay/auth.d.ts.map +1 -0
- package/dist/swarm/ebay/auth.js +268 -0
- package/dist/swarm/ebay/auth.js.map +1 -0
- package/dist/swarm/ebay/client.d.ts +111 -0
- package/dist/swarm/ebay/client.d.ts.map +1 -0
- package/dist/swarm/ebay/client.js +433 -0
- package/dist/swarm/ebay/client.js.map +1 -0
- package/dist/swarm/ebay/index.d.ts +11 -0
- package/dist/swarm/ebay/index.d.ts.map +1 -0
- package/dist/swarm/ebay/index.js +11 -0
- package/dist/swarm/ebay/index.js.map +1 -0
- package/dist/swarm/ebay/rate-limiter.d.ts +115 -0
- package/dist/swarm/ebay/rate-limiter.d.ts.map +1 -0
- package/dist/swarm/ebay/rate-limiter.js +264 -0
- package/dist/swarm/ebay/rate-limiter.js.map +1 -0
- package/dist/swarm/ebay/sandbox-config.d.ts +280 -0
- package/dist/swarm/ebay/sandbox-config.d.ts.map +1 -0
- package/dist/swarm/ebay/sandbox-config.js +353 -0
- package/dist/swarm/ebay/sandbox-config.js.map +1 -0
- package/dist/swarm/ebay/types.d.ts +532 -0
- package/dist/swarm/ebay/types.d.ts.map +1 -0
- package/dist/swarm/ebay/types.js +64 -0
- package/dist/swarm/ebay/types.js.map +1 -0
- package/dist/swarm/hooks/alert-hook.d.ts +18 -0
- package/dist/swarm/hooks/alert-hook.d.ts.map +1 -0
- package/dist/swarm/hooks/alert-hook.js +44 -0
- package/dist/swarm/hooks/alert-hook.js.map +1 -0
- package/dist/swarm/hooks/database-sync-hook.d.ts +19 -0
- package/dist/swarm/hooks/database-sync-hook.d.ts.map +1 -0
- package/dist/swarm/hooks/database-sync-hook.js +121 -0
- package/dist/swarm/hooks/database-sync-hook.js.map +1 -0
- package/dist/swarm/hooks/index.d.ts +61 -0
- package/dist/swarm/hooks/index.d.ts.map +1 -0
- package/dist/swarm/hooks/index.js +103 -0
- package/dist/swarm/hooks/index.js.map +1 -0
- package/dist/swarm/hooks/observation-hooks.d.ts +178 -0
- package/dist/swarm/hooks/observation-hooks.d.ts.map +1 -0
- package/dist/swarm/hooks/observation-hooks.js +319 -0
- package/dist/swarm/hooks/observation-hooks.js.map +1 -0
- package/dist/swarm/hooks/pinecone-sync-hook.d.ts +58 -0
- package/dist/swarm/hooks/pinecone-sync-hook.d.ts.map +1 -0
- package/dist/swarm/hooks/pinecone-sync-hook.js +193 -0
- package/dist/swarm/hooks/pinecone-sync-hook.js.map +1 -0
- package/dist/swarm/hooks/webhook-alert-hook.d.ts +35 -0
- package/dist/swarm/hooks/webhook-alert-hook.d.ts.map +1 -0
- package/dist/swarm/hooks/webhook-alert-hook.js +251 -0
- package/dist/swarm/hooks/webhook-alert-hook.js.map +1 -0
- package/dist/swarm/index.d.ts +33 -0
- package/dist/swarm/index.d.ts.map +1 -0
- package/dist/swarm/index.js +59 -0
- package/dist/swarm/index.js.map +1 -0
- package/dist/swarm/registry/event-emitter.d.ts +116 -0
- package/dist/swarm/registry/event-emitter.d.ts.map +1 -0
- package/dist/swarm/registry/event-emitter.js +188 -0
- package/dist/swarm/registry/event-emitter.js.map +1 -0
- package/dist/swarm/registry/index.d.ts +9 -0
- package/dist/swarm/registry/index.d.ts.map +1 -0
- package/dist/swarm/registry/index.js +9 -0
- package/dist/swarm/registry/index.js.map +1 -0
- package/dist/swarm/registry/insight-computer.d.ts +114 -0
- package/dist/swarm/registry/insight-computer.d.ts.map +1 -0
- package/dist/swarm/registry/insight-computer.js +387 -0
- package/dist/swarm/registry/insight-computer.js.map +1 -0
- package/dist/swarm/registry/symbol-mapper.d.ts +115 -0
- package/dist/swarm/registry/symbol-mapper.d.ts.map +1 -0
- package/dist/swarm/registry/symbol-mapper.js +229 -0
- package/dist/swarm/registry/symbol-mapper.js.map +1 -0
- package/dist/swarm/resources/index.d.ts +7 -0
- package/dist/swarm/resources/index.d.ts.map +1 -0
- package/dist/swarm/resources/index.js +7 -0
- package/dist/swarm/resources/index.js.map +1 -0
- package/dist/swarm/resources/intelligence-resources.d.ts +64 -0
- package/dist/swarm/resources/intelligence-resources.d.ts.map +1 -0
- package/dist/swarm/resources/intelligence-resources.js +309 -0
- package/dist/swarm/resources/intelligence-resources.js.map +1 -0
- package/dist/swarm/strategies/early-aggressive.d.ts +59 -0
- package/dist/swarm/strategies/early-aggressive.d.ts.map +1 -0
- package/dist/swarm/strategies/early-aggressive.js +283 -0
- package/dist/swarm/strategies/early-aggressive.js.map +1 -0
- package/dist/swarm/strategies/hybrid.d.ts +58 -0
- package/dist/swarm/strategies/hybrid.d.ts.map +1 -0
- package/dist/swarm/strategies/hybrid.js +336 -0
- package/dist/swarm/strategies/hybrid.js.map +1 -0
- package/dist/swarm/strategies/index.d.ts +35 -0
- package/dist/swarm/strategies/index.d.ts.map +1 -0
- package/dist/swarm/strategies/index.js +94 -0
- package/dist/swarm/strategies/index.js.map +1 -0
- package/dist/swarm/strategies/negotiator.d.ts +66 -0
- package/dist/swarm/strategies/negotiator.d.ts.map +1 -0
- package/dist/swarm/strategies/negotiator.js +326 -0
- package/dist/swarm/strategies/negotiator.js.map +1 -0
- package/dist/swarm/strategies/passive.d.ts +56 -0
- package/dist/swarm/strategies/passive.d.ts.map +1 -0
- package/dist/swarm/strategies/passive.js +247 -0
- package/dist/swarm/strategies/passive.js.map +1 -0
- package/dist/swarm/strategies/sniper.d.ts +43 -0
- package/dist/swarm/strategies/sniper.d.ts.map +1 -0
- package/dist/swarm/strategies/sniper.js +176 -0
- package/dist/swarm/strategies/sniper.js.map +1 -0
- package/dist/swarm/strategies/types.d.ts +256 -0
- package/dist/swarm/strategies/types.d.ts.map +1 -0
- package/dist/swarm/strategies/types.js +251 -0
- package/dist/swarm/strategies/types.js.map +1 -0
- package/dist/swarm/swarm-controller.d.ts +197 -0
- package/dist/swarm/swarm-controller.d.ts.map +1 -0
- package/dist/swarm/swarm-controller.js +812 -0
- package/dist/swarm/swarm-controller.js.map +1 -0
- package/dist/swarm/tools/index.d.ts +7 -0
- package/dist/swarm/tools/index.d.ts.map +1 -0
- package/dist/swarm/tools/index.js +7 -0
- package/dist/swarm/tools/index.js.map +1 -0
- package/dist/swarm/tools/intelligence-tools.d.ts +36 -0
- package/dist/swarm/tools/intelligence-tools.d.ts.map +1 -0
- package/dist/swarm/tools/intelligence-tools.js +508 -0
- package/dist/swarm/tools/intelligence-tools.js.map +1 -0
- package/dist/swarm/tools.d.ts +451 -0
- package/dist/swarm/tools.d.ts.map +1 -0
- package/dist/swarm/tools.js +465 -0
- package/dist/swarm/tools.js.map +1 -0
- package/dist/swarm/types.d.ts +744 -0
- package/dist/swarm/types.d.ts.map +1 -0
- package/dist/swarm/types.js +109 -0
- package/dist/swarm/types.js.map +1 -0
- package/dist/swarm/vectors/index.d.ts +8 -0
- package/dist/swarm/vectors/index.d.ts.map +1 -0
- package/dist/swarm/vectors/index.js +15 -0
- package/dist/swarm/vectors/index.js.map +1 -0
- package/dist/swarm/vectors/pinecone-client.d.ts +234 -0
- package/dist/swarm/vectors/pinecone-client.d.ts.map +1 -0
- package/dist/swarm/vectors/pinecone-client.js +290 -0
- package/dist/swarm/vectors/pinecone-client.js.map +1 -0
- package/dist/swarm/vectors/swarm-vectors.d.ts +119 -0
- package/dist/swarm/vectors/swarm-vectors.d.ts.map +1 -0
- package/dist/swarm/vectors/swarm-vectors.js +217 -0
- package/dist/swarm/vectors/swarm-vectors.js.map +1 -0
- package/dist/symbols/audit.d.ts +100 -0
- package/dist/symbols/audit.d.ts.map +1 -0
- package/dist/symbols/audit.js +391 -0
- package/dist/symbols/audit.js.map +1 -0
- package/dist/symbols/claim-validator.d.ts +113 -0
- package/dist/symbols/claim-validator.d.ts.map +1 -0
- package/dist/symbols/claim-validator.js +386 -0
- package/dist/symbols/claim-validator.js.map +1 -0
- package/dist/symbols/database.d.ts +285 -0
- package/dist/symbols/database.d.ts.map +1 -0
- package/dist/symbols/database.js +932 -0
- package/dist/symbols/database.js.map +1 -0
- package/dist/symbols/epistemic-types.d.ts +71 -0
- package/dist/symbols/epistemic-types.d.ts.map +1 -0
- package/dist/symbols/epistemic-types.js +101 -0
- package/dist/symbols/epistemic-types.js.map +1 -0
- package/dist/symbols/graph-manager.d.ts +117 -0
- package/dist/symbols/graph-manager.d.ts.map +1 -0
- package/dist/symbols/graph-manager.js +616 -0
- package/dist/symbols/graph-manager.js.map +1 -0
- package/dist/symbols/graph-tools.d.ts +15 -0
- package/dist/symbols/graph-tools.d.ts.map +1 -0
- package/dist/symbols/graph-tools.js +467 -0
- package/dist/symbols/graph-tools.js.map +1 -0
- package/dist/symbols/graph-types.d.ts +291 -0
- package/dist/symbols/graph-types.d.ts.map +1 -0
- package/dist/symbols/graph-types.js +93 -0
- package/dist/symbols/graph-types.js.map +1 -0
- package/dist/symbols/index.d.ts +18 -0
- package/dist/symbols/index.d.ts.map +1 -0
- package/dist/symbols/index.js +26 -0
- package/dist/symbols/index.js.map +1 -0
- package/dist/symbols/manager.d.ts +114 -0
- package/dist/symbols/manager.d.ts.map +1 -0
- package/dist/symbols/manager.js +1000 -0
- package/dist/symbols/manager.js.map +1 -0
- package/dist/symbols/sanitizer.d.ts +142 -0
- package/dist/symbols/sanitizer.d.ts.map +1 -0
- package/dist/symbols/sanitizer.js +582 -0
- package/dist/symbols/sanitizer.js.map +1 -0
- package/dist/symbols/simple-retrieval.d.ts +65 -0
- package/dist/symbols/simple-retrieval.d.ts.map +1 -0
- package/dist/symbols/simple-retrieval.js +110 -0
- package/dist/symbols/simple-retrieval.js.map +1 -0
- package/dist/symbols/test-epistemic-vendor59655.d.ts +28 -0
- package/dist/symbols/test-epistemic-vendor59655.d.ts.map +1 -0
- package/dist/symbols/test-epistemic-vendor59655.js +129 -0
- package/dist/symbols/test-epistemic-vendor59655.js.map +1 -0
- package/dist/symbols/tools.d.ts +19 -0
- package/dist/symbols/tools.d.ts.map +1 -0
- package/dist/symbols/tools.js +697 -0
- package/dist/symbols/tools.js.map +1 -0
- package/dist/symbols/types.d.ts +626 -0
- package/dist/symbols/types.d.ts.map +1 -0
- package/dist/symbols/types.js +100 -0
- package/dist/symbols/types.js.map +1 -0
- package/dist/symbols/validation-pipeline.d.ts +116 -0
- package/dist/symbols/validation-pipeline.d.ts.map +1 -0
- package/dist/symbols/validation-pipeline.js +119 -0
- package/dist/symbols/validation-pipeline.js.map +1 -0
- package/dist/tools/index.d.ts +15 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +24 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/ps_calendar.d.ts +68 -0
- package/dist/tools/ps_calendar.d.ts.map +1 -0
- package/dist/tools/ps_calendar.js +377 -0
- package/dist/tools/ps_calendar.js.map +1 -0
- package/dist/tools/ps_delegate.d.ts +83 -0
- package/dist/tools/ps_delegate.d.ts.map +1 -0
- package/dist/tools/ps_delegate.js +307 -0
- package/dist/tools/ps_delegate.js.map +1 -0
- package/dist/tools/ps_execute.d.ts +84 -0
- package/dist/tools/ps_execute.d.ts.map +1 -0
- package/dist/tools/ps_execute.js +211 -0
- package/dist/tools/ps_execute.js.map +1 -0
- package/dist/tools/ps_hold.d.ts +50 -0
- package/dist/tools/ps_hold.d.ts.map +1 -0
- package/dist/tools/ps_hold.js +227 -0
- package/dist/tools/ps_hold.js.map +1 -0
- package/dist/tools/ps_legal.d.ts +111 -0
- package/dist/tools/ps_legal.d.ts.map +1 -0
- package/dist/tools/ps_legal.js +456 -0
- package/dist/tools/ps_legal.js.map +1 -0
- package/dist/tools/ps_state.d.ts +146 -0
- package/dist/tools/ps_state.d.ts.map +1 -0
- package/dist/tools/ps_state.js +286 -0
- package/dist/tools/ps_state.js.map +1 -0
- package/dist/tools/ps_validate.d.ts +51 -0
- package/dist/tools/ps_validate.d.ts.map +1 -0
- package/dist/tools/ps_validate.js +191 -0
- package/dist/tools/ps_validate.js.map +1 -0
- package/dist/tools/registry.d.ts +52 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +456 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/translation/compiler.d.ts +37 -0
- package/dist/translation/compiler.d.ts.map +1 -0
- package/dist/translation/compiler.js +281 -0
- package/dist/translation/compiler.js.map +1 -0
- package/dist/translation/decompiler.d.ts +29 -0
- package/dist/translation/decompiler.d.ts.map +1 -0
- package/dist/translation/decompiler.js +454 -0
- package/dist/translation/decompiler.js.map +1 -0
- package/dist/translation/frame-translator.d.ts +75 -0
- package/dist/translation/frame-translator.d.ts.map +1 -0
- package/dist/translation/frame-translator.js +347 -0
- package/dist/translation/frame-translator.js.map +1 -0
- package/dist/translation/index.d.ts +349 -0
- package/dist/translation/index.d.ts.map +1 -0
- package/dist/translation/index.js +397 -0
- package/dist/translation/index.js.map +1 -0
- package/dist/translation/llm-extractor.d.ts +56 -0
- package/dist/translation/llm-extractor.d.ts.map +1 -0
- package/dist/translation/llm-extractor.js +345 -0
- package/dist/translation/llm-extractor.js.map +1 -0
- package/dist/translation/mappings.d.ts +91 -0
- package/dist/translation/mappings.d.ts.map +1 -0
- package/dist/translation/mappings.js +558 -0
- package/dist/translation/mappings.js.map +1 -0
- package/dist/translation/opacity-layer.d.ts +93 -0
- package/dist/translation/opacity-layer.d.ts.map +1 -0
- package/dist/translation/opacity-layer.js +404 -0
- package/dist/translation/opacity-layer.js.map +1 -0
- package/dist/translation/types.d.ts +307 -0
- package/dist/translation/types.d.ts.map +1 -0
- package/dist/translation/types.js +8 -0
- package/dist/translation/types.js.map +1 -0
- package/dist/types/index.d.ts +700 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/embeddings.d.ts +20 -0
- package/dist/utils/embeddings.d.ts.map +1 -0
- package/dist/utils/embeddings.js +110 -0
- package/dist/utils/embeddings.js.map +1 -0
- package/dist/utils/hash.d.ts +34 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +72 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/verification/cross-llm.d.ts +116 -0
- package/dist/verification/cross-llm.d.ts.map +1 -0
- package/dist/verification/cross-llm.js +438 -0
- package/dist/verification/cross-llm.js.map +1 -0
- package/dist/verification/dashboard.d.ts +127 -0
- package/dist/verification/dashboard.d.ts.map +1 -0
- package/dist/verification/dashboard.js +630 -0
- package/dist/verification/dashboard.js.map +1 -0
- package/dist/verification/index.d.ts +11 -0
- package/dist/verification/index.d.ts.map +1 -0
- package/dist/verification/index.js +11 -0
- package/dist/verification/index.js.map +1 -0
- package/dist/verification/tools.d.ts +105 -0
- package/dist/verification/tools.d.ts.map +1 -0
- package/dist/verification/tools.js +162 -0
- package/dist/verification/tools.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,1389 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Market Agent Swarm - Database Layer
|
|
3
|
+
*
|
|
4
|
+
* SQLite database for persisting swarm configurations, agent state,
|
|
5
|
+
* and the immutable event stream that powers computed insights.
|
|
6
|
+
*/
|
|
7
|
+
import Database from 'better-sqlite3';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import fs from 'fs';
|
|
10
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
11
|
+
// DATABASE INITIALIZATION
|
|
12
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
13
|
+
let db = null;
|
|
14
|
+
/**
|
|
15
|
+
* Get the database path from environment or use default.
|
|
16
|
+
*/
|
|
17
|
+
function getDatabasePath() {
|
|
18
|
+
const envPath = process.env.SWARM_DB_PATH;
|
|
19
|
+
if (envPath) {
|
|
20
|
+
return envPath;
|
|
21
|
+
}
|
|
22
|
+
// Default path relative to project root
|
|
23
|
+
return path.join(process.cwd(), 'data', 'swarm', 'market-agents.db');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initialize the swarm database.
|
|
27
|
+
*/
|
|
28
|
+
export function initializeSwarmDatabase() {
|
|
29
|
+
if (db) {
|
|
30
|
+
return db;
|
|
31
|
+
}
|
|
32
|
+
const dbPath = getDatabasePath();
|
|
33
|
+
// Ensure directory exists
|
|
34
|
+
const dbDir = path.dirname(dbPath);
|
|
35
|
+
if (!fs.existsSync(dbDir)) {
|
|
36
|
+
fs.mkdirSync(dbDir, { recursive: true });
|
|
37
|
+
}
|
|
38
|
+
db = new Database(dbPath);
|
|
39
|
+
// Enable WAL mode for better concurrency
|
|
40
|
+
db.pragma('journal_mode = WAL');
|
|
41
|
+
db.pragma('foreign_keys = ON');
|
|
42
|
+
// Create tables
|
|
43
|
+
createTables(db);
|
|
44
|
+
createIndexes(db);
|
|
45
|
+
return db;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the database instance.
|
|
49
|
+
*/
|
|
50
|
+
export function getSwarmDatabase() {
|
|
51
|
+
if (!db) {
|
|
52
|
+
return initializeSwarmDatabase();
|
|
53
|
+
}
|
|
54
|
+
return db;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Close the database connection.
|
|
58
|
+
*/
|
|
59
|
+
export function closeSwarmDatabase() {
|
|
60
|
+
if (db) {
|
|
61
|
+
db.close();
|
|
62
|
+
db = null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
66
|
+
// SCHEMA DEFINITION
|
|
67
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
68
|
+
function createTables(db) {
|
|
69
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
70
|
+
// Swarm Configurations
|
|
71
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
72
|
+
db.exec(`
|
|
73
|
+
CREATE TABLE IF NOT EXISTS swarm_configs (
|
|
74
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
75
|
+
swarm_id TEXT UNIQUE NOT NULL,
|
|
76
|
+
name TEXT NOT NULL,
|
|
77
|
+
total_budget REAL NOT NULL,
|
|
78
|
+
currency TEXT NOT NULL DEFAULT 'USD',
|
|
79
|
+
agent_count INTEGER NOT NULL,
|
|
80
|
+
strategy_distribution TEXT NOT NULL,
|
|
81
|
+
campaign_start TEXT NOT NULL,
|
|
82
|
+
campaign_end TEXT NOT NULL,
|
|
83
|
+
target_criteria TEXT NOT NULL,
|
|
84
|
+
sandbox_mode INTEGER NOT NULL DEFAULT 1,
|
|
85
|
+
fee_reserve_percent REAL NOT NULL DEFAULT 5,
|
|
86
|
+
created_by TEXT NOT NULL,
|
|
87
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
88
|
+
|
|
89
|
+
-- Runtime state
|
|
90
|
+
status TEXT NOT NULL DEFAULT 'configuring'
|
|
91
|
+
CHECK (status IN ('configuring', 'ready', 'active', 'paused', 'completed', 'terminated')),
|
|
92
|
+
total_spent REAL NOT NULL DEFAULT 0,
|
|
93
|
+
total_acquired INTEGER NOT NULL DEFAULT 0,
|
|
94
|
+
active_agents INTEGER NOT NULL DEFAULT 0,
|
|
95
|
+
last_activity_at TEXT,
|
|
96
|
+
status_message TEXT,
|
|
97
|
+
|
|
98
|
+
CONSTRAINT valid_swarm_id CHECK (swarm_id LIKE 'swarm_%'),
|
|
99
|
+
CONSTRAINT valid_budget CHECK (total_budget > 0),
|
|
100
|
+
CONSTRAINT valid_agent_count CHECK (agent_count > 0 AND agent_count <= 100)
|
|
101
|
+
)
|
|
102
|
+
`);
|
|
103
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
104
|
+
// Market Agents
|
|
105
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
106
|
+
db.exec(`
|
|
107
|
+
CREATE TABLE IF NOT EXISTS market_agents (
|
|
108
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
109
|
+
agent_id TEXT UNIQUE NOT NULL,
|
|
110
|
+
swarm_id TEXT NOT NULL,
|
|
111
|
+
name TEXT NOT NULL,
|
|
112
|
+
strategy TEXT NOT NULL
|
|
113
|
+
CHECK (strategy IN ('SNIPER', 'EARLY_AGGRESSIVE', 'NEGOTIATOR', 'HYBRID', 'PASSIVE')),
|
|
114
|
+
|
|
115
|
+
-- Budget tracking
|
|
116
|
+
budget_allocated REAL NOT NULL,
|
|
117
|
+
budget_spent REAL NOT NULL DEFAULT 0,
|
|
118
|
+
budget_reserved REAL NOT NULL DEFAULT 0,
|
|
119
|
+
currency TEXT NOT NULL DEFAULT 'USD',
|
|
120
|
+
max_per_item REAL NOT NULL,
|
|
121
|
+
|
|
122
|
+
-- Constraints
|
|
123
|
+
max_concurrent_listings INTEGER NOT NULL DEFAULT 10,
|
|
124
|
+
max_bids_per_hour INTEGER NOT NULL DEFAULT 20,
|
|
125
|
+
max_offers_per_hour INTEGER NOT NULL DEFAULT 10,
|
|
126
|
+
require_approval_above REAL,
|
|
127
|
+
|
|
128
|
+
-- Time window
|
|
129
|
+
time_window_start TEXT NOT NULL,
|
|
130
|
+
time_window_end TEXT NOT NULL,
|
|
131
|
+
|
|
132
|
+
-- State
|
|
133
|
+
status TEXT NOT NULL DEFAULT 'idle'
|
|
134
|
+
CHECK (status IN ('idle', 'searching', 'monitoring', 'bidding', 'negotiating',
|
|
135
|
+
'won', 'outbid', 'depleted', 'paused', 'terminated')),
|
|
136
|
+
status_message TEXT,
|
|
137
|
+
|
|
138
|
+
-- Metrics (denormalized for quick access, computed from events)
|
|
139
|
+
items_won INTEGER NOT NULL DEFAULT 0,
|
|
140
|
+
items_lost INTEGER NOT NULL DEFAULT 0,
|
|
141
|
+
total_bids_placed INTEGER NOT NULL DEFAULT 0,
|
|
142
|
+
total_offers_made INTEGER NOT NULL DEFAULT 0,
|
|
143
|
+
|
|
144
|
+
-- Timestamps
|
|
145
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
146
|
+
started_at TEXT,
|
|
147
|
+
last_activity_at TEXT,
|
|
148
|
+
completed_at TEXT,
|
|
149
|
+
|
|
150
|
+
FOREIGN KEY (swarm_id) REFERENCES swarm_configs(swarm_id) ON DELETE CASCADE,
|
|
151
|
+
CONSTRAINT valid_agent_id CHECK (agent_id LIKE 'mkt_agent_%'),
|
|
152
|
+
CONSTRAINT valid_budget CHECK (budget_allocated > 0)
|
|
153
|
+
)
|
|
154
|
+
`);
|
|
155
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
156
|
+
// Bid Events (Immutable Audit Trail)
|
|
157
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
158
|
+
db.exec(`
|
|
159
|
+
CREATE TABLE IF NOT EXISTS swarm_events (
|
|
160
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
161
|
+
event_id TEXT UNIQUE NOT NULL,
|
|
162
|
+
event_type TEXT NOT NULL,
|
|
163
|
+
swarm_id TEXT NOT NULL,
|
|
164
|
+
agent_id TEXT,
|
|
165
|
+
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
|
|
166
|
+
|
|
167
|
+
-- Event-specific data stored as JSON
|
|
168
|
+
item_id TEXT,
|
|
169
|
+
item_title TEXT,
|
|
170
|
+
amount REAL,
|
|
171
|
+
currency TEXT,
|
|
172
|
+
metadata TEXT,
|
|
173
|
+
|
|
174
|
+
-- Source verification (for anti-gaming)
|
|
175
|
+
source_uri TEXT,
|
|
176
|
+
source_verified INTEGER DEFAULT 0,
|
|
177
|
+
|
|
178
|
+
FOREIGN KEY (swarm_id) REFERENCES swarm_configs(swarm_id) ON DELETE CASCADE,
|
|
179
|
+
FOREIGN KEY (agent_id) REFERENCES market_agents(agent_id) ON DELETE SET NULL,
|
|
180
|
+
CONSTRAINT valid_event_id CHECK (event_id LIKE 'evt_%')
|
|
181
|
+
)
|
|
182
|
+
`);
|
|
183
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
184
|
+
// Tracked Listings
|
|
185
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
186
|
+
db.exec(`
|
|
187
|
+
CREATE TABLE IF NOT EXISTS tracked_listings (
|
|
188
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
189
|
+
item_id TEXT NOT NULL,
|
|
190
|
+
swarm_id TEXT NOT NULL,
|
|
191
|
+
|
|
192
|
+
-- Listing details
|
|
193
|
+
title TEXT NOT NULL,
|
|
194
|
+
list_price REAL NOT NULL,
|
|
195
|
+
current_bid REAL,
|
|
196
|
+
buy_it_now_price REAL,
|
|
197
|
+
listing_format TEXT NOT NULL,
|
|
198
|
+
condition TEXT,
|
|
199
|
+
end_time TEXT NOT NULL,
|
|
200
|
+
|
|
201
|
+
-- Seller info
|
|
202
|
+
seller_id TEXT,
|
|
203
|
+
seller_username TEXT,
|
|
204
|
+
seller_feedback_score INTEGER,
|
|
205
|
+
seller_feedback_percent REAL,
|
|
206
|
+
|
|
207
|
+
-- Tracking state
|
|
208
|
+
tracking_agents TEXT NOT NULL DEFAULT '[]',
|
|
209
|
+
our_highest_bid REAL,
|
|
210
|
+
our_max_bid REAL,
|
|
211
|
+
is_winning INTEGER DEFAULT 0,
|
|
212
|
+
|
|
213
|
+
-- Status
|
|
214
|
+
status TEXT NOT NULL DEFAULT 'active'
|
|
215
|
+
CHECK (status IN ('active', 'won', 'lost', 'ended', 'removed')),
|
|
216
|
+
|
|
217
|
+
-- Timestamps
|
|
218
|
+
discovered_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
219
|
+
last_updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
220
|
+
|
|
221
|
+
FOREIGN KEY (swarm_id) REFERENCES swarm_configs(swarm_id) ON DELETE CASCADE,
|
|
222
|
+
UNIQUE (item_id, swarm_id)
|
|
223
|
+
)
|
|
224
|
+
`);
|
|
225
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
226
|
+
// Computed Insights (Periodic Snapshots)
|
|
227
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
228
|
+
db.exec(`
|
|
229
|
+
CREATE TABLE IF NOT EXISTS swarm_insights (
|
|
230
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
231
|
+
insight_id TEXT UNIQUE NOT NULL,
|
|
232
|
+
swarm_id TEXT NOT NULL,
|
|
233
|
+
computation_time TEXT NOT NULL DEFAULT (datetime('now')),
|
|
234
|
+
|
|
235
|
+
-- Computed data (JSON)
|
|
236
|
+
agent_effectiveness TEXT NOT NULL,
|
|
237
|
+
strategy_rankings TEXT NOT NULL,
|
|
238
|
+
seller_patterns TEXT,
|
|
239
|
+
concentration_risks TEXT,
|
|
240
|
+
summary TEXT NOT NULL,
|
|
241
|
+
data_quality TEXT NOT NULL,
|
|
242
|
+
|
|
243
|
+
-- Metrics for quick access
|
|
244
|
+
total_spent REAL NOT NULL,
|
|
245
|
+
total_acquired INTEGER NOT NULL,
|
|
246
|
+
overall_win_rate REAL NOT NULL,
|
|
247
|
+
overall_efficiency REAL NOT NULL,
|
|
248
|
+
top_strategy TEXT,
|
|
249
|
+
top_agent TEXT,
|
|
250
|
+
|
|
251
|
+
-- Data quality
|
|
252
|
+
total_events INTEGER NOT NULL,
|
|
253
|
+
confidence_score REAL NOT NULL,
|
|
254
|
+
|
|
255
|
+
FOREIGN KEY (swarm_id) REFERENCES swarm_configs(swarm_id) ON DELETE CASCADE
|
|
256
|
+
)
|
|
257
|
+
`);
|
|
258
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
259
|
+
// Audit Log (for compliance and debugging)
|
|
260
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
261
|
+
db.exec(`
|
|
262
|
+
CREATE TABLE IF NOT EXISTS swarm_audit_log (
|
|
263
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
264
|
+
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
|
|
265
|
+
event_type TEXT NOT NULL,
|
|
266
|
+
swarm_id TEXT,
|
|
267
|
+
agent_id TEXT,
|
|
268
|
+
user_id TEXT,
|
|
269
|
+
action TEXT NOT NULL,
|
|
270
|
+
details TEXT,
|
|
271
|
+
ip_address TEXT,
|
|
272
|
+
user_agent TEXT
|
|
273
|
+
)
|
|
274
|
+
`);
|
|
275
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
276
|
+
// Observations (RECONNAISSANCE Mode - Market Intelligence)
|
|
277
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
278
|
+
db.exec(`
|
|
279
|
+
CREATE TABLE IF NOT EXISTS observations (
|
|
280
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
281
|
+
observation_id TEXT UNIQUE NOT NULL,
|
|
282
|
+
observation_type TEXT NOT NULL
|
|
283
|
+
CHECK (observation_type IN (
|
|
284
|
+
'LISTING_DISCOVERED', 'PRICE_OBSERVED', 'MARKET_CONDITION_DETECTED',
|
|
285
|
+
'OPPORTUNITY_IDENTIFIED', 'SELLER_BEHAVIOR_OBSERVED',
|
|
286
|
+
'PROBE_REQUESTED', 'PROBE_EXECUTED', 'ALERT_TRIGGERED'
|
|
287
|
+
)),
|
|
288
|
+
agent_id TEXT NOT NULL,
|
|
289
|
+
swarm_id TEXT NOT NULL,
|
|
290
|
+
listing_id TEXT,
|
|
291
|
+
|
|
292
|
+
-- Recommended action (what agent would do in COMBAT mode)
|
|
293
|
+
recommended_action TEXT NOT NULL
|
|
294
|
+
CHECK (recommended_action IN ('BID', 'OFFER', 'WATCH', 'SKIP')),
|
|
295
|
+
recommended_amount REAL,
|
|
296
|
+
|
|
297
|
+
-- Intelligence
|
|
298
|
+
market_condition TEXT NOT NULL
|
|
299
|
+
CHECK (market_condition IN ('UNDERPRICED', 'FAIR', 'OVERPRICED', 'UNKNOWN')),
|
|
300
|
+
confidence_score REAL NOT NULL CHECK (confidence_score >= 0 AND confidence_score <= 1),
|
|
301
|
+
reasoning TEXT NOT NULL,
|
|
302
|
+
|
|
303
|
+
-- Context
|
|
304
|
+
current_price REAL NOT NULL,
|
|
305
|
+
market_average REAL,
|
|
306
|
+
discount_percent REAL,
|
|
307
|
+
competition_level TEXT NOT NULL
|
|
308
|
+
CHECK (competition_level IN ('LOW', 'MEDIUM', 'HIGH')),
|
|
309
|
+
|
|
310
|
+
-- Listing snapshot
|
|
311
|
+
item_title TEXT,
|
|
312
|
+
seller_id TEXT,
|
|
313
|
+
time_remaining INTEGER,
|
|
314
|
+
|
|
315
|
+
-- Timestamps
|
|
316
|
+
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
|
|
317
|
+
metadata TEXT,
|
|
318
|
+
|
|
319
|
+
FOREIGN KEY (swarm_id) REFERENCES swarm_configs(swarm_id) ON DELETE CASCADE,
|
|
320
|
+
FOREIGN KEY (agent_id) REFERENCES market_agents(agent_id) ON DELETE SET NULL,
|
|
321
|
+
CONSTRAINT valid_observation_id CHECK (observation_id LIKE 'obs_%')
|
|
322
|
+
)
|
|
323
|
+
`);
|
|
324
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
325
|
+
// Alerts (Human-in-the-Loop Approval System)
|
|
326
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
327
|
+
db.exec(`
|
|
328
|
+
CREATE TABLE IF NOT EXISTS alerts (
|
|
329
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
330
|
+
alert_id TEXT UNIQUE NOT NULL,
|
|
331
|
+
alert_type TEXT NOT NULL
|
|
332
|
+
CHECK (alert_type IN ('PRICE_ANOMALY', 'PATTERN_MATCH', 'MULTI_AGENT_CONSENSUS')),
|
|
333
|
+
severity TEXT NOT NULL
|
|
334
|
+
CHECK (severity IN ('LOW', 'MEDIUM', 'HIGH', 'CRITICAL')),
|
|
335
|
+
swarm_id TEXT NOT NULL,
|
|
336
|
+
|
|
337
|
+
-- Trigger information
|
|
338
|
+
trigger_observation_ids TEXT NOT NULL, -- JSON array
|
|
339
|
+
listing_id TEXT NOT NULL,
|
|
340
|
+
|
|
341
|
+
-- Recommendation
|
|
342
|
+
recommended_action TEXT NOT NULL
|
|
343
|
+
CHECK (recommended_action IN ('BID', 'OFFER', 'WATCH', 'SKIP')),
|
|
344
|
+
recommended_amount REAL,
|
|
345
|
+
estimated_value REAL NOT NULL,
|
|
346
|
+
confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
|
|
347
|
+
summary TEXT NOT NULL,
|
|
348
|
+
|
|
349
|
+
-- Approval workflow
|
|
350
|
+
requires_approval INTEGER NOT NULL DEFAULT 1,
|
|
351
|
+
approval_deadline TEXT,
|
|
352
|
+
status TEXT NOT NULL DEFAULT 'PENDING'
|
|
353
|
+
CHECK (status IN ('PENDING', 'APPROVED', 'REJECTED', 'EXPIRED', 'EXECUTED')),
|
|
354
|
+
resolved_by TEXT,
|
|
355
|
+
resolved_at TEXT,
|
|
356
|
+
resolution_notes TEXT,
|
|
357
|
+
|
|
358
|
+
-- Timestamps
|
|
359
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
360
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
361
|
+
|
|
362
|
+
FOREIGN KEY (swarm_id) REFERENCES swarm_configs(swarm_id) ON DELETE CASCADE,
|
|
363
|
+
CONSTRAINT valid_alert_id CHECK (alert_id LIKE 'alert_%')
|
|
364
|
+
)
|
|
365
|
+
`);
|
|
366
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
367
|
+
// Seller Profiles (Computed from Observations)
|
|
368
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
369
|
+
db.exec(`
|
|
370
|
+
CREATE TABLE IF NOT EXISTS seller_profiles (
|
|
371
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
372
|
+
seller_id TEXT UNIQUE NOT NULL,
|
|
373
|
+
feedback_score INTEGER,
|
|
374
|
+
feedback_percent REAL,
|
|
375
|
+
|
|
376
|
+
-- Computed metrics (anti-gaming: derived from observations)
|
|
377
|
+
total_interactions INTEGER NOT NULL DEFAULT 0,
|
|
378
|
+
successful_acquisitions INTEGER NOT NULL DEFAULT 0,
|
|
379
|
+
avg_discount_achieved REAL,
|
|
380
|
+
negotiation_style TEXT
|
|
381
|
+
CHECK (negotiation_style IN ('FIRM', 'FLEXIBLE', 'COUNTER_HAPPY', 'UNKNOWN')),
|
|
382
|
+
best_offer_acceptance_rate REAL,
|
|
383
|
+
avg_offer_response_time REAL, -- hours
|
|
384
|
+
risk_level TEXT NOT NULL DEFAULT 'UNKNOWN'
|
|
385
|
+
CHECK (risk_level IN ('LOW', 'MEDIUM', 'HIGH', 'UNKNOWN')),
|
|
386
|
+
|
|
387
|
+
-- Timestamps
|
|
388
|
+
first_seen_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
389
|
+
last_updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
390
|
+
metadata TEXT
|
|
391
|
+
)
|
|
392
|
+
`);
|
|
393
|
+
}
|
|
394
|
+
function createIndexes(db) {
|
|
395
|
+
// Swarm configs
|
|
396
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_swarm_status ON swarm_configs(status)`);
|
|
397
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_swarm_created_by ON swarm_configs(created_by)`);
|
|
398
|
+
// Market agents
|
|
399
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_agent_swarm ON market_agents(swarm_id)`);
|
|
400
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_agent_status ON market_agents(status)`);
|
|
401
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_agent_strategy ON market_agents(strategy)`);
|
|
402
|
+
// Events (critical for insight computation)
|
|
403
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_event_swarm ON swarm_events(swarm_id)`);
|
|
404
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_event_agent ON swarm_events(agent_id)`);
|
|
405
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_event_type ON swarm_events(event_type)`);
|
|
406
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_event_timestamp ON swarm_events(timestamp)`);
|
|
407
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_event_item ON swarm_events(item_id)`);
|
|
408
|
+
// Tracked listings
|
|
409
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_listing_swarm ON tracked_listings(swarm_id)`);
|
|
410
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_listing_status ON tracked_listings(status)`);
|
|
411
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_listing_end_time ON tracked_listings(end_time)`);
|
|
412
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_listing_seller ON tracked_listings(seller_id)`);
|
|
413
|
+
// Insights
|
|
414
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_insights_swarm ON swarm_insights(swarm_id)`);
|
|
415
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_insights_time ON swarm_insights(computation_time)`);
|
|
416
|
+
// Observations (critical for intelligence queries)
|
|
417
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_obs_swarm ON observations(swarm_id)`);
|
|
418
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_obs_agent ON observations(agent_id)`);
|
|
419
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_obs_type ON observations(observation_type)`);
|
|
420
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_obs_listing ON observations(listing_id)`);
|
|
421
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_obs_timestamp ON observations(timestamp)`);
|
|
422
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_obs_market_condition ON observations(market_condition)`);
|
|
423
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_obs_confidence ON observations(confidence_score)`);
|
|
424
|
+
// Alerts (for approval workflow queries)
|
|
425
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_alert_swarm ON alerts(swarm_id)`);
|
|
426
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_alert_status ON alerts(status)`);
|
|
427
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_alert_type ON alerts(alert_type)`);
|
|
428
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_alert_listing ON alerts(listing_id)`);
|
|
429
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_alert_severity ON alerts(severity)`);
|
|
430
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_alert_deadline ON alerts(approval_deadline)`);
|
|
431
|
+
// Seller profiles
|
|
432
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_seller_risk ON seller_profiles(risk_level)`);
|
|
433
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_seller_style ON seller_profiles(negotiation_style)`);
|
|
434
|
+
}
|
|
435
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
436
|
+
// SWARM CRUD OPERATIONS
|
|
437
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
438
|
+
/**
|
|
439
|
+
* Create a new swarm configuration.
|
|
440
|
+
*/
|
|
441
|
+
export function createSwarm(config) {
|
|
442
|
+
const db = getSwarmDatabase();
|
|
443
|
+
const stmt = db.prepare(`
|
|
444
|
+
INSERT INTO swarm_configs (
|
|
445
|
+
swarm_id, name, total_budget, currency, agent_count,
|
|
446
|
+
strategy_distribution, campaign_start, campaign_end,
|
|
447
|
+
target_criteria, sandbox_mode, fee_reserve_percent,
|
|
448
|
+
created_by, created_at, status
|
|
449
|
+
) VALUES (
|
|
450
|
+
@swarmId, @name, @totalBudget, @currency, @agentCount,
|
|
451
|
+
@strategyDistribution, @campaignStart, @campaignEnd,
|
|
452
|
+
@targetCriteria, @sandboxMode, @feeReservePercent,
|
|
453
|
+
@createdBy, @createdAt, 'configuring'
|
|
454
|
+
)
|
|
455
|
+
`);
|
|
456
|
+
const timeWindow = config.campaignWindow ?? config.timeWindow;
|
|
457
|
+
const campaignStart = timeWindow?.start ?? timeWindow?.startAt ?? new Date().toISOString();
|
|
458
|
+
const campaignEnd = timeWindow?.end ?? timeWindow?.endAt ?? new Date(Date.now() + 86400000).toISOString();
|
|
459
|
+
stmt.run({
|
|
460
|
+
swarmId: config.swarmId,
|
|
461
|
+
name: config.name ?? 'Unnamed Swarm',
|
|
462
|
+
totalBudget: typeof config.totalBudget === 'number' ? config.totalBudget : config.totalBudget.amount,
|
|
463
|
+
currency: config.currency ?? (typeof config.totalBudget === 'object' ? config.totalBudget.currency : 'USD'),
|
|
464
|
+
agentCount: config.agentCount,
|
|
465
|
+
strategyDistribution: JSON.stringify(config.strategyDistribution instanceof Map
|
|
466
|
+
? Object.fromEntries(config.strategyDistribution)
|
|
467
|
+
: config.strategyDistribution),
|
|
468
|
+
campaignStart: String(campaignStart),
|
|
469
|
+
campaignEnd: String(campaignEnd),
|
|
470
|
+
targetCriteria: JSON.stringify(config.targetCriteria),
|
|
471
|
+
sandboxMode: config.sandboxMode ? 1 : 0,
|
|
472
|
+
feeReservePercent: config.feeReservePercent ?? 5,
|
|
473
|
+
createdBy: config.createdBy ?? 'system',
|
|
474
|
+
createdAt: config.createdAt ?? new Date().toISOString(),
|
|
475
|
+
});
|
|
476
|
+
// Record audit event
|
|
477
|
+
recordAuditEvent({
|
|
478
|
+
eventType: 'SWARM_CREATED',
|
|
479
|
+
swarmId: config.swarmId,
|
|
480
|
+
action: 'create',
|
|
481
|
+
details: JSON.stringify({ name: config.name, budget: config.totalBudget }),
|
|
482
|
+
});
|
|
483
|
+
return config;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Get a swarm configuration by ID.
|
|
487
|
+
*/
|
|
488
|
+
export function getSwarm(swarmId) {
|
|
489
|
+
const db = getSwarmDatabase();
|
|
490
|
+
const row = db.prepare(`
|
|
491
|
+
SELECT * FROM swarm_configs WHERE swarm_id = ?
|
|
492
|
+
`).get(swarmId);
|
|
493
|
+
if (!row)
|
|
494
|
+
return null;
|
|
495
|
+
return {
|
|
496
|
+
swarmId: row.swarm_id,
|
|
497
|
+
name: row.name,
|
|
498
|
+
totalBudget: row.total_budget,
|
|
499
|
+
currency: row.currency,
|
|
500
|
+
agentCount: row.agent_count,
|
|
501
|
+
strategyDistribution: JSON.parse(row.strategy_distribution),
|
|
502
|
+
campaignWindow: {
|
|
503
|
+
start: row.campaign_start,
|
|
504
|
+
end: row.campaign_end,
|
|
505
|
+
startAt: row.campaign_start,
|
|
506
|
+
endAt: row.campaign_end,
|
|
507
|
+
},
|
|
508
|
+
targetCriteria: JSON.parse(row.target_criteria),
|
|
509
|
+
sandboxMode: row.sandbox_mode === 1,
|
|
510
|
+
feeReservePercent: row.fee_reserve_percent,
|
|
511
|
+
createdBy: row.created_by,
|
|
512
|
+
createdAt: row.created_at,
|
|
513
|
+
// State
|
|
514
|
+
status: row.status,
|
|
515
|
+
totalSpent: row.total_spent,
|
|
516
|
+
totalAcquired: row.total_acquired,
|
|
517
|
+
activeAgents: row.active_agents,
|
|
518
|
+
lastActivityAt: row.last_activity_at,
|
|
519
|
+
statusMessage: row.status_message,
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Update swarm state.
|
|
524
|
+
*/
|
|
525
|
+
export function updateSwarmState(swarmId, updates) {
|
|
526
|
+
const db = getSwarmDatabase();
|
|
527
|
+
const setClauses = [];
|
|
528
|
+
const params = { swarmId };
|
|
529
|
+
if (updates.status !== undefined) {
|
|
530
|
+
setClauses.push('status = @status');
|
|
531
|
+
params.status = updates.status;
|
|
532
|
+
}
|
|
533
|
+
if (updates.totalSpent !== undefined) {
|
|
534
|
+
setClauses.push('total_spent = @totalSpent');
|
|
535
|
+
params.totalSpent = updates.totalSpent;
|
|
536
|
+
}
|
|
537
|
+
if (updates.totalAcquired !== undefined) {
|
|
538
|
+
setClauses.push('total_acquired = @totalAcquired');
|
|
539
|
+
params.totalAcquired = updates.totalAcquired;
|
|
540
|
+
}
|
|
541
|
+
if (updates.activeAgents !== undefined) {
|
|
542
|
+
setClauses.push('active_agents = @activeAgents');
|
|
543
|
+
params.activeAgents = updates.activeAgents;
|
|
544
|
+
}
|
|
545
|
+
if (updates.lastActivityAt !== undefined) {
|
|
546
|
+
setClauses.push('last_activity_at = @lastActivityAt');
|
|
547
|
+
params.lastActivityAt = updates.lastActivityAt;
|
|
548
|
+
}
|
|
549
|
+
if (updates.statusMessage !== undefined) {
|
|
550
|
+
setClauses.push('status_message = @statusMessage');
|
|
551
|
+
params.statusMessage = updates.statusMessage;
|
|
552
|
+
}
|
|
553
|
+
if (setClauses.length === 0)
|
|
554
|
+
return false;
|
|
555
|
+
const result = db.prepare(`
|
|
556
|
+
UPDATE swarm_configs SET ${setClauses.join(', ')} WHERE swarm_id = @swarmId
|
|
557
|
+
`).run(params);
|
|
558
|
+
return result.changes > 0;
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* List swarms with optional filters.
|
|
562
|
+
*/
|
|
563
|
+
export function listSwarms(filters) {
|
|
564
|
+
const db = getSwarmDatabase();
|
|
565
|
+
let query = 'SELECT * FROM swarm_configs WHERE 1=1';
|
|
566
|
+
const params = {};
|
|
567
|
+
if (filters?.status) {
|
|
568
|
+
query += ' AND status = @status';
|
|
569
|
+
params.status = filters.status;
|
|
570
|
+
}
|
|
571
|
+
if (filters?.createdBy) {
|
|
572
|
+
query += ' AND created_by = @createdBy';
|
|
573
|
+
params.createdBy = filters.createdBy;
|
|
574
|
+
}
|
|
575
|
+
query += ' ORDER BY created_at DESC';
|
|
576
|
+
if (filters?.limit) {
|
|
577
|
+
query += ' LIMIT @limit';
|
|
578
|
+
params.limit = filters.limit;
|
|
579
|
+
}
|
|
580
|
+
const rows = db.prepare(query).all(params);
|
|
581
|
+
return rows.map(row => ({
|
|
582
|
+
swarmId: row.swarm_id,
|
|
583
|
+
name: row.name,
|
|
584
|
+
totalBudget: row.total_budget,
|
|
585
|
+
currency: row.currency,
|
|
586
|
+
agentCount: row.agent_count,
|
|
587
|
+
strategyDistribution: JSON.parse(row.strategy_distribution),
|
|
588
|
+
campaignWindow: {
|
|
589
|
+
start: row.campaign_start,
|
|
590
|
+
end: row.campaign_end,
|
|
591
|
+
startAt: row.campaign_start,
|
|
592
|
+
endAt: row.campaign_end,
|
|
593
|
+
},
|
|
594
|
+
targetCriteria: JSON.parse(row.target_criteria),
|
|
595
|
+
sandboxMode: row.sandbox_mode === 1,
|
|
596
|
+
feeReservePercent: row.fee_reserve_percent,
|
|
597
|
+
createdBy: row.created_by,
|
|
598
|
+
createdAt: row.created_at,
|
|
599
|
+
status: row.status,
|
|
600
|
+
totalSpent: row.total_spent,
|
|
601
|
+
totalAcquired: row.total_acquired,
|
|
602
|
+
activeAgents: row.active_agents,
|
|
603
|
+
lastActivityAt: row.last_activity_at,
|
|
604
|
+
statusMessage: row.status_message,
|
|
605
|
+
}));
|
|
606
|
+
}
|
|
607
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
608
|
+
// AGENT CRUD OPERATIONS
|
|
609
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
610
|
+
/**
|
|
611
|
+
* Create a new market agent.
|
|
612
|
+
*/
|
|
613
|
+
export function createAgent(config) {
|
|
614
|
+
const db = getSwarmDatabase();
|
|
615
|
+
const stmt = db.prepare(`
|
|
616
|
+
INSERT INTO market_agents (
|
|
617
|
+
agent_id, swarm_id, name, strategy,
|
|
618
|
+
budget_allocated, currency, max_per_item,
|
|
619
|
+
max_concurrent_listings, max_bids_per_hour, max_offers_per_hour,
|
|
620
|
+
require_approval_above, time_window_start, time_window_end,
|
|
621
|
+
status, created_at
|
|
622
|
+
) VALUES (
|
|
623
|
+
@agentId, @swarmId, @name, @strategy,
|
|
624
|
+
@budgetAllocated, @currency, @maxPerItem,
|
|
625
|
+
@maxConcurrentListings, @maxBidsPerHour, @maxOffersPerHour,
|
|
626
|
+
@requireApprovalAbove, @timeWindowStart, @timeWindowEnd,
|
|
627
|
+
'idle', datetime('now')
|
|
628
|
+
)
|
|
629
|
+
`);
|
|
630
|
+
const budget = config.budget ?? config.budgetAllocation;
|
|
631
|
+
const constraints = config.constraints ?? {
|
|
632
|
+
maxConcurrentListings: 5,
|
|
633
|
+
maxBidsPerHour: 10,
|
|
634
|
+
maxOffersPerHour: 10,
|
|
635
|
+
};
|
|
636
|
+
const timeWindowStart = config.timeWindow.start ?? config.timeWindow.startAt ?? new Date().toISOString();
|
|
637
|
+
const timeWindowEnd = config.timeWindow.end ?? config.timeWindow.endAt ?? new Date(Date.now() + 86400000).toISOString();
|
|
638
|
+
stmt.run({
|
|
639
|
+
agentId: config.agentId,
|
|
640
|
+
swarmId: config.swarmId,
|
|
641
|
+
name: config.name ?? 'Agent',
|
|
642
|
+
strategy: config.strategy,
|
|
643
|
+
budgetAllocated: budget ? (typeof budget === 'object' && 'amount' in budget ? budget.amount : budget.value ?? 0) : 0,
|
|
644
|
+
currency: budget ? (typeof budget === 'object' && 'currency' in budget ? budget.currency : 'USD') : 'USD',
|
|
645
|
+
maxPerItem: budget && typeof budget === 'object' && 'maxPerItem' in budget ? budget.maxPerItem : null,
|
|
646
|
+
maxConcurrentListings: constraints.maxConcurrentListings ?? 5,
|
|
647
|
+
maxBidsPerHour: constraints.maxBidsPerHour ?? 10,
|
|
648
|
+
maxOffersPerHour: constraints.maxOffersPerHour ?? 10,
|
|
649
|
+
requireApprovalAbove: 'requireApprovalAbove' in constraints ? constraints.requireApprovalAbove : null,
|
|
650
|
+
timeWindowStart: String(timeWindowStart),
|
|
651
|
+
timeWindowEnd: String(timeWindowEnd),
|
|
652
|
+
});
|
|
653
|
+
return config;
|
|
654
|
+
}
|
|
655
|
+
/**
|
|
656
|
+
* Get an agent by ID.
|
|
657
|
+
*/
|
|
658
|
+
export function getAgent(agentId) {
|
|
659
|
+
const db = getSwarmDatabase();
|
|
660
|
+
const row = db.prepare(`
|
|
661
|
+
SELECT * FROM market_agents WHERE agent_id = ?
|
|
662
|
+
`).get(agentId);
|
|
663
|
+
if (!row)
|
|
664
|
+
return null;
|
|
665
|
+
return {
|
|
666
|
+
agentId: row.agent_id,
|
|
667
|
+
swarmId: row.swarm_id,
|
|
668
|
+
name: row.name,
|
|
669
|
+
strategy: row.strategy,
|
|
670
|
+
budget: {
|
|
671
|
+
amount: row.budget_allocated,
|
|
672
|
+
currency: row.currency,
|
|
673
|
+
maxPerItem: row.max_per_item,
|
|
674
|
+
reservePercent: 5, // Default
|
|
675
|
+
},
|
|
676
|
+
timeWindow: {
|
|
677
|
+
start: row.time_window_start,
|
|
678
|
+
end: row.time_window_end,
|
|
679
|
+
startAt: row.time_window_start,
|
|
680
|
+
endAt: row.time_window_end,
|
|
681
|
+
},
|
|
682
|
+
targetCriteria: { searchQuery: '' }, // From swarm
|
|
683
|
+
constraints: {
|
|
684
|
+
maxConcurrentListings: row.max_concurrent_listings,
|
|
685
|
+
maxBidsPerHour: row.max_bids_per_hour,
|
|
686
|
+
maxOffersPerHour: row.max_offers_per_hour,
|
|
687
|
+
minActionIntervalMs: 5000,
|
|
688
|
+
requireApprovalAbove: row.require_approval_above,
|
|
689
|
+
},
|
|
690
|
+
status: row.status,
|
|
691
|
+
budgetSpent: row.budget_spent,
|
|
692
|
+
budgetReserved: row.budget_reserved,
|
|
693
|
+
itemsWon: row.items_won,
|
|
694
|
+
itemsLost: row.items_lost,
|
|
695
|
+
};
|
|
696
|
+
}
|
|
697
|
+
/**
|
|
698
|
+
* Update agent state.
|
|
699
|
+
*/
|
|
700
|
+
export function updateAgentState(agentId, updates) {
|
|
701
|
+
const db = getSwarmDatabase();
|
|
702
|
+
const setClauses = [];
|
|
703
|
+
const params = { agentId };
|
|
704
|
+
Object.entries(updates).forEach(([key, value]) => {
|
|
705
|
+
if (value !== undefined) {
|
|
706
|
+
const snakeKey = key.replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
707
|
+
setClauses.push(`${snakeKey} = @${key}`);
|
|
708
|
+
params[key] = value;
|
|
709
|
+
}
|
|
710
|
+
});
|
|
711
|
+
if (setClauses.length === 0)
|
|
712
|
+
return false;
|
|
713
|
+
const result = db.prepare(`
|
|
714
|
+
UPDATE market_agents SET ${setClauses.join(', ')} WHERE agent_id = @agentId
|
|
715
|
+
`).run(params);
|
|
716
|
+
return result.changes > 0;
|
|
717
|
+
}
|
|
718
|
+
/**
|
|
719
|
+
* List agents for a swarm.
|
|
720
|
+
*/
|
|
721
|
+
export function listAgents(swarmId, filters) {
|
|
722
|
+
const db = getSwarmDatabase();
|
|
723
|
+
let query = 'SELECT * FROM market_agents WHERE swarm_id = @swarmId';
|
|
724
|
+
const params = { swarmId };
|
|
725
|
+
if (filters?.status) {
|
|
726
|
+
query += ' AND status = @status';
|
|
727
|
+
params.status = filters.status;
|
|
728
|
+
}
|
|
729
|
+
if (filters?.strategy) {
|
|
730
|
+
query += ' AND strategy = @strategy';
|
|
731
|
+
params.strategy = filters.strategy;
|
|
732
|
+
}
|
|
733
|
+
query += ' ORDER BY created_at ASC';
|
|
734
|
+
return db.prepare(query).all(params);
|
|
735
|
+
}
|
|
736
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
737
|
+
// EVENT OPERATIONS (Immutable)
|
|
738
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
739
|
+
/**
|
|
740
|
+
* Record a swarm event (immutable).
|
|
741
|
+
*/
|
|
742
|
+
export function recordEvent(event) {
|
|
743
|
+
const db = getSwarmDatabase();
|
|
744
|
+
db.prepare(`
|
|
745
|
+
INSERT INTO swarm_events (
|
|
746
|
+
event_id, event_type, swarm_id, agent_id, timestamp,
|
|
747
|
+
item_id, item_title, amount, currency, metadata, source_uri
|
|
748
|
+
) VALUES (
|
|
749
|
+
@eventId, @eventType, @swarmId, @agentId, @timestamp,
|
|
750
|
+
@itemId, @itemTitle, @amount, @currency, @metadata, @sourceUri
|
|
751
|
+
)
|
|
752
|
+
`).run({
|
|
753
|
+
eventId: event.eventId,
|
|
754
|
+
eventType: event.eventType,
|
|
755
|
+
swarmId: event.swarmId,
|
|
756
|
+
agentId: event.agentId ?? null,
|
|
757
|
+
timestamp: event.timestamp,
|
|
758
|
+
itemId: event.itemId ?? null,
|
|
759
|
+
itemTitle: event.itemTitle ?? null,
|
|
760
|
+
amount: event.bidAmount ?? event.offerAmount ?? event.finalPrice ?? null,
|
|
761
|
+
currency: event.currency ?? null,
|
|
762
|
+
metadata: event.metadata ? JSON.stringify(event.metadata) : null,
|
|
763
|
+
sourceUri: event.sourceUri ?? null,
|
|
764
|
+
});
|
|
765
|
+
}
|
|
766
|
+
/**
|
|
767
|
+
* Query events for insight computation.
|
|
768
|
+
*/
|
|
769
|
+
export function queryEvents(filters) {
|
|
770
|
+
const db = getSwarmDatabase();
|
|
771
|
+
let query = 'SELECT * FROM swarm_events WHERE swarm_id = @swarmId';
|
|
772
|
+
const params = { swarmId: filters.swarmId };
|
|
773
|
+
if (filters.agentId) {
|
|
774
|
+
query += ' AND agent_id = @agentId';
|
|
775
|
+
params.agentId = filters.agentId;
|
|
776
|
+
}
|
|
777
|
+
if (filters.eventTypes && filters.eventTypes.length > 0) {
|
|
778
|
+
query += ` AND event_type IN (${filters.eventTypes.map((_, i) => `@eventType${i}`).join(',')})`;
|
|
779
|
+
filters.eventTypes.forEach((et, i) => {
|
|
780
|
+
params[`eventType${i}`] = et;
|
|
781
|
+
});
|
|
782
|
+
}
|
|
783
|
+
if (filters.since) {
|
|
784
|
+
query += ' AND timestamp >= @since';
|
|
785
|
+
params.since = filters.since;
|
|
786
|
+
}
|
|
787
|
+
if (filters.until) {
|
|
788
|
+
query += ' AND timestamp <= @until';
|
|
789
|
+
params.until = filters.until;
|
|
790
|
+
}
|
|
791
|
+
if (filters.itemId) {
|
|
792
|
+
query += ' AND item_id = @itemId';
|
|
793
|
+
params.itemId = filters.itemId;
|
|
794
|
+
}
|
|
795
|
+
query += ' ORDER BY timestamp ASC';
|
|
796
|
+
if (filters.limit) {
|
|
797
|
+
query += ' LIMIT @limit';
|
|
798
|
+
params.limit = filters.limit;
|
|
799
|
+
}
|
|
800
|
+
const rows = db.prepare(query).all(params);
|
|
801
|
+
return rows.map(row => ({
|
|
802
|
+
eventId: row.event_id,
|
|
803
|
+
eventType: row.event_type,
|
|
804
|
+
swarmId: row.swarm_id,
|
|
805
|
+
agentId: row.agent_id,
|
|
806
|
+
timestamp: row.timestamp,
|
|
807
|
+
itemId: row.item_id,
|
|
808
|
+
itemTitle: row.item_title,
|
|
809
|
+
amount: row.amount,
|
|
810
|
+
currency: row.currency,
|
|
811
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
812
|
+
}));
|
|
813
|
+
}
|
|
814
|
+
/**
|
|
815
|
+
* Get event counts by type for a swarm.
|
|
816
|
+
*/
|
|
817
|
+
export function getEventCounts(swarmId) {
|
|
818
|
+
const db = getSwarmDatabase();
|
|
819
|
+
const rows = db.prepare(`
|
|
820
|
+
SELECT event_type, COUNT(*) as count
|
|
821
|
+
FROM swarm_events
|
|
822
|
+
WHERE swarm_id = ?
|
|
823
|
+
GROUP BY event_type
|
|
824
|
+
`).all(swarmId);
|
|
825
|
+
const counts = {};
|
|
826
|
+
for (const row of rows) {
|
|
827
|
+
counts[row.event_type] = row.count;
|
|
828
|
+
}
|
|
829
|
+
return counts;
|
|
830
|
+
}
|
|
831
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
832
|
+
// TRACKED LISTINGS OPERATIONS
|
|
833
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
834
|
+
/**
|
|
835
|
+
* Add or update a tracked listing.
|
|
836
|
+
*/
|
|
837
|
+
export function upsertTrackedListing(listing) {
|
|
838
|
+
const db = getSwarmDatabase();
|
|
839
|
+
db.prepare(`
|
|
840
|
+
INSERT INTO tracked_listings (
|
|
841
|
+
item_id, swarm_id, title, list_price, current_bid, buy_it_now_price,
|
|
842
|
+
listing_format, condition, end_time, seller_id, seller_username,
|
|
843
|
+
seller_feedback_score, seller_feedback_percent
|
|
844
|
+
) VALUES (
|
|
845
|
+
@itemId, @swarmId, @title, @listPrice, @currentBid, @buyItNowPrice,
|
|
846
|
+
@listingFormat, @condition, @endTime, @sellerId, @sellerUsername,
|
|
847
|
+
@sellerFeedbackScore, @sellerFeedbackPercent
|
|
848
|
+
)
|
|
849
|
+
ON CONFLICT (item_id, swarm_id) DO UPDATE SET
|
|
850
|
+
current_bid = @currentBid,
|
|
851
|
+
last_updated_at = datetime('now')
|
|
852
|
+
`).run({
|
|
853
|
+
itemId: listing.itemId,
|
|
854
|
+
swarmId: listing.swarmId,
|
|
855
|
+
title: listing.title,
|
|
856
|
+
listPrice: listing.listPrice,
|
|
857
|
+
currentBid: listing.currentBid ?? null,
|
|
858
|
+
buyItNowPrice: listing.buyItNowPrice ?? null,
|
|
859
|
+
listingFormat: listing.listingFormat,
|
|
860
|
+
condition: listing.condition ?? null,
|
|
861
|
+
endTime: listing.endTime,
|
|
862
|
+
sellerId: listing.sellerId ?? null,
|
|
863
|
+
sellerUsername: listing.sellerUsername ?? null,
|
|
864
|
+
sellerFeedbackScore: listing.sellerFeedbackScore ?? null,
|
|
865
|
+
sellerFeedbackPercent: listing.sellerFeedbackPercent ?? null,
|
|
866
|
+
});
|
|
867
|
+
}
|
|
868
|
+
/**
|
|
869
|
+
* Get active listings for a swarm.
|
|
870
|
+
*/
|
|
871
|
+
export function getActiveListings(swarmId) {
|
|
872
|
+
const db = getSwarmDatabase();
|
|
873
|
+
return db.prepare(`
|
|
874
|
+
SELECT * FROM tracked_listings
|
|
875
|
+
WHERE swarm_id = ? AND status = 'active'
|
|
876
|
+
ORDER BY end_time ASC
|
|
877
|
+
`).all(swarmId);
|
|
878
|
+
}
|
|
879
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
880
|
+
// INSIGHTS OPERATIONS
|
|
881
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
882
|
+
/**
|
|
883
|
+
* Store computed insights.
|
|
884
|
+
*/
|
|
885
|
+
export function storeInsights(insights) {
|
|
886
|
+
const db = getSwarmDatabase();
|
|
887
|
+
const insightId = `insight_${Date.now()}_${Math.random().toString(36).substr(2, 8)}`;
|
|
888
|
+
db.prepare(`
|
|
889
|
+
INSERT INTO swarm_insights (
|
|
890
|
+
insight_id, swarm_id, computation_time,
|
|
891
|
+
agent_effectiveness, strategy_rankings, seller_patterns,
|
|
892
|
+
concentration_risks, summary, data_quality,
|
|
893
|
+
total_spent, total_acquired, overall_win_rate, overall_efficiency,
|
|
894
|
+
top_strategy, top_agent, total_events, confidence_score
|
|
895
|
+
) VALUES (
|
|
896
|
+
@insightId, @swarmId, @computedAt,
|
|
897
|
+
@agentEffectiveness, @strategyRankings, @sellerPatterns,
|
|
898
|
+
@concentrationRisks, @summary, @dataQuality,
|
|
899
|
+
@totalSpent, @totalAcquired, @overallWinRate, @overallEfficiency,
|
|
900
|
+
@topStrategy, @topAgent, @totalEvents, @confidenceScore
|
|
901
|
+
)
|
|
902
|
+
`).run({
|
|
903
|
+
insightId,
|
|
904
|
+
swarmId: insights.swarmId,
|
|
905
|
+
computedAt: insights.computedAt,
|
|
906
|
+
agentEffectiveness: JSON.stringify(insights.agentEffectiveness),
|
|
907
|
+
strategyRankings: JSON.stringify(insights.strategyRankings),
|
|
908
|
+
sellerPatterns: JSON.stringify(insights.sellerPatterns),
|
|
909
|
+
concentrationRisks: JSON.stringify(insights.concentrationRisks),
|
|
910
|
+
summary: JSON.stringify(insights.summary),
|
|
911
|
+
dataQuality: JSON.stringify(insights.dataQuality),
|
|
912
|
+
totalSpent: insights.summary.totalSpent,
|
|
913
|
+
totalAcquired: insights.summary.totalAcquired,
|
|
914
|
+
overallWinRate: insights.summary.overallWinRate,
|
|
915
|
+
overallEfficiency: insights.summary.overallEfficiency,
|
|
916
|
+
topStrategy: insights.summary.topPerformingStrategy,
|
|
917
|
+
topAgent: insights.summary.topPerformingAgent,
|
|
918
|
+
totalEvents: insights.dataQuality.totalEvents,
|
|
919
|
+
confidenceScore: insights.dataQuality.confidenceScore,
|
|
920
|
+
});
|
|
921
|
+
}
|
|
922
|
+
/**
|
|
923
|
+
* Get latest insights for a swarm.
|
|
924
|
+
*/
|
|
925
|
+
export function getLatestInsights(swarmId) {
|
|
926
|
+
const db = getSwarmDatabase();
|
|
927
|
+
const row = db.prepare(`
|
|
928
|
+
SELECT * FROM swarm_insights
|
|
929
|
+
WHERE swarm_id = ?
|
|
930
|
+
ORDER BY computation_time DESC
|
|
931
|
+
LIMIT 1
|
|
932
|
+
`).get(swarmId);
|
|
933
|
+
if (!row)
|
|
934
|
+
return null;
|
|
935
|
+
return {
|
|
936
|
+
swarmId: row.swarm_id,
|
|
937
|
+
computedAt: row.computation_time,
|
|
938
|
+
agentEffectiveness: JSON.parse(row.agent_effectiveness),
|
|
939
|
+
strategyRankings: JSON.parse(row.strategy_rankings),
|
|
940
|
+
sellerPatterns: JSON.parse(row.seller_patterns || '[]'),
|
|
941
|
+
concentrationRisks: JSON.parse(row.concentration_risks || '[]'),
|
|
942
|
+
summary: JSON.parse(row.summary),
|
|
943
|
+
dataQuality: JSON.parse(row.data_quality),
|
|
944
|
+
};
|
|
945
|
+
}
|
|
946
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
947
|
+
// AUDIT LOGGING
|
|
948
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
949
|
+
/**
|
|
950
|
+
* Record an audit event.
|
|
951
|
+
*/
|
|
952
|
+
export function recordAuditEvent(event) {
|
|
953
|
+
const db = getSwarmDatabase();
|
|
954
|
+
db.prepare(`
|
|
955
|
+
INSERT INTO swarm_audit_log (
|
|
956
|
+
event_type, swarm_id, agent_id, user_id, action, details
|
|
957
|
+
) VALUES (
|
|
958
|
+
@eventType, @swarmId, @agentId, @userId, @action, @details
|
|
959
|
+
)
|
|
960
|
+
`).run({
|
|
961
|
+
eventType: event.eventType,
|
|
962
|
+
swarmId: event.swarmId ?? null,
|
|
963
|
+
agentId: event.agentId ?? null,
|
|
964
|
+
userId: event.userId ?? null,
|
|
965
|
+
action: event.action,
|
|
966
|
+
details: event.details ?? null,
|
|
967
|
+
});
|
|
968
|
+
}
|
|
969
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
970
|
+
// OBSERVATION OPERATIONS (RECONNAISSANCE Mode)
|
|
971
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
972
|
+
/**
|
|
973
|
+
* Record an observation (immutable intelligence record).
|
|
974
|
+
*/
|
|
975
|
+
export function recordObservation(observation) {
|
|
976
|
+
const db = getSwarmDatabase();
|
|
977
|
+
db.prepare(`
|
|
978
|
+
INSERT INTO observations (
|
|
979
|
+
observation_id, observation_type, agent_id, swarm_id, listing_id,
|
|
980
|
+
recommended_action, recommended_amount, market_condition, confidence_score,
|
|
981
|
+
reasoning, current_price, market_average, discount_percent, competition_level,
|
|
982
|
+
item_title, seller_id, time_remaining, timestamp, metadata
|
|
983
|
+
) VALUES (
|
|
984
|
+
@observationId, @observationType, @agentId, @swarmId, @listingId,
|
|
985
|
+
@recommendedAction, @recommendedAmount, @marketCondition, @confidenceScore,
|
|
986
|
+
@reasoning, @currentPrice, @marketAverage, @discountPercent, @competitionLevel,
|
|
987
|
+
@itemTitle, @sellerId, @timeRemaining, @timestamp, @metadata
|
|
988
|
+
)
|
|
989
|
+
`).run({
|
|
990
|
+
observationId: observation.observationId,
|
|
991
|
+
observationType: observation.observationType,
|
|
992
|
+
agentId: observation.agentId,
|
|
993
|
+
swarmId: observation.swarmId,
|
|
994
|
+
listingId: observation.listingId ?? null,
|
|
995
|
+
recommendedAction: observation.recommendedAction,
|
|
996
|
+
recommendedAmount: observation.recommendedAmount ?? null,
|
|
997
|
+
marketCondition: observation.marketCondition,
|
|
998
|
+
confidenceScore: observation.confidenceScore,
|
|
999
|
+
reasoning: observation.reasoning,
|
|
1000
|
+
currentPrice: observation.currentPrice,
|
|
1001
|
+
marketAverage: observation.marketAverage ?? null,
|
|
1002
|
+
discountPercent: observation.discountPercent ?? null,
|
|
1003
|
+
competitionLevel: observation.competitionLevel,
|
|
1004
|
+
itemTitle: observation.itemTitle ?? null,
|
|
1005
|
+
sellerId: observation.sellerId ?? null,
|
|
1006
|
+
timeRemaining: observation.timeRemaining ?? null,
|
|
1007
|
+
timestamp: observation.timestamp,
|
|
1008
|
+
metadata: observation.metadata ? JSON.stringify(observation.metadata) : null,
|
|
1009
|
+
});
|
|
1010
|
+
}
|
|
1011
|
+
/**
|
|
1012
|
+
* Query observations with filters.
|
|
1013
|
+
* If swarmId is not provided, queries across all swarms.
|
|
1014
|
+
*/
|
|
1015
|
+
export function queryObservations(filters) {
|
|
1016
|
+
const db = getSwarmDatabase();
|
|
1017
|
+
let query = 'SELECT * FROM observations WHERE 1=1';
|
|
1018
|
+
const params = {};
|
|
1019
|
+
if (filters.swarmId) {
|
|
1020
|
+
query += ' AND swarm_id = @swarmId';
|
|
1021
|
+
params.swarmId = filters.swarmId;
|
|
1022
|
+
}
|
|
1023
|
+
if (filters.agentId) {
|
|
1024
|
+
query += ' AND agent_id = @agentId';
|
|
1025
|
+
params.agentId = filters.agentId;
|
|
1026
|
+
}
|
|
1027
|
+
if (filters.observationTypes && filters.observationTypes.length > 0) {
|
|
1028
|
+
query += ` AND observation_type IN (${filters.observationTypes.map((_, i) => `@obsType${i}`).join(',')})`;
|
|
1029
|
+
filters.observationTypes.forEach((ot, i) => {
|
|
1030
|
+
params[`obsType${i}`] = ot;
|
|
1031
|
+
});
|
|
1032
|
+
}
|
|
1033
|
+
if (filters.listingId) {
|
|
1034
|
+
query += ' AND listing_id = @listingId';
|
|
1035
|
+
params.listingId = filters.listingId;
|
|
1036
|
+
}
|
|
1037
|
+
if (filters.marketCondition) {
|
|
1038
|
+
query += ' AND market_condition = @marketCondition';
|
|
1039
|
+
params.marketCondition = filters.marketCondition;
|
|
1040
|
+
}
|
|
1041
|
+
if (filters.minConfidence !== undefined) {
|
|
1042
|
+
query += ' AND confidence_score >= @minConfidence';
|
|
1043
|
+
params.minConfidence = filters.minConfidence;
|
|
1044
|
+
}
|
|
1045
|
+
if (filters.since) {
|
|
1046
|
+
query += ' AND timestamp >= @since';
|
|
1047
|
+
params.since = filters.since;
|
|
1048
|
+
}
|
|
1049
|
+
if (filters.until) {
|
|
1050
|
+
query += ' AND timestamp <= @until';
|
|
1051
|
+
params.until = filters.until;
|
|
1052
|
+
}
|
|
1053
|
+
query += ' ORDER BY timestamp DESC';
|
|
1054
|
+
if (filters.limit) {
|
|
1055
|
+
query += ' LIMIT @limit';
|
|
1056
|
+
params.limit = filters.limit;
|
|
1057
|
+
}
|
|
1058
|
+
const rows = db.prepare(query).all(params);
|
|
1059
|
+
return rows.map(row => ({
|
|
1060
|
+
observationId: row.observation_id,
|
|
1061
|
+
observationType: row.observation_type,
|
|
1062
|
+
agentId: row.agent_id,
|
|
1063
|
+
swarmId: row.swarm_id,
|
|
1064
|
+
listingId: row.listing_id,
|
|
1065
|
+
recommendedAction: row.recommended_action,
|
|
1066
|
+
recommendedAmount: row.recommended_amount,
|
|
1067
|
+
marketCondition: row.market_condition,
|
|
1068
|
+
confidenceScore: row.confidence_score,
|
|
1069
|
+
reasoning: row.reasoning,
|
|
1070
|
+
currentPrice: row.current_price,
|
|
1071
|
+
marketAverage: row.market_average,
|
|
1072
|
+
discountPercent: row.discount_percent,
|
|
1073
|
+
competitionLevel: row.competition_level,
|
|
1074
|
+
itemTitle: row.item_title,
|
|
1075
|
+
sellerId: row.seller_id,
|
|
1076
|
+
timeRemaining: row.time_remaining,
|
|
1077
|
+
timestamp: row.timestamp,
|
|
1078
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
1079
|
+
}));
|
|
1080
|
+
}
|
|
1081
|
+
/**
|
|
1082
|
+
* Get observations for a specific listing (for multi-agent consensus).
|
|
1083
|
+
*/
|
|
1084
|
+
export function getListingObservations(listingId) {
|
|
1085
|
+
const db = getSwarmDatabase();
|
|
1086
|
+
const rows = db.prepare(`
|
|
1087
|
+
SELECT * FROM observations
|
|
1088
|
+
WHERE listing_id = ?
|
|
1089
|
+
ORDER BY timestamp DESC
|
|
1090
|
+
`).all(listingId);
|
|
1091
|
+
return rows.map(row => ({
|
|
1092
|
+
observationId: row.observation_id,
|
|
1093
|
+
observationType: row.observation_type,
|
|
1094
|
+
agentId: row.agent_id,
|
|
1095
|
+
swarmId: row.swarm_id,
|
|
1096
|
+
listingId: row.listing_id,
|
|
1097
|
+
recommendedAction: row.recommended_action,
|
|
1098
|
+
recommendedAmount: row.recommended_amount,
|
|
1099
|
+
marketCondition: row.market_condition,
|
|
1100
|
+
confidenceScore: row.confidence_score,
|
|
1101
|
+
reasoning: row.reasoning,
|
|
1102
|
+
currentPrice: row.current_price,
|
|
1103
|
+
marketAverage: row.market_average,
|
|
1104
|
+
discountPercent: row.discount_percent,
|
|
1105
|
+
competitionLevel: row.competition_level,
|
|
1106
|
+
itemTitle: row.item_title,
|
|
1107
|
+
sellerId: row.seller_id,
|
|
1108
|
+
timeRemaining: row.time_remaining,
|
|
1109
|
+
timestamp: row.timestamp,
|
|
1110
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
1111
|
+
}));
|
|
1112
|
+
}
|
|
1113
|
+
/**
|
|
1114
|
+
* Get high-confidence opportunities (for alerts).
|
|
1115
|
+
*/
|
|
1116
|
+
export function getHighConfidenceOpportunities(swarmId, minConfidence = 0.75) {
|
|
1117
|
+
const db = getSwarmDatabase();
|
|
1118
|
+
const rows = db.prepare(`
|
|
1119
|
+
SELECT * FROM observations
|
|
1120
|
+
WHERE swarm_id = ?
|
|
1121
|
+
AND confidence_score >= ?
|
|
1122
|
+
AND observation_type = 'OPPORTUNITY_IDENTIFIED'
|
|
1123
|
+
ORDER BY confidence_score DESC, timestamp DESC
|
|
1124
|
+
LIMIT 50
|
|
1125
|
+
`).all(swarmId, minConfidence);
|
|
1126
|
+
return rows.map(row => ({
|
|
1127
|
+
observationId: row.observation_id,
|
|
1128
|
+
observationType: row.observation_type,
|
|
1129
|
+
agentId: row.agent_id,
|
|
1130
|
+
swarmId: row.swarm_id,
|
|
1131
|
+
listingId: row.listing_id,
|
|
1132
|
+
recommendedAction: row.recommended_action,
|
|
1133
|
+
recommendedAmount: row.recommended_amount,
|
|
1134
|
+
marketCondition: row.market_condition,
|
|
1135
|
+
confidenceScore: row.confidence_score,
|
|
1136
|
+
reasoning: row.reasoning,
|
|
1137
|
+
currentPrice: row.current_price,
|
|
1138
|
+
marketAverage: row.market_average,
|
|
1139
|
+
discountPercent: row.discount_percent,
|
|
1140
|
+
competitionLevel: row.competition_level,
|
|
1141
|
+
itemTitle: row.item_title,
|
|
1142
|
+
sellerId: row.seller_id,
|
|
1143
|
+
timeRemaining: row.time_remaining,
|
|
1144
|
+
timestamp: row.timestamp,
|
|
1145
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
1146
|
+
}));
|
|
1147
|
+
}
|
|
1148
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
1149
|
+
// ALERT OPERATIONS
|
|
1150
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
1151
|
+
/**
|
|
1152
|
+
* Create a new alert.
|
|
1153
|
+
*/
|
|
1154
|
+
export function createAlert(alert) {
|
|
1155
|
+
const db = getSwarmDatabase();
|
|
1156
|
+
db.prepare(`
|
|
1157
|
+
INSERT INTO alerts (
|
|
1158
|
+
alert_id, alert_type, severity, swarm_id, trigger_observation_ids,
|
|
1159
|
+
listing_id, recommended_action, recommended_amount, estimated_value,
|
|
1160
|
+
confidence, summary, requires_approval, approval_deadline, status,
|
|
1161
|
+
created_at, updated_at
|
|
1162
|
+
) VALUES (
|
|
1163
|
+
@alertId, @alertType, @severity, @swarmId, @triggerObservationIds,
|
|
1164
|
+
@listingId, @recommendedAction, @recommendedAmount, @estimatedValue,
|
|
1165
|
+
@confidence, @summary, @requiresApproval, @approvalDeadline, @status,
|
|
1166
|
+
@createdAt, @updatedAt
|
|
1167
|
+
)
|
|
1168
|
+
`).run({
|
|
1169
|
+
alertId: alert.alertId,
|
|
1170
|
+
alertType: alert.alertType,
|
|
1171
|
+
severity: alert.severity,
|
|
1172
|
+
swarmId: alert.swarmId,
|
|
1173
|
+
triggerObservationIds: JSON.stringify(alert.triggerObservationIds),
|
|
1174
|
+
listingId: alert.listingId,
|
|
1175
|
+
recommendedAction: alert.recommendedAction,
|
|
1176
|
+
recommendedAmount: alert.recommendedAmount ?? null,
|
|
1177
|
+
estimatedValue: alert.estimatedValue,
|
|
1178
|
+
confidence: alert.confidence,
|
|
1179
|
+
summary: alert.summary,
|
|
1180
|
+
requiresApproval: alert.requiresApproval ? 1 : 0,
|
|
1181
|
+
approvalDeadline: alert.approvalDeadline ?? null,
|
|
1182
|
+
status: alert.status,
|
|
1183
|
+
createdAt: alert.createdAt,
|
|
1184
|
+
updatedAt: alert.updatedAt,
|
|
1185
|
+
});
|
|
1186
|
+
}
|
|
1187
|
+
/**
|
|
1188
|
+
* Get an alert by ID.
|
|
1189
|
+
*/
|
|
1190
|
+
export function getAlert(alertId) {
|
|
1191
|
+
const db = getSwarmDatabase();
|
|
1192
|
+
const row = db.prepare(`
|
|
1193
|
+
SELECT * FROM alerts WHERE alert_id = ?
|
|
1194
|
+
`).get(alertId);
|
|
1195
|
+
if (!row)
|
|
1196
|
+
return null;
|
|
1197
|
+
return {
|
|
1198
|
+
alertId: row.alert_id,
|
|
1199
|
+
alertType: row.alert_type,
|
|
1200
|
+
severity: row.severity,
|
|
1201
|
+
swarmId: row.swarm_id,
|
|
1202
|
+
triggerObservationIds: JSON.parse(row.trigger_observation_ids),
|
|
1203
|
+
listingId: row.listing_id,
|
|
1204
|
+
recommendedAction: row.recommended_action,
|
|
1205
|
+
recommendedAmount: row.recommended_amount,
|
|
1206
|
+
estimatedValue: row.estimated_value,
|
|
1207
|
+
confidence: row.confidence,
|
|
1208
|
+
summary: row.summary,
|
|
1209
|
+
requiresApproval: row.requires_approval === 1,
|
|
1210
|
+
approvalDeadline: row.approval_deadline,
|
|
1211
|
+
status: row.status,
|
|
1212
|
+
resolvedBy: row.resolved_by,
|
|
1213
|
+
resolvedAt: row.resolved_at,
|
|
1214
|
+
resolutionNotes: row.resolution_notes,
|
|
1215
|
+
createdAt: row.created_at,
|
|
1216
|
+
updatedAt: row.updated_at,
|
|
1217
|
+
};
|
|
1218
|
+
}
|
|
1219
|
+
/**
|
|
1220
|
+
* Update alert status (for approval workflow).
|
|
1221
|
+
*/
|
|
1222
|
+
export function updateAlertStatus(alertId, status, resolvedBy, resolutionNotes) {
|
|
1223
|
+
const db = getSwarmDatabase();
|
|
1224
|
+
const result = db.prepare(`
|
|
1225
|
+
UPDATE alerts
|
|
1226
|
+
SET status = @status,
|
|
1227
|
+
resolved_by = @resolvedBy,
|
|
1228
|
+
resolved_at = datetime('now'),
|
|
1229
|
+
resolution_notes = @resolutionNotes,
|
|
1230
|
+
updated_at = datetime('now')
|
|
1231
|
+
WHERE alert_id = @alertId
|
|
1232
|
+
`).run({
|
|
1233
|
+
alertId,
|
|
1234
|
+
status,
|
|
1235
|
+
resolvedBy: resolvedBy ?? null,
|
|
1236
|
+
resolutionNotes: resolutionNotes ?? null,
|
|
1237
|
+
});
|
|
1238
|
+
return result.changes > 0;
|
|
1239
|
+
}
|
|
1240
|
+
/**
|
|
1241
|
+
* Get pending alerts for a swarm.
|
|
1242
|
+
*/
|
|
1243
|
+
export function getPendingAlerts(swarmId) {
|
|
1244
|
+
const db = getSwarmDatabase();
|
|
1245
|
+
const rows = db.prepare(`
|
|
1246
|
+
SELECT * FROM alerts
|
|
1247
|
+
WHERE swarm_id = ? AND status = 'PENDING'
|
|
1248
|
+
ORDER BY severity DESC, created_at ASC
|
|
1249
|
+
`).all(swarmId);
|
|
1250
|
+
return rows.map(row => ({
|
|
1251
|
+
alertId: row.alert_id,
|
|
1252
|
+
alertType: row.alert_type,
|
|
1253
|
+
severity: row.severity,
|
|
1254
|
+
swarmId: row.swarm_id,
|
|
1255
|
+
triggerObservationIds: JSON.parse(row.trigger_observation_ids),
|
|
1256
|
+
listingId: row.listing_id,
|
|
1257
|
+
recommendedAction: row.recommended_action,
|
|
1258
|
+
recommendedAmount: row.recommended_amount,
|
|
1259
|
+
estimatedValue: row.estimated_value,
|
|
1260
|
+
confidence: row.confidence,
|
|
1261
|
+
summary: row.summary,
|
|
1262
|
+
requiresApproval: row.requires_approval === 1,
|
|
1263
|
+
approvalDeadline: row.approval_deadline,
|
|
1264
|
+
status: row.status,
|
|
1265
|
+
resolvedBy: row.resolved_by,
|
|
1266
|
+
resolvedAt: row.resolved_at,
|
|
1267
|
+
resolutionNotes: row.resolution_notes,
|
|
1268
|
+
createdAt: row.created_at,
|
|
1269
|
+
updatedAt: row.updated_at,
|
|
1270
|
+
}));
|
|
1271
|
+
}
|
|
1272
|
+
/**
|
|
1273
|
+
* Expire alerts past their deadline.
|
|
1274
|
+
*/
|
|
1275
|
+
export function expireOverdueAlerts() {
|
|
1276
|
+
const db = getSwarmDatabase();
|
|
1277
|
+
const result = db.prepare(`
|
|
1278
|
+
UPDATE alerts
|
|
1279
|
+
SET status = 'EXPIRED', updated_at = datetime('now')
|
|
1280
|
+
WHERE status = 'PENDING'
|
|
1281
|
+
AND approval_deadline IS NOT NULL
|
|
1282
|
+
AND approval_deadline < datetime('now')
|
|
1283
|
+
`).run();
|
|
1284
|
+
return result.changes;
|
|
1285
|
+
}
|
|
1286
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
1287
|
+
// SELLER PROFILE OPERATIONS
|
|
1288
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
1289
|
+
/**
|
|
1290
|
+
* Upsert a seller profile.
|
|
1291
|
+
*/
|
|
1292
|
+
export function upsertSellerProfile(profile) {
|
|
1293
|
+
const db = getSwarmDatabase();
|
|
1294
|
+
db.prepare(`
|
|
1295
|
+
INSERT INTO seller_profiles (
|
|
1296
|
+
seller_id, feedback_score, feedback_percent, total_interactions,
|
|
1297
|
+
successful_acquisitions, avg_discount_achieved, negotiation_style,
|
|
1298
|
+
best_offer_acceptance_rate, avg_offer_response_time, risk_level,
|
|
1299
|
+
first_seen_at, last_updated_at, metadata
|
|
1300
|
+
) VALUES (
|
|
1301
|
+
@sellerId, @feedbackScore, @feedbackPercent, @totalInteractions,
|
|
1302
|
+
@successfulAcquisitions, @avgDiscountAchieved, @negotiationStyle,
|
|
1303
|
+
@bestOfferAcceptanceRate, @avgOfferResponseTime, @riskLevel,
|
|
1304
|
+
@firstSeenAt, @lastUpdatedAt, @metadata
|
|
1305
|
+
)
|
|
1306
|
+
ON CONFLICT (seller_id) DO UPDATE SET
|
|
1307
|
+
feedback_score = @feedbackScore,
|
|
1308
|
+
feedback_percent = @feedbackPercent,
|
|
1309
|
+
total_interactions = @totalInteractions,
|
|
1310
|
+
successful_acquisitions = @successfulAcquisitions,
|
|
1311
|
+
avg_discount_achieved = @avgDiscountAchieved,
|
|
1312
|
+
negotiation_style = @negotiationStyle,
|
|
1313
|
+
best_offer_acceptance_rate = @bestOfferAcceptanceRate,
|
|
1314
|
+
avg_offer_response_time = @avgOfferResponseTime,
|
|
1315
|
+
risk_level = @riskLevel,
|
|
1316
|
+
last_updated_at = @lastUpdatedAt,
|
|
1317
|
+
metadata = @metadata
|
|
1318
|
+
`).run({
|
|
1319
|
+
sellerId: profile.sellerId,
|
|
1320
|
+
feedbackScore: profile.feedbackScore ?? null,
|
|
1321
|
+
feedbackPercent: profile.feedbackPercent ?? null,
|
|
1322
|
+
totalInteractions: profile.totalInteractions,
|
|
1323
|
+
successfulAcquisitions: profile.successfulAcquisitions,
|
|
1324
|
+
avgDiscountAchieved: profile.avgDiscountAchieved ?? null,
|
|
1325
|
+
negotiationStyle: profile.negotiationStyle,
|
|
1326
|
+
bestOfferAcceptanceRate: profile.bestOfferAcceptanceRate ?? null,
|
|
1327
|
+
avgOfferResponseTime: profile.avgOfferResponseTime ?? null,
|
|
1328
|
+
riskLevel: profile.riskLevel,
|
|
1329
|
+
firstSeenAt: profile.firstSeenAt,
|
|
1330
|
+
lastUpdatedAt: profile.lastUpdatedAt,
|
|
1331
|
+
metadata: profile.metadata ? JSON.stringify(profile.metadata) : null,
|
|
1332
|
+
});
|
|
1333
|
+
}
|
|
1334
|
+
/**
|
|
1335
|
+
* Get a seller profile.
|
|
1336
|
+
*/
|
|
1337
|
+
export function getSellerProfile(sellerId) {
|
|
1338
|
+
const db = getSwarmDatabase();
|
|
1339
|
+
const row = db.prepare(`
|
|
1340
|
+
SELECT * FROM seller_profiles WHERE seller_id = ?
|
|
1341
|
+
`).get(sellerId);
|
|
1342
|
+
if (!row)
|
|
1343
|
+
return null;
|
|
1344
|
+
return {
|
|
1345
|
+
sellerId: row.seller_id,
|
|
1346
|
+
feedbackScore: row.feedback_score,
|
|
1347
|
+
feedbackPercent: row.feedback_percent,
|
|
1348
|
+
totalInteractions: row.total_interactions,
|
|
1349
|
+
successfulAcquisitions: row.successful_acquisitions,
|
|
1350
|
+
avgDiscountAchieved: row.avg_discount_achieved,
|
|
1351
|
+
negotiationStyle: row.negotiation_style,
|
|
1352
|
+
bestOfferAcceptanceRate: row.best_offer_acceptance_rate,
|
|
1353
|
+
avgOfferResponseTime: row.avg_offer_response_time,
|
|
1354
|
+
riskLevel: row.risk_level,
|
|
1355
|
+
firstSeenAt: row.first_seen_at,
|
|
1356
|
+
lastUpdatedAt: row.last_updated_at,
|
|
1357
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
1358
|
+
};
|
|
1359
|
+
}
|
|
1360
|
+
/**
|
|
1361
|
+
* List seller profiles by risk level.
|
|
1362
|
+
*/
|
|
1363
|
+
export function listSellersByRisk(riskLevel) {
|
|
1364
|
+
const db = getSwarmDatabase();
|
|
1365
|
+
let query = 'SELECT * FROM seller_profiles';
|
|
1366
|
+
const params = [];
|
|
1367
|
+
if (riskLevel) {
|
|
1368
|
+
query += ' WHERE risk_level = ?';
|
|
1369
|
+
params.push(riskLevel);
|
|
1370
|
+
}
|
|
1371
|
+
query += ' ORDER BY total_interactions DESC';
|
|
1372
|
+
const rows = db.prepare(query).all(...params);
|
|
1373
|
+
return rows.map(row => ({
|
|
1374
|
+
sellerId: row.seller_id,
|
|
1375
|
+
feedbackScore: row.feedback_score,
|
|
1376
|
+
feedbackPercent: row.feedback_percent,
|
|
1377
|
+
totalInteractions: row.total_interactions,
|
|
1378
|
+
successfulAcquisitions: row.successful_acquisitions,
|
|
1379
|
+
avgDiscountAchieved: row.avg_discount_achieved,
|
|
1380
|
+
negotiationStyle: row.negotiation_style,
|
|
1381
|
+
bestOfferAcceptanceRate: row.best_offer_acceptance_rate,
|
|
1382
|
+
avgOfferResponseTime: row.avg_offer_response_time,
|
|
1383
|
+
riskLevel: row.risk_level,
|
|
1384
|
+
firstSeenAt: row.first_seen_at,
|
|
1385
|
+
lastUpdatedAt: row.last_updated_at,
|
|
1386
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
1387
|
+
}));
|
|
1388
|
+
}
|
|
1389
|
+
//# sourceMappingURL=database.js.map
|