@soleri/core 2.10.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agency/agency-manager.d.ts +47 -0
- package/dist/agency/agency-manager.d.ts.map +1 -0
- package/dist/agency/agency-manager.js +281 -0
- package/dist/agency/agency-manager.js.map +1 -0
- package/dist/agency/index.d.ts +3 -0
- package/dist/agency/index.d.ts.map +1 -0
- package/dist/agency/index.js +2 -0
- package/dist/agency/index.js.map +1 -0
- package/dist/agency/types.d.ts +69 -0
- package/dist/agency/types.d.ts.map +1 -0
- package/dist/agency/types.js +5 -0
- package/dist/agency/types.js.map +1 -0
- package/dist/brain/brain.d.ts +0 -1
- package/dist/brain/brain.d.ts.map +1 -1
- package/dist/brain/brain.js +14 -0
- package/dist/brain/brain.js.map +1 -1
- package/dist/brain/intelligence.d.ts +5 -1
- package/dist/brain/intelligence.d.ts.map +1 -1
- package/dist/brain/intelligence.js +83 -0
- package/dist/brain/intelligence.js.map +1 -1
- package/dist/brain/types.d.ts +21 -0
- package/dist/brain/types.d.ts.map +1 -1
- package/dist/chat/agent-loop-types.d.ts +82 -0
- package/dist/chat/agent-loop-types.d.ts.map +1 -0
- package/dist/chat/agent-loop-types.js +8 -0
- package/dist/chat/agent-loop-types.js.map +1 -0
- package/dist/chat/agent-loop.d.ts +19 -0
- package/dist/chat/agent-loop.d.ts.map +1 -0
- package/dist/chat/agent-loop.js +261 -0
- package/dist/chat/agent-loop.js.map +1 -0
- package/dist/chat/auth-manager.d.ts +49 -0
- package/dist/chat/auth-manager.d.ts.map +1 -0
- package/dist/chat/auth-manager.js +152 -0
- package/dist/chat/auth-manager.js.map +1 -0
- package/dist/chat/browser-session.d.ts +86 -0
- package/dist/chat/browser-session.d.ts.map +1 -0
- package/dist/chat/browser-session.js +143 -0
- package/dist/chat/browser-session.js.map +1 -0
- package/dist/chat/cancellation.d.ts +54 -0
- package/dist/chat/cancellation.d.ts.map +1 -0
- package/dist/chat/cancellation.js +80 -0
- package/dist/chat/cancellation.js.map +1 -0
- package/dist/chat/chat-session.d.ts +86 -0
- package/dist/chat/chat-session.d.ts.map +1 -0
- package/dist/chat/chat-session.js +252 -0
- package/dist/chat/chat-session.js.map +1 -0
- package/dist/chat/file-handler.d.ts +63 -0
- package/dist/chat/file-handler.d.ts.map +1 -0
- package/dist/chat/file-handler.js +182 -0
- package/dist/chat/file-handler.js.map +1 -0
- package/dist/chat/fragment-buffer.d.ts +49 -0
- package/dist/chat/fragment-buffer.d.ts.map +1 -0
- package/dist/chat/fragment-buffer.js +130 -0
- package/dist/chat/fragment-buffer.js.map +1 -0
- package/dist/chat/index.d.ts +24 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +15 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/mcp-bridge.d.ts +60 -0
- package/dist/chat/mcp-bridge.d.ts.map +1 -0
- package/dist/chat/mcp-bridge.js +111 -0
- package/dist/chat/mcp-bridge.js.map +1 -0
- package/dist/chat/notifications.d.ts +82 -0
- package/dist/chat/notifications.d.ts.map +1 -0
- package/dist/chat/notifications.js +119 -0
- package/dist/chat/notifications.js.map +1 -0
- package/dist/chat/output-compressor.d.ts +30 -0
- package/dist/chat/output-compressor.d.ts.map +1 -0
- package/dist/chat/output-compressor.js +95 -0
- package/dist/chat/output-compressor.js.map +1 -0
- package/dist/chat/queue.d.ts +91 -0
- package/dist/chat/queue.d.ts.map +1 -0
- package/dist/chat/queue.js +146 -0
- package/dist/chat/queue.js.map +1 -0
- package/dist/chat/response-chunker.d.ts +29 -0
- package/dist/chat/response-chunker.d.ts.map +1 -0
- package/dist/chat/response-chunker.js +163 -0
- package/dist/chat/response-chunker.js.map +1 -0
- package/dist/chat/self-update.d.ts +62 -0
- package/dist/chat/self-update.d.ts.map +1 -0
- package/dist/chat/self-update.js +90 -0
- package/dist/chat/self-update.js.map +1 -0
- package/dist/chat/types.d.ts +105 -0
- package/dist/chat/types.d.ts.map +1 -0
- package/dist/chat/types.js +8 -0
- package/dist/chat/types.js.map +1 -0
- package/dist/chat/voice.d.ts +39 -0
- package/dist/chat/voice.d.ts.map +1 -0
- package/dist/chat/voice.js +80 -0
- package/dist/chat/voice.js.map +1 -0
- package/dist/claudemd/compose.d.ts +31 -0
- package/dist/claudemd/compose.d.ts.map +1 -0
- package/dist/claudemd/compose.js +105 -0
- package/dist/claudemd/compose.js.map +1 -0
- package/dist/claudemd/index.d.ts +5 -0
- package/dist/claudemd/index.d.ts.map +1 -0
- package/dist/claudemd/index.js +3 -0
- package/dist/claudemd/index.js.map +1 -0
- package/dist/claudemd/inject.d.ts +31 -0
- package/dist/claudemd/inject.d.ts.map +1 -0
- package/dist/claudemd/inject.js +157 -0
- package/dist/claudemd/inject.js.map +1 -0
- package/dist/claudemd/types.d.ts +41 -0
- package/dist/claudemd/types.d.ts.map +1 -0
- package/dist/claudemd/types.js +5 -0
- package/dist/claudemd/types.js.map +1 -0
- package/dist/context/context-engine.d.ts +31 -0
- package/dist/context/context-engine.d.ts.map +1 -0
- package/dist/context/context-engine.js +245 -0
- package/dist/context/context-engine.js.map +1 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +2 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/types.d.ts +54 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +5 -0
- package/dist/context/types.js.map +1 -0
- package/dist/enforcement/adapters/claude-code.d.ts +18 -0
- package/dist/enforcement/adapters/claude-code.d.ts.map +1 -0
- package/dist/enforcement/adapters/claude-code.js +106 -0
- package/dist/enforcement/adapters/claude-code.js.map +1 -0
- package/dist/enforcement/adapters/index.d.ts +2 -0
- package/dist/enforcement/adapters/index.d.ts.map +1 -0
- package/dist/enforcement/adapters/index.js +2 -0
- package/dist/enforcement/adapters/index.js.map +1 -0
- package/dist/enforcement/index.d.ts +4 -0
- package/dist/enforcement/index.d.ts.map +1 -0
- package/dist/enforcement/index.js +3 -0
- package/dist/enforcement/index.js.map +1 -0
- package/dist/enforcement/registry.d.ts +23 -0
- package/dist/enforcement/registry.d.ts.map +1 -0
- package/dist/enforcement/registry.js +63 -0
- package/dist/enforcement/registry.js.map +1 -0
- package/dist/enforcement/types.d.ts +51 -0
- package/dist/enforcement/types.d.ts.map +1 -0
- package/dist/enforcement/types.js +8 -0
- package/dist/enforcement/types.js.map +1 -0
- package/dist/facades/facade-factory.d.ts +10 -3
- package/dist/facades/facade-factory.d.ts.map +1 -1
- package/dist/facades/facade-factory.js +94 -5
- package/dist/facades/facade-factory.js.map +1 -1
- package/dist/facades/types.d.ts +15 -1
- package/dist/facades/types.d.ts.map +1 -1
- package/dist/facades/types.js +6 -0
- package/dist/facades/types.js.map +1 -1
- package/dist/health/health-registry.d.ts +40 -0
- package/dist/health/health-registry.d.ts.map +1 -0
- package/dist/health/health-registry.js +134 -0
- package/dist/health/health-registry.js.map +1 -0
- package/dist/health/index.d.ts +5 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +3 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/vault-integrity.d.ts +13 -0
- package/dist/health/vault-integrity.d.ts.map +1 -0
- package/dist/health/vault-integrity.js +49 -0
- package/dist/health/vault-integrity.js.map +1 -0
- package/dist/index.d.ts +67 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -3
- package/dist/index.js.map +1 -1
- package/dist/intake/intake-pipeline.d.ts +0 -7
- package/dist/intake/intake-pipeline.d.ts.map +1 -1
- package/dist/intake/intake-pipeline.js +1 -1
- package/dist/intake/intake-pipeline.js.map +1 -1
- package/dist/intelligence/types.d.ts +1 -0
- package/dist/intelligence/types.d.ts.map +1 -1
- package/dist/migrations/index.d.ts +6 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +5 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/migration-runner.d.ts +51 -0
- package/dist/migrations/migration-runner.d.ts.map +1 -0
- package/dist/migrations/migration-runner.js +141 -0
- package/dist/migrations/migration-runner.js.map +1 -0
- package/dist/packs/index.d.ts +10 -0
- package/dist/packs/index.d.ts.map +1 -0
- package/dist/packs/index.js +8 -0
- package/dist/packs/index.js.map +1 -0
- package/dist/packs/lockfile.d.ts +97 -0
- package/dist/packs/lockfile.d.ts.map +1 -0
- package/dist/packs/lockfile.js +129 -0
- package/dist/packs/lockfile.js.map +1 -0
- package/dist/packs/pack-installer.d.ts +41 -0
- package/dist/packs/pack-installer.d.ts.map +1 -0
- package/dist/packs/pack-installer.js +253 -0
- package/dist/packs/pack-installer.js.map +1 -0
- package/dist/packs/resolver.d.ts +51 -0
- package/dist/packs/resolver.d.ts.map +1 -0
- package/dist/packs/resolver.js +195 -0
- package/dist/packs/resolver.js.map +1 -0
- package/dist/packs/types.d.ts +186 -0
- package/dist/packs/types.d.ts.map +1 -0
- package/dist/packs/types.js +69 -0
- package/dist/packs/types.js.map +1 -0
- package/dist/persistence/postgres-provider.d.ts +42 -7
- package/dist/persistence/postgres-provider.d.ts.map +1 -1
- package/dist/persistence/postgres-provider.js +187 -46
- package/dist/persistence/postgres-provider.js.map +1 -1
- package/dist/playbooks/index.d.ts +2 -0
- package/dist/playbooks/index.d.ts.map +1 -1
- package/dist/playbooks/index.js +2 -0
- package/dist/playbooks/index.js.map +1 -1
- package/dist/playbooks/playbook-executor.d.ts +100 -0
- package/dist/playbooks/playbook-executor.d.ts.map +1 -0
- package/dist/playbooks/playbook-executor.js +207 -0
- package/dist/playbooks/playbook-executor.js.map +1 -0
- package/dist/plugins/index.d.ts +7 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +7 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/plugin-loader.d.ts +28 -0
- package/dist/plugins/plugin-loader.d.ts.map +1 -0
- package/dist/plugins/plugin-loader.js +150 -0
- package/dist/plugins/plugin-loader.js.map +1 -0
- package/dist/plugins/plugin-registry.d.ts +58 -0
- package/dist/plugins/plugin-registry.d.ts.map +1 -0
- package/dist/plugins/plugin-registry.js +157 -0
- package/dist/plugins/plugin-registry.js.map +1 -0
- package/dist/plugins/types.d.ts +180 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +48 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/runtime/admin-extra-ops.d.ts.map +1 -1
- package/dist/runtime/admin-extra-ops.js +181 -8
- package/dist/runtime/admin-extra-ops.js.map +1 -1
- package/dist/runtime/capture-ops.d.ts.map +1 -1
- package/dist/runtime/capture-ops.js +106 -7
- package/dist/runtime/capture-ops.js.map +1 -1
- package/dist/runtime/deprecation.d.ts +33 -0
- package/dist/runtime/deprecation.d.ts.map +1 -0
- package/dist/runtime/deprecation.js +41 -0
- package/dist/runtime/deprecation.js.map +1 -0
- package/dist/runtime/facades/admin-facade.d.ts.map +1 -1
- package/dist/runtime/facades/admin-facade.js +12 -1
- package/dist/runtime/facades/admin-facade.js.map +1 -1
- package/dist/runtime/facades/agency-facade.d.ts +7 -0
- package/dist/runtime/facades/agency-facade.d.ts.map +1 -0
- package/dist/runtime/facades/agency-facade.js +103 -0
- package/dist/runtime/facades/agency-facade.js.map +1 -0
- package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
- package/dist/runtime/facades/brain-facade.js +58 -0
- package/dist/runtime/facades/brain-facade.js.map +1 -1
- package/dist/runtime/facades/chat-facade.d.ts +7 -0
- package/dist/runtime/facades/chat-facade.d.ts.map +1 -0
- package/dist/runtime/facades/chat-facade.js +808 -0
- package/dist/runtime/facades/chat-facade.js.map +1 -0
- package/dist/runtime/facades/context-facade.d.ts +7 -0
- package/dist/runtime/facades/context-facade.d.ts.map +1 -0
- package/dist/runtime/facades/context-facade.js +45 -0
- package/dist/runtime/facades/context-facade.js.map +1 -0
- package/dist/runtime/facades/index.d.ts.map +1 -1
- package/dist/runtime/facades/index.js +18 -0
- package/dist/runtime/facades/index.js.map +1 -1
- package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
- package/dist/runtime/facades/vault-facade.js +247 -1
- package/dist/runtime/facades/vault-facade.js.map +1 -1
- package/dist/runtime/feature-flags.d.ts +18 -0
- package/dist/runtime/feature-flags.d.ts.map +1 -0
- package/dist/runtime/feature-flags.js +90 -0
- package/dist/runtime/feature-flags.js.map +1 -0
- package/dist/runtime/pack-ops.d.ts +9 -0
- package/dist/runtime/pack-ops.d.ts.map +1 -0
- package/dist/runtime/pack-ops.js +76 -0
- package/dist/runtime/pack-ops.js.map +1 -0
- package/dist/runtime/playbook-ops.d.ts +3 -7
- package/dist/runtime/playbook-ops.d.ts.map +1 -1
- package/dist/runtime/playbook-ops.js +101 -10
- package/dist/runtime/playbook-ops.js.map +1 -1
- package/dist/runtime/plugin-ops.d.ts +9 -0
- package/dist/runtime/plugin-ops.d.ts.map +1 -0
- package/dist/runtime/plugin-ops.js +235 -0
- package/dist/runtime/plugin-ops.js.map +1 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +72 -5
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/telemetry-ops.d.ts +10 -0
- package/dist/runtime/telemetry-ops.d.ts.map +1 -0
- package/dist/runtime/telemetry-ops.js +53 -0
- package/dist/runtime/telemetry-ops.js.map +1 -0
- package/dist/runtime/types.d.ts +35 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/vault-sharing-ops.d.ts +13 -0
- package/dist/runtime/vault-sharing-ops.d.ts.map +1 -0
- package/dist/runtime/vault-sharing-ops.js +345 -0
- package/dist/runtime/vault-sharing-ops.js.map +1 -0
- package/dist/streams/index.d.ts +1 -1
- package/dist/streams/index.d.ts.map +1 -1
- package/dist/streams/index.js +1 -1
- package/dist/streams/index.js.map +1 -1
- package/dist/streams/replayable-stream.d.ts +13 -1
- package/dist/streams/replayable-stream.d.ts.map +1 -1
- package/dist/streams/replayable-stream.js +27 -3
- package/dist/streams/replayable-stream.js.map +1 -1
- package/dist/text/similarity.d.ts +0 -1
- package/dist/text/similarity.d.ts.map +1 -1
- package/dist/text/similarity.js +1 -1
- package/dist/text/similarity.js.map +1 -1
- package/dist/transport/http-server.d.ts +56 -0
- package/dist/transport/http-server.d.ts.map +1 -0
- package/dist/transport/http-server.js +210 -0
- package/dist/transport/http-server.js.map +1 -0
- package/dist/transport/index.d.ts +11 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +10 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/lsp-server.d.ts +140 -0
- package/dist/transport/lsp-server.d.ts.map +1 -0
- package/dist/transport/lsp-server.js +239 -0
- package/dist/transport/lsp-server.js.map +1 -0
- package/dist/transport/rate-limiter.d.ts +35 -0
- package/dist/transport/rate-limiter.d.ts.map +1 -0
- package/dist/transport/rate-limiter.js +72 -0
- package/dist/transport/rate-limiter.js.map +1 -0
- package/dist/transport/session-manager.d.ts +49 -0
- package/dist/transport/session-manager.d.ts.map +1 -0
- package/dist/transport/session-manager.js +83 -0
- package/dist/transport/session-manager.js.map +1 -0
- package/dist/transport/token-auth.d.ts +29 -0
- package/dist/transport/token-auth.d.ts.map +1 -0
- package/dist/transport/token-auth.js +84 -0
- package/dist/transport/token-auth.js.map +1 -0
- package/dist/transport/types.d.ts +61 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +5 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/transport/ws-server.d.ts +78 -0
- package/dist/transport/ws-server.d.ts.map +1 -0
- package/dist/transport/ws-server.js +342 -0
- package/dist/transport/ws-server.js.map +1 -0
- package/dist/vault/git-vault-sync.d.ts +107 -0
- package/dist/vault/git-vault-sync.d.ts.map +1 -0
- package/dist/vault/git-vault-sync.js +251 -0
- package/dist/vault/git-vault-sync.js.map +1 -0
- package/dist/vault/knowledge-review.d.ts +67 -0
- package/dist/vault/knowledge-review.d.ts.map +1 -0
- package/dist/vault/knowledge-review.js +133 -0
- package/dist/vault/knowledge-review.js.map +1 -0
- package/dist/vault/obsidian-sync.d.ts +94 -0
- package/dist/vault/obsidian-sync.d.ts.map +1 -0
- package/dist/vault/obsidian-sync.js +247 -0
- package/dist/vault/obsidian-sync.js.map +1 -0
- package/dist/vault/scope-detector.d.ts +31 -0
- package/dist/vault/scope-detector.d.ts.map +1 -0
- package/dist/vault/scope-detector.js +182 -0
- package/dist/vault/scope-detector.js.map +1 -0
- package/dist/vault/vault-branching.d.ts +71 -0
- package/dist/vault/vault-branching.d.ts.map +1 -0
- package/dist/vault/vault-branching.js +180 -0
- package/dist/vault/vault-branching.js.map +1 -0
- package/dist/vault/vault-manager.d.ts +89 -0
- package/dist/vault/vault-manager.d.ts.map +1 -0
- package/dist/vault/vault-manager.js +199 -0
- package/dist/vault/vault-manager.js.map +1 -0
- package/dist/vault/vault-types.d.ts +30 -0
- package/dist/vault/vault-types.d.ts.map +1 -0
- package/dist/vault/vault-types.js +10 -0
- package/dist/vault/vault-types.js.map +1 -0
- package/dist/vault/vault.d.ts +10 -0
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +36 -3
- package/dist/vault/vault.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/admin-extra-ops.test.ts +31 -11
- package/src/__tests__/agency-manager.test.ts +374 -0
- package/src/__tests__/agent-loop.test.ts +256 -0
- package/src/__tests__/capture-ops.test.ts +275 -0
- package/src/__tests__/chat-differentiators.test.ts +251 -0
- package/src/__tests__/chat-enhanced.test.ts +390 -0
- package/src/__tests__/chat-transport.test.ts +665 -0
- package/src/__tests__/claudemd.test.ts +282 -0
- package/src/__tests__/context-engine.test.ts +256 -0
- package/src/__tests__/core-ops.test.ts +97 -5
- package/src/__tests__/deprecation.test.ts +78 -0
- package/src/__tests__/enforcement.test.ts +153 -0
- package/src/__tests__/facade-factory.test.ts +271 -0
- package/src/__tests__/feature-flags.test.ts +138 -0
- package/src/__tests__/git-vault-sync.test.ts +230 -0
- package/src/__tests__/health-registry.test.ts +173 -0
- package/src/__tests__/knowledge-review.test.ts +104 -0
- package/src/__tests__/lsp-transport.test.ts +442 -0
- package/src/__tests__/migration-runner.test.ts +170 -0
- package/src/__tests__/normalize.test.ts +10 -0
- package/src/__tests__/obsidian-sync.test.ts +354 -0
- package/src/__tests__/pack-lockfile.test.ts +261 -0
- package/src/__tests__/pack-ops.test.ts +146 -0
- package/src/__tests__/pack-system.test.ts +423 -0
- package/src/__tests__/playbook-executor.test.ts +249 -0
- package/src/__tests__/playbook-ops-execution.test.ts +189 -0
- package/src/__tests__/plugin-ops.test.ts +411 -0
- package/src/__tests__/plugin-system.test.ts +509 -0
- package/src/__tests__/postgres-provider.test.ts +64 -6
- package/src/__tests__/replayable-stream.test.ts +112 -1
- package/src/__tests__/scope-detector.test.ts +121 -0
- package/src/__tests__/session-lifecycle.test.ts +259 -0
- package/src/__tests__/transport.test.ts +758 -0
- package/src/__tests__/vault-branching.test.ts +274 -0
- package/src/__tests__/vault-connect.test.ts +179 -0
- package/src/__tests__/vault-integrity.test.ts +71 -0
- package/src/__tests__/vault-manager.test.ts +238 -0
- package/src/__tests__/vault-scaling.test.ts +281 -0
- package/src/__tests__/vault-sharing.test.ts +270 -0
- package/src/__tests__/ws-transport.test.ts +479 -0
- package/src/agency/agency-manager.ts +326 -0
- package/src/agency/index.ts +13 -0
- package/src/agency/types.ts +88 -0
- package/src/brain/brain.ts +15 -11
- package/src/brain/intelligence.ts +103 -0
- package/src/brain/types.ts +26 -0
- package/src/chat/agent-loop-types.ts +99 -0
- package/src/chat/agent-loop.ts +357 -0
- package/src/chat/auth-manager.ts +171 -0
- package/src/chat/browser-session.ts +188 -0
- package/src/chat/cancellation.ts +99 -0
- package/src/chat/chat-session.ts +283 -0
- package/src/chat/file-handler.ts +230 -0
- package/src/chat/fragment-buffer.ts +160 -0
- package/src/chat/index.ts +72 -0
- package/src/chat/mcp-bridge.ts +135 -0
- package/src/chat/notifications.ts +164 -0
- package/src/chat/output-compressor.ts +116 -0
- package/src/chat/queue.ts +208 -0
- package/src/chat/response-chunker.ts +200 -0
- package/src/chat/self-update.ts +117 -0
- package/src/chat/types.ts +126 -0
- package/src/chat/voice.ts +134 -0
- package/src/claudemd/compose.ts +142 -0
- package/src/claudemd/index.ts +17 -0
- package/src/claudemd/inject.ts +170 -0
- package/src/claudemd/types.ts +45 -0
- package/src/context/context-engine.ts +302 -0
- package/src/context/index.ts +11 -0
- package/src/context/types.ts +69 -0
- package/src/enforcement/adapters/claude-code.ts +135 -0
- package/src/enforcement/adapters/index.ts +1 -0
- package/src/enforcement/index.ts +10 -0
- package/src/enforcement/registry.ts +82 -0
- package/src/enforcement/types.ts +56 -0
- package/src/facades/facade-factory.ts +138 -5
- package/src/facades/types.ts +21 -0
- package/src/health/health-registry.ts +165 -0
- package/src/health/index.ts +11 -0
- package/src/health/vault-integrity.ts +66 -0
- package/src/index.ts +294 -2
- package/src/intake/intake-pipeline.ts +1 -1
- package/src/intelligence/types.ts +1 -0
- package/src/migrations/index.ts +6 -0
- package/src/migrations/migration-runner.ts +185 -0
- package/src/packs/index.ts +20 -0
- package/src/packs/lockfile.ts +180 -0
- package/src/packs/pack-installer.ts +289 -0
- package/src/packs/resolver.ts +237 -0
- package/src/packs/types.ts +125 -0
- package/src/persistence/postgres-provider.ts +211 -58
- package/src/playbooks/index.ts +11 -0
- package/src/playbooks/playbook-executor.ts +301 -0
- package/src/plugins/index.ts +19 -0
- package/src/plugins/plugin-loader.ts +183 -0
- package/src/plugins/plugin-registry.ts +187 -0
- package/src/plugins/types.ts +119 -0
- package/src/runtime/admin-extra-ops.ts +193 -8
- package/src/runtime/capture-ops.ts +113 -8
- package/src/runtime/deprecation.ts +58 -0
- package/src/runtime/facades/admin-facade.ts +16 -1
- package/src/runtime/facades/agency-facade.ts +111 -0
- package/src/runtime/facades/brain-facade.ts +60 -0
- package/src/runtime/facades/chat-facade.ts +918 -0
- package/src/runtime/facades/context-facade.ts +55 -0
- package/src/runtime/facades/index.ts +22 -1
- package/src/runtime/facades/vault-facade.ts +261 -1
- package/src/runtime/feature-flags.ts +101 -0
- package/src/runtime/pack-ops.ts +85 -0
- package/src/runtime/playbook-ops.ts +113 -9
- package/src/runtime/plugin-ops.ts +258 -0
- package/src/runtime/runtime.ts +84 -5
- package/src/runtime/telemetry-ops.ts +57 -0
- package/src/runtime/types.ts +35 -0
- package/src/runtime/vault-sharing-ops.ts +372 -0
- package/src/streams/index.ts +1 -1
- package/src/streams/replayable-stream.ts +34 -3
- package/src/text/similarity.ts +1 -1
- package/src/transport/http-server.ts +269 -0
- package/src/transport/index.ts +48 -0
- package/src/transport/lsp-server.ts +401 -0
- package/src/transport/rate-limiter.ts +97 -0
- package/src/transport/session-manager.ts +120 -0
- package/src/transport/token-auth.ts +96 -0
- package/src/transport/types.ts +66 -0
- package/src/transport/ws-server.ts +415 -0
- package/src/vault/git-vault-sync.ts +318 -0
- package/src/vault/knowledge-review.ts +221 -0
- package/src/vault/obsidian-sync.ts +346 -0
- package/src/vault/scope-detector.ts +219 -0
- package/src/vault/vault-branching.ts +264 -0
- package/src/vault/vault-manager.ts +237 -0
- package/src/vault/vault-types.ts +50 -0
- package/src/vault/vault.ts +41 -3
- package/src/governance/index.ts +0 -18
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Pack — Types & Manifest Schema
|
|
3
|
+
*
|
|
4
|
+
* A knowledge pack is a superset of a plugin: it bundles domain facades,
|
|
5
|
+
* vault entries, skills, and hooks into one installable unit.
|
|
6
|
+
*
|
|
7
|
+
* Directory structure:
|
|
8
|
+
* my-pack/
|
|
9
|
+
* soleri-pack.json # manifest (required)
|
|
10
|
+
* index.js # facade builder (optional, like plugins)
|
|
11
|
+
* vault/ # intelligence JSON bundles to seed (optional)
|
|
12
|
+
* patterns.json
|
|
13
|
+
* anti-patterns.json
|
|
14
|
+
* skills/ # skill markdown files (optional)
|
|
15
|
+
* review.md
|
|
16
|
+
* hooks/ # hook markdown files (optional)
|
|
17
|
+
* no-inline-styles.md
|
|
18
|
+
*/
|
|
19
|
+
import { z } from 'zod';
|
|
20
|
+
export declare const packManifestSchema: z.ZodObject<{
|
|
21
|
+
id: z.ZodString;
|
|
22
|
+
name: z.ZodString;
|
|
23
|
+
version: z.ZodString;
|
|
24
|
+
description: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
25
|
+
/** Domains this pack covers */
|
|
26
|
+
domains: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
27
|
+
/** Minimum engine version required (semver range) */
|
|
28
|
+
engine: z.ZodOptional<z.ZodString>;
|
|
29
|
+
/** Pack dependencies (other pack IDs) */
|
|
30
|
+
dependencies: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
31
|
+
/** Facade definitions (same as plugin manifest) */
|
|
32
|
+
facades: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
33
|
+
name: z.ZodString;
|
|
34
|
+
description: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
35
|
+
ops: z.ZodArray<z.ZodObject<{
|
|
36
|
+
name: z.ZodString;
|
|
37
|
+
description: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
38
|
+
auth: z.ZodDefault<z.ZodOptional<z.ZodEnum<["read", "write", "admin"]>>>;
|
|
39
|
+
}, "strip", z.ZodTypeAny, {
|
|
40
|
+
name: string;
|
|
41
|
+
description: string;
|
|
42
|
+
auth: "write" | "read" | "admin";
|
|
43
|
+
}, {
|
|
44
|
+
name: string;
|
|
45
|
+
description?: string | undefined;
|
|
46
|
+
auth?: "write" | "read" | "admin" | undefined;
|
|
47
|
+
}>, "many">;
|
|
48
|
+
}, "strip", z.ZodTypeAny, {
|
|
49
|
+
name: string;
|
|
50
|
+
description: string;
|
|
51
|
+
ops: {
|
|
52
|
+
name: string;
|
|
53
|
+
description: string;
|
|
54
|
+
auth: "write" | "read" | "admin";
|
|
55
|
+
}[];
|
|
56
|
+
}, {
|
|
57
|
+
name: string;
|
|
58
|
+
ops: {
|
|
59
|
+
name: string;
|
|
60
|
+
description?: string | undefined;
|
|
61
|
+
auth?: "write" | "read" | "admin" | undefined;
|
|
62
|
+
}[];
|
|
63
|
+
description?: string | undefined;
|
|
64
|
+
}>, "many">>>;
|
|
65
|
+
/** Vault configuration */
|
|
66
|
+
vault: z.ZodOptional<z.ZodObject<{
|
|
67
|
+
/** Subdirectory containing intelligence JSON bundles. Default: "vault" */
|
|
68
|
+
dir: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
69
|
+
}, "strip", z.ZodTypeAny, {
|
|
70
|
+
dir: string;
|
|
71
|
+
}, {
|
|
72
|
+
dir?: string | undefined;
|
|
73
|
+
}>>;
|
|
74
|
+
/** Skills configuration */
|
|
75
|
+
skills: z.ZodOptional<z.ZodObject<{
|
|
76
|
+
/** Subdirectory containing skill .md files. Default: "skills" */
|
|
77
|
+
dir: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
78
|
+
}, "strip", z.ZodTypeAny, {
|
|
79
|
+
dir: string;
|
|
80
|
+
}, {
|
|
81
|
+
dir?: string | undefined;
|
|
82
|
+
}>>;
|
|
83
|
+
/** Hooks configuration */
|
|
84
|
+
hooks: z.ZodOptional<z.ZodObject<{
|
|
85
|
+
/** Subdirectory containing hook .md files. Default: "hooks" */
|
|
86
|
+
dir: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
87
|
+
}, "strip", z.ZodTypeAny, {
|
|
88
|
+
dir: string;
|
|
89
|
+
}, {
|
|
90
|
+
dir?: string | undefined;
|
|
91
|
+
}>>;
|
|
92
|
+
}, "strip", z.ZodTypeAny, {
|
|
93
|
+
id: string;
|
|
94
|
+
name: string;
|
|
95
|
+
description: string;
|
|
96
|
+
version: string;
|
|
97
|
+
domains: string[];
|
|
98
|
+
dependencies: string[];
|
|
99
|
+
facades: {
|
|
100
|
+
name: string;
|
|
101
|
+
description: string;
|
|
102
|
+
ops: {
|
|
103
|
+
name: string;
|
|
104
|
+
description: string;
|
|
105
|
+
auth: "write" | "read" | "admin";
|
|
106
|
+
}[];
|
|
107
|
+
}[];
|
|
108
|
+
vault?: {
|
|
109
|
+
dir: string;
|
|
110
|
+
} | undefined;
|
|
111
|
+
hooks?: {
|
|
112
|
+
dir: string;
|
|
113
|
+
} | undefined;
|
|
114
|
+
skills?: {
|
|
115
|
+
dir: string;
|
|
116
|
+
} | undefined;
|
|
117
|
+
engine?: string | undefined;
|
|
118
|
+
}, {
|
|
119
|
+
id: string;
|
|
120
|
+
name: string;
|
|
121
|
+
version: string;
|
|
122
|
+
description?: string | undefined;
|
|
123
|
+
vault?: {
|
|
124
|
+
dir?: string | undefined;
|
|
125
|
+
} | undefined;
|
|
126
|
+
hooks?: {
|
|
127
|
+
dir?: string | undefined;
|
|
128
|
+
} | undefined;
|
|
129
|
+
skills?: {
|
|
130
|
+
dir?: string | undefined;
|
|
131
|
+
} | undefined;
|
|
132
|
+
domains?: string[] | undefined;
|
|
133
|
+
engine?: string | undefined;
|
|
134
|
+
dependencies?: string[] | undefined;
|
|
135
|
+
facades?: {
|
|
136
|
+
name: string;
|
|
137
|
+
ops: {
|
|
138
|
+
name: string;
|
|
139
|
+
description?: string | undefined;
|
|
140
|
+
auth?: "write" | "read" | "admin" | undefined;
|
|
141
|
+
}[];
|
|
142
|
+
description?: string | undefined;
|
|
143
|
+
}[] | undefined;
|
|
144
|
+
}>;
|
|
145
|
+
export type PackManifest = z.infer<typeof packManifestSchema>;
|
|
146
|
+
export type PackStatus = 'installed' | 'error' | 'uninstalled';
|
|
147
|
+
export interface InstalledPack {
|
|
148
|
+
id: string;
|
|
149
|
+
manifest: PackManifest;
|
|
150
|
+
directory: string;
|
|
151
|
+
status: PackStatus;
|
|
152
|
+
error?: string;
|
|
153
|
+
/** Number of vault entries seeded */
|
|
154
|
+
vaultEntries: number;
|
|
155
|
+
/** Skill files found */
|
|
156
|
+
skills: string[];
|
|
157
|
+
/** Hook files found */
|
|
158
|
+
hooks: string[];
|
|
159
|
+
/** Whether facades were registered via plugin system */
|
|
160
|
+
facadesRegistered: boolean;
|
|
161
|
+
installedAt: number;
|
|
162
|
+
}
|
|
163
|
+
export interface InstallResult {
|
|
164
|
+
id: string;
|
|
165
|
+
installed: boolean;
|
|
166
|
+
vaultEntries: number;
|
|
167
|
+
skills: string[];
|
|
168
|
+
hooks: string[];
|
|
169
|
+
facades: number;
|
|
170
|
+
error?: string;
|
|
171
|
+
}
|
|
172
|
+
export interface ValidateResult {
|
|
173
|
+
valid: boolean;
|
|
174
|
+
manifest?: PackManifest;
|
|
175
|
+
errors: string[];
|
|
176
|
+
warnings: string[];
|
|
177
|
+
/** Counts of what would be installed */
|
|
178
|
+
counts?: {
|
|
179
|
+
vaultEntries: number;
|
|
180
|
+
skills: number;
|
|
181
|
+
hooks: number;
|
|
182
|
+
facades: number;
|
|
183
|
+
ops: number;
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/packs/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,kBAAkB;;;;;IAK7B,+BAA+B;;IAE/B,qDAAqD;;IAErD,yCAAyC;;IAEzC,mDAAmD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiBnD,0BAA0B;;QAGtB,0EAA0E;;;;;;;IAI9E,2BAA2B;;QAGvB,iEAAiE;;;;;;;IAIrE,0BAA0B;;QAGtB,+DAA+D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAInE,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAM9D,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,OAAO,GAAG,aAAa,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,uBAAuB;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,wDAAwD;IACxD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,wCAAwC;IACxC,MAAM,CAAC,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Pack — Types & Manifest Schema
|
|
3
|
+
*
|
|
4
|
+
* A knowledge pack is a superset of a plugin: it bundles domain facades,
|
|
5
|
+
* vault entries, skills, and hooks into one installable unit.
|
|
6
|
+
*
|
|
7
|
+
* Directory structure:
|
|
8
|
+
* my-pack/
|
|
9
|
+
* soleri-pack.json # manifest (required)
|
|
10
|
+
* index.js # facade builder (optional, like plugins)
|
|
11
|
+
* vault/ # intelligence JSON bundles to seed (optional)
|
|
12
|
+
* patterns.json
|
|
13
|
+
* anti-patterns.json
|
|
14
|
+
* skills/ # skill markdown files (optional)
|
|
15
|
+
* review.md
|
|
16
|
+
* hooks/ # hook markdown files (optional)
|
|
17
|
+
* no-inline-styles.md
|
|
18
|
+
*/
|
|
19
|
+
import { z } from 'zod';
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// MANIFEST SCHEMA
|
|
22
|
+
// =============================================================================
|
|
23
|
+
export const packManifestSchema = z.object({
|
|
24
|
+
id: z.string().regex(/^[a-z0-9-]+$/, 'Pack ID must be lowercase alphanumeric with hyphens'),
|
|
25
|
+
name: z.string().min(1),
|
|
26
|
+
version: z.string().regex(/^\d+\.\d+\.\d+$/, 'Version must be semver (x.y.z)'),
|
|
27
|
+
description: z.string().optional().default(''),
|
|
28
|
+
/** Domains this pack covers */
|
|
29
|
+
domains: z.array(z.string()).optional().default([]),
|
|
30
|
+
/** Minimum engine version required (semver range) */
|
|
31
|
+
engine: z.string().optional(),
|
|
32
|
+
/** Pack dependencies (other pack IDs) */
|
|
33
|
+
dependencies: z.array(z.string()).optional().default([]),
|
|
34
|
+
/** Facade definitions (same as plugin manifest) */
|
|
35
|
+
facades: z
|
|
36
|
+
.array(z.object({
|
|
37
|
+
name: z.string(),
|
|
38
|
+
description: z.string().optional().default(''),
|
|
39
|
+
ops: z.array(z.object({
|
|
40
|
+
name: z.string(),
|
|
41
|
+
description: z.string().optional().default(''),
|
|
42
|
+
auth: z.enum(['read', 'write', 'admin']).optional().default('read'),
|
|
43
|
+
})),
|
|
44
|
+
}))
|
|
45
|
+
.optional()
|
|
46
|
+
.default([]),
|
|
47
|
+
/** Vault configuration */
|
|
48
|
+
vault: z
|
|
49
|
+
.object({
|
|
50
|
+
/** Subdirectory containing intelligence JSON bundles. Default: "vault" */
|
|
51
|
+
dir: z.string().optional().default('vault'),
|
|
52
|
+
})
|
|
53
|
+
.optional(),
|
|
54
|
+
/** Skills configuration */
|
|
55
|
+
skills: z
|
|
56
|
+
.object({
|
|
57
|
+
/** Subdirectory containing skill .md files. Default: "skills" */
|
|
58
|
+
dir: z.string().optional().default('skills'),
|
|
59
|
+
})
|
|
60
|
+
.optional(),
|
|
61
|
+
/** Hooks configuration */
|
|
62
|
+
hooks: z
|
|
63
|
+
.object({
|
|
64
|
+
/** Subdirectory containing hook .md files. Default: "hooks" */
|
|
65
|
+
dir: z.string().optional().default('hooks'),
|
|
66
|
+
})
|
|
67
|
+
.optional(),
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/packs/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,qDAAqD,CAAC;IAC3F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;IAC9E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,+BAA+B;IAC/B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACnD,qDAAqD;IACrD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,yCAAyC;IACzC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACxD,mDAAmD;IACnD,OAAO,EAAE,CAAC;SACP,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,GAAG,EAAE,CAAC,CAAC,KAAK,CACV,CAAC,CAAC,MAAM,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACpE,CAAC,CACH;KACF,CAAC,CACH;SACA,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;IACd,0BAA0B;IAC1B,KAAK,EAAE,CAAC;SACL,MAAM,CAAC;QACN,0EAA0E;QAC1E,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;KAC5C,CAAC;SACD,QAAQ,EAAE;IACb,2BAA2B;IAC3B,MAAM,EAAE,CAAC;SACN,MAAM,CAAC;QACN,iEAAiE;QACjE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;KAC7C,CAAC;SACD,QAAQ,EAAE;IACb,0BAA0B;IAC1B,KAAK,EAAE,CAAC;SACL,MAAM,CAAC;QACN,+DAA+D;QAC/D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;KAC5C,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC"}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* PostgreSQL persistence provider
|
|
2
|
+
* PostgreSQL persistence provider.
|
|
3
3
|
*
|
|
4
4
|
* Implements PersistenceProvider with pg.Pool. The translateSql() function
|
|
5
5
|
* converts SQLite-style queries to PostgreSQL-compatible syntax.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* Architecture: Dual interface — sync methods implement PersistenceProvider
|
|
8
|
+
* for drop-in compatibility, async methods provide the real implementation.
|
|
9
|
+
*
|
|
10
|
+
* Sync methods use execFileSync (safe, no shell injection) to run queries
|
|
11
|
+
* in a subprocess. This is slower than native async but maintains interface
|
|
12
|
+
* compliance with zero additional dependencies.
|
|
13
|
+
*
|
|
14
|
+
* For high-performance use, prefer the async methods directly:
|
|
15
|
+
* await provider.queryAsync(sql, params)
|
|
16
|
+
* await provider.runAsync(sql, params)
|
|
10
17
|
*/
|
|
11
18
|
import type { PersistenceProvider, PersistenceParams, RunResult, FtsSearchOptions } from './types.js';
|
|
12
19
|
/**
|
|
@@ -15,6 +22,10 @@ import type { PersistenceProvider, PersistenceParams, RunResult, FtsSearchOption
|
|
|
15
22
|
* - Converts positional `?` params to `$1, $2, ...`
|
|
16
23
|
* - Converts named `@name` params to `$N` positional, returns ordered values
|
|
17
24
|
* - Replaces `unixepoch()` with `EXTRACT(EPOCH FROM NOW())::integer`
|
|
25
|
+
* - Replaces `INTEGER PRIMARY KEY AUTOINCREMENT` with `SERIAL PRIMARY KEY`
|
|
26
|
+
* - Strips SQLite `PRAGMA` statements
|
|
27
|
+
* - Converts `INSERT OR IGNORE` to `INSERT ... ON CONFLICT DO NOTHING`
|
|
28
|
+
* - Converts `INSERT OR REPLACE` to PostgreSQL upsert syntax
|
|
18
29
|
*/
|
|
19
30
|
export declare function translateSql(sql: string, params?: PersistenceParams): {
|
|
20
31
|
sql: string;
|
|
@@ -23,24 +34,48 @@ export declare function translateSql(sql: string, params?: PersistenceParams): {
|
|
|
23
34
|
/**
|
|
24
35
|
* PostgreSQL persistence provider.
|
|
25
36
|
*
|
|
26
|
-
* Uses pg
|
|
27
|
-
* `PostgresPersistenceProvider.create()`.
|
|
37
|
+
* Uses `pg` (optional peer dependency) via subprocess for sync interface compliance.
|
|
38
|
+
* Created via async factory `PostgresPersistenceProvider.create()`.
|
|
39
|
+
*
|
|
40
|
+
* For production use, prefer the async methods directly:
|
|
41
|
+
* ```ts
|
|
42
|
+
* const rows = await provider.queryAsync('SELECT * FROM entries WHERE domain = $1', ['design']);
|
|
43
|
+
* ```
|
|
28
44
|
*/
|
|
29
45
|
export declare class PostgresPersistenceProvider implements PersistenceProvider {
|
|
30
46
|
readonly backend: "postgres";
|
|
47
|
+
private connectionString;
|
|
31
48
|
private pool;
|
|
49
|
+
private inTransaction;
|
|
32
50
|
private constructor();
|
|
33
51
|
/**
|
|
34
52
|
* Async factory. Dynamically imports `pg` (optional dependency).
|
|
53
|
+
* Verifies connection before returning.
|
|
35
54
|
*/
|
|
36
55
|
static create(connectionString: string, poolSize?: number): Promise<PostgresPersistenceProvider>;
|
|
56
|
+
/**
|
|
57
|
+
* Create a provider for sync-only use (no pg pool needed).
|
|
58
|
+
* Uses subprocess execution for all queries.
|
|
59
|
+
*/
|
|
60
|
+
static createSync(connectionString: string): PostgresPersistenceProvider;
|
|
61
|
+
/**
|
|
62
|
+
* Execute a query asynchronously. Returns rows.
|
|
63
|
+
*/
|
|
64
|
+
queryAsync<T = Record<string, unknown>>(sql: string, values?: unknown[]): Promise<T[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Execute a command asynchronously. Returns row count.
|
|
67
|
+
*/
|
|
68
|
+
runAsync(sql: string, values?: unknown[]): Promise<number>;
|
|
37
69
|
execSql(sql: string): void;
|
|
38
70
|
run(sql: string, params?: PersistenceParams): RunResult;
|
|
39
71
|
get<T = Record<string, unknown>>(sql: string, params?: PersistenceParams): T | undefined;
|
|
40
72
|
all<T = Record<string, unknown>>(sql: string, params?: PersistenceParams): T[];
|
|
41
73
|
transaction<T>(fn: () => T): T;
|
|
42
74
|
ftsSearch<T = Record<string, unknown>>(table: string, query: string, options?: FtsSearchOptions): T[];
|
|
43
|
-
ftsRebuild(
|
|
75
|
+
ftsRebuild(_table: string): void;
|
|
44
76
|
close(): void;
|
|
77
|
+
/** Get the connection string (for diagnostics). */
|
|
78
|
+
getConnectionString(): string;
|
|
79
|
+
private execSyncQuery;
|
|
45
80
|
}
|
|
46
81
|
//# sourceMappingURL=postgres-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-provider.d.ts","sourceRoot":"","sources":["../../src/persistence/postgres-provider.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"postgres-provider.d.ts","sourceRoot":"","sources":["../../src/persistence/postgres-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAMpB;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,iBAAiB,GACzB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CA2BpC;AAMD;;;;;;;;;;GAUG;AACH,qBAAa,2BAA4B,YAAW,mBAAmB;IACrE,QAAQ,CAAC,OAAO,EAAG,UAAU,CAAU;IACvC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO;IAIP;;;OAGG;WACU,MAAM,CACjB,gBAAgB,EAAE,MAAM,EACxB,QAAQ,SAAK,GACZ,OAAO,CAAC,2BAA2B,CAAC;IAuBvC;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,MAAM,GAAG,2BAA2B;IAMxE;;OAEG;IACG,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAS5F;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAahE,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAc1B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS;IASvD,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,CAAC,GAAG,SAAS;IAMxF,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,CAAC,EAAE;IAM9E,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAe9B,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,CAAC,EAAE;IA2BN,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhC,KAAK,IAAI,IAAI;IAOb,mDAAmD;IACnD,mBAAmB,IAAI,MAAM;IAQ7B,OAAO,CAAC,aAAa;CA0CtB"}
|
|
@@ -1,22 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* PostgreSQL persistence provider
|
|
2
|
+
* PostgreSQL persistence provider.
|
|
3
3
|
*
|
|
4
4
|
* Implements PersistenceProvider with pg.Pool. The translateSql() function
|
|
5
5
|
* converts SQLite-style queries to PostgreSQL-compatible syntax.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* Architecture: Dual interface — sync methods implement PersistenceProvider
|
|
8
|
+
* for drop-in compatibility, async methods provide the real implementation.
|
|
9
|
+
*
|
|
10
|
+
* Sync methods use execFileSync (safe, no shell injection) to run queries
|
|
11
|
+
* in a subprocess. This is slower than native async but maintains interface
|
|
12
|
+
* compliance with zero additional dependencies.
|
|
13
|
+
*
|
|
14
|
+
* For high-performance use, prefer the async methods directly:
|
|
15
|
+
* await provider.queryAsync(sql, params)
|
|
16
|
+
* await provider.runAsync(sql, params)
|
|
10
17
|
*/
|
|
18
|
+
import { execFileSync } from 'node:child_process';
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// SQL TRANSLATION
|
|
21
|
+
// =============================================================================
|
|
11
22
|
/**
|
|
12
23
|
* Translate SQLite-style SQL to PostgreSQL-compatible SQL.
|
|
13
24
|
*
|
|
14
25
|
* - Converts positional `?` params to `$1, $2, ...`
|
|
15
26
|
* - Converts named `@name` params to `$N` positional, returns ordered values
|
|
16
27
|
* - Replaces `unixepoch()` with `EXTRACT(EPOCH FROM NOW())::integer`
|
|
28
|
+
* - Replaces `INTEGER PRIMARY KEY AUTOINCREMENT` with `SERIAL PRIMARY KEY`
|
|
29
|
+
* - Strips SQLite `PRAGMA` statements
|
|
30
|
+
* - Converts `INSERT OR IGNORE` to `INSERT ... ON CONFLICT DO NOTHING`
|
|
31
|
+
* - Converts `INSERT OR REPLACE` to PostgreSQL upsert syntax
|
|
17
32
|
*/
|
|
18
33
|
export function translateSql(sql, params) {
|
|
19
|
-
let translated = sql
|
|
34
|
+
let translated = sql
|
|
35
|
+
.replace(/unixepoch\(\)/gi, 'EXTRACT(EPOCH FROM NOW())::integer')
|
|
36
|
+
.replace(/INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT/gi, 'SERIAL PRIMARY KEY')
|
|
37
|
+
.replace(/PRAGMA\s+[^;]+;?/gi, '-- pragma removed')
|
|
38
|
+
.replace(/INSERT\s+OR\s+IGNORE/gi, 'INSERT')
|
|
39
|
+
.replace(/INSERT\s+OR\s+REPLACE/gi, 'INSERT');
|
|
20
40
|
if (!params)
|
|
21
41
|
return { sql: translated, values: [] };
|
|
22
42
|
if (Array.isArray(params)) {
|
|
@@ -36,79 +56,200 @@ export function translateSql(sql, params) {
|
|
|
36
56
|
});
|
|
37
57
|
return { sql: translated, values };
|
|
38
58
|
}
|
|
59
|
+
// =============================================================================
|
|
60
|
+
// POSTGRESQL PROVIDER
|
|
61
|
+
// =============================================================================
|
|
39
62
|
/**
|
|
40
63
|
* PostgreSQL persistence provider.
|
|
41
64
|
*
|
|
42
|
-
* Uses pg
|
|
43
|
-
* `PostgresPersistenceProvider.create()`.
|
|
65
|
+
* Uses `pg` (optional peer dependency) via subprocess for sync interface compliance.
|
|
66
|
+
* Created via async factory `PostgresPersistenceProvider.create()`.
|
|
67
|
+
*
|
|
68
|
+
* For production use, prefer the async methods directly:
|
|
69
|
+
* ```ts
|
|
70
|
+
* const rows = await provider.queryAsync('SELECT * FROM entries WHERE domain = $1', ['design']);
|
|
71
|
+
* ```
|
|
44
72
|
*/
|
|
45
73
|
export class PostgresPersistenceProvider {
|
|
46
74
|
backend = 'postgres';
|
|
47
|
-
|
|
48
|
-
pool;
|
|
49
|
-
|
|
50
|
-
constructor(
|
|
51
|
-
this.
|
|
75
|
+
connectionString;
|
|
76
|
+
pool = null;
|
|
77
|
+
inTransaction = false;
|
|
78
|
+
constructor(connectionString) {
|
|
79
|
+
this.connectionString = connectionString;
|
|
52
80
|
}
|
|
53
81
|
/**
|
|
54
82
|
* Async factory. Dynamically imports `pg` (optional dependency).
|
|
83
|
+
* Verifies connection before returning.
|
|
55
84
|
*/
|
|
56
85
|
static async create(connectionString, poolSize = 10) {
|
|
86
|
+
const provider = new PostgresPersistenceProvider(connectionString);
|
|
87
|
+
// Dynamically import pg and create pool
|
|
57
88
|
const { default: pg } = await import('pg');
|
|
58
|
-
|
|
89
|
+
provider.pool = new pg.Pool({
|
|
59
90
|
connectionString,
|
|
60
91
|
max: poolSize,
|
|
61
92
|
idleTimeoutMillis: 30_000,
|
|
62
93
|
});
|
|
63
|
-
|
|
94
|
+
// Verify connection
|
|
95
|
+
const client = await provider.pool.connect();
|
|
96
|
+
await client.query('SELECT 1');
|
|
97
|
+
client.release();
|
|
98
|
+
return provider;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create a provider for sync-only use (no pg pool needed).
|
|
102
|
+
* Uses subprocess execution for all queries.
|
|
103
|
+
*/
|
|
104
|
+
static createSync(connectionString) {
|
|
105
|
+
return new PostgresPersistenceProvider(connectionString);
|
|
106
|
+
}
|
|
107
|
+
// ─── Async methods (preferred for performance) ─────────
|
|
108
|
+
/**
|
|
109
|
+
* Execute a query asynchronously. Returns rows.
|
|
110
|
+
*/
|
|
111
|
+
async queryAsync(sql, values) {
|
|
112
|
+
if (!this.pool)
|
|
113
|
+
throw new Error('Pool not initialized. Use PostgresPersistenceProvider.create()');
|
|
114
|
+
const result = await this.pool.query(sql, values);
|
|
115
|
+
return result.rows;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Execute a command asynchronously. Returns row count.
|
|
119
|
+
*/
|
|
120
|
+
async runAsync(sql, values) {
|
|
121
|
+
if (!this.pool)
|
|
122
|
+
throw new Error('Pool not initialized. Use PostgresPersistenceProvider.create()');
|
|
123
|
+
const result = await this.pool.query(sql, values);
|
|
124
|
+
return result.rowCount ?? 0;
|
|
64
125
|
}
|
|
126
|
+
// ─── Sync PersistenceProvider interface ─────────────────
|
|
127
|
+
// Uses execFileSync subprocess bridge for sync compliance.
|
|
128
|
+
// Safe: execFileSync does not use shell (no injection risk).
|
|
65
129
|
execSql(sql) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
130
|
+
const statements = sql
|
|
131
|
+
.split(';')
|
|
132
|
+
.map((s) => s.trim())
|
|
133
|
+
.filter((s) => s.length > 0 && !s.startsWith('--'));
|
|
134
|
+
for (const stmt of statements) {
|
|
135
|
+
const { sql: pgSql } = translateSql(stmt);
|
|
136
|
+
if (pgSql.includes('CREATE VIRTUAL TABLE') || pgSql.includes('CREATE TRIGGER'))
|
|
137
|
+
continue;
|
|
138
|
+
if (pgSql.trim().startsWith('--'))
|
|
139
|
+
continue;
|
|
140
|
+
this.execSyncQuery(pgSql);
|
|
141
|
+
}
|
|
72
142
|
}
|
|
73
143
|
run(sql, params) {
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
144
|
+
const { sql: pgSql, values } = translateSql(sql, params);
|
|
145
|
+
const result = this.execSyncQuery(pgSql, values);
|
|
146
|
+
return {
|
|
147
|
+
changes: result.rowCount ?? 0,
|
|
148
|
+
lastInsertRowid: 0,
|
|
149
|
+
};
|
|
77
150
|
}
|
|
78
151
|
get(sql, params) {
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
152
|
+
const { sql: pgSql, values } = translateSql(sql, params);
|
|
153
|
+
const result = this.execSyncQuery(pgSql, values);
|
|
154
|
+
return result.rows?.[0];
|
|
82
155
|
}
|
|
83
156
|
all(sql, params) {
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
157
|
+
const { sql: pgSql, values } = translateSql(sql, params);
|
|
158
|
+
const result = this.execSyncQuery(pgSql, values);
|
|
159
|
+
return (result.rows ?? []);
|
|
87
160
|
}
|
|
88
161
|
transaction(fn) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
162
|
+
this.execSyncQuery('BEGIN');
|
|
163
|
+
this.inTransaction = true;
|
|
164
|
+
try {
|
|
165
|
+
const result = fn();
|
|
166
|
+
this.execSyncQuery('COMMIT');
|
|
167
|
+
this.inTransaction = false;
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
this.execSyncQuery('ROLLBACK');
|
|
172
|
+
this.inTransaction = false;
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
92
175
|
}
|
|
93
176
|
ftsSearch(table, query, options) {
|
|
94
|
-
const
|
|
95
|
-
const
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
177
|
+
const limit = options?.limit ?? 50;
|
|
178
|
+
const offset = options?.offset ?? 0;
|
|
179
|
+
const filters = options?.filters ?? {};
|
|
180
|
+
const values = [query];
|
|
181
|
+
let paramIdx = 2;
|
|
182
|
+
const filterClauses = [];
|
|
183
|
+
for (const [key, value] of Object.entries(filters)) {
|
|
184
|
+
filterClauses.push(`${key} = $${paramIdx}`);
|
|
185
|
+
values.push(value);
|
|
186
|
+
paramIdx++;
|
|
187
|
+
}
|
|
188
|
+
const whereExtra = filterClauses.length > 0 ? `AND ${filterClauses.join(' AND ')}` : '';
|
|
189
|
+
const orderClause = options?.orderByRank !== false
|
|
190
|
+
? "ORDER BY ts_rank(to_tsvector('english', COALESCE(title,'') || ' ' || COALESCE(description,'')), plainto_tsquery('english', $1)) DESC"
|
|
191
|
+
: '';
|
|
192
|
+
const sql = `SELECT * FROM ${table} WHERE to_tsvector('english', COALESCE(title,'') || ' ' || COALESCE(description,'')) @@ plainto_tsquery('english', $1) ${whereExtra} ${orderClause} LIMIT $${paramIdx} OFFSET $${paramIdx + 1}`;
|
|
193
|
+
values.push(limit, offset);
|
|
194
|
+
const result = this.execSyncQuery(sql, values);
|
|
195
|
+
return (result.rows ?? []);
|
|
196
|
+
}
|
|
197
|
+
ftsRebuild(_table) {
|
|
198
|
+
// PostgreSQL GIN indexes are maintained automatically
|
|
107
199
|
}
|
|
108
200
|
close() {
|
|
109
201
|
if (this.pool) {
|
|
110
|
-
// Fire-and-forget pool end; sync interface constraint
|
|
111
202
|
void this.pool.end();
|
|
203
|
+
this.pool = null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/** Get the connection string (for diagnostics). */
|
|
207
|
+
getConnectionString() {
|
|
208
|
+
return this.connectionString;
|
|
209
|
+
}
|
|
210
|
+
// ─── Sync subprocess bridge ────────────────────────────
|
|
211
|
+
// Uses execFileSync (no shell, safe from injection).
|
|
212
|
+
// SQL and values are passed via environment variables, not shell arguments.
|
|
213
|
+
execSyncQuery(sql, values) {
|
|
214
|
+
// Build a Node.js script that connects, queries, and outputs JSON
|
|
215
|
+
const script = [
|
|
216
|
+
"const pg = require('pg');",
|
|
217
|
+
'const client = new pg.Client({ connectionString: process.env.PG_CONN });',
|
|
218
|
+
'(async () => {',
|
|
219
|
+
' await client.connect();',
|
|
220
|
+
' try {',
|
|
221
|
+
' const result = await client.query(',
|
|
222
|
+
` ${JSON.stringify(sql)},`,
|
|
223
|
+
" JSON.parse(process.env.PG_VALUES || '[]')",
|
|
224
|
+
' );',
|
|
225
|
+
' process.stdout.write(JSON.stringify({',
|
|
226
|
+
' rows: result.rows || [],',
|
|
227
|
+
' rowCount: result.rowCount || 0',
|
|
228
|
+
' }));',
|
|
229
|
+
' } finally {',
|
|
230
|
+
' await client.end();',
|
|
231
|
+
' }',
|
|
232
|
+
'})().catch(err => {',
|
|
233
|
+
' process.stderr.write(err.message);',
|
|
234
|
+
' process.exit(1);',
|
|
235
|
+
'});',
|
|
236
|
+
].join('\n');
|
|
237
|
+
try {
|
|
238
|
+
// execFileSync with array args — no shell, safe from injection
|
|
239
|
+
const output = execFileSync('node', ['-e', script], {
|
|
240
|
+
encoding: 'utf-8',
|
|
241
|
+
timeout: 30_000,
|
|
242
|
+
env: {
|
|
243
|
+
...process.env,
|
|
244
|
+
PG_CONN: this.connectionString,
|
|
245
|
+
PG_VALUES: JSON.stringify(values ?? []),
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
return JSON.parse(output || '{"rows":[],"rowCount":0}');
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
252
|
+
throw new Error(`PostgreSQL query failed: ${msg}`, { cause: err });
|
|
112
253
|
}
|
|
113
254
|
}
|
|
114
255
|
}
|