@pyric/cli 0.1.0-alpha.11 → 0.1.0-alpha.12
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/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
- package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use.js +2 -2
- package/dist/conformance/.generated/can-i-use.js.map +1 -1
- package/dist/serve/docs-ui/docs/_rhythm/index.html +1 -1
- package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +1 -1
- package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +1 -1
- package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +1 -1
- package/dist/serve/docs-ui/docs/ai-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/api-reference/index.html +2 -2
- package/dist/serve/docs-ui/docs/api-reference.md +1 -1
- package/dist/serve/docs-ui/docs/app-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/auth-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/build/ai-logic/index.html +1 -1
- package/dist/serve/docs-ui/docs/build/authentication/index.html +1 -1
- package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +1 -1
- package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +1 -1
- package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +1 -1
- package/dist/serve/docs-ui/docs/build/realtime-database/index.html +1 -1
- package/dist/serve/docs-ui/docs/conformance-scores/index.html +1 -1
- package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/database-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/firestore-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +1 -1
- package/dist/serve/docs-ui/docs/get-started/start-building/index.html +1 -1
- package/dist/serve/docs-ui/docs/index.json +200 -25
- package/dist/serve/docs-ui/docs/messaging-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +1 -1
- package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +1 -1
- package/dist/serve/docs-ui/docs/overview/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-admin-messaging-reference-api/index.html +916 -0
- package/dist/serve/docs-ui/docs/pyric-admin-messaging-reference-api.md +706 -0
- package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ai-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-auth-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api/index.html +131 -66
- package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api.md +130 -65
- package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-firestore-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-rules-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api/index.html +37 -14
- package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api.md +28 -8
- package/dist/serve/docs-ui/docs/pyric-storage-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/rules-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
- package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +1 -1
- package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +1 -1
- package/dist/serve/docs-ui/docs/storage-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
- package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
- package/dist/serve/docs-ui/llms.txt +1 -1
- package/dist/serve/worker/host/core.js +1 -1
- package/dist/serve/worker/host/core.js.map +1 -1
- package/dist/serve/worker/host/firestore-writes.d.ts.map +1 -1
- package/dist/serve/worker/host/firestore-writes.js +3 -2
- package/dist/serve/worker/host/firestore-writes.js.map +1 -1
- package/dist/serve/worker/index.d.ts +2 -1
- package/dist/serve/worker/index.d.ts.map +1 -1
- package/dist/serve/worker/index.js +2 -1
- package/dist/serve/worker/index.js.map +1 -1
- package/dist/serve/worker/protocol.js +2 -2
- package/dist/serve/worker/protocol.js.map +1 -1
- package/package.json +5 -4
- package/src/assurance/.generated/conformance-verdicts.ts +1090 -0
- package/src/assurance/attachment.ts +211 -0
- package/src/assurance/browser.ts +80 -0
- package/src/assurance/campaign.ts +496 -0
- package/src/assurance/capabilities.ts +446 -0
- package/src/assurance/cases.ts +43 -0
- package/src/assurance/index.ts +75 -0
- package/src/assurance/runner.ts +885 -0
- package/src/assurance/tool-names.ts +15 -0
- package/src/assurance/tools.ts +830 -0
- package/src/assurance/types.ts +352 -0
- package/src/assurance/validation.ts +434 -0
- package/src/bridge/client/bridge.ts +550 -0
- package/src/bridge/client/dispatch.ts +137 -0
- package/src/bridge/client.ts +45 -0
- package/src/bridge/protocol.ts +351 -0
- package/src/bridge/server/audit.ts +53 -0
- package/src/bridge/server/bridge.ts +597 -0
- package/src/bridge/server/headless.ts +160 -0
- package/src/bridge/server/json-schema-to-zod.ts +108 -0
- package/src/bridge/server/local-bridge.ts +66 -0
- package/src/bridge/server/logger.ts +50 -0
- package/src/bridge/server/mcp-contract.ts +93 -0
- package/src/bridge/server/mcp.ts +129 -0
- package/src/bridge/server/peer.ts +232 -0
- package/src/bridge/server/standalone.ts +347 -0
- package/src/bridge/server/tool-metadata.ts +99 -0
- package/src/bridge/server.ts +28 -0
- package/src/cli/can-i-use.ts +50 -0
- package/src/cli/cli.test.ts +493 -0
- package/src/cli/database-rules.ts +329 -0
- package/src/cli/dev-runner.ts +282 -0
- package/src/cli/firebase-json.ts +100 -0
- package/src/cli/firestore-indexes.ts +70 -0
- package/src/cli/index.ts +425 -0
- package/src/cli/init.ts +260 -0
- package/src/cli/mcp-proxy.ts +196 -0
- package/src/cli/parse-args.ts +80 -0
- package/src/cli/rules.ts +259 -0
- package/src/cli/scope.ts +67 -0
- package/src/cli/serve.ts +996 -0
- package/src/cli/service-commands.ts +73 -0
- package/src/cli/snapshot.ts +164 -0
- package/src/cli/storage-rules.ts +172 -0
- package/src/cli/verify.ts +416 -0
- package/src/conformance/.generated/can-i-use-browser.ts +113 -0
- package/src/conformance/.generated/can-i-use.ts +117 -0
- package/src/conformance/.generated/conformance-docs.ts +14 -0
- package/src/conformance/browser.ts +24 -0
- package/src/conformance/can-i-use-tool.ts +51 -0
- package/src/conformance/can-i-use.ts +18 -0
- package/src/conformance/docs.ts +8 -0
- package/src/conformance/index.ts +20 -0
- package/src/conformance/tools.ts +16 -0
- package/src/credentials/core/memoize-ttl.ts +142 -0
- package/src/credentials/core/types.ts +10 -0
- package/src/credentials/node/from-adc.ts +96 -0
- package/src/credentials/node/from-service-account.ts +133 -0
- package/src/credentials/node/index.ts +6 -0
- package/src/discover/concurrency.ts +127 -0
- package/src/discover/crawler-adapter.ts +142 -0
- package/src/discover/crawler.ts +1127 -0
- package/src/discover/credential-free.ts +27 -0
- package/src/discover/findCollectionGroup.ts +131 -0
- package/src/discover/firestore-source.ts +59 -0
- package/src/discover/index.ts +5 -0
- package/src/discover/merge.ts +523 -0
- package/src/discover/session.ts +402 -0
- package/src/discover/tools.ts +201 -0
- package/src/discover/types.ts +187 -0
- package/src/discover/wire.ts +324 -0
- package/src/functions-rtdb/child.ts +382 -0
- package/src/functions-rtdb/delivery.ts +7 -0
- package/src/functions-rtdb/discovery.ts +136 -0
- package/src/functions-rtdb/event.ts +64 -0
- package/src/functions-rtdb/execution.ts +111 -0
- package/src/functions-rtdb/in-memory-delivery.ts +40 -0
- package/src/functions-rtdb/project.ts +74 -0
- package/src/functions-rtdb/projection.ts +104 -0
- package/src/functions-rtdb/reference-pattern.ts +20 -0
- package/src/functions-rtdb/remote-delivery.ts +23 -0
- package/src/pkg-version.ts +49 -0
- package/src/register/esm-exports.ts +63 -0
- package/src/register/hooks.ts +30 -0
- package/src/register/index.ts +150 -0
- package/src/register/mapping.ts +33 -0
- package/src/remote/index.ts +1050 -0
- package/src/rtdb/crawl-snapshot.ts +118 -0
- package/src/rtdb/inspection.ts +137 -0
- package/src/rtdb/load-rules-document.ts +56 -0
- package/src/rtdb/rules-generation-tool.ts +38 -0
- package/src/rtdb/rules-json.ts +29 -0
- package/src/serve/activity-guard.ts +29 -0
- package/src/serve/activity-route.ts +164 -0
- package/src/serve/activity-warning.ts +26 -0
- package/src/serve/bridge-mount.ts +200 -0
- package/src/serve/bundler.ts +493 -0
- package/src/serve/capture-store.ts +65 -0
- package/src/serve/discovery.ts +199 -0
- package/src/serve/entries/ai.ts +292 -0
- package/src/serve/entries/app-backend.ts +4 -0
- package/src/serve/entries/app-client.ts +26 -0
- package/src/serve/entries/app-session-store.ts +47 -0
- package/src/serve/entries/app.ts +11 -0
- package/src/serve/entries/auth-helper-core.ts +181 -0
- package/src/serve/entries/auth-helper-dom.ts +134 -0
- package/src/serve/entries/auth-helper-runtime.ts +20 -0
- package/src/serve/entries/auth.ts +255 -0
- package/src/serve/entries/bridge-url.ts +31 -0
- package/src/serve/entries/database.ts +129 -0
- package/src/serve/entries/firestore.ts +232 -0
- package/src/serve/entries/init.ts +46 -0
- package/src/serve/entries/keepalive.ts +46 -0
- package/src/serve/entries/messaging-sw.ts +75 -0
- package/src/serve/entries/messaging.ts +96 -0
- package/src/serve/entries/runtime.ts +540 -0
- package/src/serve/entries/session-store.ts +97 -0
- package/src/serve/entries/storage.ts +92 -0
- package/src/serve/entries/tab-sync-wiring.ts +274 -0
- package/src/serve/entries/worker-runtime.ts +75 -0
- package/src/serve/init-payload.ts +42 -0
- package/src/serve/namespace.ts +675 -0
- package/src/serve/open-browser.ts +68 -0
- package/src/serve/rules.ts +272 -0
- package/src/serve/sandbox-marker.ts +31 -0
- package/src/serve/server.ts +428 -0
- package/src/serve/standalone-assets.ts +180 -0
- package/src/serve/state-store.ts +166 -0
- package/src/serve/studio/disk-project-store.ts +185 -0
- package/src/serve/studio/disk-workspace.ts +162 -0
- package/src/serve/studio/index.ts +20 -0
- package/src/serve/studio/routes.ts +237 -0
- package/src/serve/studio/store-types.ts +48 -0
- package/src/serve/studio/studio-storage.test.ts +289 -0
- package/src/serve/vite-plugin.ts +1102 -0
- package/src/serve/worker/activity-bootstrap.ts +24 -0
- package/src/serve/worker/client/admin-firestore.ts +38 -0
- package/src/serve/worker/client/ai.ts +124 -0
- package/src/serve/worker/client/auth.ts +489 -0
- package/src/serve/worker/client/connection.ts +202 -0
- package/src/serve/worker/client/core.ts +350 -0
- package/src/serve/worker/client/disconnect.ts +45 -0
- package/src/serve/worker/client/firestore-reads.ts +181 -0
- package/src/serve/worker/client/firestore-refs.ts +226 -0
- package/src/serve/worker/client/firestore-writes.ts +232 -0
- package/src/serve/worker/client/handles.ts +91 -0
- package/src/serve/worker/client/messaging.ts +119 -0
- package/src/serve/worker/client/presence.ts +174 -0
- package/src/serve/worker/client/rtdb.ts +311 -0
- package/src/serve/worker/client/rules.ts +63 -0
- package/src/serve/worker/client/service-worker-connection.ts +59 -0
- package/src/serve/worker/client/snapshots.ts +86 -0
- package/src/serve/worker/client/storage.ts +195 -0
- package/src/serve/worker/client/studio.ts +88 -0
- package/src/serve/worker/client.ts +57 -0
- package/src/serve/worker/durable-persistence.ts +137 -0
- package/src/serve/worker/entry.ts +179 -0
- package/src/serve/worker/host/admin-firestore.ts +88 -0
- package/src/serve/worker/host/connection.ts +179 -0
- package/src/serve/worker/host/core.ts +387 -0
- package/src/serve/worker/host/dispatch.ts +316 -0
- package/src/serve/worker/host/firestore-reads.ts +117 -0
- package/src/serve/worker/host/firestore-writes.ts +456 -0
- package/src/serve/worker/host/presence.ts +312 -0
- package/src/serve/worker/host/rtdb.ts +136 -0
- package/src/serve/worker/host/rules.ts +128 -0
- package/src/serve/worker/host/storage.ts +312 -0
- package/src/serve/worker/host/studio.ts +75 -0
- package/src/serve/worker/host/subscriptions.ts +238 -0
- package/src/serve/worker/host-ai.ts +165 -0
- package/src/serve/worker/host-auth.ts +469 -0
- package/src/serve/worker/host-context.ts +273 -0
- package/src/serve/worker/host-events.ts +94 -0
- package/src/serve/worker/host-messaging.ts +240 -0
- package/src/serve/worker/host.ts +47 -0
- package/src/serve/worker/index.ts +196 -0
- package/src/serve/worker/presence-timing.ts +15 -0
- package/src/serve/worker/protocol.ts +1112 -0
- package/src/serve/worker/serve-init.ts +606 -0
- package/src/serve/worker/service-worker-channel.ts +33 -0
- package/src/serve/worker/service-worker-relay.ts +86 -0
- package/src/serve/writer-lock.ts +53 -0
- package/src/verify/cases.ts +233 -0
- package/src/verify/fixture.ts +258 -0
- package/src/verify/index.ts +519 -0
- package/src/verify/tools.ts +108 -0
- package/src/version/compat-target.ts +17 -0
- package/src/vite.ts +17 -0
- package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api/index.html +0 -31
- package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api.md +0 -29
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential-free discovery implementation.
|
|
3
|
+
*
|
|
4
|
+
* This is the internal composition seam for traversal, grouping, schema
|
|
5
|
+
* inference, convergence, tool handlers, and sandbox adapters. It must remain
|
|
6
|
+
* importable without production REST, auth/token modules, or Firebase SDKs.
|
|
7
|
+
* The public `@pyric/cli/discover` entry exposes only this retained module.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export type {
|
|
11
|
+
WireDocumentSnapshot,
|
|
12
|
+
CrawlerCollectionRef,
|
|
13
|
+
CrawlerDocumentRef,
|
|
14
|
+
CrawlerFirestore,
|
|
15
|
+
CollectionGroupQuery,
|
|
16
|
+
CollectionGroupSnapshot,
|
|
17
|
+
CollectionGroupCapableFirestore,
|
|
18
|
+
} from './firestore-source.js';
|
|
19
|
+
export * from './crawler.js';
|
|
20
|
+
export * from './findCollectionGroup.js';
|
|
21
|
+
export * from './wire.js';
|
|
22
|
+
export * from './types.js';
|
|
23
|
+
export * from './session.js';
|
|
24
|
+
export * from './concurrency.js';
|
|
25
|
+
export * from './merge.js';
|
|
26
|
+
export * from './crawler-adapter.js';
|
|
27
|
+
export * from './tools.js';
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `firestore_find_collection_group` — answers "where does collection ID
|
|
3
|
+
* X appear in the database?"
|
|
4
|
+
*
|
|
5
|
+
* Item 6.1 lands this; locked Strategy A from the 0.H v1 scope (see plan
|
|
6
|
+
* 0.H and Item 6). The tool exists for the cold-start case — agents
|
|
7
|
+
* who already ran `discover_paths` can filter the discovered map
|
|
8
|
+
* themselves. So this implementation is intentionally standalone.
|
|
9
|
+
*
|
|
10
|
+
* **Cost contract — bounded, statistical:**
|
|
11
|
+
*
|
|
12
|
+
* One query per call:
|
|
13
|
+
* `db.collectionGroup(id).select().limit(N).get()`
|
|
14
|
+
*
|
|
15
|
+
* Cost: exactly `min(N, totalDocsInGroup)` reads (1 per doc, regardless
|
|
16
|
+
* of host count). Coverage of all hosts is statistical: with K hosts and
|
|
17
|
+
* uniform doc distribution, P(all K covered | N draws) ≈ 1 once
|
|
18
|
+
* `N ≥ K × ln(K)` (coupon-collector). Default `N = 100` covers ~22
|
|
19
|
+
* distinct hosts with high confidence. The tool returns
|
|
20
|
+
* `limitWasReached` so agents can raise the cap when they suspect
|
|
21
|
+
* additional hosts.
|
|
22
|
+
*
|
|
23
|
+
* **What this tool is NOT:**
|
|
24
|
+
* - Not exhaustive — bounded by `limit`. To go exhaustive, raise
|
|
25
|
+
* `limit` until `limitWasReached === false`.
|
|
26
|
+
* - Not a host-doc-count — `sampleDocCount` is the number of returned
|
|
27
|
+
* docs that shared each parent path, not the host's total doc count.
|
|
28
|
+
* - Not a schema discovery tool — for that, use `discover_paths`.
|
|
29
|
+
*/
|
|
30
|
+
'use strict';
|
|
31
|
+
|
|
32
|
+
import { toTemplatePath } from './crawler.js';
|
|
33
|
+
import type { CollectionGroupCapableFirestore } from './firestore-source.js';
|
|
34
|
+
|
|
35
|
+
// ─── Tool surface ────────────────────────────────────────────────────────
|
|
36
|
+
|
|
37
|
+
export interface FindCollectionGroupOptions {
|
|
38
|
+
/**
|
|
39
|
+
* Max docs to fetch from the collection group. Default 100 — covers
|
|
40
|
+
* ~22 distinct hosts with high confidence per the coupon-collector
|
|
41
|
+
* heuristic. Raise this if the result reports `limitWasReached: true`
|
|
42
|
+
* and you suspect more hosts exist.
|
|
43
|
+
*/
|
|
44
|
+
limit?: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface FindCollectionGroupHost {
|
|
48
|
+
/** Template-form parent collection path, e.g. `users/{userId}/posts`. */
|
|
49
|
+
templatePath: string;
|
|
50
|
+
/**
|
|
51
|
+
* Number of docs in the N-doc draw that shared this parent path.
|
|
52
|
+
* NOT the host's total doc count — that's a separate query.
|
|
53
|
+
*/
|
|
54
|
+
sampleDocCount: number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface FindCollectionGroupResult {
|
|
58
|
+
/** Discovered hosts, deduped by templatePath. Order is insertion order
|
|
59
|
+
* (i.e. the order in which the first matching doc surfaced). */
|
|
60
|
+
hosts: FindCollectionGroupHost[];
|
|
61
|
+
/** Total docs read — the cost line item. Always `min(limit, totalDocsInGroup)`. */
|
|
62
|
+
reads: number;
|
|
63
|
+
/**
|
|
64
|
+
* True iff `reads === limit`, signaling the agent should consider
|
|
65
|
+
* raising `limit` if they need exhaustive host coverage.
|
|
66
|
+
*/
|
|
67
|
+
limitWasReached: boolean;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const DEFAULT_LIMIT = 100;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Find every collection-group host of a given collection ID.
|
|
74
|
+
*
|
|
75
|
+
* One read per returned doc — cost is bounded by `limit` (default 100).
|
|
76
|
+
* Returns the hosts in template-path form (e.g. `users/{userId}/posts`)
|
|
77
|
+
* with the per-host sample doc count.
|
|
78
|
+
*
|
|
79
|
+
* Throws on Admin SDK errors (network / permission). The tool is
|
|
80
|
+
* standalone — no session, no continuation, no events — so error
|
|
81
|
+
* propagation is straightforward.
|
|
82
|
+
*/
|
|
83
|
+
export async function findCollectionGroup(
|
|
84
|
+
db: CollectionGroupCapableFirestore,
|
|
85
|
+
collectionId: string,
|
|
86
|
+
options: FindCollectionGroupOptions = {},
|
|
87
|
+
): Promise<FindCollectionGroupResult> {
|
|
88
|
+
const limit = options.limit ?? DEFAULT_LIMIT;
|
|
89
|
+
|
|
90
|
+
if (typeof collectionId !== 'string' || collectionId.length === 0) {
|
|
91
|
+
throw new Error('findCollectionGroup: collectionId must be a non-empty string');
|
|
92
|
+
}
|
|
93
|
+
if (!Number.isInteger(limit) || limit < 1) {
|
|
94
|
+
throw new RangeError(
|
|
95
|
+
`findCollectionGroup: limit must be a positive integer, got ${limit}`,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const snap = await db.collectionGroup(collectionId).select().limit(limit).get();
|
|
100
|
+
const docs = snap.docs;
|
|
101
|
+
|
|
102
|
+
// Dedup parent paths in insertion order. Keys are concrete paths;
|
|
103
|
+
// template conversion happens after dedup so we don't redo the work
|
|
104
|
+
// per doc.
|
|
105
|
+
const concreteCounts = new Map<string, number>();
|
|
106
|
+
for (const d of docs) {
|
|
107
|
+
const concretePath = d.ref.parent.path;
|
|
108
|
+
concreteCounts.set(concretePath, (concreteCounts.get(concretePath) ?? 0) + 1);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Map concrete → template, accumulating sampleDocCount across concrete
|
|
112
|
+
// paths that map to the same templatePath. Two host instances of
|
|
113
|
+
// `users/{userId}/posts` (e.g. `users/uid_1/posts` + `users/uid_2/posts`)
|
|
114
|
+
// collapse into one host entry with summed counts.
|
|
115
|
+
const templateCounts = new Map<string, number>();
|
|
116
|
+
for (const [concretePath, count] of concreteCounts) {
|
|
117
|
+
const tpl = toTemplatePath(concretePath);
|
|
118
|
+
templateCounts.set(tpl, (templateCounts.get(tpl) ?? 0) + count);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const hosts: FindCollectionGroupHost[] = [];
|
|
122
|
+
for (const [templatePath, sampleDocCount] of templateCounts) {
|
|
123
|
+
hosts.push({ templatePath, sampleDocCount });
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
hosts,
|
|
128
|
+
reads: docs.length,
|
|
129
|
+
limitWasReached: docs.length === limit,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential-neutral Firestore seam for discovery.
|
|
3
|
+
*
|
|
4
|
+
* The crawler depends only on these structural shapes. Sandbox snapshots,
|
|
5
|
+
* LocalEnvironment, production REST, and test fixtures each provide an
|
|
6
|
+
* adapter without teaching the discovery implementation how that data was
|
|
7
|
+
* obtained. Keep credentials, tokens, SDK initialization, and network policy
|
|
8
|
+
* out of this module.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** Minimal document snapshot shape needed for wire-type inference. */
|
|
12
|
+
export interface WireDocumentSnapshot {
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
_fieldsProto?: Record<string, any>;
|
|
15
|
+
ref?: { path?: string };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Minimal collection-reference shape needed for traversal. */
|
|
19
|
+
export interface CrawlerCollectionRef {
|
|
20
|
+
readonly id: string;
|
|
21
|
+
readonly path: string;
|
|
22
|
+
listDocuments(): Promise<CrawlerDocumentRef[]>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Minimal document-reference shape needed for traversal and sampling. */
|
|
26
|
+
export interface CrawlerDocumentRef {
|
|
27
|
+
readonly id: string;
|
|
28
|
+
readonly path: string;
|
|
29
|
+
listCollections(): Promise<CrawlerCollectionRef[]>;
|
|
30
|
+
get(): Promise<WireDocumentSnapshot>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Firestore-shaped source consumed by the crawler.
|
|
35
|
+
*
|
|
36
|
+
* `collection` and `doc` are needed only when resuming a continuation.
|
|
37
|
+
*/
|
|
38
|
+
export interface CrawlerFirestore {
|
|
39
|
+
listCollections(): Promise<CrawlerCollectionRef[]>;
|
|
40
|
+
collection?(path: string): CrawlerCollectionRef;
|
|
41
|
+
doc?(path: string): CrawlerDocumentRef;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Minimal collection-group query shape used by host discovery. */
|
|
45
|
+
export interface CollectionGroupQuery {
|
|
46
|
+
select(...fields: string[]): CollectionGroupQuery;
|
|
47
|
+
limit(n: number): CollectionGroupQuery;
|
|
48
|
+
get(): Promise<{ docs: CollectionGroupSnapshot[] }>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Parent-path projection used by collection-group discovery. */
|
|
52
|
+
export interface CollectionGroupSnapshot {
|
|
53
|
+
ref: { parent: { path: string } };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Optional source capability used by `findCollectionGroup`. */
|
|
57
|
+
export interface CollectionGroupCapableFirestore {
|
|
58
|
+
collectionGroup(collectionId: string): CollectionGroupQuery;
|
|
59
|
+
}
|