@superblocksteam/vite-plugin-file-sync 2.0.86 → 2.0.87-next.1
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/ai-service/agent/middleware.d.ts +1 -1
- package/dist/ai-service/agent/middleware.js +2 -2
- package/dist/ai-service/agent/middleware.js.map +1 -1
- package/dist/ai-service/agent/prompts/api-prompts.d.ts +33 -0
- package/dist/ai-service/agent/prompts/api-prompts.d.ts.map +1 -0
- package/dist/ai-service/agent/prompts/api-prompts.js +446 -0
- package/dist/ai-service/agent/prompts/api-prompts.js.map +1 -0
- package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js +16 -154
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.d.ts.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.js +13 -2
- package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/analysis.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/analysis.js +159 -15
- package/dist/ai-service/agent/tools/apis/analysis.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-executor.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-executor.js +13 -1
- package/dist/ai-service/agent/tools/apis/api-executor.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-api-docs.d.ts +12 -0
- package/dist/ai-service/agent/tools/apis/get-api-docs.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-api-docs.js +3 -3
- package/dist/ai-service/agent/tools/apis/get-api-docs.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-integration-types.d.ts +12 -0
- package/dist/ai-service/agent/tools/apis/get-integration-types.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/get-integration-types.js +76 -0
- package/dist/ai-service/agent/tools/apis/get-integration-types.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/integration-types.js +4 -4
- package/dist/ai-service/agent/tools/apis/integration-types.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +5 -4
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.js +23 -0
- package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -1
- package/dist/ai-service/agent/tools/build-debug.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-debug.js +13 -1
- package/dist/ai-service/agent/tools/build-debug.js.map +1 -1
- package/dist/ai-service/agent/tools/index.d.ts +1 -0
- package/dist/ai-service/agent/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/index.js +1 -0
- package/dist/ai-service/agent/tools/index.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.js +14 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/internal.d.ts +1 -0
- package/dist/ai-service/agent/tools/integrations/internal.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/internal.js +9 -4
- package/dist/ai-service/agent/tools/integrations/internal.js.map +1 -1
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +19 -9
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/web-fetch.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/web-fetch.js +7 -1
- package/dist/ai-service/agent/tools2/tools/web-fetch.js.map +1 -1
- package/dist/ai-service/agent/utils.d.ts.map +1 -1
- package/dist/ai-service/agent/utils.js +11 -0
- package/dist/ai-service/agent/utils.js.map +1 -1
- package/dist/ai-service/app-interface/filesystem/index.d.ts +4 -1
- package/dist/ai-service/app-interface/filesystem/index.d.ts.map +1 -1
- package/dist/ai-service/app-interface/filesystem/index.js +3 -1
- package/dist/ai-service/app-interface/filesystem/index.js.map +1 -1
- package/dist/ai-service/app-interface/filesystem/path-validator.d.ts +43 -0
- package/dist/ai-service/app-interface/filesystem/path-validator.d.ts.map +1 -0
- package/dist/ai-service/app-interface/filesystem/path-validator.js +9 -0
- package/dist/ai-service/app-interface/filesystem/path-validator.js.map +1 -0
- package/dist/ai-service/app-interface/filesystem/sdk-path-validator.d.ts +50 -0
- package/dist/ai-service/app-interface/filesystem/sdk-path-validator.d.ts.map +1 -0
- package/dist/ai-service/app-interface/filesystem/sdk-path-validator.js +68 -0
- package/dist/ai-service/app-interface/filesystem/sdk-path-validator.js.map +1 -0
- package/dist/ai-service/app-interface/filesystem/validation.d.ts +25 -8
- package/dist/ai-service/app-interface/filesystem/validation.d.ts.map +1 -1
- package/dist/ai-service/app-interface/filesystem/validation.js +52 -28
- package/dist/ai-service/app-interface/filesystem/validation.js.map +1 -1
- package/dist/ai-service/app-interface/filesystem/virtual-file-system.d.ts +1 -0
- package/dist/ai-service/app-interface/filesystem/virtual-file-system.d.ts.map +1 -1
- package/dist/ai-service/app-interface/filesystem/virtual-file-system.js +4 -1
- package/dist/ai-service/app-interface/filesystem/virtual-file-system.js.map +1 -1
- package/dist/ai-service/app-interface/filesystem/yaml-path-validator.d.ts +49 -0
- package/dist/ai-service/app-interface/filesystem/yaml-path-validator.d.ts.map +1 -0
- package/dist/ai-service/app-interface/filesystem/yaml-path-validator.js +67 -0
- package/dist/ai-service/app-interface/filesystem/yaml-path-validator.js.map +1 -0
- package/dist/ai-service/app-interface/shell.d.ts +5 -2
- package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
- package/dist/ai-service/app-interface/shell.js +11 -6
- package/dist/ai-service/app-interface/shell.js.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +3 -3
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/clark-provider/clark-provider.d.ts +1 -0
- package/dist/ai-service/clark-provider/clark-provider.d.ts.map +1 -1
- package/dist/ai-service/clark-provider/clark-provider.js +6 -1
- package/dist/ai-service/clark-provider/clark-provider.js.map +1 -1
- package/dist/ai-service/features.d.ts +4 -0
- package/dist/ai-service/features.d.ts.map +1 -1
- package/dist/ai-service/features.js +4 -0
- package/dist/ai-service/features.js.map +1 -1
- package/dist/ai-service/index.d.ts +21 -0
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +119 -10
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/judge/judge-eval-service-runner.d.ts.map +1 -1
- package/dist/ai-service/judge/judge-eval-service-runner.js +2 -0
- package/dist/ai-service/judge/judge-eval-service-runner.js.map +1 -1
- package/dist/ai-service/llm/client.js +2 -2
- package/dist/ai-service/llm/client.js.map +1 -1
- package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/context.js +4 -4
- package/dist/ai-service/llm/context-v2/context.js.map +1 -1
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js +11 -2
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js.map +1 -1
- package/dist/ai-service/llm/context-v2/prompts/compaction.d.ts +1 -1
- package/dist/ai-service/llm/context-v2/prompts/compaction.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/prompts/compaction.js +15 -6
- package/dist/ai-service/llm/context-v2/prompts/compaction.js.map +1 -1
- package/dist/ai-service/llm/context-v2/types.d.ts +4 -9
- package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/types.js +15 -45
- package/dist/ai-service/llm/context-v2/types.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/logging.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/logging.js +2 -4
- package/dist/ai-service/llm/stream/observers/logging.js.map +1 -1
- package/dist/ai-service/llm/stream/retry-engine.d.ts +4 -0
- package/dist/ai-service/llm/stream/retry-engine.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/retry-engine.js +24 -1
- package/dist/ai-service/llm/stream/retry-engine.js.map +1 -1
- package/dist/ai-service/llm/types.d.ts +4 -1
- package/dist/ai-service/llm/types.d.ts.map +1 -1
- package/dist/ai-service/security/index.d.ts +2 -1
- package/dist/ai-service/security/index.d.ts.map +1 -1
- package/dist/ai-service/security/index.js +2 -1
- package/dist/ai-service/security/index.js.map +1 -1
- package/dist/ai-service/security/secret-scanner-service.d.ts +52 -0
- package/dist/ai-service/security/secret-scanner-service.d.ts.map +1 -0
- package/dist/ai-service/security/secret-scanner-service.js +290 -0
- package/dist/ai-service/security/secret-scanner-service.js.map +1 -0
- package/dist/ai-service/security/secret-scanner.d.ts +8 -15
- package/dist/ai-service/security/secret-scanner.d.ts.map +1 -1
- package/dist/ai-service/security/secret-scanner.js +1 -50
- package/dist/ai-service/security/secret-scanner.js.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/graphql.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/graphql.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/graphql.generated.js +28 -21
- package/dist/ai-service/skills/system/superblocks-api/references/graphql.generated.js.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-api/skill.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/skill.generated.js +286 -116
- package/dist/ai-service/skills/system/superblocks-api/skill.generated.js.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +7 -0
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +1 -5
- package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.js +14 -12
- package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/idle.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/idle.js +18 -10
- package/dist/ai-service/state-machine/handlers/idle.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.js +53 -12
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/peer.d.ts +5 -0
- package/dist/ai-service/state-machine/helpers/peer.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/peer.js +19 -0
- package/dist/ai-service/state-machine/helpers/peer.js.map +1 -1
- package/dist/ai-service/template-renderer.d.ts +2 -1
- package/dist/ai-service/template-renderer.d.ts.map +1 -1
- package/dist/ai-service/template-renderer.js +28 -3
- package/dist/ai-service/template-renderer.js.map +1 -1
- package/dist/ai-service/types.d.ts +2 -0
- package/dist/ai-service/types.d.ts.map +1 -1
- package/dist/ai-service/types.js.map +1 -1
- package/dist/lock-service/activity-tracker.d.ts +5 -0
- package/dist/lock-service/activity-tracker.d.ts.map +1 -1
- package/dist/lock-service/activity-tracker.js +13 -0
- package/dist/lock-service/activity-tracker.js.map +1 -1
- package/dist/lock-service/index.d.ts +8 -0
- package/dist/lock-service/index.d.ts.map +1 -1
- package/dist/lock-service/index.js +54 -0
- package/dist/lock-service/index.js.map +1 -1
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +9 -0
- package/dist/socket-manager.js.map +1 -1
- package/dist/sync-service/index.d.ts.map +1 -1
- package/dist/sync-service/index.js +40 -7
- package/dist/sync-service/index.js.map +1 -1
- package/dist/util/log-sanitizer.d.ts +1 -0
- package/dist/util/log-sanitizer.d.ts.map +1 -1
- package/dist/util/log-sanitizer.js +8 -0
- package/dist/util/log-sanitizer.js.map +1 -1
- package/dist/vite-plugin-yaml-types.d.ts +6 -2
- package/dist/vite-plugin-yaml-types.d.ts.map +1 -1
- package/dist/vite-plugin-yaml-types.js +82 -8
- package/dist/vite-plugin-yaml-types.js.map +1 -1
- package/package.json +22 -11
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Singleton secret scanner service with caching, concurrency control,
|
|
3
|
+
* and availability gating.
|
|
4
|
+
*
|
|
5
|
+
* Wraps the low-level TruffleHog process-spawning logic from
|
|
6
|
+
* `secret-scanner.ts` to prevent resource exhaustion in containers:
|
|
7
|
+
*
|
|
8
|
+
* - **Caching**: Content-hash keyed results avoid re-scanning identical
|
|
9
|
+
* content within a TTL window.
|
|
10
|
+
* - **In-flight deduplication**: Concurrent scans of identical content
|
|
11
|
+
* coalesce into a single TruffleHog invocation.
|
|
12
|
+
* - **Concurrency control**: A promise-based semaphore limits the number
|
|
13
|
+
* of concurrent TruffleHog child processes.
|
|
14
|
+
* - **Availability gating**: When TruffleHog is not installed, all scans
|
|
15
|
+
* immediately return empty findings without spawning processes or
|
|
16
|
+
* logging errors.
|
|
17
|
+
*/
|
|
18
|
+
import { type SecretScanOptions, type SecretScanResult } from "./secret-scanner.js";
|
|
19
|
+
/** Default timeout for a single TruffleHog scan (ms). */
|
|
20
|
+
export declare const DEFAULT_SCAN_TIMEOUT_MS = 10000;
|
|
21
|
+
/** Maximum number of cached scan results. */
|
|
22
|
+
export declare const MAX_CACHE_SIZE = 200;
|
|
23
|
+
/** Time-to-live for cached scan results (ms). */
|
|
24
|
+
export declare const CACHE_TTL_MS: number;
|
|
25
|
+
/** Maximum concurrent TruffleHog child processes. */
|
|
26
|
+
export declare const MAX_CONCURRENCY = 2;
|
|
27
|
+
/**
|
|
28
|
+
* Scans text content for secrets using TruffleHog, with caching,
|
|
29
|
+
* concurrency control, and availability gating.
|
|
30
|
+
*
|
|
31
|
+
* Drop-in replacement for the original `scanContentForSecrets` from
|
|
32
|
+
* `secret-scanner.ts` — same signature, same return type.
|
|
33
|
+
*
|
|
34
|
+
* @param content - The text content to scan for secrets
|
|
35
|
+
* @param options - Scan configuration options
|
|
36
|
+
* @returns Promise resolving to scan results with any findings
|
|
37
|
+
*/
|
|
38
|
+
export declare function scanContentForSecrets(content: string, options?: SecretScanOptions): Promise<SecretScanResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Checks if TruffleHog is available on the system (cached after first call).
|
|
41
|
+
*
|
|
42
|
+
* @returns Promise resolving to true if TruffleHog is installed
|
|
43
|
+
*/
|
|
44
|
+
export declare function isTrufflehogAvailable(): Promise<boolean>;
|
|
45
|
+
/**
|
|
46
|
+
* Disposes the singleton scanner service, clearing all caches and
|
|
47
|
+
* resetting the availability flag.
|
|
48
|
+
*
|
|
49
|
+
* Primarily useful in tests or graceful shutdown.
|
|
50
|
+
*/
|
|
51
|
+
export declare function disposeSecretScanner(): void;
|
|
52
|
+
//# sourceMappingURL=secret-scanner-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-scanner-service.d.ts","sourceRoot":"","sources":["../../../src/ai-service/security/secret-scanner-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAM7B,yDAAyD;AACzD,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,6CAA6C;AAC7C,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,iDAAiD;AACjD,eAAO,MAAM,YAAY,QAAgB,CAAC;AAE1C,qDAAqD;AACrD,eAAO,MAAM,eAAe,IAAI,CAAC;AA2QjC;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAE3B;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Singleton secret scanner service with caching, concurrency control,
|
|
3
|
+
* and availability gating.
|
|
4
|
+
*
|
|
5
|
+
* Wraps the low-level TruffleHog process-spawning logic from
|
|
6
|
+
* `secret-scanner.ts` to prevent resource exhaustion in containers:
|
|
7
|
+
*
|
|
8
|
+
* - **Caching**: Content-hash keyed results avoid re-scanning identical
|
|
9
|
+
* content within a TTL window.
|
|
10
|
+
* - **In-flight deduplication**: Concurrent scans of identical content
|
|
11
|
+
* coalesce into a single TruffleHog invocation.
|
|
12
|
+
* - **Concurrency control**: A promise-based semaphore limits the number
|
|
13
|
+
* of concurrent TruffleHog child processes.
|
|
14
|
+
* - **Availability gating**: When TruffleHog is not installed, all scans
|
|
15
|
+
* immediately return empty findings without spawning processes or
|
|
16
|
+
* logging errors.
|
|
17
|
+
*/
|
|
18
|
+
import { createHash } from "node:crypto";
|
|
19
|
+
import { getErrorMeta, getPrefixedLogger } from "../../util/logger.js";
|
|
20
|
+
import { isTrufflehogAvailable as checkTrufflehogAvailable, runTrufflehog, redactSecrets, } from "./secret-scanner.js";
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Constants
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/** Default timeout for a single TruffleHog scan (ms). */
|
|
25
|
+
export const DEFAULT_SCAN_TIMEOUT_MS = 10_000;
|
|
26
|
+
/** Maximum number of cached scan results. */
|
|
27
|
+
export const MAX_CACHE_SIZE = 200;
|
|
28
|
+
/** Time-to-live for cached scan results (ms). */
|
|
29
|
+
export const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
30
|
+
/** Maximum concurrent TruffleHog child processes. */
|
|
31
|
+
export const MAX_CONCURRENCY = 2;
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// SecretScannerService
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
/**
|
|
36
|
+
* Singleton service that wraps TruffleHog process spawning with caching,
|
|
37
|
+
* in-flight deduplication, concurrency control, and availability gating.
|
|
38
|
+
*
|
|
39
|
+
* Not intended to be instantiated directly — use the module-level
|
|
40
|
+
* {@link scanContentForSecrets} and {@link isTrufflehogAvailable} functions.
|
|
41
|
+
*/
|
|
42
|
+
class SecretScannerService {
|
|
43
|
+
/** Content hash -> cached findings. */
|
|
44
|
+
cache = new Map();
|
|
45
|
+
/** Content hash -> in-flight scan promise (coalesces duplicate requests). */
|
|
46
|
+
inflight = new Map();
|
|
47
|
+
/** Number of TruffleHog processes currently running. */
|
|
48
|
+
activeProcesses = 0;
|
|
49
|
+
/** Waiters blocked on a concurrency slot. */
|
|
50
|
+
waitQueue = [];
|
|
51
|
+
/**
|
|
52
|
+
* Tri-state availability flag:
|
|
53
|
+
* - `undefined` = not yet checked
|
|
54
|
+
* - `true` = TruffleHog is installed
|
|
55
|
+
* - `false` = TruffleHog is not installed
|
|
56
|
+
*/
|
|
57
|
+
available;
|
|
58
|
+
/**
|
|
59
|
+
* Scan content for secrets, applying caching and concurrency control.
|
|
60
|
+
*
|
|
61
|
+
* @param content - Text to scan
|
|
62
|
+
* @param options - Scan configuration
|
|
63
|
+
* @returns Scan result with findings and redacted content
|
|
64
|
+
*/
|
|
65
|
+
async scan(content, options = {}) {
|
|
66
|
+
const logger = getPrefixedLogger("[secret-scan]");
|
|
67
|
+
const { timeout = DEFAULT_SCAN_TIMEOUT_MS, verifiedOnly = false } = options;
|
|
68
|
+
// 1. Availability gate — only cache positive availability so transient
|
|
69
|
+
// failures (timeouts, SIGTERM) don't permanently disable scanning.
|
|
70
|
+
if (this.available !== true) {
|
|
71
|
+
const isAvailable = await checkTrufflehogAvailable();
|
|
72
|
+
if (isAvailable) {
|
|
73
|
+
this.available = true;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
logger.debug("TruffleHog not available; secret scanning skipped");
|
|
77
|
+
return {
|
|
78
|
+
success: false,
|
|
79
|
+
findings: [],
|
|
80
|
+
error: "Secret scanning unavailable: TruffleHog is not available",
|
|
81
|
+
hasVerifiedSecrets: false,
|
|
82
|
+
hasSecrets: false,
|
|
83
|
+
redactedContent: content,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// 2. Cache lookup
|
|
88
|
+
const cacheKey = this.hashContent(content, verifiedOnly);
|
|
89
|
+
const cached = this.cache.get(cacheKey);
|
|
90
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
91
|
+
const findings = cached.findings;
|
|
92
|
+
return {
|
|
93
|
+
success: true,
|
|
94
|
+
findings,
|
|
95
|
+
hasVerifiedSecrets: findings.some((f) => f.verified),
|
|
96
|
+
hasSecrets: findings.length > 0,
|
|
97
|
+
redactedContent: redactSecrets(content, findings),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// 3. In-flight deduplication — piggyback callers must also handle
|
|
101
|
+
// rejection so they return { success: false } instead of throwing.
|
|
102
|
+
const existing = this.inflight.get(cacheKey);
|
|
103
|
+
if (existing) {
|
|
104
|
+
try {
|
|
105
|
+
const findings = await existing;
|
|
106
|
+
return {
|
|
107
|
+
success: true,
|
|
108
|
+
findings,
|
|
109
|
+
hasVerifiedSecrets: findings.some((f) => f.verified),
|
|
110
|
+
hasSecrets: findings.length > 0,
|
|
111
|
+
redactedContent: redactSecrets(content, findings),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
logger.error("Secret scan failed (deduped)", getErrorMeta(error));
|
|
116
|
+
return {
|
|
117
|
+
success: false,
|
|
118
|
+
findings: [],
|
|
119
|
+
error: error instanceof Error ? error.message : String(error),
|
|
120
|
+
hasVerifiedSecrets: false,
|
|
121
|
+
hasSecrets: false,
|
|
122
|
+
redactedContent: content,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// 4. Spawn TruffleHog with concurrency control
|
|
127
|
+
const scanPromise = this.runWithConcurrencyControl(content, timeout, verifiedOnly, cacheKey);
|
|
128
|
+
this.inflight.set(cacheKey, scanPromise);
|
|
129
|
+
try {
|
|
130
|
+
const findings = await scanPromise;
|
|
131
|
+
return {
|
|
132
|
+
success: true,
|
|
133
|
+
findings,
|
|
134
|
+
hasVerifiedSecrets: findings.some((f) => f.verified),
|
|
135
|
+
hasSecrets: findings.length > 0,
|
|
136
|
+
redactedContent: redactSecrets(content, findings),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
logger.error("Secret scan failed", getErrorMeta(error));
|
|
141
|
+
return {
|
|
142
|
+
success: false,
|
|
143
|
+
findings: [],
|
|
144
|
+
error: error instanceof Error ? error.message : String(error),
|
|
145
|
+
hasVerifiedSecrets: false,
|
|
146
|
+
hasSecrets: false,
|
|
147
|
+
redactedContent: content,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
this.inflight.delete(cacheKey);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Check if TruffleHog is available. Only caches positive results so
|
|
156
|
+
* transient failures don't permanently disable scanning.
|
|
157
|
+
*/
|
|
158
|
+
async isAvailable() {
|
|
159
|
+
if (this.available !== true) {
|
|
160
|
+
const isAvailable = await checkTrufflehogAvailable();
|
|
161
|
+
if (isAvailable) {
|
|
162
|
+
this.available = true;
|
|
163
|
+
}
|
|
164
|
+
return isAvailable;
|
|
165
|
+
}
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Dispose of the singleton — clears the cache and resets availability.
|
|
170
|
+
*/
|
|
171
|
+
dispose() {
|
|
172
|
+
this.cache.clear();
|
|
173
|
+
this.inflight.clear();
|
|
174
|
+
this.available = undefined;
|
|
175
|
+
}
|
|
176
|
+
// -----------------------------------------------------------------------
|
|
177
|
+
// Private helpers
|
|
178
|
+
// -----------------------------------------------------------------------
|
|
179
|
+
/**
|
|
180
|
+
* Compute a cache key from content and scan flags.
|
|
181
|
+
*/
|
|
182
|
+
hashContent(content, verifiedOnly) {
|
|
183
|
+
const hash = createHash("sha256");
|
|
184
|
+
hash.update(content);
|
|
185
|
+
hash.update(verifiedOnly ? ":v" : ":a");
|
|
186
|
+
return hash.digest("hex");
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Acquire a concurrency slot, run TruffleHog, cache the result, and
|
|
190
|
+
* release the slot.
|
|
191
|
+
*/
|
|
192
|
+
async runWithConcurrencyControl(content, timeout, verifiedOnly, cacheKey) {
|
|
193
|
+
await this.acquireSlot();
|
|
194
|
+
try {
|
|
195
|
+
const findings = await runTrufflehog(content, timeout, verifiedOnly);
|
|
196
|
+
// Cache successful results
|
|
197
|
+
this.cacheResult(cacheKey, findings);
|
|
198
|
+
return findings;
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
this.releaseSlot();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Wait until a concurrency slot is available.
|
|
206
|
+
*/
|
|
207
|
+
async acquireSlot() {
|
|
208
|
+
if (this.activeProcesses < MAX_CONCURRENCY) {
|
|
209
|
+
this.activeProcesses++;
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
return new Promise((resolve) => {
|
|
213
|
+
this.waitQueue.push(resolve);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Release a concurrency slot and wake the next waiter.
|
|
218
|
+
*/
|
|
219
|
+
releaseSlot() {
|
|
220
|
+
const next = this.waitQueue.shift();
|
|
221
|
+
if (next) {
|
|
222
|
+
// Hand the slot directly to the next waiter
|
|
223
|
+
next();
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
this.activeProcesses--;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Store findings in the cache, evicting the oldest entry if at capacity.
|
|
231
|
+
*/
|
|
232
|
+
cacheResult(key, findings) {
|
|
233
|
+
if (this.cache.size >= MAX_CACHE_SIZE) {
|
|
234
|
+
// Evict the oldest entry (first key in insertion order)
|
|
235
|
+
const oldest = this.cache.keys().next().value;
|
|
236
|
+
if (oldest !== undefined) {
|
|
237
|
+
this.cache.delete(oldest);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
this.cache.set(key, {
|
|
241
|
+
findings,
|
|
242
|
+
expiresAt: Date.now() + CACHE_TTL_MS,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
// Module-level singleton
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
let instance;
|
|
250
|
+
function getInstance() {
|
|
251
|
+
if (!instance) {
|
|
252
|
+
instance = new SecretScannerService();
|
|
253
|
+
}
|
|
254
|
+
return instance;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Scans text content for secrets using TruffleHog, with caching,
|
|
258
|
+
* concurrency control, and availability gating.
|
|
259
|
+
*
|
|
260
|
+
* Drop-in replacement for the original `scanContentForSecrets` from
|
|
261
|
+
* `secret-scanner.ts` — same signature, same return type.
|
|
262
|
+
*
|
|
263
|
+
* @param content - The text content to scan for secrets
|
|
264
|
+
* @param options - Scan configuration options
|
|
265
|
+
* @returns Promise resolving to scan results with any findings
|
|
266
|
+
*/
|
|
267
|
+
export async function scanContentForSecrets(content, options = {}) {
|
|
268
|
+
return getInstance().scan(content, options);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Checks if TruffleHog is available on the system (cached after first call).
|
|
272
|
+
*
|
|
273
|
+
* @returns Promise resolving to true if TruffleHog is installed
|
|
274
|
+
*/
|
|
275
|
+
export async function isTrufflehogAvailable() {
|
|
276
|
+
return getInstance().isAvailable();
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Disposes the singleton scanner service, clearing all caches and
|
|
280
|
+
* resetting the availability flag.
|
|
281
|
+
*
|
|
282
|
+
* Primarily useful in tests or graceful shutdown.
|
|
283
|
+
*/
|
|
284
|
+
export function disposeSecretScanner() {
|
|
285
|
+
if (instance) {
|
|
286
|
+
instance.dispose();
|
|
287
|
+
instance = undefined;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=secret-scanner-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-scanner-service.js","sourceRoot":"","sources":["../../../src/ai-service/security/secret-scanner-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -66,24 +66,17 @@ export interface SecretScanResult {
|
|
|
66
66
|
*/
|
|
67
67
|
export declare function redactSecrets(content: string, findings: SecretFinding[]): string;
|
|
68
68
|
/**
|
|
69
|
-
*
|
|
69
|
+
* Runs TruffleHog CLI using stdin and returns parsed findings.
|
|
70
70
|
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
71
|
+
* Uses TruffleHog's built-in detectors for common secret types (Stripe, GitHub,
|
|
72
|
+
* AWS, private keys, etc.) without custom configuration.
|
|
73
73
|
*
|
|
74
|
-
* @param content -
|
|
75
|
-
* @param
|
|
76
|
-
* @
|
|
77
|
-
*
|
|
78
|
-
* @example
|
|
79
|
-
* ```typescript
|
|
80
|
-
* const result = await scanContentForSecrets(userPrompt);
|
|
81
|
-
* if (result.hasVerifiedSecrets) {
|
|
82
|
-
* console.log("Verified secrets found:", result.findings.filter(f => f.verified));
|
|
83
|
-
* }
|
|
84
|
-
* ```
|
|
74
|
+
* @param content - Content to scan for secrets (piped to stdin)
|
|
75
|
+
* @param timeout - Timeout in milliseconds
|
|
76
|
+
* @param verifiedOnly - Whether to only return verified secrets
|
|
77
|
+
* @returns Promise resolving to array of SecretFinding objects
|
|
85
78
|
*/
|
|
86
|
-
export declare function
|
|
79
|
+
export declare function runTrufflehog(content: string, timeout: number, verifiedOnly: boolean): Promise<SecretFinding[]>;
|
|
87
80
|
/**
|
|
88
81
|
* Checks if TruffleHog is available on the system.
|
|
89
82
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret-scanner.d.ts","sourceRoot":"","sources":["../../../src/ai-service/security/secret-scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkCH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mFAAmF;IACnF,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,sBAAsB;IACtB,cAAc,CAAC,EAAE;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8FAA8F;IAC9F,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,uDAAuD;IACvD,UAAU,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,EAAE,GACxB,MAAM,CAoBR;AA4DD
|
|
1
|
+
{"version":3,"file":"secret-scanner.d.ts","sourceRoot":"","sources":["../../../src/ai-service/security/secret-scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkCH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mFAAmF;IACnF,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,sBAAsB;IACtB,cAAc,CAAC,EAAE;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8FAA8F;IAC9F,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,uDAAuD;IACvD,UAAU,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,EAAE,GACxB,MAAM,CAoBR;AA4DD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC,CAkE1B;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAmB9D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,cAAc,CAAkB;IAExC;;;;OAIG;gBACS,QAAQ,EAAE,aAAa,EAAE;IAOrC;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAc/B;;;;;;;OAOG;IACH,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAiBnC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;CACF;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,CAmBtE"}
|
|
@@ -111,55 +111,6 @@ function generateRedactedValue(raw) {
|
|
|
111
111
|
const prefixLength = Math.min(8, Math.floor(raw.length / 3));
|
|
112
112
|
return raw.slice(0, prefixLength) + "****";
|
|
113
113
|
}
|
|
114
|
-
/**
|
|
115
|
-
* Scans text content for secrets using TruffleHog.
|
|
116
|
-
*
|
|
117
|
-
* This function pipes content directly to TruffleHog's stdin command
|
|
118
|
-
* and returns any detected secrets.
|
|
119
|
-
*
|
|
120
|
-
* @param content - The text content to scan for secrets
|
|
121
|
-
* @param options - Scan configuration options
|
|
122
|
-
* @returns Promise resolving to scan results with any findings
|
|
123
|
-
*
|
|
124
|
-
* @example
|
|
125
|
-
* ```typescript
|
|
126
|
-
* const result = await scanContentForSecrets(userPrompt);
|
|
127
|
-
* if (result.hasVerifiedSecrets) {
|
|
128
|
-
* console.log("Verified secrets found:", result.findings.filter(f => f.verified));
|
|
129
|
-
* }
|
|
130
|
-
* ```
|
|
131
|
-
*/
|
|
132
|
-
export async function scanContentForSecrets(content, options = {}) {
|
|
133
|
-
const { timeout = 5000, verifiedOnly = false } = options;
|
|
134
|
-
const logger = getPrefixedLogger("[secret-scan]");
|
|
135
|
-
const startTime = performance.now();
|
|
136
|
-
logger.debug(`Starting secret scan (contentLength=${content.length}, timeout=${timeout}ms)`);
|
|
137
|
-
try {
|
|
138
|
-
const findings = await runTrufflehog(content, timeout, verifiedOnly);
|
|
139
|
-
const duration = performance.now() - startTime;
|
|
140
|
-
logger.debug(`TruffleHog scan completed in ${duration.toFixed(2)}ms: found ${findings.length} potential secrets`);
|
|
141
|
-
const redactedContent = redactSecrets(content, findings);
|
|
142
|
-
return {
|
|
143
|
-
success: true,
|
|
144
|
-
findings,
|
|
145
|
-
hasVerifiedSecrets: findings.some((f) => f.verified),
|
|
146
|
-
hasSecrets: findings.length > 0,
|
|
147
|
-
redactedContent,
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
const duration = performance.now() - startTime;
|
|
152
|
-
logger.error(`Secret scan failed after ${duration.toFixed(2)}ms: `, getErrorMeta(error));
|
|
153
|
-
return {
|
|
154
|
-
success: false,
|
|
155
|
-
findings: [],
|
|
156
|
-
error: error instanceof Error ? error.message : String(error),
|
|
157
|
-
hasVerifiedSecrets: false,
|
|
158
|
-
hasSecrets: false,
|
|
159
|
-
redactedContent: content, // Return original content on error
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
114
|
/**
|
|
164
115
|
* Runs TruffleHog CLI using stdin and returns parsed findings.
|
|
165
116
|
*
|
|
@@ -171,7 +122,7 @@ export async function scanContentForSecrets(content, options = {}) {
|
|
|
171
122
|
* @param verifiedOnly - Whether to only return verified secrets
|
|
172
123
|
* @returns Promise resolving to array of SecretFinding objects
|
|
173
124
|
*/
|
|
174
|
-
async function runTrufflehog(content, timeout, verifiedOnly) {
|
|
125
|
+
export async function runTrufflehog(content, timeout, verifiedOnly) {
|
|
175
126
|
return new Promise((resolve, reject) => {
|
|
176
127
|
const args = ["stdin", "--json"];
|
|
177
128
|
if (!shouldSkipNoUpdateFlag()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret-scanner.js","sourceRoot":"","sources":["../../../src/ai-service/security/secret-scanner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"secret-scanner.js","sourceRoot":"","sources":["../../../src/ai-service/security/secret-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const content = "# GraphQL Integrations\n\nReference documentation for working with GraphQL APIs in Superblocks.\n\n## GraphQL Class\n\n```typescript\nimport { GraphQL } from \"@superblocksteam/library\";\n\nnew GraphQL(\"fetch_users\", \"graphql-integration-id\", {\n query: `\n query GetUsers($limit: Int!) {\n users(limit: $limit) {\n id\n name\n email\n }\n }\n `,\n variables: { limit: 10 }
|
|
1
|
+
export declare const content = "# GraphQL Integrations\n\nReference documentation for working with GraphQL APIs in Superblocks.\n\n## GraphQL Class\n\n```typescript\nimport { GraphQL } from \"@superblocksteam/library\";\n\nnew GraphQL(\"fetch_users\", \"graphql-integration-id\", {\n query: `\n query GetUsers($limit: Int!) {\n users(limit: $limit) {\n id\n name\n email\n }\n }\n `,\n variables: { limit: 10 },\n});\n```\n\n## Output Structure\n\n**IMPORTANT**: GraphQL responses have a specific structure:\n\n```typescript\n// GraphQL output format\n{\n data: {\n users: [...]\n },\n errors?: [...]\n}\n\n// Access query results\nnew JavaScript(\"process\", {\n fn: ({ fetch_users }) => {\n const result = fetch_users.output;\n // Always access via .data property\n return result.data.users;\n }\n})\n```\n\n## Dynamic Queries\n\n```typescript\nnew GraphQL(\"search\", \"graphql-id\", {\n query: `\n query SearchUsers($term: String!, $limit: Int) {\n searchUsers(term: $term, limit: $limit) {\n id\n name\n matchScore\n }\n }\n `,\n variables: ({\n searchTerm,\n pageSize,\n }: {\n searchTerm: string;\n pageSize: number;\n }) => ({\n term: searchTerm,\n limit: pageSize,\n }),\n});\n```\n\n## Mutations\n\n```typescript\nnew GraphQL(\"create_user\", \"graphql-id\", {\n query: `\n mutation CreateUser($input: CreateUserInput!) {\n createUser(input: $input) {\n id\n name\n email\n createdAt\n }\n }\n `,\n variables: ({ name, email }: { name: string; email: string }) => ({\n input: { name, email },\n }),\n});\n```\n\n## Common Patterns\n\n### Query with Fragments\n\n```typescript\nnew GraphQL(\"complex_query\", \"graphql-id\", {\n query: `\n fragment UserFields on User {\n id\n name\n email\n }\n \n query GetUsersAndOrders($userId: ID!) {\n user(id: $userId) {\n ...UserFields\n orders {\n id\n total\n status\n }\n }\n }\n `,\n variables: ({ userId }: { userId: string }) => ({ userId }),\n});\n```\n\n### Pagination with Connections\n\n```typescript\nnew GraphQL(\"paginated_list\", \"graphql-id\", {\n query: `\n query ListItems($first: Int!, $after: String) {\n items(first: $first, after: $after) {\n edges {\n node {\n id\n name\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n `,\n variables: ({ pageSize, cursor }: { pageSize: number; cursor?: string }) => ({\n first: pageSize,\n after: cursor,\n }),\n});\n```\n\n### Batch Operations\n\n```typescript\nnew GraphQL(\"batch_update\", \"graphql-id\", {\n query: `\n mutation BatchUpdateItems($updates: [ItemUpdateInput!]!) {\n batchUpdateItems(updates: $updates) {\n success\n updatedCount\n errors {\n itemId\n message\n }\n }\n }\n `,\n variables: ({ items }: { items: Array<{ id: string; status: string }> }) => ({\n updates: items.map((item) => ({\n id: item.id,\n status: item.status,\n })),\n }),\n});\n```\n\n## Error Handling\n\nGraphQL can return both data and errors:\n\n```typescript\nnew GraphQL(\"risky_query\", \"graphql-id\", { ... }),\n\nnew JavaScript(\"handle_response\", {\n fn: ({ risky_query }) => {\n const result = risky_query.output;\n\n if (result.errors && result.errors.length > 0) {\n // Handle partial errors\n console.error(\"GraphQL errors:\", result.errors);\n }\n\n // Data may still be present even with errors\n return result.data?.items ?? [];\n }\n})\n```\n\n## Subscriptions\n\n**Note**: GraphQL subscriptions are not directly supported. For real-time data, consider:\n\n1. Polling with Loop blocks\n2. WebSocket integrations if available\n3. REST webhook endpoints\n\n## Best Practices\n\n1. **Always select specific fields** - Don't over-fetch\n2. **Use variables** - Never interpolate strings in queries\n3. **Handle partial responses** - GraphQL can return data with errors\n4. **Access via .data** - Always use `output.data.fieldName`\n5. **Use fragments** - For reusable field selections\n";
|
|
2
2
|
//# sourceMappingURL=graphql.generated.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql.generated.d.ts","sourceRoot":"","sources":["../../../../../../src/ai-service/skills/system/superblocks-api/references/graphql.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"graphql.generated.d.ts","sourceRoot":"","sources":["../../../../../../src/ai-service/skills/system/superblocks-api/references/graphql.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,2rIAkNnB,CAAC"}
|
|
@@ -19,8 +19,8 @@ new GraphQL("fetch_users", "graphql-integration-id", {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
\`,
|
|
22
|
-
variables: { limit: 10 }
|
|
23
|
-
})
|
|
22
|
+
variables: { limit: 10 },
|
|
23
|
+
});
|
|
24
24
|
\`\`\`
|
|
25
25
|
|
|
26
26
|
## Output Structure
|
|
@@ -59,11 +59,17 @@ new GraphQL("search", "graphql-id", {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
\`,
|
|
62
|
-
variables: ({
|
|
62
|
+
variables: ({
|
|
63
|
+
searchTerm,
|
|
64
|
+
pageSize,
|
|
65
|
+
}: {
|
|
66
|
+
searchTerm: string;
|
|
67
|
+
pageSize: number;
|
|
68
|
+
}) => ({
|
|
63
69
|
term: searchTerm,
|
|
64
|
-
limit: pageSize
|
|
65
|
-
})
|
|
66
|
-
})
|
|
70
|
+
limit: pageSize,
|
|
71
|
+
}),
|
|
72
|
+
});
|
|
67
73
|
\`\`\`
|
|
68
74
|
|
|
69
75
|
## Mutations
|
|
@@ -81,9 +87,9 @@ new GraphQL("create_user", "graphql-id", {
|
|
|
81
87
|
}
|
|
82
88
|
\`,
|
|
83
89
|
variables: ({ name, email }: { name: string; email: string }) => ({
|
|
84
|
-
input: { name, email }
|
|
85
|
-
})
|
|
86
|
-
})
|
|
90
|
+
input: { name, email },
|
|
91
|
+
}),
|
|
92
|
+
});
|
|
87
93
|
\`\`\`
|
|
88
94
|
|
|
89
95
|
## Common Patterns
|
|
@@ -110,8 +116,8 @@ new GraphQL("complex_query", "graphql-id", {
|
|
|
110
116
|
}
|
|
111
117
|
}
|
|
112
118
|
\`,
|
|
113
|
-
variables: ({ userId }: { userId: string }) => ({ userId })
|
|
114
|
-
})
|
|
119
|
+
variables: ({ userId }: { userId: string }) => ({ userId }),
|
|
120
|
+
});
|
|
115
121
|
\`\`\`
|
|
116
122
|
|
|
117
123
|
### Pagination with Connections
|
|
@@ -137,9 +143,9 @@ new GraphQL("paginated_list", "graphql-id", {
|
|
|
137
143
|
\`,
|
|
138
144
|
variables: ({ pageSize, cursor }: { pageSize: number; cursor?: string }) => ({
|
|
139
145
|
first: pageSize,
|
|
140
|
-
after: cursor
|
|
141
|
-
})
|
|
142
|
-
})
|
|
146
|
+
after: cursor,
|
|
147
|
+
}),
|
|
148
|
+
});
|
|
143
149
|
\`\`\`
|
|
144
150
|
|
|
145
151
|
### Batch Operations
|
|
@@ -159,12 +165,12 @@ new GraphQL("batch_update", "graphql-id", {
|
|
|
159
165
|
}
|
|
160
166
|
\`,
|
|
161
167
|
variables: ({ items }: { items: Array<{ id: string; status: string }> }) => ({
|
|
162
|
-
updates: items.map(item => ({
|
|
168
|
+
updates: items.map((item) => ({
|
|
163
169
|
id: item.id,
|
|
164
|
-
status: item.status
|
|
165
|
-
}))
|
|
166
|
-
})
|
|
167
|
-
})
|
|
170
|
+
status: item.status,
|
|
171
|
+
})),
|
|
172
|
+
}),
|
|
173
|
+
});
|
|
168
174
|
\`\`\`
|
|
169
175
|
|
|
170
176
|
## Error Handling
|
|
@@ -177,12 +183,12 @@ new GraphQL("risky_query", "graphql-id", { ... }),
|
|
|
177
183
|
new JavaScript("handle_response", {
|
|
178
184
|
fn: ({ risky_query }) => {
|
|
179
185
|
const result = risky_query.output;
|
|
180
|
-
|
|
186
|
+
|
|
181
187
|
if (result.errors && result.errors.length > 0) {
|
|
182
188
|
// Handle partial errors
|
|
183
189
|
console.error("GraphQL errors:", result.errors);
|
|
184
190
|
}
|
|
185
|
-
|
|
191
|
+
|
|
186
192
|
// Data may still be present even with errors
|
|
187
193
|
return result.data?.items ?? [];
|
|
188
194
|
}
|
|
@@ -192,6 +198,7 @@ new JavaScript("handle_response", {
|
|
|
192
198
|
## Subscriptions
|
|
193
199
|
|
|
194
200
|
**Note**: GraphQL subscriptions are not directly supported. For real-time data, consider:
|
|
201
|
+
|
|
195
202
|
1. Polling with Loop blocks
|
|
196
203
|
2. WebSocket integrations if available
|
|
197
204
|
3. REST webhook endpoints
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql.generated.js","sourceRoot":"","sources":["../../../../../../src/ai-service/skills/system/superblocks-api/references/graphql.generated.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,mDAAmD;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG
|
|
1
|
+
{"version":3,"file":"graphql.generated.js","sourceRoot":"","sources":["../../../../../../src/ai-service/skills/system/superblocks-api/references/graphql.generated.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,mDAAmD;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkNtB,CAAC"}
|