claude-code-swarm 0.3.4 → 0.3.6
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +22 -1
- package/.claude-plugin/run-agent-inbox-mcp.sh +95 -0
- package/.claude-plugin/run-minimem-mcp.sh +98 -0
- package/.claude-plugin/run-opentasks-mcp.sh +65 -0
- package/.gitattributes +3 -0
- package/.opentasks/config.json +9 -0
- package/.opentasks/graph.jsonl +0 -0
- package/CLAUDE.md +196 -36
- package/e2e/helpers/cleanup.mjs +17 -3
- package/e2e/helpers/map-mock-server.mjs +201 -25
- package/e2e/helpers/opentasks-daemon.mjs +149 -0
- package/e2e/helpers/sidecar.mjs +222 -0
- package/e2e/helpers/workspace.mjs +2 -1
- package/e2e/tier5-sidecar-inbox.test.mjs +900 -0
- package/e2e/tier6-inbox-mcp.test.mjs +173 -0
- package/e2e/tier6-live-agent.test.mjs +759 -0
- package/e2e/tier6-live-inbox-flow.test.mjs +938 -0
- package/e2e/tier7-hooks.test.mjs +992 -0
- package/e2e/tier7-minimem.test.mjs +461 -0
- package/e2e/tier7-opentasks.test.mjs +513 -0
- package/e2e/tier7-skilltree.test.mjs +506 -0
- package/e2e/vitest.config.e2e.mjs +1 -1
- package/hooks/hooks.json +15 -8
- package/package.json +17 -1
- package/references/agent-inbox/CLAUDE.md +151 -0
- package/references/agent-inbox/README.md +238 -0
- package/references/agent-inbox/docs/CLAUDE-CODE-SWARM-PROPOSAL.md +137 -0
- package/references/agent-inbox/docs/DESIGN.md +1156 -0
- package/references/agent-inbox/hooks/inbox-hook.mjs +119 -0
- package/references/agent-inbox/hooks/register-hook.mjs +69 -0
- package/references/agent-inbox/package-lock.json +3347 -0
- package/references/agent-inbox/package.json +58 -0
- package/references/agent-inbox/rules/agent-inbox.md +78 -0
- package/references/agent-inbox/src/federation/address.ts +61 -0
- package/references/agent-inbox/src/federation/connection-manager.ts +573 -0
- package/references/agent-inbox/src/federation/delivery-queue.ts +222 -0
- package/references/agent-inbox/src/federation/index.ts +6 -0
- package/references/agent-inbox/src/federation/routing-engine.ts +188 -0
- package/references/agent-inbox/src/federation/trust.ts +71 -0
- package/references/agent-inbox/src/index.ts +404 -0
- package/references/agent-inbox/src/ipc/ipc-server.ts +265 -0
- package/references/agent-inbox/src/jsonrpc/mail-server.ts +382 -0
- package/references/agent-inbox/src/map/map-client.ts +414 -0
- package/references/agent-inbox/src/mcp/mcp-proxy.ts +326 -0
- package/references/agent-inbox/src/mcp/mcp-server.ts +272 -0
- package/references/agent-inbox/src/mesh/delivery-bridge.ts +110 -0
- package/references/agent-inbox/src/mesh/mesh-connector.ts +41 -0
- package/references/agent-inbox/src/mesh/mesh-transport.ts +157 -0
- package/references/agent-inbox/src/mesh/type-mapper.ts +239 -0
- package/references/agent-inbox/src/push/notifier.ts +233 -0
- package/references/agent-inbox/src/registry/warm-registry.ts +255 -0
- package/references/agent-inbox/src/router/message-router.ts +175 -0
- package/references/agent-inbox/src/storage/interface.ts +48 -0
- package/references/agent-inbox/src/storage/memory.ts +145 -0
- package/references/agent-inbox/src/storage/sqlite.ts +671 -0
- package/references/agent-inbox/src/traceability/traceability.ts +183 -0
- package/references/agent-inbox/src/types.ts +329 -0
- package/references/agent-inbox/test/federation/address.test.ts +101 -0
- package/references/agent-inbox/test/federation/connection-manager.test.ts +546 -0
- package/references/agent-inbox/test/federation/delivery-queue.test.ts +159 -0
- package/references/agent-inbox/test/federation/integration.test.ts +857 -0
- package/references/agent-inbox/test/federation/routing-engine.test.ts +117 -0
- package/references/agent-inbox/test/federation/sdk-integration.test.ts +744 -0
- package/references/agent-inbox/test/federation/trust.test.ts +89 -0
- package/references/agent-inbox/test/ipc-jsonrpc.test.ts +113 -0
- package/references/agent-inbox/test/ipc-new-commands.test.ts +200 -0
- package/references/agent-inbox/test/ipc-server.test.ts +197 -0
- package/references/agent-inbox/test/mail-server.test.ts +285 -0
- package/references/agent-inbox/test/map-client.test.ts +408 -0
- package/references/agent-inbox/test/mcp-proxy.test.ts +191 -0
- package/references/agent-inbox/test/mesh/delivery-bridge.test.ts +178 -0
- package/references/agent-inbox/test/mesh/e2e-mesh.test.ts +527 -0
- package/references/agent-inbox/test/mesh/e2e-real-meshpeer.test.ts +629 -0
- package/references/agent-inbox/test/mesh/federation-mesh.test.ts +269 -0
- package/references/agent-inbox/test/mesh/mesh-connector.test.ts +66 -0
- package/references/agent-inbox/test/mesh/mesh-transport.test.ts +191 -0
- package/references/agent-inbox/test/mesh/meshpeer-integration.test.ts +442 -0
- package/references/agent-inbox/test/mesh/mock-mesh.ts +125 -0
- package/references/agent-inbox/test/mesh/mock-meshpeer.ts +266 -0
- package/references/agent-inbox/test/mesh/type-mapper.test.ts +226 -0
- package/references/agent-inbox/test/message-router.test.ts +184 -0
- package/references/agent-inbox/test/push-notifier.test.ts +139 -0
- package/references/agent-inbox/test/registry/warm-registry.test.ts +171 -0
- package/references/agent-inbox/test/sqlite-prefix.test.ts +192 -0
- package/references/agent-inbox/test/sqlite-storage.test.ts +243 -0
- package/references/agent-inbox/test/storage.test.ts +196 -0
- package/references/agent-inbox/test/traceability.test.ts +123 -0
- package/references/agent-inbox/test/wake.test.ts +330 -0
- package/references/agent-inbox/tsconfig.json +20 -0
- package/references/agent-inbox/tsup.config.ts +10 -0
- package/references/agent-inbox/vitest.config.ts +8 -0
- package/references/minimem/.claude/settings.json +7 -0
- package/references/minimem/.sudocode/issues.jsonl +18 -0
- package/references/minimem/.sudocode/specs.jsonl +1 -0
- package/references/minimem/CLAUDE.md +329 -0
- package/references/minimem/README.md +565 -0
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
- package/references/minimem/claude-plugin/.mcp.json +7 -0
- package/references/minimem/claude-plugin/README.md +158 -0
- package/references/minimem/claude-plugin/commands/recall.md +47 -0
- package/references/minimem/claude-plugin/commands/remember.md +41 -0
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
- package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
- package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
- package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
- package/references/minimem/media/banner.png +0 -0
- package/references/minimem/package-lock.json +5373 -0
- package/references/minimem/package.json +76 -0
- package/references/minimem/scripts/postbuild.js +49 -0
- package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
- package/references/minimem/src/__tests__/errors.test.ts +265 -0
- package/references/minimem/src/__tests__/helpers.ts +199 -0
- package/references/minimem/src/__tests__/internal.test.ts +407 -0
- package/references/minimem/src/__tests__/knowledge-frontmatter.test.ts +148 -0
- package/references/minimem/src/__tests__/knowledge.test.ts +148 -0
- package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
- package/references/minimem/src/__tests__/session.test.ts +190 -0
- package/references/minimem/src/cli/__tests__/commands.test.ts +760 -0
- package/references/minimem/src/cli/__tests__/contained-layout.test.ts +286 -0
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
- package/references/minimem/src/cli/commands/append.ts +76 -0
- package/references/minimem/src/cli/commands/config.ts +262 -0
- package/references/minimem/src/cli/commands/conflicts.ts +415 -0
- package/references/minimem/src/cli/commands/daemon.ts +169 -0
- package/references/minimem/src/cli/commands/index.ts +12 -0
- package/references/minimem/src/cli/commands/init.ts +166 -0
- package/references/minimem/src/cli/commands/mcp.ts +221 -0
- package/references/minimem/src/cli/commands/push-pull.ts +213 -0
- package/references/minimem/src/cli/commands/search.ts +223 -0
- package/references/minimem/src/cli/commands/status.ts +84 -0
- package/references/minimem/src/cli/commands/store.ts +189 -0
- package/references/minimem/src/cli/commands/sync-init.ts +290 -0
- package/references/minimem/src/cli/commands/sync.ts +70 -0
- package/references/minimem/src/cli/commands/upsert.ts +197 -0
- package/references/minimem/src/cli/config.ts +611 -0
- package/references/minimem/src/cli/index.ts +299 -0
- package/references/minimem/src/cli/shared.ts +189 -0
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
- package/references/minimem/src/cli/sync/central.ts +292 -0
- package/references/minimem/src/cli/sync/conflicts.ts +205 -0
- package/references/minimem/src/cli/sync/daemon.ts +407 -0
- package/references/minimem/src/cli/sync/detection.ts +138 -0
- package/references/minimem/src/cli/sync/index.ts +107 -0
- package/references/minimem/src/cli/sync/operations.ts +373 -0
- package/references/minimem/src/cli/sync/registry.ts +279 -0
- package/references/minimem/src/cli/sync/state.ts +358 -0
- package/references/minimem/src/cli/sync/validation.ts +206 -0
- package/references/minimem/src/cli/sync/watcher.ts +237 -0
- package/references/minimem/src/cli/version.ts +34 -0
- package/references/minimem/src/core/index.ts +9 -0
- package/references/minimem/src/core/indexer.ts +628 -0
- package/references/minimem/src/core/searcher.ts +221 -0
- package/references/minimem/src/db/schema.ts +183 -0
- package/references/minimem/src/db/sqlite-vec.ts +24 -0
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
- package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
- package/references/minimem/src/embeddings/batch-openai.ts +409 -0
- package/references/minimem/src/embeddings/embeddings.ts +434 -0
- package/references/minimem/src/index.ts +132 -0
- package/references/minimem/src/internal.ts +299 -0
- package/references/minimem/src/minimem.ts +1291 -0
- package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
- package/references/minimem/src/search/graph.ts +234 -0
- package/references/minimem/src/search/hybrid.ts +151 -0
- package/references/minimem/src/search/search.ts +256 -0
- package/references/minimem/src/server/__tests__/mcp.test.ts +347 -0
- package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
- package/references/minimem/src/server/mcp.ts +326 -0
- package/references/minimem/src/server/tools.ts +720 -0
- package/references/minimem/src/session.ts +460 -0
- package/references/minimem/src/store/__tests__/manifest.test.ts +177 -0
- package/references/minimem/src/store/__tests__/materialize.test.ts +52 -0
- package/references/minimem/src/store/__tests__/store-graph.test.ts +228 -0
- package/references/minimem/src/store/index.ts +27 -0
- package/references/minimem/src/store/manifest.ts +203 -0
- package/references/minimem/src/store/materialize.ts +185 -0
- package/references/minimem/src/store/store-graph.ts +252 -0
- package/references/minimem/tsconfig.json +19 -0
- package/references/minimem/tsup.config.ts +26 -0
- package/references/minimem/vitest.config.ts +29 -0
- package/references/multi-agent-protocol/.sudocode/issues.jsonl +120 -0
- package/references/multi-agent-protocol/.sudocode/specs.jsonl +15 -0
- package/references/multi-agent-protocol/LICENSE +21 -0
- package/references/multi-agent-protocol/README.md +113 -0
- package/references/multi-agent-protocol/docs/00-design-specification.md +496 -0
- package/references/multi-agent-protocol/docs/01-open-questions.md +1050 -0
- package/references/multi-agent-protocol/docs/02-wire-protocol.md +296 -0
- package/references/multi-agent-protocol/docs/03-streaming-semantics.md +252 -0
- package/references/multi-agent-protocol/docs/04-error-handling.md +231 -0
- package/references/multi-agent-protocol/docs/05-connection-model.md +244 -0
- package/references/multi-agent-protocol/docs/06-visibility-permissions.md +243 -0
- package/references/multi-agent-protocol/docs/07-federation.md +335 -0
- package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +253 -0
- package/references/multi-agent-protocol/docs/09-authentication.md +748 -0
- package/references/multi-agent-protocol/docs/10-environment-awareness.md +242 -0
- package/references/multi-agent-protocol/docs/10-mail-protocol.md +553 -0
- package/references/multi-agent-protocol/docs/11-anp-inspired-improvements.md +1079 -0
- package/references/multi-agent-protocol/docs/11-trajectory-protocol.md +292 -0
- package/references/multi-agent-protocol/docs/12-anp-implementation-plan.md +641 -0
- package/references/multi-agent-protocol/docs/agent-iam-integration.md +877 -0
- package/references/multi-agent-protocol/docs/agentic-mesh-integration-draft.md +459 -0
- package/references/multi-agent-protocol/docs/git-transport-draft.md +251 -0
- package/references/multi-agent-protocol/docs-site/Gemfile +22 -0
- package/references/multi-agent-protocol/docs-site/README.md +82 -0
- package/references/multi-agent-protocol/docs-site/_config.yml +91 -0
- package/references/multi-agent-protocol/docs-site/_includes/head_custom.html +20 -0
- package/references/multi-agent-protocol/docs-site/_sass/color_schemes/map.scss +42 -0
- package/references/multi-agent-protocol/docs-site/_sass/custom/custom.scss +34 -0
- package/references/multi-agent-protocol/docs-site/examples/full-integration.md +510 -0
- package/references/multi-agent-protocol/docs-site/examples/index.md +138 -0
- package/references/multi-agent-protocol/docs-site/examples/simple-chat.md +282 -0
- package/references/multi-agent-protocol/docs-site/examples/task-queue.md +399 -0
- package/references/multi-agent-protocol/docs-site/getting-started/index.md +98 -0
- package/references/multi-agent-protocol/docs-site/getting-started/installation.md +219 -0
- package/references/multi-agent-protocol/docs-site/getting-started/overview.md +172 -0
- package/references/multi-agent-protocol/docs-site/getting-started/quickstart.md +237 -0
- package/references/multi-agent-protocol/docs-site/index.md +136 -0
- package/references/multi-agent-protocol/docs-site/protocol/authentication.md +391 -0
- package/references/multi-agent-protocol/docs-site/protocol/connection-model.md +376 -0
- package/references/multi-agent-protocol/docs-site/protocol/design.md +284 -0
- package/references/multi-agent-protocol/docs-site/protocol/error-handling.md +312 -0
- package/references/multi-agent-protocol/docs-site/protocol/federation.md +449 -0
- package/references/multi-agent-protocol/docs-site/protocol/index.md +129 -0
- package/references/multi-agent-protocol/docs-site/protocol/permissions.md +398 -0
- package/references/multi-agent-protocol/docs-site/protocol/streaming.md +353 -0
- package/references/multi-agent-protocol/docs-site/protocol/wire-protocol.md +369 -0
- package/references/multi-agent-protocol/docs-site/sdk/api/agent.md +357 -0
- package/references/multi-agent-protocol/docs-site/sdk/api/client.md +380 -0
- package/references/multi-agent-protocol/docs-site/sdk/api/index.md +62 -0
- package/references/multi-agent-protocol/docs-site/sdk/api/server.md +453 -0
- package/references/multi-agent-protocol/docs-site/sdk/api/types.md +468 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/agent.md +375 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/authentication.md +405 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/client.md +352 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/index.md +89 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/server.md +360 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/testing.md +446 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/transports.md +363 -0
- package/references/multi-agent-protocol/docs-site/sdk/index.md +206 -0
- package/references/multi-agent-protocol/package-lock.json +4230 -0
- package/references/multi-agent-protocol/package.json +56 -0
- package/references/multi-agent-protocol/schema/meta.json +584 -0
- package/references/multi-agent-protocol/schema/schema.json +3067 -0
- package/references/openhive/.claude/settings.json +6 -0
- package/references/openhive/.dockerignore +54 -0
- package/references/openhive/.github/workflows/docker.yml +52 -0
- package/references/openhive/.sudocode/issues.jsonl +24 -0
- package/references/openhive/.sudocode/specs.jsonl +4 -0
- package/references/openhive/CLAUDE.md +88 -0
- package/references/openhive/Dockerfile +105 -0
- package/references/openhive/README.md +745 -0
- package/references/openhive/bin/openhive.js +6 -0
- package/references/openhive/cloudbuild.yaml +80 -0
- package/references/openhive/deploy/cloud-run.sh +106 -0
- package/references/openhive/deploy/openhive.env.example +80 -0
- package/references/openhive/deploy/openhive.service +91 -0
- package/references/openhive/docker-compose.yml +67 -0
- package/references/openhive/docker-entrypoint.sh +117 -0
- package/references/openhive/docs/API_MIGRATION.md +176 -0
- package/references/openhive/docs/DEPLOYMENT.md +847 -0
- package/references/openhive/docs/DESIGN_v1.md +489 -0
- package/references/openhive/docs/DESIGN_v2.md +564 -0
- package/references/openhive/docs/HEADSCALE_HOSTING_SPEC.md +513 -0
- package/references/openhive/docs/HIVE_SYNC_DESIGN.md +2362 -0
- package/references/openhive/docs/HIVE_SYNC_IMPLEMENTATION_PLAN.md +1169 -0
- package/references/openhive/docs/HOSTING.md +601 -0
- package/references/openhive/docs/IMPLEMENTATION_PLAN.md +428 -0
- package/references/openhive/docs/LOCAL_SETUP.md +506 -0
- package/references/openhive/docs/MACRO_AGENT_ATLAS_EXTENSION.md +351 -0
- package/references/openhive/docs/MEMORY_BANK_SYNC_SPEC.md +909 -0
- package/references/openhive/docs/PLAN_v1.md +471 -0
- package/references/openhive/docs/PLAN_v2.md +623 -0
- package/references/openhive/docs/WEBSOCKET.md +267 -0
- package/references/openhive/docs/openswarm-bootstrap-token-spec.md +240 -0
- package/references/openhive/ecosystem.config.cjs +76 -0
- package/references/openhive/fly.toml +63 -0
- package/references/openhive/package-lock.json +17640 -0
- package/references/openhive/package.json +128 -0
- package/references/openhive/packages/openhive-types/package-lock.json +1473 -0
- package/references/openhive/packages/openhive-types/package.json +42 -0
- package/references/openhive/packages/openhive-types/src/index.ts +36 -0
- package/references/openhive/packages/openhive-types/src/map-coordination.ts +92 -0
- package/references/openhive/packages/openhive-types/src/map-session-sync.ts +50 -0
- package/references/openhive/packages/openhive-types/src/map-sync.ts +68 -0
- package/references/openhive/packages/openhive-types/tsconfig.json +15 -0
- package/references/openhive/packages/openhive-types/tsconfig.tsbuildinfo +1 -0
- package/references/openhive/packages/openhive-types/tsup.config.ts +12 -0
- package/references/openhive/railway.json +13 -0
- package/references/openhive/railway.toml +24 -0
- package/references/openhive/render.yaml +51 -0
- package/references/openhive/src/__tests__/auth.test.ts +148 -0
- package/references/openhive/src/__tests__/bridge/credentials.test.ts +65 -0
- package/references/openhive/src/__tests__/bridge/dal.test.ts +279 -0
- package/references/openhive/src/__tests__/bridge/inbound.test.ts +349 -0
- package/references/openhive/src/__tests__/bridge/manager.test.ts +419 -0
- package/references/openhive/src/__tests__/bridge/mentions.test.ts +83 -0
- package/references/openhive/src/__tests__/bridge/outbound.test.ts +209 -0
- package/references/openhive/src/__tests__/bridge/slack-adapter.test.ts +276 -0
- package/references/openhive/src/__tests__/cli.test.ts +342 -0
- package/references/openhive/src/__tests__/config.test.ts +205 -0
- package/references/openhive/src/__tests__/coordination/coordination.test.ts +1072 -0
- package/references/openhive/src/__tests__/coordination/cross-instance.test.ts +540 -0
- package/references/openhive/src/__tests__/coordination/e2e.test.ts +780 -0
- package/references/openhive/src/__tests__/data-dir.test.ts +332 -0
- package/references/openhive/src/__tests__/db.test.ts +258 -0
- package/references/openhive/src/__tests__/discovery.test.ts +288 -0
- package/references/openhive/src/__tests__/events/dal.test.ts +371 -0
- package/references/openhive/src/__tests__/events/dispatch.test.ts +202 -0
- package/references/openhive/src/__tests__/events/e2e.test.ts +528 -0
- package/references/openhive/src/__tests__/events/normalizers.test.ts +263 -0
- package/references/openhive/src/__tests__/events/router.test.ts +314 -0
- package/references/openhive/src/__tests__/events/routes.test.ts +407 -0
- package/references/openhive/src/__tests__/follows.test.ts +328 -0
- package/references/openhive/src/__tests__/helpers/test-dirs.ts +44 -0
- package/references/openhive/src/__tests__/ingest-keys.test.ts +925 -0
- package/references/openhive/src/__tests__/map/sync-client-content.test.ts +288 -0
- package/references/openhive/src/__tests__/map/sync-client.test.ts +500 -0
- package/references/openhive/src/__tests__/map/sync-listener.test.ts +504 -0
- package/references/openhive/src/__tests__/middleware/hostname-guard.test.ts +73 -0
- package/references/openhive/src/__tests__/migrations.test.ts +260 -0
- package/references/openhive/src/__tests__/opentasks/client.test.ts +497 -0
- package/references/openhive/src/__tests__/opentasks/discovery.test.ts +283 -0
- package/references/openhive/src/__tests__/opentasks/e2e.test.ts +767 -0
- package/references/openhive/src/__tests__/routes/agents.test.ts +417 -0
- package/references/openhive/src/__tests__/routes/opentasks-content.test.ts +493 -0
- package/references/openhive/src/__tests__/routes/resource-content.test.ts +1741 -0
- package/references/openhive/src/__tests__/sessions/adapters.test.ts +524 -0
- package/references/openhive/src/__tests__/sessions/routes.test.ts +1053 -0
- package/references/openhive/src/__tests__/sessions/storage.test.ts +545 -0
- package/references/openhive/src/__tests__/sessions/trajectory-checkpoints.test.ts +349 -0
- package/references/openhive/src/__tests__/sessions/trajectory-routes.test.ts +290 -0
- package/references/openhive/src/__tests__/swarm/config.test.ts +125 -0
- package/references/openhive/src/__tests__/swarm/credentials.test.ts +254 -0
- package/references/openhive/src/__tests__/swarm/dal.test.ts +290 -0
- package/references/openhive/src/__tests__/swarm/e2e.test.ts +827 -0
- package/references/openhive/src/__tests__/swarm/fixtures/exit-immediately.js +3 -0
- package/references/openhive/src/__tests__/swarm/fixtures/map-server.js +147 -0
- package/references/openhive/src/__tests__/swarm/fixtures/sleep-server.js +52 -0
- package/references/openhive/src/__tests__/swarm/local-provider.test.ts +279 -0
- package/references/openhive/src/__tests__/swarm/manager.test.ts +305 -0
- package/references/openhive/src/__tests__/swarm/routes.test.ts +396 -0
- package/references/openhive/src/__tests__/swarm/workspace.test.ts +257 -0
- package/references/openhive/src/__tests__/swarmhub/client.test.ts +324 -0
- package/references/openhive/src/__tests__/swarmhub/config.test.ts +213 -0
- package/references/openhive/src/__tests__/swarmhub/connector.test.ts +581 -0
- package/references/openhive/src/__tests__/swarmhub/routes.test.ts +639 -0
- package/references/openhive/src/__tests__/swarmhub/slack-client.test.ts +164 -0
- package/references/openhive/src/__tests__/swarmhub/slack-connector.test.ts +164 -0
- package/references/openhive/src/__tests__/swarmhub/slack-routes.test.ts +373 -0
- package/references/openhive/src/__tests__/swarmhub/webhook-handler.test.ts +295 -0
- package/references/openhive/src/__tests__/sync/resource-sync.test.ts +1418 -0
- package/references/openhive/src/__tests__/sync/sync.test.ts +800 -0
- package/references/openhive/src/api/index.ts +65 -0
- package/references/openhive/src/api/middleware/auth.ts +227 -0
- package/references/openhive/src/api/middleware/hostname-guard.ts +38 -0
- package/references/openhive/src/api/routes/admin.ts +366 -0
- package/references/openhive/src/api/routes/agents.ts +223 -0
- package/references/openhive/src/api/routes/auth.ts +164 -0
- package/references/openhive/src/api/routes/bridges.ts +384 -0
- package/references/openhive/src/api/routes/comments.ts +294 -0
- package/references/openhive/src/api/routes/coordination.ts +312 -0
- package/references/openhive/src/api/routes/events.ts +158 -0
- package/references/openhive/src/api/routes/federation.ts +367 -0
- package/references/openhive/src/api/routes/feed.ts +212 -0
- package/references/openhive/src/api/routes/hives.ts +264 -0
- package/references/openhive/src/api/routes/map.ts +674 -0
- package/references/openhive/src/api/routes/memory-banks.ts +971 -0
- package/references/openhive/src/api/routes/posts.ts +342 -0
- package/references/openhive/src/api/routes/resource-content.ts +727 -0
- package/references/openhive/src/api/routes/resources.ts +1013 -0
- package/references/openhive/src/api/routes/search.ts +45 -0
- package/references/openhive/src/api/routes/sessions.ts +1187 -0
- package/references/openhive/src/api/routes/swarm-hosting.ts +313 -0
- package/references/openhive/src/api/routes/sync-protocol.ts +168 -0
- package/references/openhive/src/api/routes/sync.ts +279 -0
- package/references/openhive/src/api/routes/uploads.ts +174 -0
- package/references/openhive/src/api/routes/webhooks.ts +603 -0
- package/references/openhive/src/api/schemas/agents.ts +26 -0
- package/references/openhive/src/api/schemas/comments.ts +22 -0
- package/references/openhive/src/api/schemas/hives.ts +33 -0
- package/references/openhive/src/api/schemas/posts.ts +37 -0
- package/references/openhive/src/api/schemas/sync.ts +56 -0
- package/references/openhive/src/auth/index.ts +2 -0
- package/references/openhive/src/auth/jwks.ts +58 -0
- package/references/openhive/src/bridge/adapters/slack.ts +306 -0
- package/references/openhive/src/bridge/credentials.ts +72 -0
- package/references/openhive/src/bridge/inbound.ts +288 -0
- package/references/openhive/src/bridge/index.ts +42 -0
- package/references/openhive/src/bridge/manager.ts +425 -0
- package/references/openhive/src/bridge/mentions.ts +42 -0
- package/references/openhive/src/bridge/outbound.ts +103 -0
- package/references/openhive/src/bridge/schema.ts +82 -0
- package/references/openhive/src/bridge/types.ts +238 -0
- package/references/openhive/src/cli/network.ts +480 -0
- package/references/openhive/src/cli.ts +620 -0
- package/references/openhive/src/config.ts +611 -0
- package/references/openhive/src/coordination/index.ts +43 -0
- package/references/openhive/src/coordination/listener.ts +92 -0
- package/references/openhive/src/coordination/schema.ts +79 -0
- package/references/openhive/src/coordination/service.ts +233 -0
- package/references/openhive/src/coordination/types.ts +177 -0
- package/references/openhive/src/data-dir.ts +105 -0
- package/references/openhive/src/db/adapters/index.ts +21 -0
- package/references/openhive/src/db/adapters/postgres.ts +310 -0
- package/references/openhive/src/db/adapters/sqlite.ts +56 -0
- package/references/openhive/src/db/adapters/types.ts +65 -0
- package/references/openhive/src/db/dal/agents.ts +430 -0
- package/references/openhive/src/db/dal/bridge.ts +336 -0
- package/references/openhive/src/db/dal/comments.ts +213 -0
- package/references/openhive/src/db/dal/coordination.ts +361 -0
- package/references/openhive/src/db/dal/events.ts +381 -0
- package/references/openhive/src/db/dal/follows.ts +96 -0
- package/references/openhive/src/db/dal/hives.ts +198 -0
- package/references/openhive/src/db/dal/ingest-keys.ts +176 -0
- package/references/openhive/src/db/dal/instances.ts +196 -0
- package/references/openhive/src/db/dal/invites.ts +123 -0
- package/references/openhive/src/db/dal/map.ts +750 -0
- package/references/openhive/src/db/dal/posts.ts +274 -0
- package/references/openhive/src/db/dal/remote-agents.ts +56 -0
- package/references/openhive/src/db/dal/search.ts +238 -0
- package/references/openhive/src/db/dal/sync-events.ts +160 -0
- package/references/openhive/src/db/dal/sync-groups.ts +100 -0
- package/references/openhive/src/db/dal/sync-peer-configs.ts +216 -0
- package/references/openhive/src/db/dal/sync-peers.ts +145 -0
- package/references/openhive/src/db/dal/syncable-resources.ts +888 -0
- package/references/openhive/src/db/dal/trajectory-checkpoints.ts +291 -0
- package/references/openhive/src/db/dal/uploads.ts +124 -0
- package/references/openhive/src/db/dal/votes.ts +124 -0
- package/references/openhive/src/db/index.ts +293 -0
- package/references/openhive/src/db/providers/index.ts +75 -0
- package/references/openhive/src/db/providers/postgres.ts +529 -0
- package/references/openhive/src/db/providers/sqlite.ts +1383 -0
- package/references/openhive/src/db/providers/turso.ts +1360 -0
- package/references/openhive/src/db/providers/types.ts +516 -0
- package/references/openhive/src/db/schema.ts +641 -0
- package/references/openhive/src/discovery/index.ts +403 -0
- package/references/openhive/src/events/dispatch.ts +106 -0
- package/references/openhive/src/events/index.ts +17 -0
- package/references/openhive/src/events/normalizers/github.ts +133 -0
- package/references/openhive/src/events/normalizers/index.ts +62 -0
- package/references/openhive/src/events/normalizers/slack.ts +50 -0
- package/references/openhive/src/events/router.ts +156 -0
- package/references/openhive/src/events/schema.ts +66 -0
- package/references/openhive/src/events/types.ts +130 -0
- package/references/openhive/src/federation/index.ts +1 -0
- package/references/openhive/src/federation/service.ts +776 -0
- package/references/openhive/src/headscale/client.ts +256 -0
- package/references/openhive/src/headscale/config.ts +212 -0
- package/references/openhive/src/headscale/index.ts +23 -0
- package/references/openhive/src/headscale/manager.ts +249 -0
- package/references/openhive/src/headscale/sync.ts +272 -0
- package/references/openhive/src/headscale/types.ts +231 -0
- package/references/openhive/src/index.ts +225 -0
- package/references/openhive/src/map/client-entry.ts +26 -0
- package/references/openhive/src/map/index.ts +76 -0
- package/references/openhive/src/map/schema.ts +119 -0
- package/references/openhive/src/map/service.ts +323 -0
- package/references/openhive/src/map/sync-client.ts +696 -0
- package/references/openhive/src/map/sync-listener.ts +409 -0
- package/references/openhive/src/map/types.ts +290 -0
- package/references/openhive/src/network/factory.ts +118 -0
- package/references/openhive/src/network/headscale-provider.ts +437 -0
- package/references/openhive/src/network/index.ts +43 -0
- package/references/openhive/src/network/tailscale-client.ts +289 -0
- package/references/openhive/src/network/tailscale-provider.ts +287 -0
- package/references/openhive/src/network/types.ts +178 -0
- package/references/openhive/src/opentasks-client/client.ts +374 -0
- package/references/openhive/src/opentasks-client/index.ts +7 -0
- package/references/openhive/src/realtime/index.ts +282 -0
- package/references/openhive/src/server.ts +1069 -0
- package/references/openhive/src/services/email.ts +177 -0
- package/references/openhive/src/services/sitemap.ts +135 -0
- package/references/openhive/src/sessions/adapters/claude.ts +466 -0
- package/references/openhive/src/sessions/adapters/codex.ts +265 -0
- package/references/openhive/src/sessions/adapters/index.ts +263 -0
- package/references/openhive/src/sessions/adapters/raw.ts +144 -0
- package/references/openhive/src/sessions/adapters/types.ts +83 -0
- package/references/openhive/src/sessions/index.ts +50 -0
- package/references/openhive/src/sessions/storage/adapters/gcs.ts +277 -0
- package/references/openhive/src/sessions/storage/adapters/local.ts +240 -0
- package/references/openhive/src/sessions/storage/adapters/s3.ts +321 -0
- package/references/openhive/src/sessions/storage/index.ts +231 -0
- package/references/openhive/src/sessions/storage/types.ts +189 -0
- package/references/openhive/src/sessions/types.ts +415 -0
- package/references/openhive/src/shared/types/index.ts +45 -0
- package/references/openhive/src/shared/types/map-coordination.ts +92 -0
- package/references/openhive/src/shared/types/map-session-sync.ts +170 -0
- package/references/openhive/src/shared/types/map-sync.ts +68 -0
- package/references/openhive/src/skill.ts +203 -0
- package/references/openhive/src/storage/adapters/local.ts +169 -0
- package/references/openhive/src/storage/adapters/s3.ts +195 -0
- package/references/openhive/src/storage/index.ts +64 -0
- package/references/openhive/src/storage/types.ts +69 -0
- package/references/openhive/src/swarm/credentials.ts +98 -0
- package/references/openhive/src/swarm/dal.ts +206 -0
- package/references/openhive/src/swarm/index.ts +28 -0
- package/references/openhive/src/swarm/manager.ts +917 -0
- package/references/openhive/src/swarm/providers/local.ts +338 -0
- package/references/openhive/src/swarm/providers/sandboxed-local.ts +478 -0
- package/references/openhive/src/swarm/providers/workspace.ts +52 -0
- package/references/openhive/src/swarm/schema.ts +43 -0
- package/references/openhive/src/swarm/types.ts +333 -0
- package/references/openhive/src/swarmhub/client.ts +279 -0
- package/references/openhive/src/swarmhub/connector.ts +463 -0
- package/references/openhive/src/swarmhub/index.ts +43 -0
- package/references/openhive/src/swarmhub/routes.ts +296 -0
- package/references/openhive/src/swarmhub/types.ts +213 -0
- package/references/openhive/src/swarmhub/webhook-handler.ts +126 -0
- package/references/openhive/src/sync/compaction.ts +193 -0
- package/references/openhive/src/sync/coordination-hooks.ts +154 -0
- package/references/openhive/src/sync/crypto.ts +79 -0
- package/references/openhive/src/sync/gossip.ts +136 -0
- package/references/openhive/src/sync/hooks.ts +202 -0
- package/references/openhive/src/sync/materializer-repo.ts +256 -0
- package/references/openhive/src/sync/materializer.ts +682 -0
- package/references/openhive/src/sync/middleware.ts +140 -0
- package/references/openhive/src/sync/peer-resolver.ts +157 -0
- package/references/openhive/src/sync/resource-hooks.ts +161 -0
- package/references/openhive/src/sync/schema.ts +158 -0
- package/references/openhive/src/sync/service.ts +990 -0
- package/references/openhive/src/sync/types.ts +369 -0
- package/references/openhive/src/terminal/index.ts +4 -0
- package/references/openhive/src/terminal/pty-manager.ts +337 -0
- package/references/openhive/src/terminal/resolve-tui.ts +44 -0
- package/references/openhive/src/terminal/terminal-ws.ts +251 -0
- package/references/openhive/src/types.ts +442 -0
- package/references/openhive/src/utils/git-remote.ts +329 -0
- package/references/openhive/src/web/App.tsx +77 -0
- package/references/openhive/src/web/__tests__/components/dashboard/RecentActivity.test.tsx +77 -0
- package/references/openhive/src/web/__tests__/components/dashboard/StatsOverview.test.tsx +62 -0
- package/references/openhive/src/web/__tests__/components/dashboard/SwarmStatusSummary.test.tsx +122 -0
- package/references/openhive/src/web/__tests__/components/dashboard/SyncResourcesStatus.test.tsx +104 -0
- package/references/openhive/src/web/__tests__/components/layout/Sidebar.test.tsx +110 -0
- package/references/openhive/src/web/__tests__/components/swarm/StatusBadges.test.tsx +65 -0
- package/references/openhive/src/web/__tests__/components/terminal/query-responses.test.ts +143 -0
- package/references/openhive/src/web/__tests__/components/terminal/terminal-mouse.test.ts +509 -0
- package/references/openhive/src/web/__tests__/hooks/useEventsApi.test.ts +378 -0
- package/references/openhive/src/web/__tests__/pages/Dashboard.test.tsx +57 -0
- package/references/openhive/src/web/__tests__/pages/Events.test.tsx +886 -0
- package/references/openhive/src/web/__tests__/pages/Explore.test.tsx +63 -0
- package/references/openhive/src/web/__tests__/routing.test.tsx +79 -0
- package/references/openhive/src/web/__tests__/setup.ts +37 -0
- package/references/openhive/src/web/__tests__/stores/dashboard.test.ts +49 -0
- package/references/openhive/src/web/components/common/AgentBadge.tsx +58 -0
- package/references/openhive/src/web/components/common/Avatar.tsx +78 -0
- package/references/openhive/src/web/components/common/ErrorBoundary.tsx +76 -0
- package/references/openhive/src/web/components/common/Highlight.tsx +79 -0
- package/references/openhive/src/web/components/common/ImageUpload.tsx +209 -0
- package/references/openhive/src/web/components/common/LoadingSpinner.tsx +37 -0
- package/references/openhive/src/web/components/common/Logo.tsx +21 -0
- package/references/openhive/src/web/components/common/Markdown.tsx +53 -0
- package/references/openhive/src/web/components/common/ProtectedRoute.tsx +18 -0
- package/references/openhive/src/web/components/common/ThemeToggle.tsx +38 -0
- package/references/openhive/src/web/components/common/TimeAgo.tsx +17 -0
- package/references/openhive/src/web/components/common/Toast.tsx +70 -0
- package/references/openhive/src/web/components/common/VoteButtons.tsx +100 -0
- package/references/openhive/src/web/components/dashboard/RecentActivity.tsx +100 -0
- package/references/openhive/src/web/components/dashboard/StatsOverview.tsx +40 -0
- package/references/openhive/src/web/components/dashboard/SwarmStatusSummary.tsx +89 -0
- package/references/openhive/src/web/components/dashboard/SyncResourcesStatus.tsx +81 -0
- package/references/openhive/src/web/components/feed/FeedControls.tsx +38 -0
- package/references/openhive/src/web/components/feed/NewPostsIndicator.tsx +75 -0
- package/references/openhive/src/web/components/feed/PostCard.tsx +129 -0
- package/references/openhive/src/web/components/feed/PostList.tsx +83 -0
- package/references/openhive/src/web/components/layout/Footer.tsx +5 -0
- package/references/openhive/src/web/components/layout/Layout.tsx +29 -0
- package/references/openhive/src/web/components/layout/Sidebar.tsx +348 -0
- package/references/openhive/src/web/components/post/CommentForm.tsx +59 -0
- package/references/openhive/src/web/components/post/CommentTree.tsx +145 -0
- package/references/openhive/src/web/components/resources/MemoryBrowser.tsx +208 -0
- package/references/openhive/src/web/components/resources/OpenTasksSummary.tsx +138 -0
- package/references/openhive/src/web/components/resources/SkillBrowser.tsx +284 -0
- package/references/openhive/src/web/components/swarm/StatusBadges.tsx +56 -0
- package/references/openhive/src/web/components/terminal/TerminalPanel.tsx +485 -0
- package/references/openhive/src/web/components/terminal/index.ts +2 -0
- package/references/openhive/src/web/components/terminal/query-responses.ts +70 -0
- package/references/openhive/src/web/components/terminal/terminal-mouse.ts +222 -0
- package/references/openhive/src/web/hooks/useApi.ts +740 -0
- package/references/openhive/src/web/hooks/useDocumentTitle.ts +49 -0
- package/references/openhive/src/web/hooks/useInfiniteScroll.ts +58 -0
- package/references/openhive/src/web/hooks/useRealtimeUpdates.ts +154 -0
- package/references/openhive/src/web/hooks/useWebSocket.ts +225 -0
- package/references/openhive/src/web/index.html +73 -0
- package/references/openhive/src/web/lib/api.ts +518 -0
- package/references/openhive/src/web/main.tsx +32 -0
- package/references/openhive/src/web/pages/About.tsx +131 -0
- package/references/openhive/src/web/pages/Agent.tsx +130 -0
- package/references/openhive/src/web/pages/Agents.tsx +69 -0
- package/references/openhive/src/web/pages/AuthCallback.tsx +75 -0
- package/references/openhive/src/web/pages/Dashboard.tsx +41 -0
- package/references/openhive/src/web/pages/Events.tsx +1025 -0
- package/references/openhive/src/web/pages/Explore.tsx +43 -0
- package/references/openhive/src/web/pages/Hive.tsx +134 -0
- package/references/openhive/src/web/pages/Hives.tsx +64 -0
- package/references/openhive/src/web/pages/Home.tsx +43 -0
- package/references/openhive/src/web/pages/Login.tsx +122 -0
- package/references/openhive/src/web/pages/Post.tsx +216 -0
- package/references/openhive/src/web/pages/ResourceDetail.tsx +426 -0
- package/references/openhive/src/web/pages/Resources.tsx +276 -0
- package/references/openhive/src/web/pages/Search.tsx +234 -0
- package/references/openhive/src/web/pages/SessionDetail.tsx +703 -0
- package/references/openhive/src/web/pages/Sessions.tsx +129 -0
- package/references/openhive/src/web/pages/Settings.tsx +826 -0
- package/references/openhive/src/web/pages/SwarmCraft.tsx +16 -0
- package/references/openhive/src/web/pages/Swarms.tsx +981 -0
- package/references/openhive/src/web/pages/Terminal.tsx +69 -0
- package/references/openhive/src/web/postcss.config.js +5 -0
- package/references/openhive/src/web/public/favicon.svg +11 -0
- package/references/openhive/src/web/public/manifest.json +21 -0
- package/references/openhive/src/web/stores/auth.ts +207 -0
- package/references/openhive/src/web/stores/dashboard.ts +23 -0
- package/references/openhive/src/web/stores/realtime.ts +90 -0
- package/references/openhive/src/web/stores/theme.ts +70 -0
- package/references/openhive/src/web/stores/toast.ts +63 -0
- package/references/openhive/src/web/styles/globals.css +503 -0
- package/references/openhive/src/web/sw.ts +228 -0
- package/references/openhive/src/web/utils/serviceWorker.ts +86 -0
- package/references/openhive/src/web/vite.config.ts +81 -0
- package/references/openhive/tsconfig.json +32 -0
- package/references/openhive/tsup.config.ts +17 -0
- package/references/openhive/vitest.config.ts +30 -0
- package/references/openhive/vitest.web.config.ts +20 -0
- package/references/opentasks/.claude/settings.json +6 -0
- package/references/opentasks/.claude-plugin/plugin.json +20 -0
- package/references/opentasks/.lintstagedrc.json +4 -0
- package/references/opentasks/.prettierignore +4 -0
- package/references/opentasks/.prettierrc.json +11 -0
- package/references/opentasks/.sudocode/issues.jsonl +89 -0
- package/references/opentasks/.sudocode/specs.jsonl +24 -0
- package/references/opentasks/README.md +401 -0
- package/references/opentasks/docs/ARCHITECTURE.md +841 -0
- package/references/opentasks/docs/DESIGN.md +689 -0
- package/references/opentasks/docs/INTERFACE.md +670 -0
- package/references/opentasks/docs/PERSISTENCE.md +1638 -0
- package/references/opentasks/docs/PROVIDERS.md +1412 -0
- package/references/opentasks/docs/SCHEMA.md +815 -0
- package/references/opentasks/docs/TESTING.md +1081 -0
- package/references/opentasks/eslint.config.js +58 -0
- package/references/opentasks/package-lock.json +4348 -0
- package/references/opentasks/package.json +81 -0
- package/references/opentasks/skills/opentasks/SKILL.md +139 -0
- package/references/opentasks/skills/opentasks/dependency-management.md +119 -0
- package/references/opentasks/skills/opentasks/feedback-and-review.md +100 -0
- package/references/opentasks/skills/opentasks/linking-external-data.md +103 -0
- package/references/opentasks/skills/opentasks/spec-to-implementation.md +98 -0
- package/references/opentasks/src/__tests__/cli-tools.test.ts +800 -0
- package/references/opentasks/src/__tests__/cli.test.ts +97 -0
- package/references/opentasks/src/__tests__/p1-p3-gaps.test.ts +635 -0
- package/references/opentasks/src/cli.ts +929 -0
- package/references/opentasks/src/client/__tests__/client-crud.test.ts +546 -0
- package/references/opentasks/src/client/__tests__/client.test.ts +658 -0
- package/references/opentasks/src/client/__tests__/socket-discovery.test.ts +122 -0
- package/references/opentasks/src/client/client.ts +560 -0
- package/references/opentasks/src/client/index.ts +32 -0
- package/references/opentasks/src/config/__tests__/defaults.test.ts +66 -0
- package/references/opentasks/src/config/__tests__/env.test.ts +155 -0
- package/references/opentasks/src/config/__tests__/index.test.ts +148 -0
- package/references/opentasks/src/config/__tests__/loader.test.ts +173 -0
- package/references/opentasks/src/config/__tests__/merge.test.ts +121 -0
- package/references/opentasks/src/config/__tests__/schema.test.ts +446 -0
- package/references/opentasks/src/config/defaults.ts +18 -0
- package/references/opentasks/src/config/env.ts +170 -0
- package/references/opentasks/src/config/errors.ts +33 -0
- package/references/opentasks/src/config/index.ts +63 -0
- package/references/opentasks/src/config/loader.ts +90 -0
- package/references/opentasks/src/config/merge.ts +64 -0
- package/references/opentasks/src/config/schema.ts +767 -0
- package/references/opentasks/src/core/__tests__/conditional-redirects.test.ts +116 -0
- package/references/opentasks/src/core/__tests__/connections.test.ts +194 -0
- package/references/opentasks/src/core/__tests__/hash.test.ts +161 -0
- package/references/opentasks/src/core/__tests__/id.test.ts +175 -0
- package/references/opentasks/src/core/__tests__/init.test.ts +115 -0
- package/references/opentasks/src/core/__tests__/location.test.ts +94 -0
- package/references/opentasks/src/core/__tests__/merge-driver.test.ts +300 -0
- package/references/opentasks/src/core/__tests__/redirects.test.ts +169 -0
- package/references/opentasks/src/core/__tests__/resolve-location-target.test.ts +468 -0
- package/references/opentasks/src/core/__tests__/uri.test.ts +228 -0
- package/references/opentasks/src/core/__tests__/worktree.test.ts +160 -0
- package/references/opentasks/src/core/conditional-redirects.ts +100 -0
- package/references/opentasks/src/core/connections.ts +217 -0
- package/references/opentasks/src/core/discover.ts +195 -0
- package/references/opentasks/src/core/hash.ts +74 -0
- package/references/opentasks/src/core/id.ts +174 -0
- package/references/opentasks/src/core/index.ts +108 -0
- package/references/opentasks/src/core/init.ts +66 -0
- package/references/opentasks/src/core/location.ts +139 -0
- package/references/opentasks/src/core/merge-driver.ts +280 -0
- package/references/opentasks/src/core/redirects.ts +182 -0
- package/references/opentasks/src/core/uri.ts +270 -0
- package/references/opentasks/src/core/worktree.ts +504 -0
- package/references/opentasks/src/daemon/__tests__/e2e-live-agent.test.ts +344 -0
- package/references/opentasks/src/daemon/__tests__/e2e-session-pipeline.test.ts +447 -0
- package/references/opentasks/src/daemon/__tests__/e2e-watch.test.ts +279 -0
- package/references/opentasks/src/daemon/__tests__/entire-linker.test.ts +1074 -0
- package/references/opentasks/src/daemon/__tests__/entire-watcher.test.ts +659 -0
- package/references/opentasks/src/daemon/__tests__/flush.test.ts +306 -0
- package/references/opentasks/src/daemon/__tests__/integration.test.ts +338 -0
- package/references/opentasks/src/daemon/__tests__/ipc.test.ts +406 -0
- package/references/opentasks/src/daemon/__tests__/lifecycle.test.ts +378 -0
- package/references/opentasks/src/daemon/__tests__/lock.test.ts +240 -0
- package/references/opentasks/src/daemon/__tests__/methods/graph.test.ts +372 -0
- package/references/opentasks/src/daemon/__tests__/methods/provider.test.ts +238 -0
- package/references/opentasks/src/daemon/__tests__/methods/tools.test.ts +690 -0
- package/references/opentasks/src/daemon/__tests__/multi-location.test.ts +945 -0
- package/references/opentasks/src/daemon/__tests__/registry.test.ts +268 -0
- package/references/opentasks/src/daemon/__tests__/watcher.test.ts +329 -0
- package/references/opentasks/src/daemon/entire-linker.ts +615 -0
- package/references/opentasks/src/daemon/entire-watcher.ts +415 -0
- package/references/opentasks/src/daemon/factory.ts +133 -0
- package/references/opentasks/src/daemon/flush.ts +168 -0
- package/references/opentasks/src/daemon/index.ts +120 -0
- package/references/opentasks/src/daemon/ipc.ts +491 -0
- package/references/opentasks/src/daemon/lifecycle.ts +1106 -0
- package/references/opentasks/src/daemon/location-state.ts +481 -0
- package/references/opentasks/src/daemon/lock.ts +168 -0
- package/references/opentasks/src/daemon/methods/__tests__/graph.test.ts +359 -0
- package/references/opentasks/src/daemon/methods/__tests__/provider.test.ts +227 -0
- package/references/opentasks/src/daemon/methods/__tests__/tools.test.ts +360 -0
- package/references/opentasks/src/daemon/methods/__tests__/watch.test.ts +656 -0
- package/references/opentasks/src/daemon/methods/archive.ts +193 -0
- package/references/opentasks/src/daemon/methods/graph.ts +274 -0
- package/references/opentasks/src/daemon/methods/lifecycle.ts +112 -0
- package/references/opentasks/src/daemon/methods/location.ts +118 -0
- package/references/opentasks/src/daemon/methods/provider.ts +159 -0
- package/references/opentasks/src/daemon/methods/tools.ts +221 -0
- package/references/opentasks/src/daemon/methods/watch.ts +206 -0
- package/references/opentasks/src/daemon/registry.ts +244 -0
- package/references/opentasks/src/daemon/types.ts +163 -0
- package/references/opentasks/src/daemon/watcher.ts +248 -0
- package/references/opentasks/src/entire/__tests__/agent-registry.test.ts +127 -0
- package/references/opentasks/src/entire/__tests__/claude-generator.test.ts +49 -0
- package/references/opentasks/src/entire/__tests__/commit-msg.test.ts +89 -0
- package/references/opentasks/src/entire/__tests__/cursor-agent.test.ts +224 -0
- package/references/opentasks/src/entire/__tests__/flush-sentinel.test.ts +93 -0
- package/references/opentasks/src/entire/__tests__/gemini-agent.test.ts +375 -0
- package/references/opentasks/src/entire/__tests__/git-hooks.test.ts +85 -0
- package/references/opentasks/src/entire/__tests__/hook-managers.test.ts +128 -0
- package/references/opentasks/src/entire/__tests__/opencode-agent.test.ts +329 -0
- package/references/opentasks/src/entire/__tests__/redaction.test.ts +143 -0
- package/references/opentasks/src/entire/__tests__/session-store.test.ts +83 -0
- package/references/opentasks/src/entire/__tests__/summarize.test.ts +346 -0
- package/references/opentasks/src/entire/__tests__/transcript-timestamp.test.ts +127 -0
- package/references/opentasks/src/entire/__tests__/types.test.ts +112 -0
- package/references/opentasks/src/entire/__tests__/utils.test.ts +296 -0
- package/references/opentasks/src/entire/__tests__/validation.test.ts +103 -0
- package/references/opentasks/src/entire/__tests__/worktree.test.ts +66 -0
- package/references/opentasks/src/entire/agent/registry.ts +143 -0
- package/references/opentasks/src/entire/agent/session-types.ts +117 -0
- package/references/opentasks/src/entire/agent/types.ts +217 -0
- package/references/opentasks/src/entire/commands/clean.ts +134 -0
- package/references/opentasks/src/entire/commands/disable.ts +85 -0
- package/references/opentasks/src/entire/commands/doctor.ts +152 -0
- package/references/opentasks/src/entire/commands/enable.ts +149 -0
- package/references/opentasks/src/entire/commands/explain.ts +271 -0
- package/references/opentasks/src/entire/commands/reset.ts +105 -0
- package/references/opentasks/src/entire/commands/resume.ts +194 -0
- package/references/opentasks/src/entire/commands/rewind.ts +204 -0
- package/references/opentasks/src/entire/commands/status.ts +150 -0
- package/references/opentasks/src/entire/config.ts +153 -0
- package/references/opentasks/src/entire/git-operations.ts +485 -0
- package/references/opentasks/src/entire/hooks/git-hooks.ts +171 -0
- package/references/opentasks/src/entire/hooks/lifecycle.ts +224 -0
- package/references/opentasks/src/entire/index.ts +644 -0
- package/references/opentasks/src/entire/security/redaction.ts +263 -0
- package/references/opentasks/src/entire/session/state-machine.ts +463 -0
- package/references/opentasks/src/entire/store/checkpoint-store.ts +489 -0
- package/references/opentasks/src/entire/store/native-store.ts +178 -0
- package/references/opentasks/src/entire/store/provider-types.ts +99 -0
- package/references/opentasks/src/entire/store/session-store.ts +233 -0
- package/references/opentasks/src/entire/strategy/attribution.ts +300 -0
- package/references/opentasks/src/entire/strategy/common.ts +222 -0
- package/references/opentasks/src/entire/strategy/content-overlap.ts +242 -0
- package/references/opentasks/src/entire/strategy/manual-commit.ts +1008 -0
- package/references/opentasks/src/entire/strategy/types.ts +285 -0
- package/references/opentasks/src/entire/summarize/claude-generator.ts +119 -0
- package/references/opentasks/src/entire/summarize/summarize.ts +432 -0
- package/references/opentasks/src/entire/types.ts +408 -0
- package/references/opentasks/src/entire/utils/chunk-files.ts +49 -0
- package/references/opentasks/src/entire/utils/commit-message.ts +65 -0
- package/references/opentasks/src/entire/utils/detect-agent.ts +36 -0
- package/references/opentasks/src/entire/utils/hook-managers.ts +118 -0
- package/references/opentasks/src/entire/utils/ide-tags.ts +32 -0
- package/references/opentasks/src/entire/utils/paths.ts +59 -0
- package/references/opentasks/src/entire/utils/preview-rewind.ts +86 -0
- package/references/opentasks/src/entire/utils/rewind-conflict.ts +121 -0
- package/references/opentasks/src/entire/utils/shadow-branch.ts +113 -0
- package/references/opentasks/src/entire/utils/string-utils.ts +46 -0
- package/references/opentasks/src/entire/utils/todo-extract.ts +193 -0
- package/references/opentasks/src/entire/utils/trailers.ts +190 -0
- package/references/opentasks/src/entire/utils/transcript-parse.ts +177 -0
- package/references/opentasks/src/entire/utils/transcript-timestamp.ts +61 -0
- package/references/opentasks/src/entire/utils/tree-ops.ts +227 -0
- package/references/opentasks/src/entire/utils/tty.ts +72 -0
- package/references/opentasks/src/entire/utils/validation.ts +67 -0
- package/references/opentasks/src/entire/utils/worktree.ts +58 -0
- package/references/opentasks/src/graph/EdgeTypeRegistry.ts +330 -0
- package/references/opentasks/src/graph/FederatedGraph.ts +796 -0
- package/references/opentasks/src/graph/GraphologyAdapter.ts +374 -0
- package/references/opentasks/src/graph/HydratingFederatedGraph.ts +533 -0
- package/references/opentasks/src/graph/__tests__/EdgeTypeRegistry.test.ts +263 -0
- package/references/opentasks/src/graph/__tests__/FederatedGraph.test.ts +821 -0
- package/references/opentasks/src/graph/__tests__/GraphologyAdapter.test.ts +408 -0
- package/references/opentasks/src/graph/__tests__/HydratingFederatedGraph.test.ts +735 -0
- package/references/opentasks/src/graph/__tests__/debounce.test.ts +276 -0
- package/references/opentasks/src/graph/__tests__/e2e-store-roundtrip.test.ts +349 -0
- package/references/opentasks/src/graph/__tests__/edge-cases.test.ts +595 -0
- package/references/opentasks/src/graph/__tests__/expansion.test.ts +304 -0
- package/references/opentasks/src/graph/__tests__/git-graph-syncer.test.ts +572 -0
- package/references/opentasks/src/graph/__tests__/provider-store.test.ts +1091 -0
- package/references/opentasks/src/graph/__tests__/query.test.ts +991 -0
- package/references/opentasks/src/graph/__tests__/store.test.ts +998 -0
- package/references/opentasks/src/graph/__tests__/sync.test.ts +178 -0
- package/references/opentasks/src/graph/__tests__/validation.test.ts +657 -0
- package/references/opentasks/src/graph/coordination.ts +454 -0
- package/references/opentasks/src/graph/debounce.ts +154 -0
- package/references/opentasks/src/graph/expansion.ts +364 -0
- package/references/opentasks/src/graph/git-graph-syncer.ts +321 -0
- package/references/opentasks/src/graph/history.ts +438 -0
- package/references/opentasks/src/graph/index.ts +145 -0
- package/references/opentasks/src/graph/provider-store.ts +1077 -0
- package/references/opentasks/src/graph/query.ts +651 -0
- package/references/opentasks/src/graph/store.ts +861 -0
- package/references/opentasks/src/graph/sync.ts +116 -0
- package/references/opentasks/src/graph/types.ts +420 -0
- package/references/opentasks/src/graph/validation.ts +520 -0
- package/references/opentasks/src/index.ts +270 -0
- package/references/opentasks/src/materialization/CLAUDE.md +88 -0
- package/references/opentasks/src/materialization/README.md +187 -0
- package/references/opentasks/src/materialization/__tests__/archive-methods.test.ts +194 -0
- package/references/opentasks/src/materialization/__tests__/archiver.test.ts +528 -0
- package/references/opentasks/src/materialization/__tests__/config.test.ts +123 -0
- package/references/opentasks/src/materialization/__tests__/git-remote-store.test.ts +533 -0
- package/references/opentasks/src/materialization/__tests__/graph-id.test.ts +82 -0
- package/references/opentasks/src/materialization/__tests__/http-remote-store.test.ts +263 -0
- package/references/opentasks/src/materialization/__tests__/materialize-before-archive.test.ts +246 -0
- package/references/opentasks/src/materialization/__tests__/remote-store-factory.test.ts +152 -0
- package/references/opentasks/src/materialization/__tests__/snapshot.test.ts +209 -0
- package/references/opentasks/src/materialization/archiver.ts +318 -0
- package/references/opentasks/src/materialization/git-archive-store.ts +568 -0
- package/references/opentasks/src/materialization/git-remote-store.ts +551 -0
- package/references/opentasks/src/materialization/graph-id.ts +173 -0
- package/references/opentasks/src/materialization/http-remote-store.ts +190 -0
- package/references/opentasks/src/materialization/index.ts +62 -0
- package/references/opentasks/src/materialization/remote-store-factory.ts +55 -0
- package/references/opentasks/src/materialization/snapshot.ts +230 -0
- package/references/opentasks/src/materialization/types.ts +410 -0
- package/references/opentasks/src/providers/__tests__/beads.test.ts +752 -0
- package/references/opentasks/src/providers/__tests__/claude-tasks.test.ts +485 -0
- package/references/opentasks/src/providers/__tests__/entire-e2e.test.ts +692 -0
- package/references/opentasks/src/providers/__tests__/entire-sessionlog-e2e.test.ts +1113 -0
- package/references/opentasks/src/providers/__tests__/entire.test.ts +1016 -0
- package/references/opentasks/src/providers/__tests__/from-config.test.ts +183 -0
- package/references/opentasks/src/providers/__tests__/global.test.ts +515 -0
- package/references/opentasks/src/providers/__tests__/materialization.test.ts +567 -0
- package/references/opentasks/src/providers/__tests__/native.test.ts +693 -0
- package/references/opentasks/src/providers/__tests__/registry.test.ts +232 -0
- package/references/opentasks/src/providers/beads.ts +1155 -0
- package/references/opentasks/src/providers/claude-tasks.ts +402 -0
- package/references/opentasks/src/providers/entire.ts +608 -0
- package/references/opentasks/src/providers/from-config.ts +210 -0
- package/references/opentasks/src/providers/global.ts +460 -0
- package/references/opentasks/src/providers/index.ts +147 -0
- package/references/opentasks/src/providers/location.ts +237 -0
- package/references/opentasks/src/providers/materialization.ts +346 -0
- package/references/opentasks/src/providers/native.ts +725 -0
- package/references/opentasks/src/providers/registry.ts +114 -0
- package/references/opentasks/src/providers/sudocode.ts +1292 -0
- package/references/opentasks/src/providers/sync.ts +485 -0
- package/references/opentasks/src/providers/traits/RelationshipQueryable.ts +169 -0
- package/references/opentasks/src/providers/traits/TaskManageable.ts +211 -0
- package/references/opentasks/src/providers/traits/Watchable.ts +260 -0
- package/references/opentasks/src/providers/traits/__tests__/RelationshipQueryable.test.ts +217 -0
- package/references/opentasks/src/providers/traits/__tests__/TaskManageable.test.ts +241 -0
- package/references/opentasks/src/providers/traits/index.ts +42 -0
- package/references/opentasks/src/providers/types.ts +439 -0
- package/references/opentasks/src/schema/__tests__/validation.test.ts +283 -0
- package/references/opentasks/src/schema/base.ts +88 -0
- package/references/opentasks/src/schema/edges.ts +78 -0
- package/references/opentasks/src/schema/index.ts +37 -0
- package/references/opentasks/src/schema/nodes.ts +119 -0
- package/references/opentasks/src/schema/storage.ts +130 -0
- package/references/opentasks/src/schema/validation.ts +209 -0
- package/references/opentasks/src/storage/__tests__/atomic-write.test.ts +227 -0
- package/references/opentasks/src/storage/__tests__/file-lock.test.ts +120 -0
- package/references/opentasks/src/storage/__tests__/jsonl.test.ts +267 -0
- package/references/opentasks/src/storage/__tests__/locked-writer.test.ts +134 -0
- package/references/opentasks/src/storage/__tests__/sqlite.test.ts +572 -0
- package/references/opentasks/src/storage/atomic-write.ts +86 -0
- package/references/opentasks/src/storage/file-lock.ts +215 -0
- package/references/opentasks/src/storage/index.ts +24 -0
- package/references/opentasks/src/storage/interface.ts +289 -0
- package/references/opentasks/src/storage/jsonl.ts +264 -0
- package/references/opentasks/src/storage/locked-writer.ts +140 -0
- package/references/opentasks/src/storage/sqlite-schema.ts +177 -0
- package/references/opentasks/src/storage/sqlite.ts +791 -0
- package/references/opentasks/src/tools/__tests__/annotate.test.ts +381 -0
- package/references/opentasks/src/tools/__tests__/link.test.ts +299 -0
- package/references/opentasks/src/tools/__tests__/query.test.ts +350 -0
- package/references/opentasks/src/tools/__tests__/task.test.ts +218 -0
- package/references/opentasks/src/tools/annotate.ts +277 -0
- package/references/opentasks/src/tools/index.ts +57 -0
- package/references/opentasks/src/tools/link.ts +163 -0
- package/references/opentasks/src/tools/query.ts +468 -0
- package/references/opentasks/src/tools/task.ts +213 -0
- package/references/opentasks/src/tools/types.ts +451 -0
- package/references/opentasks/src/tracking/__tests__/claude-tool-categorizer.test.ts +223 -0
- package/references/opentasks/src/tracking/__tests__/transcript-extractor.test.ts +262 -0
- package/references/opentasks/src/tracking/claude-tool-categorizer.ts +155 -0
- package/references/opentasks/src/tracking/index.ts +32 -0
- package/references/opentasks/src/tracking/skill-tracker.ts +322 -0
- package/references/opentasks/src/tracking/transcript-extractor.ts +225 -0
- package/references/opentasks/tests/e2e/helpers/assertions.ts +211 -0
- package/references/opentasks/tests/e2e/helpers/beads-helpers.ts +487 -0
- package/references/opentasks/tests/e2e/helpers/fixtures.ts +236 -0
- package/references/opentasks/tests/e2e/helpers/index.ts +122 -0
- package/references/opentasks/tests/e2e/helpers/sudocode-helpers.ts +341 -0
- package/references/opentasks/tests/e2e/helpers/system-setup.ts +504 -0
- package/references/opentasks/tests/e2e/helpers/test-agent.ts +504 -0
- package/references/opentasks/tests/e2e/infrastructure.e2e.test.ts +521 -0
- package/references/opentasks/tests/e2e/skill-tracking.e2e.test.ts +625 -0
- package/references/opentasks/tests/e2e/workflows/feedback-loop.e2e.test.ts +279 -0
- package/references/opentasks/tests/e2e/workflows/multi-agent.e2e.test.ts +304 -0
- package/references/opentasks/tests/e2e/workflows/provider-sync/background-sync.e2e.test.ts +292 -0
- package/references/opentasks/tests/e2e/workflows/provider-sync/beads-provider-compat.e2e.test.ts +249 -0
- package/references/opentasks/tests/e2e/workflows/provider-sync/cross-provider-edges.e2e.test.ts +407 -0
- package/references/opentasks/tests/e2e/workflows/provider-sync/federated-ready.e2e.test.ts +504 -0
- package/references/opentasks/tests/e2e/workflows/provider-sync/hydration.e2e.test.ts +340 -0
- package/references/opentasks/tests/e2e/workflows/provider-sync/materialization.e2e.test.ts +370 -0
- package/references/opentasks/tests/e2e/workflows/provider-sync/sudocode-provider-compat.e2e.test.ts +683 -0
- package/references/opentasks/tests/e2e/workflows/provider-sync/watchable-beads.e2e.test.ts +573 -0
- package/references/opentasks/tests/e2e/workflows/spec-driven.e2e.test.ts +244 -0
- package/references/opentasks/tests/e2e/worktree-location.e2e.test.ts +699 -0
- package/references/opentasks/tests/integration/daemon/helpers.ts +147 -0
- package/references/opentasks/tests/integration/daemon/ipc.integration.test.ts +343 -0
- package/references/opentasks/tests/integration/daemon/lifecycle.integration.test.ts +407 -0
- package/references/opentasks/tests/integration/graph/federated-graph.integration.test.ts +660 -0
- package/references/opentasks/tests/integration/helpers/flags.ts +28 -0
- package/references/opentasks/tests/integration/helpers/index.ts +47 -0
- package/references/opentasks/tests/integration/helpers/process.ts +133 -0
- package/references/opentasks/tests/integration/helpers/temp.ts +105 -0
- package/references/opentasks/tests/integration/helpers/wait.ts +133 -0
- package/references/opentasks/tests/integration/helpers.test.ts +120 -0
- package/references/opentasks/tests/integration/providers/beads-task-manageable.integration.test.ts +450 -0
- package/references/opentasks/tests/integration/providers/beads.integration.test.ts +388 -0
- package/references/opentasks/tests/integration/providers/native-task-manageable.integration.test.ts +667 -0
- package/references/opentasks/tests/integration/providers/sudocode-task-manageable.integration.test.ts +406 -0
- package/references/opentasks/tests/integration/providers/sudocode.integration.test.ts +342 -0
- package/references/opentasks/tests/integration/storage/jsonl-durability.integration.test.ts +390 -0
- package/references/opentasks/tests/integration/storage/sqlite-durability.integration.test.ts +527 -0
- package/references/opentasks/tests/integration/worktree/redirect-location-resolution.integration.test.ts +578 -0
- package/references/opentasks/tests/integration/worktree/worktree-flow.integration.test.ts +656 -0
- package/references/opentasks/tsconfig.json +18 -0
- package/references/opentasks/vitest.config.ts +27 -0
- package/references/opentasks/vitest.e2e.config.ts +35 -0
- package/references/opentasks/vitest.integration.config.ts +19 -0
- package/references/openteams/.claude/settings.json +6 -0
- package/references/openteams/CLAUDE.md +98 -0
- package/references/openteams/README.md +508 -0
- package/references/openteams/SKILL.md +198 -0
- package/references/openteams/design.md +250 -0
- package/references/openteams/docs/visual-editor-design.md +1225 -0
- package/references/openteams/editor/index.html +15 -0
- package/references/openteams/editor/package.json +39 -0
- package/references/openteams/editor/src/App.tsx +48 -0
- package/references/openteams/editor/src/components/canvas/Canvas.tsx +131 -0
- package/references/openteams/editor/src/components/canvas/QuickAddMenu.tsx +134 -0
- package/references/openteams/editor/src/components/edges/PeerRouteEdge.tsx +82 -0
- package/references/openteams/editor/src/components/edges/SignalFlowEdge.tsx +77 -0
- package/references/openteams/editor/src/components/edges/SpawnEdge.tsx +54 -0
- package/references/openteams/editor/src/components/inspector/ChannelInspector.tsx +158 -0
- package/references/openteams/editor/src/components/inspector/EdgeInspector.tsx +168 -0
- package/references/openteams/editor/src/components/inspector/Inspector.tsx +46 -0
- package/references/openteams/editor/src/components/inspector/RoleInspector.tsx +508 -0
- package/references/openteams/editor/src/components/inspector/TeamInspector.tsx +126 -0
- package/references/openteams/editor/src/components/nodes/ChannelNode.tsx +103 -0
- package/references/openteams/editor/src/components/nodes/RoleNode.tsx +157 -0
- package/references/openteams/editor/src/components/nodes/node-styles.ts +101 -0
- package/references/openteams/editor/src/components/sidebar/Sidebar.tsx +227 -0
- package/references/openteams/editor/src/components/toolbar/ExportModal.tsx +110 -0
- package/references/openteams/editor/src/components/toolbar/ImportModal.tsx +139 -0
- package/references/openteams/editor/src/components/toolbar/Toolbar.tsx +190 -0
- package/references/openteams/editor/src/hooks/use-autosave.ts +126 -0
- package/references/openteams/editor/src/hooks/use-keyboard.ts +106 -0
- package/references/openteams/editor/src/hooks/use-validation.ts +45 -0
- package/references/openteams/editor/src/index.css +245 -0
- package/references/openteams/editor/src/lib/auto-layout.ts +51 -0
- package/references/openteams/editor/src/lib/bundled-templates.ts +42 -0
- package/references/openteams/editor/src/lib/compiler.ts +75 -0
- package/references/openteams/editor/src/lib/load-template.ts +103 -0
- package/references/openteams/editor/src/lib/rebuild-edges.ts +104 -0
- package/references/openteams/editor/src/lib/serializer.ts +408 -0
- package/references/openteams/editor/src/lib/signal-catalog.ts +50 -0
- package/references/openteams/editor/src/lib/validator.ts +172 -0
- package/references/openteams/editor/src/main.tsx +10 -0
- package/references/openteams/editor/src/stores/canvas-store.ts +80 -0
- package/references/openteams/editor/src/stores/config-store.ts +243 -0
- package/references/openteams/editor/src/stores/history-store.ts +143 -0
- package/references/openteams/editor/src/stores/theme-store.ts +66 -0
- package/references/openteams/editor/src/stores/ui-store.ts +46 -0
- package/references/openteams/editor/src/stores/validation-store.ts +27 -0
- package/references/openteams/editor/src/types/editor.ts +74 -0
- package/references/openteams/editor/src/vite-env.d.ts +1 -0
- package/references/openteams/editor/tests/compiler.test.ts +151 -0
- package/references/openteams/editor/tests/e2e-add-remove.test.ts +386 -0
- package/references/openteams/editor/tests/e2e-components.test.tsx +424 -0
- package/references/openteams/editor/tests/e2e-export-roundtrip.test.ts +299 -0
- package/references/openteams/editor/tests/e2e-template-load.test.ts +204 -0
- package/references/openteams/editor/tests/e2e-ui-store.test.ts +126 -0
- package/references/openteams/editor/tests/e2e-undo-redo.test.ts +203 -0
- package/references/openteams/editor/tests/e2e-validation.test.ts +307 -0
- package/references/openteams/editor/tests/serializer.test.ts +142 -0
- package/references/openteams/editor/tests/setup.ts +52 -0
- package/references/openteams/editor/tests/validator.test.ts +92 -0
- package/references/openteams/editor/tsconfig.json +21 -0
- package/references/openteams/editor/tsconfig.tsbuildinfo +1 -0
- package/references/openteams/editor/vite.config.ts +28 -0
- package/references/openteams/examples/bmad-method/prompts/analyst/ROLE.md +16 -0
- package/references/openteams/examples/bmad-method/prompts/analyst/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/architect/ROLE.md +24 -0
- package/references/openteams/examples/bmad-method/prompts/architect/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/developer/ROLE.md +25 -0
- package/references/openteams/examples/bmad-method/prompts/developer/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/master/ROLE.md +21 -0
- package/references/openteams/examples/bmad-method/prompts/master/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/pm/ROLE.md +20 -0
- package/references/openteams/examples/bmad-method/prompts/pm/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/qa/ROLE.md +17 -0
- package/references/openteams/examples/bmad-method/prompts/qa/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/ROLE.md +23 -0
- package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/scrum-master/ROLE.md +27 -0
- package/references/openteams/examples/bmad-method/prompts/scrum-master/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/tech-writer/ROLE.md +21 -0
- package/references/openteams/examples/bmad-method/prompts/tech-writer/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/ux-designer/ROLE.md +16 -0
- package/references/openteams/examples/bmad-method/prompts/ux-designer/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/roles/analyst.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/architect.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/developer.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/master.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/pm.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/qa.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/quick-flow-dev.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/scrum-master.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/tech-writer.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/ux-designer.yaml +8 -0
- package/references/openteams/examples/bmad-method/team.yaml +161 -0
- package/references/openteams/examples/bug-fix-pipeline/roles/fixer.yaml +9 -0
- package/references/openteams/examples/bug-fix-pipeline/roles/investigator.yaml +8 -0
- package/references/openteams/examples/bug-fix-pipeline/roles/pr-creator.yaml +6 -0
- package/references/openteams/examples/bug-fix-pipeline/roles/triager.yaml +7 -0
- package/references/openteams/examples/bug-fix-pipeline/roles/verifier.yaml +8 -0
- package/references/openteams/examples/bug-fix-pipeline/team.yaml +88 -0
- package/references/openteams/examples/codebase-migration/roles/assessor.yaml +7 -0
- package/references/openteams/examples/codebase-migration/roles/migrator.yaml +9 -0
- package/references/openteams/examples/codebase-migration/roles/planner.yaml +5 -0
- package/references/openteams/examples/codebase-migration/roles/test-extractor.yaml +9 -0
- package/references/openteams/examples/codebase-migration/roles/validator.yaml +7 -0
- package/references/openteams/examples/codebase-migration/team.yaml +81 -0
- package/references/openteams/examples/docs-sync/roles/adr-writer.yaml +7 -0
- package/references/openteams/examples/docs-sync/roles/api-doc-writer.yaml +7 -0
- package/references/openteams/examples/docs-sync/roles/change-detector.yaml +7 -0
- package/references/openteams/examples/docs-sync/roles/doc-reviewer.yaml +7 -0
- package/references/openteams/examples/docs-sync/roles/guide-writer.yaml +7 -0
- package/references/openteams/examples/docs-sync/team.yaml +84 -0
- package/references/openteams/examples/gsd/prompts/codebase-mapper/ROLE.md +17 -0
- package/references/openteams/examples/gsd/prompts/codebase-mapper/SOUL.md +5 -0
- package/references/openteams/examples/gsd/prompts/debugger/ROLE.md +25 -0
- package/references/openteams/examples/gsd/prompts/debugger/SOUL.md +5 -0
- package/references/openteams/examples/gsd/prompts/executor/ROLE.md +34 -0
- package/references/openteams/examples/gsd/prompts/executor/SOUL.md +5 -0
- package/references/openteams/examples/gsd/prompts/integration-checker/ROLE.md +18 -0
- package/references/openteams/examples/gsd/prompts/integration-checker/SOUL.md +3 -0
- package/references/openteams/examples/gsd/prompts/orchestrator/ROLE.md +42 -0
- package/references/openteams/examples/gsd/prompts/orchestrator/SOUL.md +5 -0
- package/references/openteams/examples/gsd/prompts/phase-researcher/ROLE.md +15 -0
- package/references/openteams/examples/gsd/prompts/phase-researcher/SOUL.md +3 -0
- package/references/openteams/examples/gsd/prompts/plan-checker/ROLE.md +17 -0
- package/references/openteams/examples/gsd/prompts/plan-checker/SOUL.md +3 -0
- package/references/openteams/examples/gsd/prompts/planner/ROLE.md +28 -0
- package/references/openteams/examples/gsd/prompts/planner/SOUL.md +5 -0
- package/references/openteams/examples/gsd/prompts/project-researcher/ROLE.md +16 -0
- package/references/openteams/examples/gsd/prompts/project-researcher/SOUL.md +3 -0
- package/references/openteams/examples/gsd/prompts/research-synthesizer/ROLE.md +13 -0
- package/references/openteams/examples/gsd/prompts/research-synthesizer/SOUL.md +3 -0
- package/references/openteams/examples/gsd/prompts/roadmapper/ROLE.md +14 -0
- package/references/openteams/examples/gsd/prompts/roadmapper/SOUL.md +3 -0
- package/references/openteams/examples/gsd/prompts/verifier/ROLE.md +19 -0
- package/references/openteams/examples/gsd/prompts/verifier/SOUL.md +5 -0
- package/references/openteams/examples/gsd/roles/codebase-mapper.yaml +8 -0
- package/references/openteams/examples/gsd/roles/debugger.yaml +8 -0
- package/references/openteams/examples/gsd/roles/executor.yaml +8 -0
- package/references/openteams/examples/gsd/roles/integration-checker.yaml +8 -0
- package/references/openteams/examples/gsd/roles/orchestrator.yaml +9 -0
- package/references/openteams/examples/gsd/roles/phase-researcher.yaml +7 -0
- package/references/openteams/examples/gsd/roles/plan-checker.yaml +8 -0
- package/references/openteams/examples/gsd/roles/planner.yaml +8 -0
- package/references/openteams/examples/gsd/roles/project-researcher.yaml +8 -0
- package/references/openteams/examples/gsd/roles/research-synthesizer.yaml +7 -0
- package/references/openteams/examples/gsd/roles/roadmapper.yaml +7 -0
- package/references/openteams/examples/gsd/roles/verifier.yaml +8 -0
- package/references/openteams/examples/gsd/team.yaml +154 -0
- package/references/openteams/examples/incident-response/roles/communicator.yaml +5 -0
- package/references/openteams/examples/incident-response/roles/fix-proposer.yaml +7 -0
- package/references/openteams/examples/incident-response/roles/incident-triager.yaml +8 -0
- package/references/openteams/examples/incident-response/roles/investigator.yaml +8 -0
- package/references/openteams/examples/incident-response/team.yaml +68 -0
- package/references/openteams/examples/pr-review-checks/roles/code-reviewer.yaml +7 -0
- package/references/openteams/examples/pr-review-checks/roles/security-scanner.yaml +6 -0
- package/references/openteams/examples/pr-review-checks/roles/summarizer.yaml +6 -0
- package/references/openteams/examples/pr-review-checks/roles/test-checker.yaml +8 -0
- package/references/openteams/examples/pr-review-checks/team.yaml +64 -0
- package/references/openteams/examples/security-audit/roles/code-analyzer.yaml +6 -0
- package/references/openteams/examples/security-audit/roles/dep-scanner.yaml +7 -0
- package/references/openteams/examples/security-audit/roles/fixer.yaml +9 -0
- package/references/openteams/examples/security-audit/roles/pr-creator.yaml +6 -0
- package/references/openteams/examples/security-audit/roles/prioritizer.yaml +6 -0
- package/references/openteams/examples/security-audit/roles/secrets-scanner.yaml +6 -0
- package/references/openteams/examples/security-audit/roles/verifier.yaml +8 -0
- package/references/openteams/examples/security-audit/team.yaml +102 -0
- package/references/openteams/media/banner.png +0 -0
- package/references/openteams/media/editor.png +0 -0
- package/references/openteams/package-lock.json +4804 -0
- package/references/openteams/package.json +58 -0
- package/references/openteams/schema/role.schema.json +147 -0
- package/references/openteams/schema/team.schema.json +311 -0
- package/references/openteams/src/cli/editor.ts +170 -0
- package/references/openteams/src/cli/generate.test.ts +191 -0
- package/references/openteams/src/cli/generate.ts +242 -0
- package/references/openteams/src/cli/prompt-utils.ts +42 -0
- package/references/openteams/src/cli/template.test.ts +365 -0
- package/references/openteams/src/cli/template.ts +205 -0
- package/references/openteams/src/cli.ts +22 -0
- package/references/openteams/src/generators/agent-prompt-generator.test.ts +426 -0
- package/references/openteams/src/generators/agent-prompt-generator.ts +556 -0
- package/references/openteams/src/generators/package-generator.test.ts +129 -0
- package/references/openteams/src/generators/package-generator.ts +110 -0
- package/references/openteams/src/generators/skill-generator.test.ts +274 -0
- package/references/openteams/src/generators/skill-generator.ts +394 -0
- package/references/openteams/src/index.ts +84 -0
- package/references/openteams/src/template/builtins.test.ts +74 -0
- package/references/openteams/src/template/builtins.ts +108 -0
- package/references/openteams/src/template/install-service.test.ts +452 -0
- package/references/openteams/src/template/install-service.ts +332 -0
- package/references/openteams/src/template/loader.test.ts +1696 -0
- package/references/openteams/src/template/loader.ts +804 -0
- package/references/openteams/src/template/resolver.test.ts +304 -0
- package/references/openteams/src/template/resolver.ts +251 -0
- package/references/openteams/src/template/types.ts +229 -0
- package/references/openteams/tsconfig.cjs.json +7 -0
- package/references/openteams/tsconfig.esm.json +8 -0
- package/references/openteams/tsconfig.json +16 -0
- package/references/openteams/vitest.config.ts +9 -0
- package/references/sessionlog/.husky/pre-commit +1 -0
- package/references/sessionlog/.lintstagedrc.json +4 -0
- package/references/sessionlog/.prettierignore +4 -0
- package/references/sessionlog/.prettierrc.json +11 -0
- package/references/sessionlog/LICENSE +21 -0
- package/references/sessionlog/README.md +453 -0
- package/references/sessionlog/eslint.config.js +58 -0
- package/references/sessionlog/package-lock.json +3672 -0
- package/references/sessionlog/package.json +65 -0
- package/references/sessionlog/src/__tests__/agent-hooks.test.ts +570 -0
- package/references/sessionlog/src/__tests__/agent-registry.test.ts +127 -0
- package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +225 -0
- package/references/sessionlog/src/__tests__/claude-generator.test.ts +46 -0
- package/references/sessionlog/src/__tests__/commit-msg.test.ts +86 -0
- package/references/sessionlog/src/__tests__/cursor-agent.test.ts +224 -0
- package/references/sessionlog/src/__tests__/e2e-live.test.ts +890 -0
- package/references/sessionlog/src/__tests__/event-log.test.ts +183 -0
- package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +105 -0
- package/references/sessionlog/src/__tests__/gemini-agent.test.ts +375 -0
- package/references/sessionlog/src/__tests__/git-hooks.test.ts +78 -0
- package/references/sessionlog/src/__tests__/hook-managers.test.ts +121 -0
- package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +759 -0
- package/references/sessionlog/src/__tests__/opencode-agent.test.ts +338 -0
- package/references/sessionlog/src/__tests__/redaction.test.ts +136 -0
- package/references/sessionlog/src/__tests__/session-repo.test.ts +353 -0
- package/references/sessionlog/src/__tests__/session-store.test.ts +166 -0
- package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +466 -0
- package/references/sessionlog/src/__tests__/skill-live.test.ts +461 -0
- package/references/sessionlog/src/__tests__/summarize.test.ts +348 -0
- package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +610 -0
- package/references/sessionlog/src/__tests__/task-plan-live.test.ts +632 -0
- package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +121 -0
- package/references/sessionlog/src/__tests__/types.test.ts +166 -0
- package/references/sessionlog/src/__tests__/utils.test.ts +333 -0
- package/references/sessionlog/src/__tests__/validation.test.ts +103 -0
- package/references/sessionlog/src/__tests__/worktree.test.ts +57 -0
- package/references/sessionlog/src/agent/registry.ts +143 -0
- package/references/sessionlog/src/agent/session-types.ts +113 -0
- package/references/sessionlog/src/agent/types.ts +220 -0
- package/references/sessionlog/src/cli.ts +597 -0
- package/references/sessionlog/src/commands/clean.ts +133 -0
- package/references/sessionlog/src/commands/disable.ts +84 -0
- package/references/sessionlog/src/commands/doctor.ts +145 -0
- package/references/sessionlog/src/commands/enable.ts +202 -0
- package/references/sessionlog/src/commands/explain.ts +261 -0
- package/references/sessionlog/src/commands/reset.ts +105 -0
- package/references/sessionlog/src/commands/resume.ts +180 -0
- package/references/sessionlog/src/commands/rewind.ts +195 -0
- package/references/sessionlog/src/commands/setup-ccweb.ts +275 -0
- package/references/sessionlog/src/commands/status.ts +172 -0
- package/references/sessionlog/src/config.ts +165 -0
- package/references/sessionlog/src/events/event-log.ts +126 -0
- package/references/sessionlog/src/git-operations.ts +558 -0
- package/references/sessionlog/src/hooks/git-hooks.ts +165 -0
- package/references/sessionlog/src/hooks/lifecycle.ts +391 -0
- package/references/sessionlog/src/index.ts +650 -0
- package/references/sessionlog/src/security/redaction.ts +283 -0
- package/references/sessionlog/src/session/state-machine.ts +452 -0
- package/references/sessionlog/src/store/checkpoint-store.ts +509 -0
- package/references/sessionlog/src/store/native-store.ts +173 -0
- package/references/sessionlog/src/store/provider-types.ts +99 -0
- package/references/sessionlog/src/store/session-store.ts +266 -0
- package/references/sessionlog/src/strategy/attribution.ts +296 -0
- package/references/sessionlog/src/strategy/common.ts +207 -0
- package/references/sessionlog/src/strategy/content-overlap.ts +228 -0
- package/references/sessionlog/src/strategy/manual-commit.ts +988 -0
- package/references/sessionlog/src/strategy/types.ts +279 -0
- package/references/sessionlog/src/summarize/claude-generator.ts +115 -0
- package/references/sessionlog/src/summarize/summarize.ts +432 -0
- package/references/sessionlog/src/types.ts +508 -0
- package/references/sessionlog/src/utils/chunk-files.ts +49 -0
- package/references/sessionlog/src/utils/commit-message.ts +65 -0
- package/references/sessionlog/src/utils/detect-agent.ts +36 -0
- package/references/sessionlog/src/utils/hook-managers.ts +125 -0
- package/references/sessionlog/src/utils/ide-tags.ts +32 -0
- package/references/sessionlog/src/utils/paths.ts +79 -0
- package/references/sessionlog/src/utils/preview-rewind.ts +80 -0
- package/references/sessionlog/src/utils/rewind-conflict.ts +121 -0
- package/references/sessionlog/src/utils/shadow-branch.ts +109 -0
- package/references/sessionlog/src/utils/string-utils.ts +46 -0
- package/references/sessionlog/src/utils/todo-extract.ts +188 -0
- package/references/sessionlog/src/utils/trailers.ts +187 -0
- package/references/sessionlog/src/utils/transcript-parse.ts +177 -0
- package/references/sessionlog/src/utils/transcript-timestamp.ts +59 -0
- package/references/sessionlog/src/utils/tree-ops.ts +219 -0
- package/references/sessionlog/src/utils/tty.ts +72 -0
- package/references/sessionlog/src/utils/validation.ts +65 -0
- package/references/sessionlog/src/utils/worktree.ts +58 -0
- package/references/sessionlog/src/wire-types.ts +59 -0
- package/references/sessionlog/templates/setup-env.sh +153 -0
- package/references/sessionlog/tsconfig.json +18 -0
- package/references/sessionlog/vitest.config.ts +12 -0
- package/references/skill-tree/.claude/settings.json +6 -0
- package/references/skill-tree/.sudocode/issues.jsonl +19 -0
- package/references/skill-tree/.sudocode/specs.jsonl +3 -0
- package/references/skill-tree/CLAUDE.md +132 -0
- package/references/skill-tree/README.md +396 -0
- package/references/skill-tree/docs/GAPS_v1.md +221 -0
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
- package/references/skill-tree/docs/TODOS.md +91 -0
- package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
- package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
- package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
- package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
- package/references/skill-tree/docs/scraper/README.md +170 -0
- package/references/skill-tree/examples/basic-usage.ts +157 -0
- package/references/skill-tree/package-lock.json +1852 -0
- package/references/skill-tree/package.json +66 -0
- package/references/skill-tree/plan.md +78 -0
- package/references/skill-tree/scraper/README.md +123 -0
- package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
- package/references/skill-tree/scraper/docs/PLAN.md +336 -0
- package/references/skill-tree/scraper/drizzle.config.ts +10 -0
- package/references/skill-tree/scraper/package-lock.json +6329 -0
- package/references/skill-tree/scraper/package.json +68 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
- package/references/skill-tree/scraper/tsup.config.ts +14 -0
- package/references/skill-tree/scraper/vitest.config.ts +17 -0
- package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
- package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
- package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
- package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
- package/references/skill-tree/test/run-all.ts +106 -0
- package/references/skill-tree/test/utils.ts +128 -0
- package/references/skill-tree/vitest.config.ts +16 -0
- package/references/swarmkit/LICENSE +21 -0
- package/references/swarmkit/README.md +130 -0
- package/references/swarmkit/docs/design.md +453 -0
- package/references/swarmkit/docs/package-setup-reference.md +519 -0
- package/references/swarmkit/package-lock.json +1938 -0
- package/references/swarmkit/package.json +43 -0
- package/references/swarmkit/src/cli.ts +41 -0
- package/references/swarmkit/src/commands/add.ts +126 -0
- package/references/swarmkit/src/commands/doctor.ts +117 -0
- package/references/swarmkit/src/commands/hive.ts +279 -0
- package/references/swarmkit/src/commands/init/phases/configure.ts +74 -0
- package/references/swarmkit/src/commands/init/phases/global-setup.ts +104 -0
- package/references/swarmkit/src/commands/init/phases/packages.ts +44 -0
- package/references/swarmkit/src/commands/init/phases/project.ts +81 -0
- package/references/swarmkit/src/commands/init/phases/use-case.ts +47 -0
- package/references/swarmkit/src/commands/init/state.test.ts +23 -0
- package/references/swarmkit/src/commands/init/state.ts +22 -0
- package/references/swarmkit/src/commands/init/wizard.ts +160 -0
- package/references/swarmkit/src/commands/init.ts +17 -0
- package/references/swarmkit/src/commands/login.ts +106 -0
- package/references/swarmkit/src/commands/logout.ts +22 -0
- package/references/swarmkit/src/commands/remove.ts +72 -0
- package/references/swarmkit/src/commands/status.ts +101 -0
- package/references/swarmkit/src/commands/update.ts +62 -0
- package/references/swarmkit/src/commands/whoami.ts +41 -0
- package/references/swarmkit/src/config/global.test.ts +258 -0
- package/references/swarmkit/src/config/global.ts +141 -0
- package/references/swarmkit/src/config/keys.test.ts +109 -0
- package/references/swarmkit/src/config/keys.ts +49 -0
- package/references/swarmkit/src/doctor/checks.test.ts +366 -0
- package/references/swarmkit/src/doctor/checks.ts +292 -0
- package/references/swarmkit/src/doctor/types.ts +33 -0
- package/references/swarmkit/src/hub/auth-flow.test.ts +127 -0
- package/references/swarmkit/src/hub/auth-flow.ts +144 -0
- package/references/swarmkit/src/hub/client.test.ts +224 -0
- package/references/swarmkit/src/hub/client.ts +185 -0
- package/references/swarmkit/src/hub/credentials.test.ts +132 -0
- package/references/swarmkit/src/hub/credentials.ts +51 -0
- package/references/swarmkit/src/index.ts +116 -0
- package/references/swarmkit/src/packages/installer.test.ts +365 -0
- package/references/swarmkit/src/packages/installer.ts +206 -0
- package/references/swarmkit/src/packages/plugin.test.ts +141 -0
- package/references/swarmkit/src/packages/plugin.ts +46 -0
- package/references/swarmkit/src/packages/registry.test.ts +235 -0
- package/references/swarmkit/src/packages/registry.ts +209 -0
- package/references/swarmkit/src/packages/setup.test.ts +1395 -0
- package/references/swarmkit/src/packages/setup.ts +671 -0
- package/references/swarmkit/src/utils/ui.test.ts +115 -0
- package/references/swarmkit/src/utils/ui.ts +62 -0
- package/references/swarmkit/tsconfig.json +17 -0
- package/references/swarmkit/vitest.config.ts +9 -0
- package/scripts/bootstrap.mjs +33 -1
- package/scripts/generate-agents.mjs +5 -1
- package/scripts/map-hook.mjs +100 -63
- package/scripts/map-sidecar.mjs +198 -25
- package/scripts/team-loader.mjs +26 -48
- package/skills/swarm/SKILL.md +85 -27
- package/src/__tests__/agent-generator.test.mjs +15 -23
- package/src/__tests__/bootstrap.test.mjs +124 -1
- package/src/__tests__/config.test.mjs +72 -27
- package/src/__tests__/context-output.test.mjs +13 -14
- package/src/__tests__/e2e-inbox-integration.test.mjs +732 -0
- package/src/__tests__/e2e-live-inbox.test.mjs +597 -0
- package/src/__tests__/e2e-live-map.test.mjs +536 -0
- package/src/__tests__/e2e-mesh-sidecar.test.mjs +570 -0
- package/src/__tests__/e2e-native-task-hooks.test.mjs +376 -0
- package/src/__tests__/e2e-sidecar-bridge.test.mjs +477 -0
- package/src/__tests__/helpers.mjs +13 -0
- package/src/__tests__/inbox-integration.test.mjs +298 -0
- package/src/__tests__/inbox.test.mjs +22 -89
- package/src/__tests__/index.test.mjs +33 -9
- package/src/__tests__/integration.test.mjs +514 -0
- package/src/__tests__/map-events.test.mjs +514 -150
- package/src/__tests__/mesh-connection.test.mjs +308 -0
- package/src/__tests__/opentasks-client.test.mjs +517 -0
- package/src/__tests__/paths.test.mjs +185 -54
- package/src/__tests__/sidecar-client.test.mjs +35 -0
- package/src/__tests__/sidecar-server.test.mjs +124 -0
- package/src/__tests__/skilltree-client.test.mjs +126 -0
- package/src/agent-generator.mjs +129 -67
- package/src/bootstrap.mjs +174 -13
- package/src/config.mjs +35 -1
- package/src/context-output.mjs +254 -30
- package/src/inbox.mjs +9 -54
- package/src/index.mjs +38 -7
- package/src/map-connection.mjs +1 -0
- package/src/map-events.mjs +350 -80
- package/src/mesh-connection.mjs +148 -0
- package/src/opentasks-client.mjs +269 -0
- package/src/paths.mjs +178 -28
- package/src/sessionlog.mjs +14 -9
- package/src/sidecar-client.mjs +79 -25
- package/src/sidecar-server.mjs +205 -16
- package/src/skilltree-client.mjs +218 -0
- package/src/template.mjs +68 -4
- package/vitest.config.mjs +1 -0
|
@@ -0,0 +1,1383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Database Provider
|
|
3
|
+
*
|
|
4
|
+
* Wraps the existing DAL functions to implement the DatabaseProvider interface.
|
|
5
|
+
* Uses better-sqlite3 for synchronous SQLite access.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import Database from 'better-sqlite3';
|
|
9
|
+
import { nanoid } from 'nanoid';
|
|
10
|
+
import bcrypt from 'bcrypt';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import type {
|
|
14
|
+
DatabaseProvider,
|
|
15
|
+
SQLiteProviderConfig,
|
|
16
|
+
AgentRepository,
|
|
17
|
+
PostRepository,
|
|
18
|
+
CommentRepository,
|
|
19
|
+
HiveRepository,
|
|
20
|
+
VoteRepository,
|
|
21
|
+
FollowRepository,
|
|
22
|
+
InviteRepository,
|
|
23
|
+
UploadRepository,
|
|
24
|
+
InstanceRepository,
|
|
25
|
+
SearchRepository,
|
|
26
|
+
CreateAgentInput,
|
|
27
|
+
CreateHumanInput,
|
|
28
|
+
UpdateAgentInput,
|
|
29
|
+
CreatePostInput,
|
|
30
|
+
UpdatePostInput,
|
|
31
|
+
ListPostsOptions,
|
|
32
|
+
CreateCommentInput,
|
|
33
|
+
UpdateCommentInput,
|
|
34
|
+
ListCommentsOptions,
|
|
35
|
+
CreateHiveInput,
|
|
36
|
+
UpdateHiveInput,
|
|
37
|
+
CastVoteInput,
|
|
38
|
+
CreateInviteInput,
|
|
39
|
+
CreateUploadInput,
|
|
40
|
+
Upload,
|
|
41
|
+
CreateInstanceInput,
|
|
42
|
+
SearchOptions,
|
|
43
|
+
SearchResults,
|
|
44
|
+
} from './types.js';
|
|
45
|
+
import type { Agent, AgentPublic, Post, PostWithAuthor, Comment, CommentWithAuthor, Hive, Vote, Follow, InviteCode, FederatedInstance } from '../../types.js';
|
|
46
|
+
|
|
47
|
+
const SALT_ROUNDS = 10;
|
|
48
|
+
|
|
49
|
+
// Schema and migrations
|
|
50
|
+
const CREATE_TABLES = `
|
|
51
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
52
|
+
version INTEGER PRIMARY KEY
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
56
|
+
id TEXT PRIMARY KEY,
|
|
57
|
+
name TEXT UNIQUE NOT NULL,
|
|
58
|
+
api_key_hash TEXT,
|
|
59
|
+
description TEXT,
|
|
60
|
+
avatar_url TEXT,
|
|
61
|
+
karma INTEGER DEFAULT 0,
|
|
62
|
+
is_verified INTEGER DEFAULT 0,
|
|
63
|
+
is_admin INTEGER DEFAULT 0,
|
|
64
|
+
metadata TEXT,
|
|
65
|
+
verification_status TEXT DEFAULT 'pending',
|
|
66
|
+
verification_data TEXT,
|
|
67
|
+
account_type TEXT DEFAULT 'agent',
|
|
68
|
+
email TEXT UNIQUE,
|
|
69
|
+
password_hash TEXT,
|
|
70
|
+
email_verified INTEGER DEFAULT 0,
|
|
71
|
+
password_reset_token TEXT,
|
|
72
|
+
password_reset_expires TEXT,
|
|
73
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
74
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
75
|
+
last_seen_at TEXT
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
CREATE TABLE IF NOT EXISTS hives (
|
|
79
|
+
id TEXT PRIMARY KEY,
|
|
80
|
+
name TEXT UNIQUE NOT NULL,
|
|
81
|
+
description TEXT,
|
|
82
|
+
owner_id TEXT NOT NULL REFERENCES agents(id),
|
|
83
|
+
is_public INTEGER DEFAULT 1,
|
|
84
|
+
settings TEXT,
|
|
85
|
+
member_count INTEGER DEFAULT 0,
|
|
86
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
87
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
CREATE TABLE IF NOT EXISTS posts (
|
|
91
|
+
id TEXT PRIMARY KEY,
|
|
92
|
+
hive_id TEXT NOT NULL REFERENCES hives(id) ON DELETE CASCADE,
|
|
93
|
+
author_id TEXT NOT NULL REFERENCES agents(id),
|
|
94
|
+
title TEXT NOT NULL,
|
|
95
|
+
content TEXT,
|
|
96
|
+
url TEXT,
|
|
97
|
+
score INTEGER DEFAULT 0,
|
|
98
|
+
comment_count INTEGER DEFAULT 0,
|
|
99
|
+
is_pinned INTEGER DEFAULT 0,
|
|
100
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
101
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
CREATE TABLE IF NOT EXISTS comments (
|
|
105
|
+
id TEXT PRIMARY KEY,
|
|
106
|
+
post_id TEXT NOT NULL REFERENCES posts(id) ON DELETE CASCADE,
|
|
107
|
+
parent_id TEXT REFERENCES comments(id),
|
|
108
|
+
author_id TEXT NOT NULL REFERENCES agents(id),
|
|
109
|
+
content TEXT NOT NULL,
|
|
110
|
+
score INTEGER DEFAULT 0,
|
|
111
|
+
depth INTEGER DEFAULT 0,
|
|
112
|
+
path TEXT NOT NULL,
|
|
113
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
114
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
CREATE TABLE IF NOT EXISTS votes (
|
|
118
|
+
id TEXT PRIMARY KEY,
|
|
119
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
120
|
+
target_type TEXT NOT NULL CHECK (target_type IN ('post', 'comment')),
|
|
121
|
+
target_id TEXT NOT NULL,
|
|
122
|
+
value INTEGER NOT NULL CHECK (value IN (-1, 1)),
|
|
123
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
124
|
+
UNIQUE(agent_id, target_type, target_id)
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
CREATE TABLE IF NOT EXISTS memberships (
|
|
128
|
+
id TEXT PRIMARY KEY,
|
|
129
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
130
|
+
hive_id TEXT NOT NULL REFERENCES hives(id) ON DELETE CASCADE,
|
|
131
|
+
role TEXT DEFAULT 'member' CHECK (role IN ('member', 'moderator', 'owner')),
|
|
132
|
+
joined_at TEXT DEFAULT (datetime('now')),
|
|
133
|
+
UNIQUE(agent_id, hive_id)
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
CREATE TABLE IF NOT EXISTS follows (
|
|
137
|
+
id TEXT PRIMARY KEY,
|
|
138
|
+
follower_id TEXT NOT NULL REFERENCES agents(id),
|
|
139
|
+
following_id TEXT NOT NULL REFERENCES agents(id),
|
|
140
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
141
|
+
UNIQUE(follower_id, following_id)
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
CREATE TABLE IF NOT EXISTS invite_codes (
|
|
145
|
+
id TEXT PRIMARY KEY,
|
|
146
|
+
code TEXT UNIQUE NOT NULL,
|
|
147
|
+
created_by TEXT REFERENCES agents(id),
|
|
148
|
+
used_by TEXT REFERENCES agents(id),
|
|
149
|
+
uses_left INTEGER DEFAULT 1,
|
|
150
|
+
expires_at TEXT,
|
|
151
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
CREATE TABLE IF NOT EXISTS uploads (
|
|
155
|
+
id TEXT PRIMARY KEY,
|
|
156
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
157
|
+
filename TEXT NOT NULL,
|
|
158
|
+
mime_type TEXT NOT NULL,
|
|
159
|
+
size INTEGER NOT NULL,
|
|
160
|
+
storage_key TEXT UNIQUE NOT NULL,
|
|
161
|
+
purpose TEXT NOT NULL,
|
|
162
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
CREATE TABLE IF NOT EXISTS federated_instances (
|
|
166
|
+
id TEXT PRIMARY KEY,
|
|
167
|
+
url TEXT UNIQUE NOT NULL,
|
|
168
|
+
name TEXT NOT NULL,
|
|
169
|
+
public_key TEXT,
|
|
170
|
+
status TEXT DEFAULT 'pending',
|
|
171
|
+
is_trusted INTEGER DEFAULT 0,
|
|
172
|
+
agent_count INTEGER DEFAULT 0,
|
|
173
|
+
post_count INTEGER DEFAULT 0,
|
|
174
|
+
last_sync TEXT,
|
|
175
|
+
last_error TEXT,
|
|
176
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
177
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
-- Indexes
|
|
181
|
+
CREATE INDEX IF NOT EXISTS idx_posts_hive ON posts(hive_id);
|
|
182
|
+
CREATE INDEX IF NOT EXISTS idx_posts_author ON posts(author_id);
|
|
183
|
+
CREATE INDEX IF NOT EXISTS idx_posts_created ON posts(created_at DESC);
|
|
184
|
+
CREATE INDEX IF NOT EXISTS idx_comments_post ON comments(post_id);
|
|
185
|
+
CREATE INDEX IF NOT EXISTS idx_comments_path ON comments(path);
|
|
186
|
+
CREATE INDEX IF NOT EXISTS idx_votes_target ON votes(target_type, target_id);
|
|
187
|
+
CREATE INDEX IF NOT EXISTS idx_memberships_hive ON memberships(hive_id);
|
|
188
|
+
CREATE INDEX IF NOT EXISTS idx_memberships_agent ON memberships(agent_id);
|
|
189
|
+
CREATE INDEX IF NOT EXISTS idx_follows_follower ON follows(follower_id);
|
|
190
|
+
CREATE INDEX IF NOT EXISTS idx_follows_following ON follows(following_id);
|
|
191
|
+
CREATE INDEX IF NOT EXISTS idx_uploads_agent ON uploads(agent_id);
|
|
192
|
+
`;
|
|
193
|
+
|
|
194
|
+
const CREATE_FTS = `
|
|
195
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS posts_fts USING fts5(title, content, content=posts, content_rowid=rowid);
|
|
196
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS comments_fts USING fts5(content, content=comments, content_rowid=rowid);
|
|
197
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS agents_fts USING fts5(name, description, content=agents, content_rowid=rowid);
|
|
198
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS hives_fts USING fts5(name, description, content=hives, content_rowid=rowid);
|
|
199
|
+
|
|
200
|
+
-- Triggers to keep FTS in sync
|
|
201
|
+
CREATE TRIGGER IF NOT EXISTS posts_ai AFTER INSERT ON posts BEGIN
|
|
202
|
+
INSERT INTO posts_fts(rowid, title, content) VALUES (NEW.rowid, NEW.title, NEW.content);
|
|
203
|
+
END;
|
|
204
|
+
CREATE TRIGGER IF NOT EXISTS posts_ad AFTER DELETE ON posts BEGIN
|
|
205
|
+
INSERT INTO posts_fts(posts_fts, rowid, title, content) VALUES('delete', OLD.rowid, OLD.title, OLD.content);
|
|
206
|
+
END;
|
|
207
|
+
CREATE TRIGGER IF NOT EXISTS posts_au AFTER UPDATE ON posts BEGIN
|
|
208
|
+
INSERT INTO posts_fts(posts_fts, rowid, title, content) VALUES('delete', OLD.rowid, OLD.title, OLD.content);
|
|
209
|
+
INSERT INTO posts_fts(rowid, title, content) VALUES (NEW.rowid, NEW.title, NEW.content);
|
|
210
|
+
END;
|
|
211
|
+
`;
|
|
212
|
+
|
|
213
|
+
// Helper functions
|
|
214
|
+
function rowToAgent(row: Record<string, unknown>): Agent {
|
|
215
|
+
return {
|
|
216
|
+
...row,
|
|
217
|
+
is_verified: Boolean(row.is_verified),
|
|
218
|
+
is_admin: Boolean(row.is_admin),
|
|
219
|
+
email_verified: Boolean(row.email_verified),
|
|
220
|
+
account_type: (row.account_type as string) || 'agent',
|
|
221
|
+
metadata: row.metadata ? JSON.parse(row.metadata as string) : null,
|
|
222
|
+
verification_data: row.verification_data ? JSON.parse(row.verification_data as string) : null,
|
|
223
|
+
} as Agent;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function toPublicAgent(agent: Agent): AgentPublic {
|
|
227
|
+
return {
|
|
228
|
+
id: agent.id,
|
|
229
|
+
name: agent.name,
|
|
230
|
+
description: agent.description,
|
|
231
|
+
avatar_url: agent.avatar_url,
|
|
232
|
+
karma: agent.karma,
|
|
233
|
+
is_verified: agent.is_verified,
|
|
234
|
+
created_at: agent.created_at,
|
|
235
|
+
account_type: agent.account_type || 'agent',
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// SQLite Provider Implementation
|
|
240
|
+
export class SQLiteProvider implements DatabaseProvider {
|
|
241
|
+
readonly type = 'sqlite' as const;
|
|
242
|
+
private db: Database.Database;
|
|
243
|
+
|
|
244
|
+
agents: AgentRepository;
|
|
245
|
+
posts: PostRepository;
|
|
246
|
+
comments: CommentRepository;
|
|
247
|
+
hives: HiveRepository;
|
|
248
|
+
votes: VoteRepository;
|
|
249
|
+
follows: FollowRepository;
|
|
250
|
+
invites: InviteRepository;
|
|
251
|
+
uploads: UploadRepository;
|
|
252
|
+
instances: InstanceRepository;
|
|
253
|
+
search: SearchRepository;
|
|
254
|
+
|
|
255
|
+
// Sync repositories — stubs until sync layer is migrated to Provider pattern (NEW-11)
|
|
256
|
+
syncGroups: any = null;
|
|
257
|
+
syncPeers: any = null;
|
|
258
|
+
syncEvents: any = null;
|
|
259
|
+
syncPeerConfigs: any = null;
|
|
260
|
+
|
|
261
|
+
constructor(private config: SQLiteProviderConfig) {
|
|
262
|
+
// Ensure directory exists
|
|
263
|
+
const dbPath = path.resolve(config.path);
|
|
264
|
+
const dbDir = path.dirname(dbPath);
|
|
265
|
+
if (!fs.existsSync(dbDir)) {
|
|
266
|
+
fs.mkdirSync(dbDir, { recursive: true });
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
this.db = new Database(dbPath);
|
|
270
|
+
this.db.pragma('journal_mode = WAL');
|
|
271
|
+
this.db.pragma('foreign_keys = ON');
|
|
272
|
+
|
|
273
|
+
// Initialize repositories
|
|
274
|
+
this.agents = this.createAgentRepository();
|
|
275
|
+
this.posts = this.createPostRepository();
|
|
276
|
+
this.comments = this.createCommentRepository();
|
|
277
|
+
this.hives = this.createHiveRepository();
|
|
278
|
+
this.votes = this.createVoteRepository();
|
|
279
|
+
this.follows = this.createFollowRepository();
|
|
280
|
+
this.invites = this.createInviteRepository();
|
|
281
|
+
this.uploads = this.createUploadRepository();
|
|
282
|
+
this.instances = this.createInstanceRepository();
|
|
283
|
+
this.search = this.createSearchRepository();
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
async initialize(): Promise<void> {
|
|
287
|
+
this.db.exec(CREATE_TABLES);
|
|
288
|
+
await this.migrate();
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
async close(): Promise<void> {
|
|
292
|
+
this.db.close();
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
async transaction<T>(fn: () => Promise<T>): Promise<T> {
|
|
296
|
+
const txn = this.db.transaction(async () => {
|
|
297
|
+
return await fn();
|
|
298
|
+
});
|
|
299
|
+
return txn() as T;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
async migrate(): Promise<void> {
|
|
303
|
+
const version = await this.getSchemaVersion();
|
|
304
|
+
|
|
305
|
+
if (version === 0) {
|
|
306
|
+
// Fresh install
|
|
307
|
+
this.db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(6);
|
|
308
|
+
this.db.exec(CREATE_FTS);
|
|
309
|
+
} else if (version < 6) {
|
|
310
|
+
// Run migrations
|
|
311
|
+
if (version < 2) {
|
|
312
|
+
this.db.exec(CREATE_FTS);
|
|
313
|
+
}
|
|
314
|
+
if (version < 3) {
|
|
315
|
+
// Uploads table already in CREATE_TABLES
|
|
316
|
+
}
|
|
317
|
+
if (version < 4) {
|
|
318
|
+
// Human account fields already in CREATE_TABLES
|
|
319
|
+
}
|
|
320
|
+
if (version < 6) {
|
|
321
|
+
// Password reset fields already in CREATE_TABLES
|
|
322
|
+
}
|
|
323
|
+
this.db.prepare('UPDATE schema_version SET version = ?').run(6);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
async getSchemaVersion(): Promise<number> {
|
|
328
|
+
try {
|
|
329
|
+
const row = this.db.prepare('SELECT version FROM schema_version').get() as { version: number } | undefined;
|
|
330
|
+
return row?.version ?? 0;
|
|
331
|
+
} catch {
|
|
332
|
+
return 0;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// ============================================================================
|
|
337
|
+
// Repository Implementations
|
|
338
|
+
// ============================================================================
|
|
339
|
+
|
|
340
|
+
private createAgentRepository(): AgentRepository {
|
|
341
|
+
const db = this.db;
|
|
342
|
+
|
|
343
|
+
return {
|
|
344
|
+
async create(input: CreateAgentInput) {
|
|
345
|
+
const id = nanoid();
|
|
346
|
+
const apiKey = nanoid(32);
|
|
347
|
+
const apiKeyHash = await bcrypt.hash(apiKey, SALT_ROUNDS);
|
|
348
|
+
|
|
349
|
+
db.prepare(`
|
|
350
|
+
INSERT INTO agents (id, name, api_key_hash, description, avatar_url, is_admin, metadata)
|
|
351
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
352
|
+
`).run(
|
|
353
|
+
id,
|
|
354
|
+
input.name,
|
|
355
|
+
apiKeyHash,
|
|
356
|
+
input.description || null,
|
|
357
|
+
input.avatar_url || null,
|
|
358
|
+
input.is_admin ? 1 : 0,
|
|
359
|
+
input.metadata ? JSON.stringify(input.metadata) : null
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
const agent = await this.findById(id);
|
|
363
|
+
return { agent: agent!, apiKey };
|
|
364
|
+
},
|
|
365
|
+
|
|
366
|
+
async findById(id: string) {
|
|
367
|
+
const row = db.prepare('SELECT * FROM agents WHERE id = ?').get(id) as Record<string, unknown> | undefined;
|
|
368
|
+
return row ? rowToAgent(row) : null;
|
|
369
|
+
},
|
|
370
|
+
|
|
371
|
+
async findByName(name: string) {
|
|
372
|
+
const row = db.prepare('SELECT * FROM agents WHERE name = ?').get(name) as Record<string, unknown> | undefined;
|
|
373
|
+
return row ? rowToAgent(row) : null;
|
|
374
|
+
},
|
|
375
|
+
|
|
376
|
+
async findByApiKey(apiKey: string) {
|
|
377
|
+
const agents = db.prepare('SELECT * FROM agents WHERE api_key_hash IS NOT NULL').all() as Record<string, unknown>[];
|
|
378
|
+
for (const row of agents) {
|
|
379
|
+
if (await bcrypt.compare(apiKey, row.api_key_hash as string)) {
|
|
380
|
+
return rowToAgent(row);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return null;
|
|
384
|
+
},
|
|
385
|
+
|
|
386
|
+
async update(id: string, input: UpdateAgentInput) {
|
|
387
|
+
const updates: string[] = [];
|
|
388
|
+
const values: unknown[] = [];
|
|
389
|
+
|
|
390
|
+
if (input.description !== undefined) { updates.push('description = ?'); values.push(input.description); }
|
|
391
|
+
if (input.avatar_url !== undefined) { updates.push('avatar_url = ?'); values.push(input.avatar_url); }
|
|
392
|
+
if (input.metadata !== undefined) { updates.push('metadata = ?'); values.push(JSON.stringify(input.metadata)); }
|
|
393
|
+
if (input.verification_status !== undefined) { updates.push('verification_status = ?'); values.push(input.verification_status); }
|
|
394
|
+
if (input.verification_data !== undefined) { updates.push('verification_data = ?'); values.push(JSON.stringify(input.verification_data)); }
|
|
395
|
+
if (input.is_verified !== undefined) { updates.push('is_verified = ?'); values.push(input.is_verified ? 1 : 0); }
|
|
396
|
+
if (input.is_admin !== undefined) { updates.push('is_admin = ?'); values.push(input.is_admin ? 1 : 0); }
|
|
397
|
+
|
|
398
|
+
if (updates.length === 0) return this.findById(id);
|
|
399
|
+
|
|
400
|
+
updates.push("updated_at = datetime('now')");
|
|
401
|
+
values.push(id);
|
|
402
|
+
|
|
403
|
+
db.prepare(`UPDATE agents SET ${updates.join(', ')} WHERE id = ?`).run(...values);
|
|
404
|
+
return this.findById(id);
|
|
405
|
+
},
|
|
406
|
+
|
|
407
|
+
async updateKarma(id: string, delta: number) {
|
|
408
|
+
db.prepare(`UPDATE agents SET karma = karma + ?, updated_at = datetime('now') WHERE id = ?`).run(delta, id);
|
|
409
|
+
},
|
|
410
|
+
|
|
411
|
+
async updateLastSeen(id: string) {
|
|
412
|
+
db.prepare(`UPDATE agents SET last_seen_at = datetime('now') WHERE id = ?`).run(id);
|
|
413
|
+
},
|
|
414
|
+
|
|
415
|
+
async list(options) {
|
|
416
|
+
let query = 'SELECT * FROM agents';
|
|
417
|
+
const conditions: string[] = [];
|
|
418
|
+
const values: unknown[] = [];
|
|
419
|
+
|
|
420
|
+
if (options.verified_only) conditions.push('is_verified = 1');
|
|
421
|
+
if (conditions.length > 0) query += ' WHERE ' + conditions.join(' AND ');
|
|
422
|
+
query += ' ORDER BY created_at DESC';
|
|
423
|
+
if (options.limit) { query += ' LIMIT ?'; values.push(options.limit); }
|
|
424
|
+
if (options.offset) { query += ' OFFSET ?'; values.push(options.offset); }
|
|
425
|
+
|
|
426
|
+
const rows = db.prepare(query).all(...values) as Record<string, unknown>[];
|
|
427
|
+
return rows.map(rowToAgent);
|
|
428
|
+
},
|
|
429
|
+
|
|
430
|
+
async count() {
|
|
431
|
+
const row = db.prepare('SELECT COUNT(*) as count FROM agents').get() as { count: number };
|
|
432
|
+
return row.count;
|
|
433
|
+
},
|
|
434
|
+
|
|
435
|
+
async delete(id: string) {
|
|
436
|
+
const result = db.prepare('DELETE FROM agents WHERE id = ?').run(id);
|
|
437
|
+
return result.changes > 0;
|
|
438
|
+
},
|
|
439
|
+
|
|
440
|
+
toPublic: toPublicAgent,
|
|
441
|
+
|
|
442
|
+
// Human accounts
|
|
443
|
+
async createHuman(input: CreateHumanInput) {
|
|
444
|
+
const id = nanoid();
|
|
445
|
+
const passwordHash = await bcrypt.hash(input.password, SALT_ROUNDS);
|
|
446
|
+
|
|
447
|
+
db.prepare(`
|
|
448
|
+
INSERT INTO agents (id, name, email, password_hash, description, avatar_url, account_type, is_verified, verification_status)
|
|
449
|
+
VALUES (?, ?, ?, ?, ?, ?, 'human', 0, 'pending')
|
|
450
|
+
`).run(id, input.name, input.email.toLowerCase(), passwordHash, input.description || null, input.avatar_url || null);
|
|
451
|
+
|
|
452
|
+
return (await this.findById(id))!;
|
|
453
|
+
},
|
|
454
|
+
|
|
455
|
+
async findByEmail(email: string) {
|
|
456
|
+
const row = db.prepare('SELECT * FROM agents WHERE email = ? AND account_type = ?').get(email.toLowerCase(), 'human') as Record<string, unknown> | undefined;
|
|
457
|
+
return row ? rowToAgent(row) : null;
|
|
458
|
+
},
|
|
459
|
+
|
|
460
|
+
async verifyPassword(agent: Agent, password: string) {
|
|
461
|
+
if (!agent.password_hash) return false;
|
|
462
|
+
return bcrypt.compare(password, agent.password_hash);
|
|
463
|
+
},
|
|
464
|
+
|
|
465
|
+
async setPassword(id: string, password: string) {
|
|
466
|
+
const passwordHash = await bcrypt.hash(password, SALT_ROUNDS);
|
|
467
|
+
db.prepare(`UPDATE agents SET password_hash = ?, updated_at = datetime('now') WHERE id = ?`).run(passwordHash, id);
|
|
468
|
+
},
|
|
469
|
+
|
|
470
|
+
async verifyEmail(id: string) {
|
|
471
|
+
db.prepare(`UPDATE agents SET email_verified = 1, is_verified = 1, verification_status = 'verified', updated_at = datetime('now') WHERE id = ?`).run(id);
|
|
472
|
+
},
|
|
473
|
+
|
|
474
|
+
async isEmailTaken(email: string) {
|
|
475
|
+
const row = db.prepare('SELECT id FROM agents WHERE email = ?').get(email.toLowerCase());
|
|
476
|
+
return row !== undefined;
|
|
477
|
+
},
|
|
478
|
+
|
|
479
|
+
async isNameTaken(name: string) {
|
|
480
|
+
const row = db.prepare('SELECT id FROM agents WHERE name = ?').get(name);
|
|
481
|
+
return row !== undefined;
|
|
482
|
+
},
|
|
483
|
+
|
|
484
|
+
// Password reset
|
|
485
|
+
async setResetToken(id: string, token: string, expiresAt: Date) {
|
|
486
|
+
db.prepare(`UPDATE agents SET password_reset_token = ?, password_reset_expires = ?, updated_at = datetime('now') WHERE id = ?`)
|
|
487
|
+
.run(token, expiresAt.toISOString(), id);
|
|
488
|
+
},
|
|
489
|
+
|
|
490
|
+
async findByResetToken(token: string) {
|
|
491
|
+
const row = db.prepare('SELECT * FROM agents WHERE password_reset_token = ?').get(token) as Record<string, unknown> | undefined;
|
|
492
|
+
if (!row) return null;
|
|
493
|
+
|
|
494
|
+
const agent = rowToAgent(row);
|
|
495
|
+
if (agent.password_reset_expires && new Date(agent.password_reset_expires) < new Date()) {
|
|
496
|
+
return null;
|
|
497
|
+
}
|
|
498
|
+
return agent;
|
|
499
|
+
},
|
|
500
|
+
|
|
501
|
+
async resetPassword(id: string, newPassword: string) {
|
|
502
|
+
const passwordHash = await bcrypt.hash(newPassword, SALT_ROUNDS);
|
|
503
|
+
db.prepare(`UPDATE agents SET password_hash = ?, password_reset_token = NULL, password_reset_expires = NULL, updated_at = datetime('now') WHERE id = ?`)
|
|
504
|
+
.run(passwordHash, id);
|
|
505
|
+
},
|
|
506
|
+
|
|
507
|
+
async clearResetToken(id: string) {
|
|
508
|
+
db.prepare(`UPDATE agents SET password_reset_token = NULL, password_reset_expires = NULL, updated_at = datetime('now') WHERE id = ?`).run(id);
|
|
509
|
+
},
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
private createPostRepository(): PostRepository {
|
|
514
|
+
const db = this.db;
|
|
515
|
+
|
|
516
|
+
return {
|
|
517
|
+
async create(input: CreatePostInput) {
|
|
518
|
+
const id = nanoid();
|
|
519
|
+
db.prepare(`
|
|
520
|
+
INSERT INTO posts (id, hive_id, author_id, title, content, url)
|
|
521
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
522
|
+
`).run(id, input.hive_id, input.author_id, input.title, input.content || null, input.url || null);
|
|
523
|
+
|
|
524
|
+
return (await this.findById(id))!;
|
|
525
|
+
},
|
|
526
|
+
|
|
527
|
+
async findById(id: string) {
|
|
528
|
+
const row = db.prepare('SELECT * FROM posts WHERE id = ?').get(id) as Post | undefined;
|
|
529
|
+
return row || null;
|
|
530
|
+
},
|
|
531
|
+
|
|
532
|
+
async findWithAuthor(id: string, viewerId?: string) {
|
|
533
|
+
let query = `
|
|
534
|
+
SELECT p.*, a.name as author_name, a.avatar_url as author_avatar, a.karma as author_karma,
|
|
535
|
+
a.is_verified as author_verified, a.created_at as author_created_at, a.account_type as author_account_type,
|
|
536
|
+
h.name as hive_name
|
|
537
|
+
FROM posts p
|
|
538
|
+
JOIN agents a ON p.author_id = a.id
|
|
539
|
+
JOIN hives h ON p.hive_id = h.id
|
|
540
|
+
`;
|
|
541
|
+
|
|
542
|
+
if (viewerId) {
|
|
543
|
+
query += ` LEFT JOIN votes v ON v.target_type = 'post' AND v.target_id = p.id AND v.agent_id = ?`;
|
|
544
|
+
}
|
|
545
|
+
query += ` WHERE p.id = ?`;
|
|
546
|
+
|
|
547
|
+
const row = db.prepare(query).get(...(viewerId ? [viewerId, id] : [id])) as Record<string, unknown> | undefined;
|
|
548
|
+
if (!row) return null;
|
|
549
|
+
|
|
550
|
+
return {
|
|
551
|
+
id: row.id,
|
|
552
|
+
hive_id: row.hive_id,
|
|
553
|
+
author_id: row.author_id,
|
|
554
|
+
title: row.title,
|
|
555
|
+
content: row.content,
|
|
556
|
+
url: row.url,
|
|
557
|
+
score: row.score,
|
|
558
|
+
comment_count: row.comment_count,
|
|
559
|
+
is_pinned: Boolean(row.is_pinned),
|
|
560
|
+
created_at: row.created_at,
|
|
561
|
+
updated_at: row.updated_at,
|
|
562
|
+
hive_name: row.hive_name,
|
|
563
|
+
user_vote: (row as { value?: number }).value as (1 | -1 | null) || null,
|
|
564
|
+
author: {
|
|
565
|
+
id: row.author_id,
|
|
566
|
+
name: row.author_name,
|
|
567
|
+
description: null,
|
|
568
|
+
avatar_url: row.author_avatar,
|
|
569
|
+
karma: row.author_karma,
|
|
570
|
+
is_verified: Boolean(row.author_verified),
|
|
571
|
+
created_at: row.author_created_at,
|
|
572
|
+
account_type: row.author_account_type || 'agent',
|
|
573
|
+
},
|
|
574
|
+
} as PostWithAuthor;
|
|
575
|
+
},
|
|
576
|
+
|
|
577
|
+
async update(id: string, input: UpdatePostInput) {
|
|
578
|
+
const updates: string[] = [];
|
|
579
|
+
const values: unknown[] = [];
|
|
580
|
+
|
|
581
|
+
if (input.title !== undefined) { updates.push('title = ?'); values.push(input.title); }
|
|
582
|
+
if (input.content !== undefined) { updates.push('content = ?'); values.push(input.content); }
|
|
583
|
+
if (input.url !== undefined) { updates.push('url = ?'); values.push(input.url); }
|
|
584
|
+
if (input.is_pinned !== undefined) { updates.push('is_pinned = ?'); values.push(input.is_pinned ? 1 : 0); }
|
|
585
|
+
|
|
586
|
+
if (updates.length === 0) return this.findById(id);
|
|
587
|
+
|
|
588
|
+
updates.push("updated_at = datetime('now')");
|
|
589
|
+
values.push(id);
|
|
590
|
+
|
|
591
|
+
db.prepare(`UPDATE posts SET ${updates.join(', ')} WHERE id = ?`).run(...values);
|
|
592
|
+
return this.findById(id);
|
|
593
|
+
},
|
|
594
|
+
|
|
595
|
+
async delete(id: string) {
|
|
596
|
+
const result = db.prepare('DELETE FROM posts WHERE id = ?').run(id);
|
|
597
|
+
return result.changes > 0;
|
|
598
|
+
},
|
|
599
|
+
|
|
600
|
+
async updateScore(id: string, delta: number) {
|
|
601
|
+
db.prepare(`UPDATE posts SET score = score + ? WHERE id = ?`).run(delta, id);
|
|
602
|
+
},
|
|
603
|
+
|
|
604
|
+
async updateCommentCount(id: string, delta: number) {
|
|
605
|
+
db.prepare(`UPDATE posts SET comment_count = comment_count + ? WHERE id = ?`).run(delta, id);
|
|
606
|
+
},
|
|
607
|
+
|
|
608
|
+
async list(options: ListPostsOptions) {
|
|
609
|
+
const sort = options.sort || 'hot';
|
|
610
|
+
let orderBy: string;
|
|
611
|
+
|
|
612
|
+
switch (sort) {
|
|
613
|
+
case 'new': orderBy = 'p.created_at DESC'; break;
|
|
614
|
+
case 'top': orderBy = 'p.score DESC, p.created_at DESC'; break;
|
|
615
|
+
case 'hot':
|
|
616
|
+
default:
|
|
617
|
+
orderBy = "(p.score + 1) / (1 + (julianday('now') - julianday(p.created_at)) * 24) DESC";
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
let query = `
|
|
621
|
+
SELECT p.*, a.name as author_name, a.avatar_url as author_avatar, a.karma as author_karma,
|
|
622
|
+
a.is_verified as author_verified, a.created_at as author_created_at, a.account_type as author_account_type,
|
|
623
|
+
h.name as hive_name
|
|
624
|
+
FROM posts p
|
|
625
|
+
JOIN agents a ON p.author_id = a.id
|
|
626
|
+
JOIN hives h ON p.hive_id = h.id
|
|
627
|
+
`;
|
|
628
|
+
|
|
629
|
+
const conditions: string[] = [];
|
|
630
|
+
const values: unknown[] = [];
|
|
631
|
+
|
|
632
|
+
if (options.viewer_id) {
|
|
633
|
+
query = query.replace('FROM posts p', `FROM posts p LEFT JOIN votes v ON v.target_type = 'post' AND v.target_id = p.id AND v.agent_id = ?`);
|
|
634
|
+
values.push(options.viewer_id);
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
if (options.hive_id) { conditions.push('p.hive_id = ?'); values.push(options.hive_id); }
|
|
638
|
+
if (options.hive_name) { conditions.push('h.name = ?'); values.push(options.hive_name); }
|
|
639
|
+
if (options.author_id) { conditions.push('p.author_id = ?'); values.push(options.author_id); }
|
|
640
|
+
|
|
641
|
+
if (conditions.length > 0) query += ' WHERE ' + conditions.join(' AND ');
|
|
642
|
+
query += ` ORDER BY ${orderBy}`;
|
|
643
|
+
if (options.limit) { query += ' LIMIT ?'; values.push(options.limit); }
|
|
644
|
+
if (options.offset) { query += ' OFFSET ?'; values.push(options.offset); }
|
|
645
|
+
|
|
646
|
+
const rows = db.prepare(query).all(...values) as Record<string, unknown>[];
|
|
647
|
+
|
|
648
|
+
return rows.map(row => ({
|
|
649
|
+
id: row.id,
|
|
650
|
+
hive_id: row.hive_id,
|
|
651
|
+
author_id: row.author_id,
|
|
652
|
+
title: row.title,
|
|
653
|
+
content: row.content,
|
|
654
|
+
url: row.url,
|
|
655
|
+
score: row.score,
|
|
656
|
+
comment_count: row.comment_count,
|
|
657
|
+
is_pinned: Boolean(row.is_pinned),
|
|
658
|
+
created_at: row.created_at,
|
|
659
|
+
updated_at: row.updated_at,
|
|
660
|
+
hive_name: row.hive_name,
|
|
661
|
+
user_vote: (row as { value?: number }).value as (1 | -1 | null) || null,
|
|
662
|
+
author: {
|
|
663
|
+
id: row.author_id,
|
|
664
|
+
name: row.author_name,
|
|
665
|
+
description: null,
|
|
666
|
+
avatar_url: row.author_avatar,
|
|
667
|
+
karma: row.author_karma,
|
|
668
|
+
is_verified: Boolean(row.author_verified),
|
|
669
|
+
created_at: row.author_created_at,
|
|
670
|
+
account_type: row.author_account_type || 'agent',
|
|
671
|
+
},
|
|
672
|
+
})) as PostWithAuthor[];
|
|
673
|
+
},
|
|
674
|
+
|
|
675
|
+
async count(hive_id?: string) {
|
|
676
|
+
if (hive_id) {
|
|
677
|
+
const row = db.prepare('SELECT COUNT(*) as count FROM posts WHERE hive_id = ?').get(hive_id) as { count: number };
|
|
678
|
+
return row.count;
|
|
679
|
+
}
|
|
680
|
+
const row = db.prepare('SELECT COUNT(*) as count FROM posts').get() as { count: number };
|
|
681
|
+
return row.count;
|
|
682
|
+
},
|
|
683
|
+
};
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
private createCommentRepository(): CommentRepository {
|
|
687
|
+
const db = this.db;
|
|
688
|
+
|
|
689
|
+
return {
|
|
690
|
+
async create(input: CreateCommentInput) {
|
|
691
|
+
const id = nanoid();
|
|
692
|
+
let depth = 0;
|
|
693
|
+
let path = id;
|
|
694
|
+
|
|
695
|
+
if (input.parent_id) {
|
|
696
|
+
const parent = await this.findById(input.parent_id);
|
|
697
|
+
if (parent) {
|
|
698
|
+
depth = parent.depth + 1;
|
|
699
|
+
path = parent.path + '.' + id;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
db.prepare(`
|
|
704
|
+
INSERT INTO comments (id, post_id, parent_id, author_id, content, depth, path)
|
|
705
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
706
|
+
`).run(id, input.post_id, input.parent_id || null, input.author_id, input.content, depth, path);
|
|
707
|
+
|
|
708
|
+
// Update post comment count
|
|
709
|
+
db.prepare(`UPDATE posts SET comment_count = comment_count + 1 WHERE id = ?`).run(input.post_id);
|
|
710
|
+
|
|
711
|
+
return (await this.findById(id))!;
|
|
712
|
+
},
|
|
713
|
+
|
|
714
|
+
async findById(id: string) {
|
|
715
|
+
const row = db.prepare('SELECT * FROM comments WHERE id = ?').get(id) as Comment | undefined;
|
|
716
|
+
return row || null;
|
|
717
|
+
},
|
|
718
|
+
|
|
719
|
+
async update(id: string, input: UpdateCommentInput) {
|
|
720
|
+
db.prepare(`UPDATE comments SET content = ?, updated_at = datetime('now') WHERE id = ?`).run(input.content, id);
|
|
721
|
+
return this.findById(id);
|
|
722
|
+
},
|
|
723
|
+
|
|
724
|
+
async delete(id: string) {
|
|
725
|
+
const comment = await this.findById(id);
|
|
726
|
+
if (!comment) return false;
|
|
727
|
+
|
|
728
|
+
// Count descendants
|
|
729
|
+
const countRow = db.prepare(`SELECT COUNT(*) as count FROM comments WHERE path LIKE ?`).get(comment.path + '.%') as { count: number };
|
|
730
|
+
const totalDeleted = countRow.count + 1;
|
|
731
|
+
|
|
732
|
+
// Delete comment and descendants
|
|
733
|
+
db.prepare(`DELETE FROM comments WHERE path LIKE ? OR id = ?`).run(comment.path + '.%', id);
|
|
734
|
+
|
|
735
|
+
// Update post comment count
|
|
736
|
+
db.prepare(`UPDATE posts SET comment_count = comment_count - ? WHERE id = ?`).run(totalDeleted, comment.post_id);
|
|
737
|
+
|
|
738
|
+
return true;
|
|
739
|
+
},
|
|
740
|
+
|
|
741
|
+
async updateScore(id: string, delta: number) {
|
|
742
|
+
db.prepare(`UPDATE comments SET score = score + ? WHERE id = ?`).run(delta, id);
|
|
743
|
+
},
|
|
744
|
+
|
|
745
|
+
async list(options: ListCommentsOptions) {
|
|
746
|
+
const sort = options.sort || 'top';
|
|
747
|
+
const orderBy = sort === 'new' ? 'c.created_at DESC' : 'c.score DESC, c.created_at DESC';
|
|
748
|
+
|
|
749
|
+
let query = `
|
|
750
|
+
SELECT c.*, a.name as author_name, a.avatar_url as author_avatar, a.karma as author_karma,
|
|
751
|
+
a.is_verified as author_verified, a.created_at as author_created_at, a.account_type as author_account_type
|
|
752
|
+
FROM comments c
|
|
753
|
+
JOIN agents a ON c.author_id = a.id
|
|
754
|
+
WHERE c.post_id = ?
|
|
755
|
+
`;
|
|
756
|
+
|
|
757
|
+
const values: unknown[] = [options.post_id];
|
|
758
|
+
|
|
759
|
+
if (options.viewer_id) {
|
|
760
|
+
query = query.replace('FROM comments c', `FROM comments c LEFT JOIN votes v ON v.target_type = 'comment' AND v.target_id = c.id AND v.agent_id = ?`);
|
|
761
|
+
values.unshift(options.viewer_id);
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
query += ` ORDER BY ${orderBy}`;
|
|
765
|
+
if (options.limit) { query += ' LIMIT ?'; values.push(options.limit); }
|
|
766
|
+
if (options.offset) { query += ' OFFSET ?'; values.push(options.offset); }
|
|
767
|
+
|
|
768
|
+
const rows = db.prepare(query).all(...values) as Record<string, unknown>[];
|
|
769
|
+
|
|
770
|
+
return rows.map(row => ({
|
|
771
|
+
id: row.id,
|
|
772
|
+
post_id: row.post_id,
|
|
773
|
+
parent_id: row.parent_id,
|
|
774
|
+
author_id: row.author_id,
|
|
775
|
+
content: row.content,
|
|
776
|
+
score: row.score,
|
|
777
|
+
depth: row.depth,
|
|
778
|
+
path: row.path,
|
|
779
|
+
created_at: row.created_at,
|
|
780
|
+
updated_at: row.updated_at,
|
|
781
|
+
user_vote: (row as { value?: number }).value as (1 | -1 | null) || null,
|
|
782
|
+
author: {
|
|
783
|
+
id: row.author_id,
|
|
784
|
+
name: row.author_name,
|
|
785
|
+
description: null,
|
|
786
|
+
avatar_url: row.author_avatar,
|
|
787
|
+
karma: row.author_karma,
|
|
788
|
+
is_verified: Boolean(row.author_verified),
|
|
789
|
+
created_at: row.author_created_at,
|
|
790
|
+
account_type: row.author_account_type || 'agent',
|
|
791
|
+
},
|
|
792
|
+
})) as CommentWithAuthor[];
|
|
793
|
+
},
|
|
794
|
+
|
|
795
|
+
async count(post_id: string) {
|
|
796
|
+
const row = db.prepare('SELECT COUNT(*) as count FROM comments WHERE post_id = ?').get(post_id) as { count: number };
|
|
797
|
+
return row.count;
|
|
798
|
+
},
|
|
799
|
+
|
|
800
|
+
buildTree(comments: CommentWithAuthor[]): CommentWithAuthor[] {
|
|
801
|
+
const map = new Map<string, CommentWithAuthor>();
|
|
802
|
+
const roots: CommentWithAuthor[] = [];
|
|
803
|
+
|
|
804
|
+
for (const comment of comments) {
|
|
805
|
+
map.set(comment.id, { ...comment, replies: [] });
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
for (const comment of comments) {
|
|
809
|
+
const node = map.get(comment.id)!;
|
|
810
|
+
if (comment.parent_id && map.has(comment.parent_id)) {
|
|
811
|
+
map.get(comment.parent_id)!.replies!.push(node);
|
|
812
|
+
} else {
|
|
813
|
+
roots.push(node);
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
return roots;
|
|
818
|
+
},
|
|
819
|
+
};
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
private createHiveRepository(): HiveRepository {
|
|
823
|
+
const db = this.db;
|
|
824
|
+
|
|
825
|
+
return {
|
|
826
|
+
async create(input: CreateHiveInput) {
|
|
827
|
+
const id = nanoid();
|
|
828
|
+
db.prepare(`
|
|
829
|
+
INSERT INTO hives (id, name, description, owner_id, is_public, settings, member_count)
|
|
830
|
+
VALUES (?, ?, ?, ?, ?, ?, 1)
|
|
831
|
+
`).run(id, input.name.toLowerCase(), input.description || null, input.owner_id, input.is_public !== false ? 1 : 0, input.settings ? JSON.stringify(input.settings) : null);
|
|
832
|
+
|
|
833
|
+
// Add owner as member
|
|
834
|
+
db.prepare(`INSERT INTO memberships (id, agent_id, hive_id, role) VALUES (?, ?, ?, 'owner')`).run(nanoid(), input.owner_id, id);
|
|
835
|
+
|
|
836
|
+
return (await this.findById(id))!;
|
|
837
|
+
},
|
|
838
|
+
|
|
839
|
+
async findById(id: string) {
|
|
840
|
+
const row = db.prepare('SELECT * FROM hives WHERE id = ?').get(id) as Record<string, unknown> | undefined;
|
|
841
|
+
if (!row) return null;
|
|
842
|
+
return { ...row, is_public: Boolean(row.is_public), settings: row.settings ? JSON.parse(row.settings as string) : null } as Hive;
|
|
843
|
+
},
|
|
844
|
+
|
|
845
|
+
async findByName(name: string) {
|
|
846
|
+
const row = db.prepare('SELECT * FROM hives WHERE name = ?').get(name.toLowerCase()) as Record<string, unknown> | undefined;
|
|
847
|
+
if (!row) return null;
|
|
848
|
+
return { ...row, is_public: Boolean(row.is_public), settings: row.settings ? JSON.parse(row.settings as string) : null } as Hive;
|
|
849
|
+
},
|
|
850
|
+
|
|
851
|
+
async update(id: string, input: UpdateHiveInput) {
|
|
852
|
+
const updates: string[] = [];
|
|
853
|
+
const values: unknown[] = [];
|
|
854
|
+
|
|
855
|
+
if (input.description !== undefined) { updates.push('description = ?'); values.push(input.description); }
|
|
856
|
+
if (input.is_public !== undefined) { updates.push('is_public = ?'); values.push(input.is_public ? 1 : 0); }
|
|
857
|
+
if (input.settings !== undefined) { updates.push('settings = ?'); values.push(JSON.stringify(input.settings)); }
|
|
858
|
+
|
|
859
|
+
if (updates.length === 0) return this.findById(id);
|
|
860
|
+
|
|
861
|
+
updates.push("updated_at = datetime('now')");
|
|
862
|
+
values.push(id);
|
|
863
|
+
|
|
864
|
+
db.prepare(`UPDATE hives SET ${updates.join(', ')} WHERE id = ?`).run(...values);
|
|
865
|
+
return this.findById(id);
|
|
866
|
+
},
|
|
867
|
+
|
|
868
|
+
async delete(id: string) {
|
|
869
|
+
const result = db.prepare('DELETE FROM hives WHERE id = ?').run(id);
|
|
870
|
+
return result.changes > 0;
|
|
871
|
+
},
|
|
872
|
+
|
|
873
|
+
async list(options) {
|
|
874
|
+
let query = 'SELECT * FROM hives';
|
|
875
|
+
const values: unknown[] = [];
|
|
876
|
+
|
|
877
|
+
if (options.member_id) {
|
|
878
|
+
query = 'SELECT h.* FROM hives h JOIN memberships m ON h.id = m.hive_id WHERE m.agent_id = ?';
|
|
879
|
+
values.push(options.member_id);
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
query += ' ORDER BY member_count DESC, created_at DESC';
|
|
883
|
+
if (options.limit) { query += ' LIMIT ?'; values.push(options.limit); }
|
|
884
|
+
if (options.offset) { query += ' OFFSET ?'; values.push(options.offset); }
|
|
885
|
+
|
|
886
|
+
const rows = db.prepare(query).all(...values) as Record<string, unknown>[];
|
|
887
|
+
return rows.map(row => ({ ...row, is_public: Boolean(row.is_public), settings: row.settings ? JSON.parse(row.settings as string) : null })) as Hive[];
|
|
888
|
+
},
|
|
889
|
+
|
|
890
|
+
async count() {
|
|
891
|
+
const row = db.prepare('SELECT COUNT(*) as count FROM hives').get() as { count: number };
|
|
892
|
+
return row.count;
|
|
893
|
+
},
|
|
894
|
+
|
|
895
|
+
async getMembers(hiveId: string) {
|
|
896
|
+
const rows = db.prepare('SELECT agent_id, role, joined_at FROM memberships WHERE hive_id = ?').all(hiveId);
|
|
897
|
+
return rows as Array<{ agent_id: string; role: string; joined_at: string }>;
|
|
898
|
+
},
|
|
899
|
+
|
|
900
|
+
async isMember(hiveId: string, agentId: string) {
|
|
901
|
+
const row = db.prepare('SELECT id FROM memberships WHERE hive_id = ? AND agent_id = ?').get(hiveId, agentId);
|
|
902
|
+
return row !== undefined;
|
|
903
|
+
},
|
|
904
|
+
|
|
905
|
+
async getMembership(hiveId: string, agentId: string) {
|
|
906
|
+
const row = db.prepare('SELECT role FROM memberships WHERE hive_id = ? AND agent_id = ?').get(hiveId, agentId) as { role: string } | undefined;
|
|
907
|
+
return row || null;
|
|
908
|
+
},
|
|
909
|
+
|
|
910
|
+
async join(hiveId: string, agentId: string, role = 'member') {
|
|
911
|
+
try {
|
|
912
|
+
db.prepare(`INSERT INTO memberships (id, agent_id, hive_id, role) VALUES (?, ?, ?, ?)`).run(nanoid(), agentId, hiveId, role);
|
|
913
|
+
db.prepare(`UPDATE hives SET member_count = member_count + 1 WHERE id = ?`).run(hiveId);
|
|
914
|
+
return true;
|
|
915
|
+
} catch {
|
|
916
|
+
return false;
|
|
917
|
+
}
|
|
918
|
+
},
|
|
919
|
+
|
|
920
|
+
async leave(hiveId: string, agentId: string) {
|
|
921
|
+
const result = db.prepare('DELETE FROM memberships WHERE hive_id = ? AND agent_id = ?').run(hiveId, agentId);
|
|
922
|
+
if (result.changes > 0) {
|
|
923
|
+
db.prepare(`UPDATE hives SET member_count = member_count - 1 WHERE id = ?`).run(hiveId);
|
|
924
|
+
return true;
|
|
925
|
+
}
|
|
926
|
+
return false;
|
|
927
|
+
},
|
|
928
|
+
|
|
929
|
+
async updateRole(hiveId: string, agentId: string, role: string) {
|
|
930
|
+
const result = db.prepare('UPDATE memberships SET role = ? WHERE hive_id = ? AND agent_id = ?').run(role, hiveId, agentId);
|
|
931
|
+
return result.changes > 0;
|
|
932
|
+
},
|
|
933
|
+
};
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
private createVoteRepository(): VoteRepository {
|
|
937
|
+
const db = this.db;
|
|
938
|
+
const posts = this.posts;
|
|
939
|
+
const comments = this.comments;
|
|
940
|
+
const agents = this.agents;
|
|
941
|
+
|
|
942
|
+
return {
|
|
943
|
+
async cast(input: CastVoteInput) {
|
|
944
|
+
const existing = await this.get(input.agent_id, input.target_type, input.target_id);
|
|
945
|
+
let scoreDelta = 0;
|
|
946
|
+
|
|
947
|
+
if (existing) {
|
|
948
|
+
if (existing.value === input.value) {
|
|
949
|
+
// Same vote - toggle off
|
|
950
|
+
await this.remove(input.agent_id, input.target_type, input.target_id);
|
|
951
|
+
scoreDelta = -input.value;
|
|
952
|
+
|
|
953
|
+
if (input.target_type === 'post') {
|
|
954
|
+
await posts.updateScore(input.target_id, scoreDelta);
|
|
955
|
+
const post = await posts.findById(input.target_id);
|
|
956
|
+
if (post) await agents.updateKarma(post.author_id, scoreDelta);
|
|
957
|
+
} else {
|
|
958
|
+
await comments.updateScore(input.target_id, scoreDelta);
|
|
959
|
+
const comment = await comments.findById(input.target_id);
|
|
960
|
+
if (comment) await agents.updateKarma(comment.author_id, scoreDelta);
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
return { vote: null, scoreDelta };
|
|
964
|
+
} else {
|
|
965
|
+
// Different vote - switch
|
|
966
|
+
db.prepare('UPDATE votes SET value = ? WHERE id = ?').run(input.value, existing.id);
|
|
967
|
+
scoreDelta = input.value * 2; // -1 to 1 = +2, 1 to -1 = -2
|
|
968
|
+
}
|
|
969
|
+
} else {
|
|
970
|
+
// New vote
|
|
971
|
+
const id = nanoid();
|
|
972
|
+
db.prepare(`INSERT INTO votes (id, agent_id, target_type, target_id, value) VALUES (?, ?, ?, ?, ?)`).run(id, input.agent_id, input.target_type, input.target_id, input.value);
|
|
973
|
+
scoreDelta = input.value;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
// Update target score and author karma
|
|
977
|
+
if (input.target_type === 'post') {
|
|
978
|
+
await posts.updateScore(input.target_id, scoreDelta);
|
|
979
|
+
const post = await posts.findById(input.target_id);
|
|
980
|
+
if (post) await agents.updateKarma(post.author_id, scoreDelta);
|
|
981
|
+
} else {
|
|
982
|
+
await comments.updateScore(input.target_id, scoreDelta);
|
|
983
|
+
const comment = await comments.findById(input.target_id);
|
|
984
|
+
if (comment) await agents.updateKarma(comment.author_id, scoreDelta);
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
const vote = await this.get(input.agent_id, input.target_type, input.target_id);
|
|
988
|
+
return { vote, scoreDelta };
|
|
989
|
+
},
|
|
990
|
+
|
|
991
|
+
async get(agentId: string, targetType: 'post' | 'comment', targetId: string) {
|
|
992
|
+
const row = db.prepare('SELECT * FROM votes WHERE agent_id = ? AND target_type = ? AND target_id = ?').get(agentId, targetType, targetId) as Vote | undefined;
|
|
993
|
+
return row || null;
|
|
994
|
+
},
|
|
995
|
+
|
|
996
|
+
async getForTarget(targetType: 'post' | 'comment', targetId: string) {
|
|
997
|
+
return db.prepare('SELECT * FROM votes WHERE target_type = ? AND target_id = ?').all(targetType, targetId) as Vote[];
|
|
998
|
+
},
|
|
999
|
+
|
|
1000
|
+
async remove(agentId: string, targetType: 'post' | 'comment', targetId: string) {
|
|
1001
|
+
const result = db.prepare('DELETE FROM votes WHERE agent_id = ? AND target_type = ? AND target_id = ?').run(agentId, targetType, targetId);
|
|
1002
|
+
return result.changes > 0;
|
|
1003
|
+
},
|
|
1004
|
+
};
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
private createFollowRepository(): FollowRepository {
|
|
1008
|
+
const db = this.db;
|
|
1009
|
+
|
|
1010
|
+
return {
|
|
1011
|
+
async follow(followerId: string, followingId: string) {
|
|
1012
|
+
if (followerId === followingId) return null;
|
|
1013
|
+
try {
|
|
1014
|
+
const id = nanoid();
|
|
1015
|
+
db.prepare(`INSERT INTO follows (id, follower_id, following_id) VALUES (?, ?, ?)`).run(id, followerId, followingId);
|
|
1016
|
+
const row = db.prepare('SELECT * FROM follows WHERE id = ?').get(id) as Follow | undefined;
|
|
1017
|
+
return row || null;
|
|
1018
|
+
} catch {
|
|
1019
|
+
return null;
|
|
1020
|
+
}
|
|
1021
|
+
},
|
|
1022
|
+
|
|
1023
|
+
async unfollow(followerId: string, followingId: string) {
|
|
1024
|
+
const result = db.prepare('DELETE FROM follows WHERE follower_id = ? AND following_id = ?').run(followerId, followingId);
|
|
1025
|
+
return result.changes > 0;
|
|
1026
|
+
},
|
|
1027
|
+
|
|
1028
|
+
async isFollowing(followerId: string, followingId: string) {
|
|
1029
|
+
const row = db.prepare('SELECT id FROM follows WHERE follower_id = ? AND following_id = ?').get(followerId, followingId);
|
|
1030
|
+
return row !== undefined;
|
|
1031
|
+
},
|
|
1032
|
+
|
|
1033
|
+
async getFollowers(agentId: string, limit = 50, offset = 0) {
|
|
1034
|
+
const rows = db.prepare(`
|
|
1035
|
+
SELECT a.id, a.name, a.description, a.avatar_url, a.karma, a.is_verified, a.created_at, a.account_type
|
|
1036
|
+
FROM follows f
|
|
1037
|
+
JOIN agents a ON f.follower_id = a.id
|
|
1038
|
+
WHERE f.following_id = ?
|
|
1039
|
+
ORDER BY f.created_at DESC
|
|
1040
|
+
LIMIT ? OFFSET ?
|
|
1041
|
+
`).all(agentId, limit, offset) as Record<string, unknown>[];
|
|
1042
|
+
|
|
1043
|
+
return rows.map(row => ({ ...row, is_verified: Boolean(row.is_verified) })) as AgentPublic[];
|
|
1044
|
+
},
|
|
1045
|
+
|
|
1046
|
+
async getFollowing(agentId: string, limit = 50, offset = 0) {
|
|
1047
|
+
const rows = db.prepare(`
|
|
1048
|
+
SELECT a.id, a.name, a.description, a.avatar_url, a.karma, a.is_verified, a.created_at, a.account_type
|
|
1049
|
+
FROM follows f
|
|
1050
|
+
JOIN agents a ON f.following_id = a.id
|
|
1051
|
+
WHERE f.follower_id = ?
|
|
1052
|
+
ORDER BY f.created_at DESC
|
|
1053
|
+
LIMIT ? OFFSET ?
|
|
1054
|
+
`).all(agentId, limit, offset) as Record<string, unknown>[];
|
|
1055
|
+
|
|
1056
|
+
return rows.map(row => ({ ...row, is_verified: Boolean(row.is_verified) })) as AgentPublic[];
|
|
1057
|
+
},
|
|
1058
|
+
|
|
1059
|
+
async getFollowerCount(agentId: string) {
|
|
1060
|
+
const row = db.prepare('SELECT COUNT(*) as count FROM follows WHERE following_id = ?').get(agentId) as { count: number };
|
|
1061
|
+
return row.count;
|
|
1062
|
+
},
|
|
1063
|
+
|
|
1064
|
+
async getFollowingCount(agentId: string) {
|
|
1065
|
+
const row = db.prepare('SELECT COUNT(*) as count FROM follows WHERE follower_id = ?').get(agentId) as { count: number };
|
|
1066
|
+
return row.count;
|
|
1067
|
+
},
|
|
1068
|
+
};
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
private createInviteRepository(): InviteRepository {
|
|
1072
|
+
const db = this.db;
|
|
1073
|
+
|
|
1074
|
+
return {
|
|
1075
|
+
async create(input: CreateInviteInput) {
|
|
1076
|
+
const id = nanoid();
|
|
1077
|
+
const code = nanoid(12).toUpperCase();
|
|
1078
|
+
|
|
1079
|
+
db.prepare(`
|
|
1080
|
+
INSERT INTO invite_codes (id, code, created_by, uses_left, expires_at)
|
|
1081
|
+
VALUES (?, ?, ?, ?, ?)
|
|
1082
|
+
`).run(id, code, input.created_by || null, input.uses_left ?? 1, input.expires_at?.toISOString() || null);
|
|
1083
|
+
|
|
1084
|
+
return (await this.findById(id))!;
|
|
1085
|
+
},
|
|
1086
|
+
|
|
1087
|
+
async findById(id: string) {
|
|
1088
|
+
const row = db.prepare('SELECT * FROM invite_codes WHERE id = ?').get(id) as InviteCode | undefined;
|
|
1089
|
+
return row || null;
|
|
1090
|
+
},
|
|
1091
|
+
|
|
1092
|
+
async findByCode(code: string) {
|
|
1093
|
+
const row = db.prepare('SELECT * FROM invite_codes WHERE code = ?').get(code.toUpperCase()) as InviteCode | undefined;
|
|
1094
|
+
return row || null;
|
|
1095
|
+
},
|
|
1096
|
+
|
|
1097
|
+
async validate(code: string) {
|
|
1098
|
+
const invite = await this.findByCode(code);
|
|
1099
|
+
if (!invite) return { valid: false, reason: 'Invalid invite code' };
|
|
1100
|
+
if (invite.uses_left <= 0) return { valid: false, reason: 'Invite code has been used' };
|
|
1101
|
+
if (invite.expires_at && new Date(invite.expires_at) < new Date()) {
|
|
1102
|
+
return { valid: false, reason: 'Invite code has expired' };
|
|
1103
|
+
}
|
|
1104
|
+
return { valid: true };
|
|
1105
|
+
},
|
|
1106
|
+
|
|
1107
|
+
async use(code: string, usedBy: string) {
|
|
1108
|
+
const validation = await this.validate(code);
|
|
1109
|
+
if (!validation.valid) return false;
|
|
1110
|
+
|
|
1111
|
+
const invite = await this.findByCode(code);
|
|
1112
|
+
if (!invite) return false;
|
|
1113
|
+
|
|
1114
|
+
db.prepare('UPDATE invite_codes SET uses_left = uses_left - 1, used_by = ? WHERE id = ?').run(usedBy, invite.id);
|
|
1115
|
+
return true;
|
|
1116
|
+
},
|
|
1117
|
+
|
|
1118
|
+
async list(options) {
|
|
1119
|
+
let query = 'SELECT * FROM invite_codes';
|
|
1120
|
+
const values: unknown[] = [];
|
|
1121
|
+
|
|
1122
|
+
if (options.valid_only) {
|
|
1123
|
+
query += " WHERE uses_left > 0 AND (expires_at IS NULL OR expires_at > datetime('now'))";
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
query += ' ORDER BY created_at DESC';
|
|
1127
|
+
if (options.limit) { query += ' LIMIT ?'; values.push(options.limit); }
|
|
1128
|
+
if (options.offset) { query += ' OFFSET ?'; values.push(options.offset); }
|
|
1129
|
+
|
|
1130
|
+
return db.prepare(query).all(...values) as InviteCode[];
|
|
1131
|
+
},
|
|
1132
|
+
|
|
1133
|
+
async delete(id: string) {
|
|
1134
|
+
const result = db.prepare('DELETE FROM invite_codes WHERE id = ?').run(id);
|
|
1135
|
+
return result.changes > 0;
|
|
1136
|
+
},
|
|
1137
|
+
};
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
private createUploadRepository(): UploadRepository {
|
|
1141
|
+
const db = this.db;
|
|
1142
|
+
|
|
1143
|
+
return {
|
|
1144
|
+
async create(input: CreateUploadInput) {
|
|
1145
|
+
db.prepare(`
|
|
1146
|
+
INSERT INTO uploads (id, agent_id, filename, mime_type, size, storage_key, purpose)
|
|
1147
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
1148
|
+
`).run(input.id, input.agent_id, input.filename, input.mime_type, input.size, input.storage_key, input.purpose);
|
|
1149
|
+
|
|
1150
|
+
return (await this.findById(input.id))!;
|
|
1151
|
+
},
|
|
1152
|
+
|
|
1153
|
+
async findById(id: string) {
|
|
1154
|
+
const row = db.prepare('SELECT * FROM uploads WHERE id = ?').get(id) as Upload | undefined;
|
|
1155
|
+
return row || null;
|
|
1156
|
+
},
|
|
1157
|
+
|
|
1158
|
+
async findByKey(key: string) {
|
|
1159
|
+
const row = db.prepare('SELECT * FROM uploads WHERE storage_key = ?').get(key) as Upload | undefined;
|
|
1160
|
+
return row || null;
|
|
1161
|
+
},
|
|
1162
|
+
|
|
1163
|
+
async listByAgent(agentId: string, options) {
|
|
1164
|
+
let query = 'SELECT * FROM uploads WHERE agent_id = ?';
|
|
1165
|
+
const values: unknown[] = [agentId];
|
|
1166
|
+
|
|
1167
|
+
if (options?.purpose) { query += ' AND purpose = ?'; values.push(options.purpose); }
|
|
1168
|
+
query += ' ORDER BY created_at DESC';
|
|
1169
|
+
if (options?.limit) { query += ' LIMIT ?'; values.push(options.limit); }
|
|
1170
|
+
|
|
1171
|
+
return db.prepare(query).all(...values) as Upload[];
|
|
1172
|
+
},
|
|
1173
|
+
|
|
1174
|
+
async delete(id: string) {
|
|
1175
|
+
const result = db.prepare('DELETE FROM uploads WHERE id = ?').run(id);
|
|
1176
|
+
return result.changes > 0;
|
|
1177
|
+
},
|
|
1178
|
+
|
|
1179
|
+
async deleteByKey(key: string) {
|
|
1180
|
+
const result = db.prepare('DELETE FROM uploads WHERE storage_key = ?').run(key);
|
|
1181
|
+
return result.changes > 0;
|
|
1182
|
+
},
|
|
1183
|
+
|
|
1184
|
+
async getStats(agentId: string) {
|
|
1185
|
+
const totalRow = db.prepare('SELECT COUNT(*) as count, SUM(size) as size FROM uploads WHERE agent_id = ?').get(agentId) as { count: number; size: number };
|
|
1186
|
+
const purposeRows = db.prepare('SELECT purpose, SUM(size) as size FROM uploads WHERE agent_id = ? GROUP BY purpose').all(agentId) as Array<{ purpose: string; size: number }>;
|
|
1187
|
+
|
|
1188
|
+
const by_purpose: Record<string, number> = {};
|
|
1189
|
+
for (const row of purposeRows) {
|
|
1190
|
+
by_purpose[row.purpose] = row.size || 0;
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
return { total_count: totalRow.count || 0, total_size: totalRow.size || 0, by_purpose };
|
|
1194
|
+
},
|
|
1195
|
+
};
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
private createInstanceRepository(): InstanceRepository {
|
|
1199
|
+
const db = this.db;
|
|
1200
|
+
|
|
1201
|
+
return {
|
|
1202
|
+
async create(input: CreateInstanceInput) {
|
|
1203
|
+
const id = nanoid();
|
|
1204
|
+
const normalizedUrl = input.url.replace(/\/$/, '').toLowerCase();
|
|
1205
|
+
|
|
1206
|
+
db.prepare(`
|
|
1207
|
+
INSERT INTO federated_instances (id, url, name, public_key)
|
|
1208
|
+
VALUES (?, ?, ?, ?)
|
|
1209
|
+
`).run(id, normalizedUrl, input.name, input.public_key || null);
|
|
1210
|
+
|
|
1211
|
+
return (await this.findById(id))!;
|
|
1212
|
+
},
|
|
1213
|
+
|
|
1214
|
+
async findById(id: string) {
|
|
1215
|
+
const row = db.prepare('SELECT * FROM federated_instances WHERE id = ?').get(id) as Record<string, unknown> | undefined;
|
|
1216
|
+
if (!row) return null;
|
|
1217
|
+
return { ...row, is_trusted: Boolean(row.is_trusted) } as FederatedInstance;
|
|
1218
|
+
},
|
|
1219
|
+
|
|
1220
|
+
async findByUrl(url: string) {
|
|
1221
|
+
const normalizedUrl = url.replace(/\/$/, '').toLowerCase();
|
|
1222
|
+
const row = db.prepare('SELECT * FROM federated_instances WHERE url = ?').get(normalizedUrl) as Record<string, unknown> | undefined;
|
|
1223
|
+
if (!row) return null;
|
|
1224
|
+
return { ...row, is_trusted: Boolean(row.is_trusted) } as FederatedInstance;
|
|
1225
|
+
},
|
|
1226
|
+
|
|
1227
|
+
async update(id: string, input: Partial<FederatedInstance>) {
|
|
1228
|
+
const updates: string[] = [];
|
|
1229
|
+
const values: unknown[] = [];
|
|
1230
|
+
|
|
1231
|
+
if (input.name !== undefined) { updates.push('name = ?'); values.push(input.name); }
|
|
1232
|
+
if (input.public_key !== undefined) { updates.push('public_key = ?'); values.push(input.public_key); }
|
|
1233
|
+
if (input.is_trusted !== undefined) { updates.push('is_trusted = ?'); values.push(input.is_trusted ? 1 : 0); }
|
|
1234
|
+
if (input.last_sync !== undefined) { updates.push('last_sync = ?'); values.push(input.last_sync); }
|
|
1235
|
+
|
|
1236
|
+
if (updates.length === 0) return this.findById(id);
|
|
1237
|
+
|
|
1238
|
+
updates.push("updated_at = datetime('now')");
|
|
1239
|
+
values.push(id);
|
|
1240
|
+
|
|
1241
|
+
db.prepare(`UPDATE federated_instances SET ${updates.join(', ')} WHERE id = ?`).run(...values);
|
|
1242
|
+
return this.findById(id);
|
|
1243
|
+
},
|
|
1244
|
+
|
|
1245
|
+
async delete(id: string) {
|
|
1246
|
+
const result = db.prepare('DELETE FROM federated_instances WHERE id = ?').run(id);
|
|
1247
|
+
return result.changes > 0;
|
|
1248
|
+
},
|
|
1249
|
+
|
|
1250
|
+
async list(options) {
|
|
1251
|
+
let query = 'SELECT * FROM federated_instances';
|
|
1252
|
+
const conditions: string[] = [];
|
|
1253
|
+
const values: unknown[] = [];
|
|
1254
|
+
|
|
1255
|
+
if (options?.status) { conditions.push('status = ?'); values.push(options.status); }
|
|
1256
|
+
if (conditions.length > 0) query += ' WHERE ' + conditions.join(' AND ');
|
|
1257
|
+
|
|
1258
|
+
query += ' ORDER BY created_at DESC';
|
|
1259
|
+
if (options?.limit) { query += ' LIMIT ?'; values.push(options.limit); }
|
|
1260
|
+
if (options?.offset) { query += ' OFFSET ?'; values.push(options.offset); }
|
|
1261
|
+
|
|
1262
|
+
const rows = db.prepare(query).all(...values) as Record<string, unknown>[];
|
|
1263
|
+
return rows.map(row => ({ ...row, is_trusted: Boolean(row.is_trusted) })) as FederatedInstance[];
|
|
1264
|
+
},
|
|
1265
|
+
|
|
1266
|
+
async count() {
|
|
1267
|
+
const total = (db.prepare('SELECT COUNT(*) as count FROM federated_instances').get() as { count: number }).count;
|
|
1268
|
+
const active = (db.prepare("SELECT COUNT(*) as count FROM federated_instances WHERE status = 'active'").get() as { count: number }).count;
|
|
1269
|
+
const blocked = (db.prepare("SELECT COUNT(*) as count FROM federated_instances WHERE status = 'blocked'").get() as { count: number }).count;
|
|
1270
|
+
return { total, active, blocked };
|
|
1271
|
+
},
|
|
1272
|
+
};
|
|
1273
|
+
}
|
|
1274
|
+
|
|
1275
|
+
private createSearchRepository(): SearchRepository {
|
|
1276
|
+
const db = this.db;
|
|
1277
|
+
const agents = this.agents;
|
|
1278
|
+
|
|
1279
|
+
return {
|
|
1280
|
+
async search(options: SearchOptions) {
|
|
1281
|
+
const query = options.query.replace(/["-*()]/g, '').split(/\s+/).map(t => `"${t}"*`).join(' ');
|
|
1282
|
+
const limit = options.limit || 20;
|
|
1283
|
+
const offset = options.offset || 0;
|
|
1284
|
+
const searchType = options.type || 'all';
|
|
1285
|
+
|
|
1286
|
+
const results: SearchResults = {
|
|
1287
|
+
posts: [],
|
|
1288
|
+
comments: [],
|
|
1289
|
+
agents: [],
|
|
1290
|
+
hives: [],
|
|
1291
|
+
total: { posts: 0, comments: 0, agents: 0, hives: 0 },
|
|
1292
|
+
};
|
|
1293
|
+
|
|
1294
|
+
if (searchType === 'all' || searchType === 'posts') {
|
|
1295
|
+
try {
|
|
1296
|
+
const rows = db.prepare(`
|
|
1297
|
+
SELECT p.*, a.name as author_name, a.avatar_url as author_avatar, a.karma as author_karma,
|
|
1298
|
+
a.is_verified as author_verified, a.created_at as author_created_at, a.account_type as author_account_type,
|
|
1299
|
+
h.name as hive_name
|
|
1300
|
+
FROM posts_fts fts
|
|
1301
|
+
JOIN posts p ON fts.rowid = p.rowid
|
|
1302
|
+
JOIN agents a ON p.author_id = a.id
|
|
1303
|
+
JOIN hives h ON p.hive_id = h.id
|
|
1304
|
+
WHERE posts_fts MATCH ?
|
|
1305
|
+
ORDER BY rank
|
|
1306
|
+
LIMIT ? OFFSET ?
|
|
1307
|
+
`).all(query, limit, offset) as Record<string, unknown>[];
|
|
1308
|
+
|
|
1309
|
+
results.posts = rows.map(row => ({
|
|
1310
|
+
id: row.id,
|
|
1311
|
+
hive_id: row.hive_id,
|
|
1312
|
+
author_id: row.author_id,
|
|
1313
|
+
title: row.title,
|
|
1314
|
+
content: row.content,
|
|
1315
|
+
url: row.url,
|
|
1316
|
+
score: row.score,
|
|
1317
|
+
comment_count: row.comment_count,
|
|
1318
|
+
is_pinned: Boolean(row.is_pinned),
|
|
1319
|
+
created_at: row.created_at,
|
|
1320
|
+
updated_at: row.updated_at,
|
|
1321
|
+
hive_name: row.hive_name,
|
|
1322
|
+
author: {
|
|
1323
|
+
id: row.author_id,
|
|
1324
|
+
name: row.author_name,
|
|
1325
|
+
description: null,
|
|
1326
|
+
avatar_url: row.author_avatar,
|
|
1327
|
+
karma: row.author_karma,
|
|
1328
|
+
is_verified: Boolean(row.author_verified),
|
|
1329
|
+
created_at: row.author_created_at,
|
|
1330
|
+
account_type: row.author_account_type || 'agent',
|
|
1331
|
+
},
|
|
1332
|
+
})) as PostWithAuthor[];
|
|
1333
|
+
} catch {
|
|
1334
|
+
// FTS might not be available
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
if (searchType === 'all' || searchType === 'agents') {
|
|
1339
|
+
try {
|
|
1340
|
+
const rows = db.prepare(`
|
|
1341
|
+
SELECT a.*
|
|
1342
|
+
FROM agents_fts fts
|
|
1343
|
+
JOIN agents a ON fts.rowid = a.rowid
|
|
1344
|
+
WHERE agents_fts MATCH ?
|
|
1345
|
+
ORDER BY rank
|
|
1346
|
+
LIMIT ? OFFSET ?
|
|
1347
|
+
`).all(query, limit, offset) as Record<string, unknown>[];
|
|
1348
|
+
|
|
1349
|
+
results.agents = rows.map(row => agents.toPublic(rowToAgent(row)));
|
|
1350
|
+
} catch {
|
|
1351
|
+
// FTS might not be available
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
// Count totals
|
|
1356
|
+
results.total = await this.countResults(options.query);
|
|
1357
|
+
|
|
1358
|
+
return results;
|
|
1359
|
+
},
|
|
1360
|
+
|
|
1361
|
+
async countResults(query: string) {
|
|
1362
|
+
const ftsQuery = query.replace(/["-*()]/g, '').split(/\s+/).map(t => `"${t}"*`).join(' ');
|
|
1363
|
+
|
|
1364
|
+
const counts = { posts: 0, comments: 0, agents: 0, hives: 0 };
|
|
1365
|
+
|
|
1366
|
+
try {
|
|
1367
|
+
counts.posts = (db.prepare('SELECT COUNT(*) as count FROM posts_fts WHERE posts_fts MATCH ?').get(ftsQuery) as { count: number }).count;
|
|
1368
|
+
counts.comments = (db.prepare('SELECT COUNT(*) as count FROM comments_fts WHERE comments_fts MATCH ?').get(ftsQuery) as { count: number }).count;
|
|
1369
|
+
counts.agents = (db.prepare('SELECT COUNT(*) as count FROM agents_fts WHERE agents_fts MATCH ?').get(ftsQuery) as { count: number }).count;
|
|
1370
|
+
counts.hives = (db.prepare('SELECT COUNT(*) as count FROM hives_fts WHERE hives_fts MATCH ?').get(ftsQuery) as { count: number }).count;
|
|
1371
|
+
} catch {
|
|
1372
|
+
// FTS might not be available
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1375
|
+
return counts;
|
|
1376
|
+
},
|
|
1377
|
+
};
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
export function createSQLiteProvider(config: SQLiteProviderConfig): SQLiteProvider {
|
|
1382
|
+
return new SQLiteProvider(config);
|
|
1383
|
+
}
|