@phigon/observer 8.0.2 → 8.2.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/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +376 -303
- package/THIRD_PARTY_NOTICES.md +610 -0
- package/dist/bin/guardian-runner-darwin-amd64 +0 -0
- package/dist/bin/guardian-runner-darwin-arm64 +0 -0
- package/dist/bin/guardian-runner-linux-amd64 +0 -0
- package/dist/bin/guardian-runner-linux-arm64 +0 -0
- package/dist/bin/guardian-runner-windows-amd64.exe +0 -0
- package/dist/bin/guardian-runner-windows-arm64.exe +0 -0
- package/dist/src/action-policy.d.ts +0 -0
- package/dist/src/action-policy.d.ts.map +1 -1
- package/dist/src/action-policy.js +4 -2
- package/dist/src/action-policy.js.map +1 -1
- package/dist/src/activity/adapters/claude.d.ts +0 -0
- package/dist/src/activity/adapters/claude.d.ts.map +1 -1
- package/dist/src/activity/adapters/claude.js +19 -1
- package/dist/src/activity/adapters/claude.js.map +1 -1
- package/dist/src/activity/adapters/cline-task.d.ts +7 -0
- package/dist/src/activity/adapters/cline-task.d.ts.map +1 -0
- package/dist/src/activity/adapters/cline-task.js +197 -0
- package/dist/src/activity/adapters/cline-task.js.map +1 -0
- package/dist/src/activity/adapters/cline.d.ts +3 -0
- package/dist/src/activity/adapters/cline.d.ts.map +1 -0
- package/dist/src/activity/adapters/cline.js +102 -0
- package/dist/src/activity/adapters/cline.js.map +1 -0
- package/dist/src/activity/adapters/codex.d.ts +0 -0
- package/dist/src/activity/adapters/codex.d.ts.map +1 -1
- package/dist/src/activity/adapters/codex.js +76 -0
- package/dist/src/activity/adapters/codex.js.map +1 -1
- package/dist/src/activity/adapters/copilot-chat.d.ts +3 -0
- package/dist/src/activity/adapters/copilot-chat.d.ts.map +1 -0
- package/dist/src/activity/adapters/copilot-chat.js +176 -0
- package/dist/src/activity/adapters/copilot-chat.js.map +1 -0
- package/dist/src/activity/adapters/copilot.d.ts +2 -1
- package/dist/src/activity/adapters/copilot.d.ts.map +1 -1
- package/dist/src/activity/adapters/copilot.js +173 -2
- package/dist/src/activity/adapters/copilot.js.map +1 -1
- package/dist/src/activity/adapters/cursor.d.ts +3 -0
- package/dist/src/activity/adapters/cursor.d.ts.map +1 -0
- package/dist/src/activity/adapters/cursor.js +86 -0
- package/dist/src/activity/adapters/cursor.js.map +1 -0
- package/dist/src/activity/adapters/factory-droid.d.ts +3 -0
- package/dist/src/activity/adapters/factory-droid.d.ts.map +1 -0
- package/dist/src/activity/adapters/factory-droid.js +126 -0
- package/dist/src/activity/adapters/factory-droid.js.map +1 -0
- package/dist/src/activity/adapters/gemini.d.ts +3 -0
- package/dist/src/activity/adapters/gemini.d.ts.map +1 -0
- package/dist/src/activity/adapters/gemini.js +177 -0
- package/dist/src/activity/adapters/gemini.js.map +1 -0
- package/dist/src/activity/adapters/generic.d.ts +0 -0
- package/dist/src/activity/adapters/generic.d.ts.map +0 -0
- package/dist/src/activity/adapters/generic.js +0 -0
- package/dist/src/activity/adapters/generic.js.map +0 -0
- package/dist/src/activity/adapters/goose.d.ts +3 -0
- package/dist/src/activity/adapters/goose.d.ts.map +1 -0
- package/dist/src/activity/adapters/goose.js +116 -0
- package/dist/src/activity/adapters/goose.js.map +1 -0
- package/dist/src/activity/adapters/hermes.d.ts +0 -0
- package/dist/src/activity/adapters/hermes.d.ts.map +0 -0
- package/dist/src/activity/adapters/hermes.js +0 -0
- package/dist/src/activity/adapters/hermes.js.map +0 -0
- package/dist/src/activity/adapters/kiro.d.ts +3 -0
- package/dist/src/activity/adapters/kiro.d.ts.map +1 -0
- package/dist/src/activity/adapters/kiro.js +47 -0
- package/dist/src/activity/adapters/kiro.js.map +1 -0
- package/dist/src/activity/adapters/openai-compatible.d.ts +0 -0
- package/dist/src/activity/adapters/openai-compatible.d.ts.map +0 -0
- package/dist/src/activity/adapters/openai-compatible.js +0 -0
- package/dist/src/activity/adapters/openai-compatible.js.map +0 -0
- package/dist/src/activity/adapters/openclaw.d.ts +0 -0
- package/dist/src/activity/adapters/openclaw.d.ts.map +0 -0
- package/dist/src/activity/adapters/openclaw.js +0 -0
- package/dist/src/activity/adapters/openclaw.js.map +0 -0
- package/dist/src/activity/adapters/opencode.d.ts +0 -0
- package/dist/src/activity/adapters/opencode.d.ts.map +1 -1
- package/dist/src/activity/adapters/opencode.js +108 -1
- package/dist/src/activity/adapters/opencode.js.map +1 -1
- package/dist/src/activity/adapters/zed.d.ts +3 -0
- package/dist/src/activity/adapters/zed.d.ts.map +1 -0
- package/dist/src/activity/adapters/zed.js +134 -0
- package/dist/src/activity/adapters/zed.js.map +1 -0
- package/dist/src/activity/bridges.d.ts +0 -0
- package/dist/src/activity/bridges.d.ts.map +0 -0
- package/dist/src/activity/bridges.js +0 -0
- package/dist/src/activity/bridges.js.map +0 -0
- package/dist/src/activity/collector.d.ts +12 -0
- package/dist/src/activity/collector.d.ts.map +1 -1
- package/dist/src/activity/collector.js +156 -3
- package/dist/src/activity/collector.js.map +1 -1
- package/dist/src/activity/goose-sqlite-source.d.ts +33 -0
- package/dist/src/activity/goose-sqlite-source.d.ts.map +1 -0
- package/dist/src/activity/goose-sqlite-source.js +274 -0
- package/dist/src/activity/goose-sqlite-source.js.map +1 -0
- package/dist/src/activity/index.d.ts +3 -0
- package/dist/src/activity/index.d.ts.map +1 -1
- package/dist/src/activity/index.js +3 -0
- package/dist/src/activity/index.js.map +1 -1
- package/dist/src/activity/ingest.d.ts +0 -0
- package/dist/src/activity/ingest.d.ts.map +1 -1
- package/dist/src/activity/ingest.js +2 -1
- package/dist/src/activity/ingest.js.map +1 -1
- package/dist/src/activity/json-document-source.d.ts +136 -0
- package/dist/src/activity/json-document-source.d.ts.map +1 -0
- package/dist/src/activity/json-document-source.js +569 -0
- package/dist/src/activity/json-document-source.js.map +1 -0
- package/dist/src/activity/native-capabilities.d.ts +0 -0
- package/dist/src/activity/native-capabilities.d.ts.map +0 -0
- package/dist/src/activity/native-capabilities.js +0 -0
- package/dist/src/activity/native-capabilities.js.map +0 -0
- package/dist/src/activity/normalize.d.ts +0 -0
- package/dist/src/activity/normalize.d.ts.map +1 -1
- package/dist/src/activity/normalize.js +64 -6
- package/dist/src/activity/normalize.js.map +1 -1
- package/dist/src/activity/opencode-message-tables.d.ts +87 -0
- package/dist/src/activity/opencode-message-tables.d.ts.map +1 -0
- package/dist/src/activity/opencode-message-tables.js +546 -0
- package/dist/src/activity/opencode-message-tables.js.map +1 -0
- package/dist/src/activity/opencode-sqlite-source.d.ts +7 -0
- package/dist/src/activity/opencode-sqlite-source.d.ts.map +1 -1
- package/dist/src/activity/opencode-sqlite-source.js +153 -63
- package/dist/src/activity/opencode-sqlite-source.js.map +1 -1
- package/dist/src/activity/policy.d.ts +0 -0
- package/dist/src/activity/policy.d.ts.map +1 -1
- package/dist/src/activity/policy.js +2 -13
- package/dist/src/activity/policy.js.map +1 -1
- package/dist/src/activity/record.d.ts +0 -0
- package/dist/src/activity/record.d.ts.map +0 -0
- package/dist/src/activity/record.js +0 -0
- package/dist/src/activity/record.js.map +0 -0
- package/dist/src/activity/source-reader.d.ts +16 -1
- package/dist/src/activity/source-reader.d.ts.map +1 -1
- package/dist/src/activity/source-reader.js +308 -29
- package/dist/src/activity/source-reader.js.map +1 -1
- package/dist/src/activity/sqlite-connections.d.ts +77 -0
- package/dist/src/activity/sqlite-connections.d.ts.map +1 -0
- package/dist/src/activity/sqlite-connections.js +220 -0
- package/dist/src/activity/sqlite-connections.js.map +1 -0
- package/dist/src/activity/types.d.ts +0 -0
- package/dist/src/activity/types.d.ts.map +0 -0
- package/dist/src/activity/types.js +0 -0
- package/dist/src/activity/types.js.map +0 -0
- package/dist/src/activity/zed-sqlite-source.d.ts +65 -0
- package/dist/src/activity/zed-sqlite-source.d.ts.map +1 -0
- package/dist/src/activity/zed-sqlite-source.js +547 -0
- package/dist/src/activity/zed-sqlite-source.js.map +1 -0
- package/dist/src/agent-action-executor.d.ts +14 -1
- package/dist/src/agent-action-executor.d.ts.map +1 -1
- package/dist/src/agent-action-executor.js +114 -57
- package/dist/src/agent-action-executor.js.map +1 -1
- package/dist/src/agentic-guardian.d.ts +0 -0
- package/dist/src/agentic-guardian.d.ts.map +1 -1
- package/dist/src/agentic-guardian.js +6 -5
- package/dist/src/agentic-guardian.js.map +1 -1
- package/dist/src/atomic-replace.d.ts +0 -0
- package/dist/src/atomic-replace.d.ts.map +0 -0
- package/dist/src/atomic-replace.js +0 -0
- package/dist/src/atomic-replace.js.map +0 -0
- package/dist/src/cli.d.ts +0 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +96 -13
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.d.ts +15 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +105 -4
- package/dist/src/config.js.map +1 -1
- package/dist/src/connection-config.d.ts +3 -0
- package/dist/src/connection-config.d.ts.map +1 -0
- package/dist/src/connection-config.js +29 -0
- package/dist/src/connection-config.js.map +1 -0
- package/dist/src/content-redaction.d.ts +3 -0
- package/dist/src/content-redaction.d.ts.map +1 -0
- package/dist/src/content-redaction.js +19 -0
- package/dist/src/content-redaction.js.map +1 -0
- package/dist/src/credential-store.d.ts +1 -0
- package/dist/src/credential-store.d.ts.map +1 -1
- package/dist/src/credential-store.js +13 -2
- package/dist/src/credential-store.js.map +1 -1
- package/dist/src/custom-agent-registry.d.ts +0 -0
- package/dist/src/custom-agent-registry.d.ts.map +1 -1
- package/dist/src/custom-agent-registry.js +2 -1
- package/dist/src/custom-agent-registry.js.map +1 -1
- package/dist/src/discovery/adapters/claude.d.ts +0 -0
- package/dist/src/discovery/adapters/claude.d.ts.map +0 -0
- package/dist/src/discovery/adapters/claude.js +0 -0
- package/dist/src/discovery/adapters/claude.js.map +0 -0
- package/dist/src/discovery/adapters/codex.d.ts +0 -0
- package/dist/src/discovery/adapters/codex.d.ts.map +0 -0
- package/dist/src/discovery/adapters/codex.js +0 -0
- package/dist/src/discovery/adapters/codex.js.map +0 -0
- package/dist/src/discovery/adapters/custom.d.ts +0 -0
- package/dist/src/discovery/adapters/custom.d.ts.map +0 -0
- package/dist/src/discovery/adapters/custom.js +0 -0
- package/dist/src/discovery/adapters/custom.js.map +0 -0
- package/dist/src/discovery/adapters/generic.d.ts +0 -0
- package/dist/src/discovery/adapters/generic.d.ts.map +1 -1
- package/dist/src/discovery/adapters/generic.js +160 -2
- package/dist/src/discovery/adapters/generic.js.map +1 -1
- package/dist/src/discovery/adapters/hermes.d.ts +0 -0
- package/dist/src/discovery/adapters/hermes.d.ts.map +0 -0
- package/dist/src/discovery/adapters/hermes.js +0 -0
- package/dist/src/discovery/adapters/hermes.js.map +0 -0
- package/dist/src/discovery/adapters/openclaw.d.ts +0 -0
- package/dist/src/discovery/adapters/openclaw.d.ts.map +0 -0
- package/dist/src/discovery/adapters/openclaw.js +0 -0
- package/dist/src/discovery/adapters/openclaw.js.map +0 -0
- package/dist/src/discovery/engine.d.ts +7 -1
- package/dist/src/discovery/engine.d.ts.map +1 -1
- package/dist/src/discovery/engine.js +20 -5
- package/dist/src/discovery/engine.js.map +1 -1
- package/dist/src/discovery/evidence.d.ts +0 -0
- package/dist/src/discovery/evidence.d.ts.map +0 -0
- package/dist/src/discovery/evidence.js +0 -0
- package/dist/src/discovery/evidence.js.map +0 -0
- package/dist/src/discovery/index.d.ts +0 -0
- package/dist/src/discovery/index.d.ts.map +0 -0
- package/dist/src/discovery/index.js +0 -0
- package/dist/src/discovery/index.js.map +0 -0
- package/dist/src/discovery/known-agent.d.ts +7 -0
- package/dist/src/discovery/known-agent.d.ts.map +1 -1
- package/dist/src/discovery/known-agent.js +9 -4
- package/dist/src/discovery/known-agent.js.map +1 -1
- package/dist/src/discovery/process-identity.d.ts +0 -0
- package/dist/src/discovery/process-identity.d.ts.map +0 -0
- package/dist/src/discovery/process-identity.js +0 -0
- package/dist/src/discovery/process-identity.js.map +0 -0
- package/dist/src/discovery/system-evidence.d.ts +40 -1
- package/dist/src/discovery/system-evidence.d.ts.map +1 -1
- package/dist/src/discovery/system-evidence.js +189 -16
- package/dist/src/discovery/system-evidence.js.map +1 -1
- package/dist/src/discovery/types.d.ts +0 -0
- package/dist/src/discovery/types.d.ts.map +0 -0
- package/dist/src/discovery/types.js +0 -0
- package/dist/src/discovery/types.js.map +0 -0
- package/dist/src/event-queue.d.ts +0 -0
- package/dist/src/event-queue.d.ts.map +1 -1
- package/dist/src/event-queue.js +88 -38
- package/dist/src/event-queue.js.map +1 -1
- package/dist/src/event-spool.d.ts +0 -0
- package/dist/src/event-spool.d.ts.map +1 -1
- package/dist/src/event-spool.js +58 -10
- package/dist/src/event-spool.js.map +1 -1
- package/dist/src/generated/phigon/v1/action_pb.d.ts +0 -0
- package/dist/src/generated/phigon/v1/action_pb.d.ts.map +1 -1
- package/dist/src/generated/phigon/v1/action_pb.js +1 -1
- package/dist/src/generated/phigon/v1/action_pb.js.map +1 -1
- package/dist/src/generated/phigon/v1/common_pb.d.ts +0 -0
- package/dist/src/generated/phigon/v1/common_pb.d.ts.map +1 -1
- package/dist/src/generated/phigon/v1/common_pb.js +1 -1
- package/dist/src/generated/phigon/v1/common_pb.js.map +1 -1
- package/dist/src/generated/phigon/v1/history_sync_pb.d.ts +0 -0
- package/dist/src/generated/phigon/v1/history_sync_pb.d.ts.map +1 -1
- package/dist/src/generated/phigon/v1/history_sync_pb.js +1 -1
- package/dist/src/generated/phigon/v1/history_sync_pb.js.map +1 -1
- package/dist/src/generated/phigon/v1/identity_pb.d.ts +0 -0
- package/dist/src/generated/phigon/v1/identity_pb.d.ts.map +1 -1
- package/dist/src/generated/phigon/v1/identity_pb.js +1 -1
- package/dist/src/generated/phigon/v1/identity_pb.js.map +1 -1
- package/dist/src/generated/phigon/v1/observer_service_pb.d.ts +0 -0
- package/dist/src/generated/phigon/v1/observer_service_pb.d.ts.map +1 -1
- package/dist/src/generated/phigon/v1/observer_service_pb.js +1 -1
- package/dist/src/generated/phigon/v1/observer_service_pb.js.map +1 -1
- package/dist/src/generated/phigon/v1/policy_pb.d.ts +0 -0
- package/dist/src/generated/phigon/v1/policy_pb.d.ts.map +1 -1
- package/dist/src/generated/phigon/v1/policy_pb.js +1 -1
- package/dist/src/generated/phigon/v1/policy_pb.js.map +1 -1
- package/dist/src/generated/phigon/v1/supervision_pb.d.ts +0 -0
- package/dist/src/generated/phigon/v1/supervision_pb.d.ts.map +1 -1
- package/dist/src/generated/phigon/v1/supervision_pb.js +1 -1
- package/dist/src/generated/phigon/v1/supervision_pb.js.map +1 -1
- package/dist/src/generated/phigon/v1/telemetry_pb.d.ts +0 -0
- package/dist/src/generated/phigon/v1/telemetry_pb.d.ts.map +1 -1
- package/dist/src/generated/phigon/v1/telemetry_pb.js +1 -1
- package/dist/src/generated/phigon/v1/telemetry_pb.js.map +1 -1
- package/dist/src/guardian-containment.d.ts +2 -6
- package/dist/src/guardian-containment.d.ts.map +1 -1
- package/dist/src/guardian-containment.js +12 -63
- package/dist/src/guardian-containment.js.map +1 -1
- package/dist/src/guardian-decision-journal.d.ts +0 -0
- package/dist/src/guardian-decision-journal.d.ts.map +1 -1
- package/dist/src/guardian-decision-journal.js +2 -1
- package/dist/src/guardian-decision-journal.js.map +1 -1
- package/dist/src/guardian-execution-manifest.d.ts +0 -0
- package/dist/src/guardian-execution-manifest.d.ts.map +0 -0
- package/dist/src/guardian-execution-manifest.js +0 -0
- package/dist/src/guardian-execution-manifest.js.map +0 -0
- package/dist/src/guardian-hosted-client.d.ts +0 -0
- package/dist/src/guardian-hosted-client.d.ts.map +0 -0
- package/dist/src/guardian-hosted-client.js +0 -0
- package/dist/src/guardian-hosted-client.js.map +0 -0
- package/dist/src/guardian-managed-exec.d.ts +0 -0
- package/dist/src/guardian-managed-exec.d.ts.map +1 -1
- package/dist/src/guardian-managed-exec.js +2 -1
- package/dist/src/guardian-managed-exec.js.map +1 -1
- package/dist/src/guardian-model-bridge.d.ts +0 -0
- package/dist/src/guardian-model-bridge.d.ts.map +1 -1
- package/dist/src/guardian-model-bridge.js +2 -1
- package/dist/src/guardian-model-bridge.js.map +1 -1
- package/dist/src/guardian-native.d.ts +0 -1
- package/dist/src/guardian-native.d.ts.map +1 -1
- package/dist/src/guardian-native.js +0 -6
- package/dist/src/guardian-native.js.map +1 -1
- package/dist/src/guardian-process-monitor.d.ts +6 -1
- package/dist/src/guardian-process-monitor.d.ts.map +1 -1
- package/dist/src/guardian-process-monitor.js +64 -8
- package/dist/src/guardian-process-monitor.js.map +1 -1
- package/dist/src/health.d.ts +0 -0
- package/dist/src/health.d.ts.map +0 -0
- package/dist/src/health.js +0 -0
- package/dist/src/health.js.map +0 -0
- package/dist/src/historical-identity-store.d.ts +0 -0
- package/dist/src/historical-identity-store.d.ts.map +1 -1
- package/dist/src/historical-identity-store.js +2 -1
- package/dist/src/historical-identity-store.js.map +1 -1
- package/dist/src/index.d.ts +0 -0
- package/dist/src/index.d.ts.map +0 -0
- package/dist/src/index.js +0 -0
- package/dist/src/index.js.map +0 -0
- package/dist/src/installation.d.ts +0 -0
- package/dist/src/installation.d.ts.map +1 -1
- package/dist/src/installation.js +3 -2
- package/dist/src/installation.js.map +1 -1
- package/dist/src/machine-command-executor.d.ts +26 -7
- package/dist/src/machine-command-executor.d.ts.map +1 -1
- package/dist/src/machine-command-executor.js +123 -21
- package/dist/src/machine-command-executor.js.map +1 -1
- package/dist/src/pair.d.ts +0 -0
- package/dist/src/pair.d.ts.map +1 -1
- package/dist/src/pair.js +13 -3
- package/dist/src/pair.js.map +1 -1
- package/dist/src/private-directory.d.ts +4 -0
- package/dist/src/private-directory.d.ts.map +1 -0
- package/dist/src/private-directory.js +35 -0
- package/dist/src/private-directory.js.map +1 -0
- package/dist/src/process-tree.d.ts +73 -0
- package/dist/src/process-tree.d.ts.map +1 -0
- package/dist/src/process-tree.js +256 -0
- package/dist/src/process-tree.js.map +1 -0
- package/dist/src/remove-machine.d.ts +0 -0
- package/dist/src/remove-machine.d.ts.map +0 -0
- package/dist/src/remove-machine.js +0 -0
- package/dist/src/remove-machine.js.map +0 -0
- package/dist/src/server-authority.d.ts +26 -0
- package/dist/src/server-authority.d.ts.map +1 -0
- package/dist/src/server-authority.js +102 -0
- package/dist/src/server-authority.js.map +1 -0
- package/dist/src/stream-client.d.ts +6 -2
- package/dist/src/stream-client.d.ts.map +1 -1
- package/dist/src/stream-client.js +95 -16
- package/dist/src/stream-client.js.map +1 -1
- package/dist/src/stream-state.d.ts +0 -0
- package/dist/src/stream-state.d.ts.map +1 -1
- package/dist/src/stream-state.js +2 -1
- package/dist/src/stream-state.js.map +1 -1
- package/dist/src/system-inspection.d.ts +78 -0
- package/dist/src/system-inspection.d.ts.map +1 -0
- package/dist/src/system-inspection.js +281 -0
- package/dist/src/system-inspection.js.map +1 -0
- package/dist/src/update.d.ts +15 -0
- package/dist/src/update.d.ts.map +1 -0
- package/dist/src/update.js +93 -0
- package/dist/src/update.js.map +1 -0
- package/dist/src/user-notices.d.ts +53 -0
- package/dist/src/user-notices.d.ts.map +1 -0
- package/dist/src/user-notices.js +117 -0
- package/dist/src/user-notices.js.map +1 -0
- package/package.json +83 -78
- package/scripts/install.mjs +306 -306
- package/scripts/managed-service.mjs +0 -0
- package/scripts/verify-guardian-release.mjs +0 -0
- package/scripts/windows-app-control.mjs +0 -0
- package/dist/src/windows-process.d.ts +0 -7
- package/dist/src/windows-process.d.ts.map +0 -1
- package/dist/src/windows-process.js +0 -18
- package/dist/src/windows-process.js.map +0 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Stats } from "node:fs";
|
|
2
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
3
|
+
/**
|
|
4
|
+
* Sizes and times of a database and its write-ahead log. A commit changes at
|
|
5
|
+
* least the log's time, so an unchanged signature means nothing new landed.
|
|
6
|
+
*/
|
|
7
|
+
export declare function databaseSignature(path: string, main: Pick<Stats, "size" | "mtimeMs">): Promise<string>;
|
|
8
|
+
/**
|
|
9
|
+
* Databases a history import already read to the end, by signature. A batch
|
|
10
|
+
* that completes with nothing new marks its database; later batches skip it
|
|
11
|
+
* until a commit changes the signature. New work after that point is the
|
|
12
|
+
* live reader's, so this only spares re-reading finished history.
|
|
13
|
+
*/
|
|
14
|
+
export type CompletedHistory = Map<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* The cursors an idle scan read, in order, with the values it found (or
|
|
17
|
+
* undefined). An idle scan selected no row, so it changed no cursor.
|
|
18
|
+
*/
|
|
19
|
+
export type IdleCursors = ReadonlyArray<readonly [string, number | undefined]>;
|
|
20
|
+
/** What a live reader does with a database on this tick. */
|
|
21
|
+
export type SQLiteScan = Readonly<{
|
|
22
|
+
unchanged: true;
|
|
23
|
+
}> | Readonly<{
|
|
24
|
+
unchanged: false;
|
|
25
|
+
database: DatabaseSync;
|
|
26
|
+
/**
|
|
27
|
+
* Record a successful scan; `idle` when it selected no row. `recheckAt`
|
|
28
|
+
* is when a scan of the same data would find something new (a row it
|
|
29
|
+
* waits for has settled), so the idle state expires then.
|
|
30
|
+
*/
|
|
31
|
+
finish(idle: IdleCursors | undefined, recheckAt?: number): void;
|
|
32
|
+
/** Drop the connection after a failed scan. */
|
|
33
|
+
fail(): void;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Decides, for a live reader, when a database has to be scanned, keyed by
|
|
37
|
+
* source root.
|
|
38
|
+
*
|
|
39
|
+
* While the database is active a read-only connection stays open, and
|
|
40
|
+
* `PRAGMA data_version` proves it unchanged: SQLite changes that value on
|
|
41
|
+
* the same connection whenever any other connection commits, even a WAL
|
|
42
|
+
* commit that leaves every file size and timestamp as they were.
|
|
43
|
+
*
|
|
44
|
+
* After `idleCloseMs` without a change the connection is closed, because
|
|
45
|
+
* an open SQLite file on Windows cannot be deleted or replaced by the user or
|
|
46
|
+
* the agent. While closed, each tick compares the main and -wal file sizes
|
|
47
|
+
* and modification times. A difference reopens the database for a full scan.
|
|
48
|
+
* Because a commit can leave them unchanged (after a WAL restart within one
|
|
49
|
+
* timestamp tick), a full scan also runs at least every `recheckMs`.
|
|
50
|
+
*
|
|
51
|
+
* A scan is skipped only when the last full scan selected no row and every
|
|
52
|
+
* cursor it read still holds the same value, so a full scan would again find
|
|
53
|
+
* nothing. A scan that waits for a row to settle sets when that happens, and
|
|
54
|
+
* its idle state expires then. Statements finish within a scan (node:sqlite resets each one), so
|
|
55
|
+
* no read transaction stays open between ticks to hold back checkpoints.
|
|
56
|
+
*/
|
|
57
|
+
export declare class SQLiteConnections {
|
|
58
|
+
#private;
|
|
59
|
+
constructor(options?: Readonly<{
|
|
60
|
+
clock?: () => number;
|
|
61
|
+
idleCloseMs?: number;
|
|
62
|
+
recheckMs?: number;
|
|
63
|
+
}>);
|
|
64
|
+
/**
|
|
65
|
+
* Whether the database at `path` (resolved from `root`, with `metadata`
|
|
66
|
+
* from the same tick) must be scanned, and the connection to scan it with.
|
|
67
|
+
*/
|
|
68
|
+
check(root: string, path: string, metadata: Stats, cursors: ReadonlyMap<string, number>, open: (path: string) => DatabaseSync): Promise<SQLiteScan>;
|
|
69
|
+
release(root: string): void;
|
|
70
|
+
/** Forget the databases of roots that are no longer configured. */
|
|
71
|
+
retain(roots: ReadonlySet<string>): void;
|
|
72
|
+
closeAll(): void;
|
|
73
|
+
/** How many connections are open now. */
|
|
74
|
+
get openConnections(): number;
|
|
75
|
+
}
|
|
76
|
+
export declare function dataVersion(database: DatabaseSync): number;
|
|
77
|
+
//# sourceMappingURL=sqlite-connections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-connections.d.ts","sourceRoot":"","sources":["../../../src/activity/sqlite-connections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAS5G;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEnD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAE/E,4DAA4D;AAC5D,MAAM,MAAM,UAAU,GAClB,QAAQ,CAAC;IAAE,SAAS,EAAE,IAAI,CAAA;CAAE,CAAC,GAC7B,QAAQ,CAAC;IACT,SAAS,EAAE,KAAK,CAAC;IACjB,QAAQ,EAAE,YAAY,CAAC;IACvB;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChE,+CAA+C;IAC/C,IAAI,IAAI,IAAI,CAAC;CACd,CAAC,CAAC;AAyBL;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,iBAAiB;;gBAO1B,OAAO,GAAE,QAAQ,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAM;IAOT;;;OAGG;IACG,KAAK,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,KAAK,EACf,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,GACnC,OAAO,CAAC,UAAU,CAAC;IA8EtB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO3B,mEAAmE;IACnE,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;IAMxC,QAAQ,IAAI,IAAI;IAIhB,yCAAyC;IACzC,IAAI,eAAe,IAAI,MAAM,CAM5B;CAQF;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAM1D"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { stat } from "node:fs/promises";
|
|
2
|
+
/**
|
|
3
|
+
* Sizes and times of a database and its write-ahead log. A commit changes at
|
|
4
|
+
* least the log's time, so an unchanged signature means nothing new landed.
|
|
5
|
+
*/
|
|
6
|
+
export async function databaseSignature(path, main) {
|
|
7
|
+
let log = "-";
|
|
8
|
+
try {
|
|
9
|
+
const wal = await stat(`${path}-wal`);
|
|
10
|
+
log = `${wal.size}:${wal.mtimeMs}`;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// No write-ahead log: the main file's size and time cover every commit.
|
|
14
|
+
}
|
|
15
|
+
return `${main.size}:${main.mtimeMs}:${log}`;
|
|
16
|
+
}
|
|
17
|
+
const unchanged = Object.freeze({ unchanged: true });
|
|
18
|
+
/**
|
|
19
|
+
* Decides, for a live reader, when a database has to be scanned, keyed by
|
|
20
|
+
* source root.
|
|
21
|
+
*
|
|
22
|
+
* While the database is active a read-only connection stays open, and
|
|
23
|
+
* `PRAGMA data_version` proves it unchanged: SQLite changes that value on
|
|
24
|
+
* the same connection whenever any other connection commits, even a WAL
|
|
25
|
+
* commit that leaves every file size and timestamp as they were.
|
|
26
|
+
*
|
|
27
|
+
* After `idleCloseMs` without a change the connection is closed, because
|
|
28
|
+
* an open SQLite file on Windows cannot be deleted or replaced by the user or
|
|
29
|
+
* the agent. While closed, each tick compares the main and -wal file sizes
|
|
30
|
+
* and modification times. A difference reopens the database for a full scan.
|
|
31
|
+
* Because a commit can leave them unchanged (after a WAL restart within one
|
|
32
|
+
* timestamp tick), a full scan also runs at least every `recheckMs`.
|
|
33
|
+
*
|
|
34
|
+
* A scan is skipped only when the last full scan selected no row and every
|
|
35
|
+
* cursor it read still holds the same value, so a full scan would again find
|
|
36
|
+
* nothing. A scan that waits for a row to settle sets when that happens, and
|
|
37
|
+
* its idle state expires then. Statements finish within a scan (node:sqlite resets each one), so
|
|
38
|
+
* no read transaction stays open between ticks to hold back checkpoints.
|
|
39
|
+
*/
|
|
40
|
+
export class SQLiteConnections {
|
|
41
|
+
#states = new Map();
|
|
42
|
+
#clock;
|
|
43
|
+
#idleCloseMs;
|
|
44
|
+
#recheckMs;
|
|
45
|
+
constructor(options = {}) {
|
|
46
|
+
this.#clock = options.clock ?? Date.now;
|
|
47
|
+
this.#idleCloseMs = options.idleCloseMs ?? 60_000;
|
|
48
|
+
this.#recheckMs = options.recheckMs ?? 60_000;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Whether the database at `path` (resolved from `root`, with `metadata`
|
|
52
|
+
* from the same tick) must be scanned, and the connection to scan it with.
|
|
53
|
+
*/
|
|
54
|
+
async check(root, path, metadata, cursors, open) {
|
|
55
|
+
const identity = databaseIdentity(path, metadata);
|
|
56
|
+
// Read before data_version or any scan query, so whatever this tick
|
|
57
|
+
// cannot see changes the signature or version the next tick reads.
|
|
58
|
+
const signature = await fileSignature(path, metadata);
|
|
59
|
+
let state = this.#states.get(root);
|
|
60
|
+
if (state !== undefined && state.identity !== identity) {
|
|
61
|
+
this.release(root);
|
|
62
|
+
state = undefined;
|
|
63
|
+
}
|
|
64
|
+
const now = this.#clock();
|
|
65
|
+
if (state === undefined) {
|
|
66
|
+
state = {
|
|
67
|
+
identity,
|
|
68
|
+
connection: undefined,
|
|
69
|
+
version: undefined,
|
|
70
|
+
changedAt: now,
|
|
71
|
+
signature,
|
|
72
|
+
checkedAt: now,
|
|
73
|
+
idle: undefined,
|
|
74
|
+
};
|
|
75
|
+
this.#states.set(root, state);
|
|
76
|
+
}
|
|
77
|
+
if (state.connection === undefined) {
|
|
78
|
+
if (state.idle !== undefined &&
|
|
79
|
+
state.signature === signature &&
|
|
80
|
+
now - state.checkedAt < this.#recheckMs &&
|
|
81
|
+
unexpired(state.idle, now) &&
|
|
82
|
+
sameCursors(state.idle.cursors, cursors)) {
|
|
83
|
+
return unchanged;
|
|
84
|
+
}
|
|
85
|
+
// The files changed, the periodic full scan is due, or there is no
|
|
86
|
+
// idle scan to compare with. A new connection has its own versions.
|
|
87
|
+
if (state.signature !== signature)
|
|
88
|
+
state.changedAt = now;
|
|
89
|
+
state.idle = undefined;
|
|
90
|
+
state.version = undefined;
|
|
91
|
+
state.connection = open(path);
|
|
92
|
+
}
|
|
93
|
+
state.signature = signature;
|
|
94
|
+
const current = state;
|
|
95
|
+
const database = state.connection;
|
|
96
|
+
let version;
|
|
97
|
+
try {
|
|
98
|
+
version = dataVersion(database);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
this.release(root);
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
if (current.version !== undefined && current.version !== version) {
|
|
105
|
+
current.changedAt = now;
|
|
106
|
+
}
|
|
107
|
+
current.version = version;
|
|
108
|
+
if (current.idle !== undefined &&
|
|
109
|
+
current.idle.version === version &&
|
|
110
|
+
unexpired(current.idle, now) &&
|
|
111
|
+
sameCursors(current.idle.cursors, cursors)) {
|
|
112
|
+
if (now - current.changedAt >= this.#idleCloseMs)
|
|
113
|
+
this.#close(current, now);
|
|
114
|
+
return unchanged;
|
|
115
|
+
}
|
|
116
|
+
current.idle = undefined;
|
|
117
|
+
return {
|
|
118
|
+
unchanged: false,
|
|
119
|
+
database,
|
|
120
|
+
finish: (idle, recheckAt) => {
|
|
121
|
+
if (this.#states.get(root) !== current)
|
|
122
|
+
return;
|
|
123
|
+
if (idle !== undefined)
|
|
124
|
+
current.idle = { version, cursors: idle, until: recheckAt };
|
|
125
|
+
if (now - current.changedAt >= this.#idleCloseMs)
|
|
126
|
+
this.#close(current, now);
|
|
127
|
+
},
|
|
128
|
+
fail: () => {
|
|
129
|
+
if (this.#states.get(root) === current)
|
|
130
|
+
this.release(root);
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
release(root) {
|
|
135
|
+
const state = this.#states.get(root);
|
|
136
|
+
if (state === undefined)
|
|
137
|
+
return;
|
|
138
|
+
this.#states.delete(root);
|
|
139
|
+
if (state.connection !== undefined)
|
|
140
|
+
closeQuietly(state.connection);
|
|
141
|
+
}
|
|
142
|
+
/** Forget the databases of roots that are no longer configured. */
|
|
143
|
+
retain(roots) {
|
|
144
|
+
for (const root of [...this.#states.keys()]) {
|
|
145
|
+
if (!roots.has(root))
|
|
146
|
+
this.release(root);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
closeAll() {
|
|
150
|
+
for (const root of [...this.#states.keys()])
|
|
151
|
+
this.release(root);
|
|
152
|
+
}
|
|
153
|
+
/** How many connections are open now. */
|
|
154
|
+
get openConnections() {
|
|
155
|
+
let open = 0;
|
|
156
|
+
for (const state of this.#states.values()) {
|
|
157
|
+
if (state.connection !== undefined)
|
|
158
|
+
open++;
|
|
159
|
+
}
|
|
160
|
+
return open;
|
|
161
|
+
}
|
|
162
|
+
#close(state, now) {
|
|
163
|
+
if (state.connection !== undefined)
|
|
164
|
+
closeQuietly(state.connection);
|
|
165
|
+
state.connection = undefined;
|
|
166
|
+
state.version = undefined;
|
|
167
|
+
state.checkedAt = now;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
export function dataVersion(database) {
|
|
171
|
+
const value = database.prepare("PRAGMA data_version").get()?.["data_version"];
|
|
172
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value)) {
|
|
173
|
+
throw new Error("SQLite data version is unavailable.");
|
|
174
|
+
}
|
|
175
|
+
return value;
|
|
176
|
+
}
|
|
177
|
+
function databaseIdentity(path, metadata) {
|
|
178
|
+
return [path, metadata.dev, metadata.ino, metadata.birthtimeMs].join("\u0000");
|
|
179
|
+
}
|
|
180
|
+
let unreadableWal = 0;
|
|
181
|
+
async function fileSignature(path, main) {
|
|
182
|
+
let wal;
|
|
183
|
+
try {
|
|
184
|
+
const metadata = await stat(`${path}-wal`);
|
|
185
|
+
wal = [metadata.size, metadata.mtimeMs, metadata.ino].join(":");
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
// No -wal file: a rollback-journal database, or WAL after the last
|
|
189
|
+
// writer closed. Any other failure counts as a change.
|
|
190
|
+
wal = error instanceof Error && "code" in error && error.code === "ENOENT"
|
|
191
|
+
? "none"
|
|
192
|
+
: `unreadable:${++unreadableWal}`;
|
|
193
|
+
}
|
|
194
|
+
return `${main.size}:${main.mtimeMs}\u0000${wal}`;
|
|
195
|
+
}
|
|
196
|
+
/** True until the idle state's expiry, if it has one. */
|
|
197
|
+
function unexpired(idle, now) {
|
|
198
|
+
return idle.until === undefined || now < idle.until;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* True when every cursor still holds the value the idle scan saw. They are
|
|
202
|
+
* read in the scan's order, so least-recently-used bookkeeping matches the
|
|
203
|
+
* scan this replaces.
|
|
204
|
+
*/
|
|
205
|
+
function sameCursors(idle, cursors) {
|
|
206
|
+
for (const [key, value] of idle) {
|
|
207
|
+
if (cursors.get(key) !== value)
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
function closeQuietly(database) {
|
|
213
|
+
try {
|
|
214
|
+
database.close();
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// Already closed.
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=sqlite-connections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-connections.js","sourceRoot":"","sources":["../../../src/activity/sqlite-connections.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { SourceRecord } from "./source-reader.js";
|
|
2
|
+
import { type CompletedHistory, type SQLiteConnections } from "./sqlite-connections.js";
|
|
3
|
+
type ScanOptions = Readonly<{
|
|
4
|
+
adapterId: string;
|
|
5
|
+
roots: readonly string[];
|
|
6
|
+
cursors: Map<string, number>;
|
|
7
|
+
initialScan: boolean;
|
|
8
|
+
replayOnFirstStart: boolean;
|
|
9
|
+
/** Newest threads replayed on a first live start. */
|
|
10
|
+
replaySessions: number;
|
|
11
|
+
maxReplayRecords: number;
|
|
12
|
+
maxRecords: number;
|
|
13
|
+
historical: boolean;
|
|
14
|
+
/** Connections a live reader keeps open between scans. */
|
|
15
|
+
connections?: SQLiteConnections;
|
|
16
|
+
/** History only: databases already read to the end. */
|
|
17
|
+
completedHistory?: CompletedHistory;
|
|
18
|
+
}>;
|
|
19
|
+
type ScanResult = Readonly<{
|
|
20
|
+
records: readonly SourceRecord[];
|
|
21
|
+
files: number;
|
|
22
|
+
malformed: number;
|
|
23
|
+
oversized: number;
|
|
24
|
+
complete: boolean;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* One delivered unit of a Zed thread: a user prompt, one block of an agent
|
|
28
|
+
* reply (text, thinking or a tool call) or one tool result. `complete` is
|
|
29
|
+
* false for a tool call whose input was still streaming when Zed saved.
|
|
30
|
+
*/
|
|
31
|
+
export type ZedThreadItem = Readonly<{
|
|
32
|
+
id: string;
|
|
33
|
+
complete: boolean;
|
|
34
|
+
value: Readonly<Record<string, unknown>>;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Zed's agent panel keeps every thread in one SQLite database,
|
|
38
|
+
* `<data dir>/threads/threads.db`: one `threads` row per thread whose `data`
|
|
39
|
+
* is the whole thread as JSON, zstd-compressed (`data_type` "zstd") or plain
|
|
40
|
+
* ("json"), rewritten on every save. Each thread is split into items (see
|
|
41
|
+
* zedThreadItems) and a per-thread cursor remembers how many were delivered
|
|
42
|
+
* and the last one's id, so only items added since are emitted. A thread
|
|
43
|
+
* whose `updated_at` and size are unchanged is not decompressed again.
|
|
44
|
+
* Messages carry no times of their own; items take the thread's save time.
|
|
45
|
+
*/
|
|
46
|
+
export declare function scanZedSQLiteSources(options: ScanOptions): Promise<ScanResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Splits a saved Zed thread into items, in order. Zed's own format
|
|
49
|
+
* (version 0.3.0) stores `messages` as tagged values: `{ User: { id,
|
|
50
|
+
* content } }`, `{ Agent: { content, tool_results } }`, `"Resume"` and
|
|
51
|
+
* `{ Compaction: ... }`. A user message becomes one item; each Text,
|
|
52
|
+
* Thinking or ToolUse block of an agent message becomes one, followed by
|
|
53
|
+
* one per tool result. Older threads from Zed's first agent store messages
|
|
54
|
+
* as `{ id, role, segments, tool_uses, tool_results }` and are read into the
|
|
55
|
+
* same items.
|
|
56
|
+
*
|
|
57
|
+
* Item ids are stable across saves: they hang off the id of the user
|
|
58
|
+
* message that started the turn, so a turn rewound and sent again gets new
|
|
59
|
+
* ids. Large payloads are left out: images, the full text of mentioned files
|
|
60
|
+
* and Zed's debugging copy of tool output. Returns undefined when the
|
|
61
|
+
* document holds no message list.
|
|
62
|
+
*/
|
|
63
|
+
export declare function zedThreadItems(document: unknown): readonly ZedThreadItem[] | undefined;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=zed-sqlite-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zed-sqlite-source.d.ts","sourceRoot":"","sources":["../../../src/activity/zed-sqlite-source.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,KAAK,gBAAgB,EAAuC,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAY7H,KAAK,WAAW,GAAG,QAAQ,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC,CAAC,CAAC;AAEH,KAAK,UAAU,GAAG,QAAQ,CAAC;IACzB,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC,CAAC;AAIH;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1C,CAAC,CAAC;AAEH;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAuBrB;AA+ND;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,OAAO,GAChB,SAAS,aAAa,EAAE,GAAG,SAAS,CA2CtC"}
|