@superblocksteam/vite-plugin-file-sync 2.0.123 → 2.0.124-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts +16 -1
- 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 +27 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.js +3 -1
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-comparator.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-comparator.js +1 -4
- package/dist/ai-service/agent/tools/apis/api-comparator.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-testing-state.js +7 -0
- package/dist/ai-service/agent/tools/apis/api-testing-state.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-api-docs.d.ts +1 -1
- package/dist/ai-service/agent/tools/apis/write-api.d.ts +2 -2
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.js +11 -33
- package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -1
- package/dist/ai-service/agent/tools/build-copy-directory.d.ts +1 -1
- package/dist/ai-service/agent/tools/build-finalize.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-finalize.js +11 -2
- package/dist/ai-service/agent/tools/build-finalize.js.map +1 -1
- package/dist/ai-service/agent/tools/build-install-packages.d.ts +41 -1
- package/dist/ai-service/agent/tools/build-install-packages.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-install-packages.js +208 -0
- package/dist/ai-service/agent/tools/build-install-packages.js.map +1 -1
- package/dist/ai-service/agent/tools/build-lookup-npm-package.d.ts +28 -0
- package/dist/ai-service/agent/tools/build-lookup-npm-package.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/build-lookup-npm-package.js +78 -0
- package/dist/ai-service/agent/tools/build-lookup-npm-package.js.map +1 -0
- package/dist/ai-service/agent/tools/build-manage-checklist.d.ts +4 -4
- package/dist/ai-service/agent/tools/build-navigate-preview.d.ts +16 -0
- package/dist/ai-service/agent/tools/build-navigate-preview.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/build-navigate-preview.js +68 -0
- package/dist/ai-service/agent/tools/build-navigate-preview.js.map +1 -0
- package/dist/ai-service/agent/tools/build-write-file.d.ts +1 -1
- package/dist/ai-service/agent/tools/databases/dev-database.d.ts +9 -9
- package/dist/ai-service/agent/tools/index.d.ts +2 -0
- package/dist/ai-service/agent/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/index.js +2 -0
- package/dist/ai-service/agent/tools/index.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts +3 -3
- package/dist/ai-service/agent/tools/report-security-findings.d.ts +11 -5
- package/dist/ai-service/agent/tools/report-security-findings.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/report-security-findings.js +1 -0
- package/dist/ai-service/agent/tools/report-security-findings.js.map +1 -1
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +3 -1
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/git.d.ts +2 -2
- package/dist/ai-service/agent/tools2/tools/grep.d.ts +2 -2
- package/dist/ai-service/agent/tools2/tools/update-test-case-status.d.ts +2 -2
- package/dist/ai-service/app-interface/npm-error-parser.d.ts +161 -0
- package/dist/ai-service/app-interface/npm-error-parser.d.ts.map +1 -0
- package/dist/ai-service/app-interface/npm-error-parser.js +510 -0
- package/dist/ai-service/app-interface/npm-error-parser.js.map +1 -0
- package/dist/ai-service/app-interface/npm-package-lookup.d.ts +286 -0
- package/dist/ai-service/app-interface/npm-package-lookup.d.ts.map +1 -0
- package/dist/ai-service/app-interface/npm-package-lookup.js +793 -0
- package/dist/ai-service/app-interface/npm-package-lookup.js.map +1 -0
- package/dist/ai-service/app-interface/npm-registry.d.ts +735 -47
- package/dist/ai-service/app-interface/npm-registry.d.ts.map +1 -1
- package/dist/ai-service/app-interface/npm-registry.js +1882 -153
- package/dist/ai-service/app-interface/npm-registry.js.map +1 -1
- package/dist/ai-service/app-interface/shell.d.ts +118 -1
- package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
- package/dist/ai-service/app-interface/shell.js +579 -157
- package/dist/ai-service/app-interface/shell.js.map +1 -1
- package/dist/ai-service/app-skills/manager.d.ts +1 -1
- package/dist/ai-service/app-skills/manager.d.ts.map +1 -1
- package/dist/ai-service/app-skills/manager.js +39 -7
- package/dist/ai-service/app-skills/manager.js.map +1 -1
- package/dist/ai-service/checklist/api-migration-checklist-gate.d.ts +9 -0
- package/dist/ai-service/checklist/api-migration-checklist-gate.d.ts.map +1 -0
- package/dist/ai-service/checklist/api-migration-checklist-gate.js +30 -0
- package/dist/ai-service/checklist/api-migration-checklist-gate.js.map +1 -0
- package/dist/ai-service/checklist/api-migration-origins.d.ts +4 -0
- package/dist/ai-service/checklist/api-migration-origins.d.ts.map +1 -0
- package/dist/ai-service/checklist/api-migration-origins.js +8 -0
- package/dist/ai-service/checklist/api-migration-origins.js.map +1 -0
- package/dist/ai-service/checklist/persisted-checklist-store.d.ts +2 -3
- package/dist/ai-service/checklist/persisted-checklist-store.d.ts.map +1 -1
- package/dist/ai-service/checklist/persisted-checklist-store.js +6 -7
- package/dist/ai-service/checklist/persisted-checklist-store.js.map +1 -1
- package/dist/ai-service/context-archive-paths.d.ts +4 -0
- package/dist/ai-service/context-archive-paths.d.ts.map +1 -0
- package/dist/ai-service/context-archive-paths.js +28 -0
- package/dist/ai-service/context-archive-paths.js.map +1 -0
- package/dist/ai-service/context-download.d.ts +3 -1
- package/dist/ai-service/context-download.d.ts.map +1 -1
- package/dist/ai-service/context-download.js +48 -9
- package/dist/ai-service/context-download.js.map +1 -1
- package/dist/ai-service/context-upload.d.ts +3 -2
- package/dist/ai-service/context-upload.d.ts.map +1 -1
- package/dist/ai-service/context-upload.js +44 -26
- package/dist/ai-service/context-upload.js.map +1 -1
- package/dist/ai-service/dev-database-client.d.ts +3 -11
- package/dist/ai-service/dev-database-client.d.ts.map +1 -1
- package/dist/ai-service/dev-database-client.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 +8 -0
- package/dist/ai-service/features.js.map +1 -1
- package/dist/ai-service/filter-disabled-tools-for-migration.d.ts.map +1 -1
- package/dist/ai-service/filter-disabled-tools-for-migration.js +4 -0
- package/dist/ai-service/filter-disabled-tools-for-migration.js.map +1 -1
- package/dist/ai-service/index.d.ts +94 -0
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +564 -17
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/llm/client.d.ts +38 -3
- package/dist/ai-service/llm/client.d.ts.map +1 -1
- package/dist/ai-service/llm/client.js +73 -22
- package/dist/ai-service/llm/client.js.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.d.ts +3 -1
- package/dist/ai-service/llm/context-v2/adapter.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.js +11 -11
- package/dist/ai-service/llm/context-v2/adapter.js.map +1 -1
- package/dist/ai-service/llm/context-v2/compaction/client-side.d.ts +44 -0
- package/dist/ai-service/llm/context-v2/compaction/client-side.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/client-side.js +170 -0
- package/dist/ai-service/llm/context-v2/compaction/client-side.js.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/compaction-strategy.d.ts +56 -0
- package/dist/ai-service/llm/context-v2/compaction/compaction-strategy.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/compaction-strategy.js +9 -0
- package/dist/ai-service/llm/context-v2/compaction/compaction-strategy.js.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/index.d.ts +5 -0
- package/dist/ai-service/llm/context-v2/compaction/index.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/index.js +3 -0
- package/dist/ai-service/llm/context-v2/compaction/index.js.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts +30 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.js +130 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.js.map +1 -0
- package/dist/ai-service/llm/context-v2/context-management.d.ts +203 -0
- package/dist/ai-service/llm/context-v2/context-management.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/context-management.js +183 -0
- package/dist/ai-service/llm/context-v2/context-management.js.map +1 -0
- package/dist/ai-service/llm/context-v2/context.d.ts +64 -22
- package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/context.js +233 -157
- package/dist/ai-service/llm/context-v2/context.js.map +1 -1
- package/dist/ai-service/llm/context-v2/conversation-context.d.ts +24 -7
- package/dist/ai-service/llm/context-v2/conversation-context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/conversation-context.js +1 -1
- package/dist/ai-service/llm/context-v2/index.d.ts +0 -4
- package/dist/ai-service/llm/context-v2/index.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/index.js +0 -4
- package/dist/ai-service/llm/context-v2/index.js.map +1 -1
- package/dist/ai-service/llm/context-v2/manager.d.ts +24 -3
- package/dist/ai-service/llm/context-v2/manager.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/manager.js +146 -4
- package/dist/ai-service/llm/context-v2/manager.js.map +1 -1
- package/dist/ai-service/llm/context-v2/migrations/v1-to-v2.d.ts +2 -7
- package/dist/ai-service/llm/context-v2/migrations/v1-to-v2.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/migrations/v1-to-v2.js +5 -73
- package/dist/ai-service/llm/context-v2/migrations/v1-to-v2.js.map +1 -1
- package/dist/ai-service/llm/context-v2/storage/event-store.d.ts +57 -0
- package/dist/ai-service/llm/context-v2/storage/event-store.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/event-store.js +10 -0
- package/dist/ai-service/llm/context-v2/storage/event-store.js.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/event-types.d.ts +50 -0
- package/dist/ai-service/llm/context-v2/storage/event-types.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/event-types.js +10 -0
- package/dist/ai-service/llm/context-v2/storage/event-types.js.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.d.ts +87 -0
- package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.js +184 -0
- package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.js.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/migration.d.ts +49 -0
- package/dist/ai-service/llm/context-v2/storage/migration.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/migration.js +126 -0
- package/dist/ai-service/llm/context-v2/storage/migration.js.map +1 -0
- package/dist/ai-service/llm/context-v2/types.d.ts +16 -11
- package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/types.js +2 -2
- package/dist/ai-service/llm/context-v2/types.js.map +1 -1
- package/dist/ai-service/llm/impl/clark.d.ts +8 -0
- package/dist/ai-service/llm/impl/clark.d.ts.map +1 -1
- package/dist/ai-service/llm/impl/clark.js +8 -0
- package/dist/ai-service/llm/impl/clark.js.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.d.ts.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.js +17 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.js.map +1 -1
- package/dist/ai-service/llm/provider.d.ts.map +1 -1
- package/dist/ai-service/llm/provider.js +1 -3
- package/dist/ai-service/llm/provider.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/context.d.ts +23 -0
- package/dist/ai-service/llm/stream/observers/context.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/context.js +62 -0
- package/dist/ai-service/llm/stream/observers/context.js.map +1 -1
- package/dist/ai-service/llm/tool-context-integrity.d.ts +25 -0
- package/dist/ai-service/llm/tool-context-integrity.d.ts.map +1 -0
- package/dist/ai-service/llm/tool-context-integrity.js +141 -0
- package/dist/ai-service/llm/tool-context-integrity.js.map +1 -0
- package/dist/ai-service/skills/system/superblocks-migration/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-migration/skill.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-migration/skill.generated.js +6 -1
- package/dist/ai-service/skills/system/superblocks-migration/skill.generated.js.map +1 -1
- package/dist/ai-service/skills/system/third-party-migration/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/third-party-migration/skill.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/third-party-migration/skill.generated.js +3 -2
- package/dist/ai-service/skills/system/third-party-migration/skill.generated.js.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +23 -2
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +37 -2
- 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 +29 -2
- package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.js +9 -0
- package/dist/ai-service/state-machine/handlers/awaiting-user.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 +25 -2
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/fetch-with-reconnect-retry.d.ts +6 -0
- package/dist/ai-service/state-machine/helpers/fetch-with-reconnect-retry.d.ts.map +1 -0
- package/dist/ai-service/state-machine/helpers/fetch-with-reconnect-retry.js +36 -0
- package/dist/ai-service/state-machine/helpers/fetch-with-reconnect-retry.js.map +1 -0
- package/dist/ai-service/state-machine/helpers/stable-peer.d.ts +30 -1
- package/dist/ai-service/state-machine/helpers/stable-peer.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/stable-peer.js +85 -2
- package/dist/ai-service/state-machine/helpers/stable-peer.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/user-preferences.d.ts +8 -0
- package/dist/ai-service/state-machine/helpers/user-preferences.d.ts.map +1 -0
- package/dist/ai-service/state-machine/helpers/user-preferences.js +11 -0
- package/dist/ai-service/state-machine/helpers/user-preferences.js.map +1 -0
- package/dist/ai-service/template-renderer.d.ts +18 -1
- package/dist/ai-service/template-renderer.d.ts.map +1 -1
- package/dist/ai-service/template-renderer.js +73 -12
- package/dist/ai-service/template-renderer.js.map +1 -1
- package/dist/ai-service/types.d.ts +157 -0
- package/dist/ai-service/types.d.ts.map +1 -1
- package/dist/ai-service/types.js +137 -0
- package/dist/ai-service/types.js.map +1 -1
- package/dist/ai-service/util/llm-config-utils.d.ts +21 -22
- package/dist/ai-service/util/llm-config-utils.d.ts.map +1 -1
- package/dist/ai-service/util/llm-config-utils.js +40 -67
- package/dist/ai-service/util/llm-config-utils.js.map +1 -1
- package/dist/file-sync-vite-plugin.d.ts.map +1 -1
- package/dist/file-sync-vite-plugin.js +5 -0
- package/dist/file-sync-vite-plugin.js.map +1 -1
- package/dist/file-system-helpers.d.ts +17 -0
- package/dist/file-system-helpers.d.ts.map +1 -1
- package/dist/file-system-helpers.js +22 -0
- package/dist/file-system-helpers.js.map +1 -1
- package/dist/git-service/index.d.ts.map +1 -1
- package/dist/git-service/index.js +15 -1
- package/dist/git-service/index.js.map +1 -1
- package/dist/migration/migration-routes.d.ts.map +1 -1
- package/dist/migration/migration-routes.js +26 -3
- package/dist/migration/migration-routes.js.map +1 -1
- package/dist/migration/translation-prompt.d.ts.map +1 -1
- package/dist/migration/translation-prompt.js +5 -0
- package/dist/migration/translation-prompt.js.map +1 -1
- package/dist/migration-templates/app-fullstack/package.json +2 -2
- package/dist/policy-gate-callback-mapper.d.ts +24 -0
- package/dist/policy-gate-callback-mapper.d.ts.map +1 -0
- package/dist/policy-gate-callback-mapper.js +61 -0
- package/dist/policy-gate-callback-mapper.js.map +1 -0
- package/dist/policy-gate-runner.d.ts +32 -0
- package/dist/policy-gate-runner.d.ts.map +1 -0
- package/dist/policy-gate-runner.js +191 -0
- package/dist/policy-gate-runner.js.map +1 -0
- package/dist/router-parser.d.ts.map +1 -1
- package/dist/router-parser.js +107 -11
- package/dist/router-parser.js.map +1 -1
- package/dist/sync-service/list-dir.d.ts.map +1 -1
- package/dist/sync-service/list-dir.js +13 -3
- package/dist/sync-service/list-dir.js.map +1 -1
- package/package.json +28 -10
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"react-day-picker": "^9.9.0",
|
|
52
52
|
"react-dom": "18.2.0",
|
|
53
53
|
"react-dropzone": "^14.3.8",
|
|
54
|
-
"react-router": "^7.
|
|
54
|
+
"react-router": "^7.12.0",
|
|
55
55
|
"react-syntax-highlighter": "^16.1.0",
|
|
56
56
|
"recharts": "3.3.0",
|
|
57
57
|
"sonner": "^2.0.7",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
72
72
|
"eslint-plugin-react-refresh": "^0.5.0",
|
|
73
73
|
"globals": "^17.3.0",
|
|
74
|
-
"postcss": "^8.5.
|
|
74
|
+
"postcss": "^8.5.10",
|
|
75
75
|
"tailwindcss": "^4.1.12",
|
|
76
76
|
"tsx": "^4.0.0",
|
|
77
77
|
"tw-animate-css": "^1.3.7",
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReportReviewRunInput } from "./ai-service/agent/tools/report-security-findings.js";
|
|
2
|
+
export type PolicyGateMode = "advisory" | "blocking";
|
|
3
|
+
/** Matches POST /api/v1/policy-gates/review-runs/state finding objects (server writer). */
|
|
4
|
+
export interface PolicyGateCallbackFinding {
|
|
5
|
+
blocking: boolean;
|
|
6
|
+
category: "external_policy" | "misconfiguration" | "security_agent" | "secret" | "sensitive_data" | "vulnerability";
|
|
7
|
+
clarkRemediable: boolean;
|
|
8
|
+
confidence?: "high" | "low" | "medium" | null;
|
|
9
|
+
evidenceJson?: Record<string, unknown>;
|
|
10
|
+
fingerprint: string;
|
|
11
|
+
humanSummary?: string | null;
|
|
12
|
+
locationsJson?: unknown[];
|
|
13
|
+
remediationHintJson?: Record<string, unknown>;
|
|
14
|
+
severity: "critical" | "high" | "info" | "low" | "medium";
|
|
15
|
+
sourcePhase?: "edit_mode_app" | null;
|
|
16
|
+
sourceTool: string;
|
|
17
|
+
technicalSummary?: string | null;
|
|
18
|
+
title: string;
|
|
19
|
+
}
|
|
20
|
+
type AgentFinding = ReportReviewRunInput["findings"][number];
|
|
21
|
+
export declare function mapFindingCategory(agentCategory: AgentFinding["category"] | string): PolicyGateCallbackFinding["category"];
|
|
22
|
+
export declare function mapAgentFindingsToPolicyGateCallback(findings: AgentFinding[], aiAgentRunId: string, policyMode: PolicyGateMode): PolicyGateCallbackFinding[];
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=policy-gate-callback-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-gate-callback-mapper.d.ts","sourceRoot":"","sources":["../src/policy-gate-callback-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sDAAsD,CAAC;AAEjG,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,UAAU,CAAC;AAErD,2FAA2F;AAC3F,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EACJ,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,QAAQ,GACR,gBAAgB,GAChB,eAAe,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1D,WAAW,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,KAAK,YAAY,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,YAAY,CAAC,UAAU,CAAC,GAAG,MAAM,GAC/C,yBAAyB,CAAC,UAAU,CAAC,CAiBvC;AAMD,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,YAAY,EAAE,EACxB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,cAAc,GACzB,yBAAyB,EAAE,CAsC7B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export function mapFindingCategory(agentCategory) {
|
|
2
|
+
switch (agentCategory) {
|
|
3
|
+
case "secret":
|
|
4
|
+
return "secret";
|
|
5
|
+
case "injection":
|
|
6
|
+
case "xss":
|
|
7
|
+
return "vulnerability";
|
|
8
|
+
case "data_exposure":
|
|
9
|
+
return "sensitive_data";
|
|
10
|
+
case "config":
|
|
11
|
+
case "crypto":
|
|
12
|
+
return "misconfiguration";
|
|
13
|
+
case "auth":
|
|
14
|
+
case "other":
|
|
15
|
+
default:
|
|
16
|
+
return "security_agent";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
// Policy mode is authoritative for the gate decision. The admin's intent
|
|
20
|
+
// (blocking vs advisory) outranks the LLM's severity rating, which reflects
|
|
21
|
+
// exploitability and isn't always aligned with the admin's policy concern
|
|
22
|
+
// (e.g. a styling rule like "no green buttons" is medium severity, but a
|
|
23
|
+
// blocking-mode policy should still block the deploy).
|
|
24
|
+
export function mapAgentFindingsToPolicyGateCallback(findings, aiAgentRunId, policyMode) {
|
|
25
|
+
return findings.map((finding) => {
|
|
26
|
+
const blocking = policyMode === "blocking";
|
|
27
|
+
const location = {
|
|
28
|
+
filePath: finding.location.file,
|
|
29
|
+
};
|
|
30
|
+
if (finding.location.component) {
|
|
31
|
+
location.component = finding.location.component;
|
|
32
|
+
}
|
|
33
|
+
if (finding.location.line !== undefined) {
|
|
34
|
+
location.line = finding.location.line;
|
|
35
|
+
}
|
|
36
|
+
const callbackFinding = {
|
|
37
|
+
blocking,
|
|
38
|
+
category: mapFindingCategory(finding.category),
|
|
39
|
+
clarkRemediable: finding.clarkRemediable,
|
|
40
|
+
confidence: finding.confidence,
|
|
41
|
+
evidenceJson: {
|
|
42
|
+
evidence: finding.evidence,
|
|
43
|
+
},
|
|
44
|
+
fingerprint: `${aiAgentRunId}-${finding.id}`,
|
|
45
|
+
humanSummary: finding.description,
|
|
46
|
+
locationsJson: [location],
|
|
47
|
+
severity: finding.severity,
|
|
48
|
+
sourcePhase: "edit_mode_app",
|
|
49
|
+
sourceTool: "dev-server-security-agent",
|
|
50
|
+
technicalSummary: finding.description,
|
|
51
|
+
title: finding.title,
|
|
52
|
+
};
|
|
53
|
+
if (finding.suggestedFix) {
|
|
54
|
+
callbackFinding.remediationHintJson = {
|
|
55
|
+
suggestedFix: finding.suggestedFix,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return callbackFinding;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=policy-gate-callback-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-gate-callback-mapper.js","sourceRoot":"","sources":["../src/policy-gate-callback-mapper.ts"],"names":[],"mappings":"AA8BA,MAAM,UAAU,kBAAkB,CAChC,aAAgD;IAEhD,QAAQ,aAAa,EAAE,CAAC;QACtB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,WAAW,CAAC;QACjB,KAAK,KAAK;YACR,OAAO,eAAe,CAAC;QACzB,KAAK,eAAe;YAClB,OAAO,gBAAgB,CAAC;QAC1B,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,kBAAkB,CAAC;QAC5B,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb;YACE,OAAO,gBAAgB,CAAC;IAC5B,CAAC;AACH,CAAC;AACD,yEAAyE;AACzE,4EAA4E;AAC5E,0EAA0E;AAC1E,yEAAyE;AACzE,uDAAuD;AACvD,MAAM,UAAU,oCAAoC,CAClD,QAAwB,EACxB,YAAoB,EACpB,UAA0B;IAE1B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,MAAM,QAAQ,GAAG,UAAU,KAAK,UAAU,CAAC;QAC3C,MAAM,QAAQ,GAA4B;YACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;SAChC,CAAC;QACF,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC/B,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QACxC,CAAC;QAED,MAAM,eAAe,GAA8B;YACjD,QAAQ;YACR,QAAQ,EAAE,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC9C,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,YAAY,EAAE;gBACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B;YACD,WAAW,EAAE,GAAG,YAAY,IAAI,OAAO,CAAC,EAAE,EAAE;YAC5C,YAAY,EAAE,OAAO,CAAC,WAAW;YACjC,aAAa,EAAE,CAAC,QAAQ,CAAC;YACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,eAAe;YAC5B,UAAU,EAAE,2BAA2B;YACvC,gBAAgB,EAAE,OAAO,CAAC,WAAW;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC;QACF,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,eAAe,CAAC,mBAAmB,GAAG;gBACpC,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC,CAAC;QACJ,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ViteDevServer } from "vite";
|
|
2
|
+
import type { LLMProviderConfig } from "@superblocksteam/library-shared/types";
|
|
3
|
+
import type { AiService } from "./ai-service/index.js";
|
|
4
|
+
export type PolicyGateMode = "advisory" | "blocking";
|
|
5
|
+
export interface PolicyGateAssignment {
|
|
6
|
+
aiAgentRunId: string;
|
|
7
|
+
applicationCommitId: string;
|
|
8
|
+
applicationId: string;
|
|
9
|
+
directoryContentsHash: string;
|
|
10
|
+
executionContext: string;
|
|
11
|
+
llmConfig?: LLMProviderConfig;
|
|
12
|
+
mode: PolicyGateMode;
|
|
13
|
+
organizationId: string;
|
|
14
|
+
profileId: string;
|
|
15
|
+
promptConfigJson?: Record<string, unknown>;
|
|
16
|
+
reviewPolicyId: string;
|
|
17
|
+
reviewPolicyVersionId: string;
|
|
18
|
+
runnerType: string;
|
|
19
|
+
runtime: string;
|
|
20
|
+
token: string;
|
|
21
|
+
trigger: string;
|
|
22
|
+
}
|
|
23
|
+
export interface PolicyGateRoutesDeps {
|
|
24
|
+
aiService?: AiService;
|
|
25
|
+
superblocksBaseUrl?: string;
|
|
26
|
+
}
|
|
27
|
+
type PolicyGateExecutionRequest = Parameters<NonNullable<PolicyGateRoutesDeps["aiService"]>["handlePolicyGateExecution"]>[0];
|
|
28
|
+
export declare function buildPolicyGateRuntimeMetadata(assignment: PolicyGateAssignment, runtimeMetadataJson?: Record<string, unknown>, finalFailureReason?: string): Record<string, unknown>;
|
|
29
|
+
export declare function buildPolicyGateExecutionRequest(assignment: PolicyGateAssignment): PolicyGateExecutionRequest;
|
|
30
|
+
export declare function registerPolicyGateRoutes(server: ViteDevServer, deps: PolicyGateRoutesDeps): void;
|
|
31
|
+
export { mapFindingCategory } from "./policy-gate-callback-mapper.js";
|
|
32
|
+
//# sourceMappingURL=policy-gate-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-gate-runner.d.ts","sourceRoot":"","sources":["../src/policy-gate-runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIvD,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,UAAU,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAI9B,IAAI,EAAE,cAAc,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AA2CD,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,KAAK,0BAA0B,GAAG,UAAU,CAC1C,WAAW,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAC5E,CAAC,CAAC,CAAC,CAAC;AAEL,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,oBAAoB,EAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzB;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,oBAAoB,GAC/B,0BAA0B,CAY5B;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,oBAAoB,GACzB,IAAI,CA0EN;AA6FD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import bodyParser from "body-parser";
|
|
2
|
+
import { mapAgentFindingsToPolicyGateCallback } from "./policy-gate-callback-mapper.js";
|
|
3
|
+
import { getErrorMeta, getLogger } from "./util/logger.js";
|
|
4
|
+
const REQUIRED_ASSIGNMENT_FIELDS = [
|
|
5
|
+
"aiAgentRunId",
|
|
6
|
+
"applicationCommitId",
|
|
7
|
+
"applicationId",
|
|
8
|
+
"directoryContentsHash",
|
|
9
|
+
"executionContext",
|
|
10
|
+
"mode",
|
|
11
|
+
"organizationId",
|
|
12
|
+
"profileId",
|
|
13
|
+
"reviewPolicyId",
|
|
14
|
+
"reviewPolicyVersionId",
|
|
15
|
+
"runnerType",
|
|
16
|
+
"runtime",
|
|
17
|
+
"token",
|
|
18
|
+
"trigger",
|
|
19
|
+
];
|
|
20
|
+
const VALID_MODES = ["advisory", "blocking"];
|
|
21
|
+
function validateAssignment(body) {
|
|
22
|
+
if (!body || typeof body !== "object") {
|
|
23
|
+
return { error: "Request body must be a JSON object" };
|
|
24
|
+
}
|
|
25
|
+
const obj = body;
|
|
26
|
+
for (const field of REQUIRED_ASSIGNMENT_FIELDS) {
|
|
27
|
+
if (typeof obj[field] !== "string" || obj[field] === "") {
|
|
28
|
+
return { error: `Missing or invalid field: ${field}` };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (!VALID_MODES.includes(obj.mode)) {
|
|
32
|
+
return {
|
|
33
|
+
error: `Invalid mode: ${String(obj.mode)} (expected 'advisory' or 'blocking')`,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return { assignment: obj };
|
|
37
|
+
}
|
|
38
|
+
const CALLBACK_PATH = "/api/v1/policy-gates/review-runs/state";
|
|
39
|
+
export function buildPolicyGateRuntimeMetadata(assignment, runtimeMetadataJson, finalFailureReason) {
|
|
40
|
+
return {
|
|
41
|
+
assignedContentHash: assignment.directoryContentsHash,
|
|
42
|
+
applicationCommitId: assignment.applicationCommitId,
|
|
43
|
+
...(runtimeMetadataJson ?? {}),
|
|
44
|
+
...(finalFailureReason && { finalFailureReason }),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function buildPolicyGateExecutionRequest(assignment) {
|
|
48
|
+
const adminPrompt = typeof assignment.promptConfigJson?.prompt === "string"
|
|
49
|
+
? assignment.promptConfigJson.prompt
|
|
50
|
+
: undefined;
|
|
51
|
+
return {
|
|
52
|
+
adminPrompt,
|
|
53
|
+
aiAgentRunId: assignment.aiAgentRunId,
|
|
54
|
+
applicationId: assignment.applicationId,
|
|
55
|
+
llmConfig: assignment.llmConfig,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function registerPolicyGateRoutes(server, deps) {
|
|
59
|
+
const logger = getLogger();
|
|
60
|
+
server.middlewares.use("/_sb_policy_gates/v1/execute", bodyParser.json({ limit: "1mb" }));
|
|
61
|
+
server.middlewares.use("/_sb_policy_gates/v1/execute", (req, res, next) => {
|
|
62
|
+
if (req.method !== "POST") {
|
|
63
|
+
return next();
|
|
64
|
+
}
|
|
65
|
+
void (async () => {
|
|
66
|
+
try {
|
|
67
|
+
const body = req.body;
|
|
68
|
+
const validation = validateAssignment(body);
|
|
69
|
+
if ("error" in validation) {
|
|
70
|
+
res.statusCode = 400;
|
|
71
|
+
res.end(JSON.stringify({ error: validation.error }));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const { assignment } = validation;
|
|
75
|
+
if (!deps.superblocksBaseUrl) {
|
|
76
|
+
logger.error("[policy-gate-runner] superblocksBaseUrl not configured");
|
|
77
|
+
res.statusCode = 500;
|
|
78
|
+
res.end(JSON.stringify({ error: "Server base URL not configured" }));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (!deps.aiService) {
|
|
82
|
+
logger.error("[policy-gate-runner] AI service not available");
|
|
83
|
+
res.statusCode = 503;
|
|
84
|
+
res.end(JSON.stringify({ error: "AI service not available" }));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
logger.info(`[policy-gate-runner] Received assignment for run ${assignment.aiAgentRunId}`);
|
|
88
|
+
res.statusCode = 200;
|
|
89
|
+
res.setHeader("Content-Type", "application/json");
|
|
90
|
+
res.end(JSON.stringify({
|
|
91
|
+
accepted: true,
|
|
92
|
+
aiAgentRunId: assignment.aiAgentRunId,
|
|
93
|
+
}));
|
|
94
|
+
void executePolicyGateRun(assignment, deps.aiService, deps.superblocksBaseUrl, logger);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
logger.error("[policy-gate-runner] Error handling assignment", getErrorMeta(error));
|
|
98
|
+
res.statusCode = 500;
|
|
99
|
+
res.end(JSON.stringify({ error: "Internal error" }));
|
|
100
|
+
}
|
|
101
|
+
})();
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async function executePolicyGateRun(assignment, aiService, superblocksBaseUrl, logger) {
|
|
105
|
+
const startedAt = new Date().toISOString();
|
|
106
|
+
try {
|
|
107
|
+
try {
|
|
108
|
+
await postRunState(assignment, superblocksBaseUrl, logger, {
|
|
109
|
+
status: "running",
|
|
110
|
+
startedAt,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (runningError) {
|
|
114
|
+
logger.error("[policy-gate-runner] Failed to post running state, aborting execution", getErrorMeta(runningError));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const result = await aiService.handlePolicyGateExecution(buildPolicyGateExecutionRequest(assignment));
|
|
118
|
+
const completedAt = new Date().toISOString();
|
|
119
|
+
const findings = mapAgentFindingsToPolicyGateCallback(result.findings, assignment.aiAgentRunId, assignment.mode);
|
|
120
|
+
const hasBlockingFindings = findings.some((f) => f.blocking);
|
|
121
|
+
await postRunState(assignment, superblocksBaseUrl, logger, {
|
|
122
|
+
completedAt,
|
|
123
|
+
decision: hasBlockingFindings ? "blocked" : "allowed",
|
|
124
|
+
decisionReason: hasBlockingFindings
|
|
125
|
+
? `Security agent found ${findings.filter((f) => f.blocking).length} blocking finding(s)`
|
|
126
|
+
: "No blocking findings detected",
|
|
127
|
+
findings,
|
|
128
|
+
findingsWriteMode: "replace",
|
|
129
|
+
runtimeMetadataJson: buildPolicyGateRuntimeMetadata(assignment, result.runtimeMetadataJson),
|
|
130
|
+
startedAt,
|
|
131
|
+
status: hasBlockingFindings ? "blocked" : "passed",
|
|
132
|
+
});
|
|
133
|
+
logger.info(`[policy-gate-runner] Completed run ${assignment.aiAgentRunId}: ${findings.length} findings, ${hasBlockingFindings ? "blocked" : "passed"}`);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
logger.error("[policy-gate-runner] Execution failed", getErrorMeta(error));
|
|
137
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown execution error";
|
|
138
|
+
const runtimeMetadataJson = error &&
|
|
139
|
+
typeof error === "object" &&
|
|
140
|
+
"runtimeMetadataJson" in error &&
|
|
141
|
+
error.runtimeMetadataJson &&
|
|
142
|
+
typeof error.runtimeMetadataJson === "object" &&
|
|
143
|
+
!Array.isArray(error.runtimeMetadataJson)
|
|
144
|
+
? error.runtimeMetadataJson
|
|
145
|
+
: undefined;
|
|
146
|
+
await postRunState(assignment, superblocksBaseUrl, logger, {
|
|
147
|
+
completedAt: new Date().toISOString(),
|
|
148
|
+
decision: "error_blocked",
|
|
149
|
+
errorCode: "execution_failed",
|
|
150
|
+
errorMessage,
|
|
151
|
+
runtimeMetadataJson: buildPolicyGateRuntimeMetadata(assignment, runtimeMetadataJson, errorMessage),
|
|
152
|
+
startedAt,
|
|
153
|
+
status: "errored",
|
|
154
|
+
}).catch((callbackError) => {
|
|
155
|
+
logger.error("[policy-gate-runner] Failed to post error state", getErrorMeta(callbackError));
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export { mapFindingCategory } from "./policy-gate-callback-mapper.js";
|
|
160
|
+
async function postRunState(assignment, superblocksBaseUrl, logger, state) {
|
|
161
|
+
const callbackUrl = `${superblocksBaseUrl}${CALLBACK_PATH}`;
|
|
162
|
+
const payload = {
|
|
163
|
+
aiAgentRunId: assignment.aiAgentRunId,
|
|
164
|
+
applicationCommitId: assignment.applicationCommitId,
|
|
165
|
+
applicationId: assignment.applicationId,
|
|
166
|
+
directoryContentsHash: assignment.directoryContentsHash,
|
|
167
|
+
executionContext: assignment.executionContext,
|
|
168
|
+
profileId: assignment.profileId,
|
|
169
|
+
reviewPolicyId: assignment.reviewPolicyId,
|
|
170
|
+
reviewPolicyVersionId: assignment.reviewPolicyVersionId,
|
|
171
|
+
runnerType: assignment.runnerType,
|
|
172
|
+
runtime: assignment.runtime,
|
|
173
|
+
trigger: assignment.trigger,
|
|
174
|
+
...state,
|
|
175
|
+
};
|
|
176
|
+
const response = await fetch(callbackUrl, {
|
|
177
|
+
body: JSON.stringify(payload),
|
|
178
|
+
headers: {
|
|
179
|
+
Authorization: `Bearer ${assignment.token}`,
|
|
180
|
+
"Content-Type": "application/json",
|
|
181
|
+
},
|
|
182
|
+
method: "POST",
|
|
183
|
+
});
|
|
184
|
+
if (!response.ok) {
|
|
185
|
+
const text = await response.text().catch(() => "");
|
|
186
|
+
logger.error(`[policy-gate-runner] Callback POST failed: ${response.status} ${text}`);
|
|
187
|
+
throw new Error(`Callback POST failed with HTTP ${response.status}`);
|
|
188
|
+
}
|
|
189
|
+
logger.info(`[policy-gate-runner] Posted run state for ${assignment.aiAgentRunId}: ${JSON.stringify(state.status)}`);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=policy-gate-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-gate-runner.js","sourceRoot":"","sources":["../src/policy-gate-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-parser.d.ts","sourceRoot":"","sources":["../src/router-parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"router-parser.d.ts","sourceRoot":"","sources":["../src/router-parser.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AA0LD;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwDrE;AAgPD;;GAEG;AACH,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,EAAE,CAAC,CAoK5B"}
|
package/dist/router-parser.js
CHANGED
|
@@ -254,8 +254,12 @@ function logUnresolvedComponent(kind, name, routerFilePath) {
|
|
|
254
254
|
}
|
|
255
255
|
/**
|
|
256
256
|
* Extract the string specifier from `import("...")` or `import("...").then(...)`.
|
|
257
|
+
*
|
|
258
|
+
* When `callableImportMap` is provided, also resolves `obj.prop()` and
|
|
259
|
+
* `obj.prop().then(...)` patterns where `obj.prop` is a known import-returning
|
|
260
|
+
* callable (e.g. `const pageChunks = { Home: () => import("./pages/Home.tsx") }`).
|
|
257
261
|
*/
|
|
258
|
-
function extractImportSpecifierFromExpression(node) {
|
|
262
|
+
function extractImportSpecifierFromExpression(node, callableImportMap) {
|
|
259
263
|
if (!node)
|
|
260
264
|
return null;
|
|
261
265
|
// Direct import("...")
|
|
@@ -272,8 +276,50 @@ function extractImportSpecifierFromExpression(node) {
|
|
|
272
276
|
node.callee.object.arguments[0]?.type === "StringLiteral") {
|
|
273
277
|
return node.callee.object.arguments[0].value;
|
|
274
278
|
}
|
|
279
|
+
if (callableImportMap && callableImportMap.size > 0) {
|
|
280
|
+
// obj.prop() — direct call to a known import-returning function
|
|
281
|
+
if (node.type === "CallExpression" &&
|
|
282
|
+
node.callee.type === "MemberExpression") {
|
|
283
|
+
const resolved = resolveCallableMemberExpression(node.callee, callableImportMap);
|
|
284
|
+
if (resolved)
|
|
285
|
+
return resolved;
|
|
286
|
+
}
|
|
287
|
+
// obj.prop().then(...) — call to a known import-returning function followed by .then()
|
|
288
|
+
if (node.type === "CallExpression" &&
|
|
289
|
+
node.callee.type === "MemberExpression" &&
|
|
290
|
+
!node.callee.computed &&
|
|
291
|
+
node.callee.property.type === "Identifier" &&
|
|
292
|
+
node.callee.property.name === "then" &&
|
|
293
|
+
node.callee.object.type === "CallExpression" &&
|
|
294
|
+
node.callee.object.callee.type === "MemberExpression") {
|
|
295
|
+
const resolved = resolveCallableMemberExpression(node.callee.object.callee, callableImportMap);
|
|
296
|
+
if (resolved)
|
|
297
|
+
return resolved;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
275
300
|
return null;
|
|
276
301
|
}
|
|
302
|
+
/**
|
|
303
|
+
* Resolve a `MemberExpression` against a callable-import map, supporting both
|
|
304
|
+
* dot access (`obj.foo`) and computed string-literal access (`obj["foo"]`).
|
|
305
|
+
*
|
|
306
|
+
* Computed access with a dynamic key (e.g. `obj[name]`) is intentionally not
|
|
307
|
+
* resolved — there is no way to know the property name at parse time.
|
|
308
|
+
*/
|
|
309
|
+
function resolveCallableMemberExpression(member, callableImportMap) {
|
|
310
|
+
if (member.object.type !== "Identifier")
|
|
311
|
+
return null;
|
|
312
|
+
let propName = null;
|
|
313
|
+
if (!member.computed && member.property.type === "Identifier") {
|
|
314
|
+
propName = member.property.name;
|
|
315
|
+
}
|
|
316
|
+
else if (member.computed && member.property.type === "StringLiteral") {
|
|
317
|
+
propName = member.property.value;
|
|
318
|
+
}
|
|
319
|
+
if (!propName)
|
|
320
|
+
return null;
|
|
321
|
+
return callableImportMap.get(member.object.name)?.get(propName) ?? null;
|
|
322
|
+
}
|
|
277
323
|
/**
|
|
278
324
|
* Extract the dynamic import specifier from the body of a `() => ...` arrow.
|
|
279
325
|
*
|
|
@@ -283,8 +329,10 @@ function extractImportSpecifierFromExpression(node) {
|
|
|
283
329
|
* async () => await import("./Page.tsx")
|
|
284
330
|
* async () => { const m = await import("./Page.tsx"); return { Component: m.default }; }
|
|
285
331
|
* () => { return import("./Page.tsx"); }
|
|
332
|
+
* () => obj.prop() (when obj.prop is a known import-returning callable)
|
|
333
|
+
* () => obj.prop().then(mod => (...)) (same, with .then() chained)
|
|
286
334
|
*/
|
|
287
|
-
function extractImportPathFromArrowFunction(node) {
|
|
335
|
+
function extractImportPathFromArrowFunction(node, callableImportMap) {
|
|
288
336
|
const body = node.body;
|
|
289
337
|
if (body.type === "BlockStatement") {
|
|
290
338
|
for (const statement of body.body) {
|
|
@@ -293,7 +341,7 @@ function extractImportPathFromArrowFunction(node) {
|
|
|
293
341
|
let init = decl.init;
|
|
294
342
|
if (init?.type === "AwaitExpression")
|
|
295
343
|
init = init.argument;
|
|
296
|
-
const path = extractImportSpecifierFromExpression(init);
|
|
344
|
+
const path = extractImportSpecifierFromExpression(init, callableImportMap);
|
|
297
345
|
if (path)
|
|
298
346
|
return path;
|
|
299
347
|
}
|
|
@@ -302,7 +350,7 @@ function extractImportPathFromArrowFunction(node) {
|
|
|
302
350
|
let arg = statement.argument;
|
|
303
351
|
if (arg?.type === "AwaitExpression")
|
|
304
352
|
arg = arg.argument;
|
|
305
|
-
const path = extractImportSpecifierFromExpression(arg);
|
|
353
|
+
const path = extractImportSpecifierFromExpression(arg, callableImportMap);
|
|
306
354
|
if (path)
|
|
307
355
|
return path;
|
|
308
356
|
}
|
|
@@ -311,7 +359,7 @@ function extractImportPathFromArrowFunction(node) {
|
|
|
311
359
|
}
|
|
312
360
|
// Expression body — possibly wrapped in `await`
|
|
313
361
|
const expr = body.type === "AwaitExpression" && body.argument ? body.argument : body;
|
|
314
|
-
return extractImportSpecifierFromExpression(expr);
|
|
362
|
+
return extractImportSpecifierFromExpression(expr, callableImportMap);
|
|
315
363
|
}
|
|
316
364
|
/**
|
|
317
365
|
* Recognize `lazy(() => import("..."))` or `React.lazy(() => import("..."))`
|
|
@@ -389,6 +437,10 @@ export async function parseRouterFile(routerFilePath, rootDir) {
|
|
|
389
437
|
let routesArray = null;
|
|
390
438
|
// Collect top-level variable declarations so we can resolve identifier references
|
|
391
439
|
const variableDeclarations = new Map();
|
|
440
|
+
// Collect top-level objects whose properties are import-returning arrow functions.
|
|
441
|
+
// e.g. const pageChunks = { Home: () => import("./pages/Home.tsx") }
|
|
442
|
+
// Maps objectName → (propertyName → importPath)
|
|
443
|
+
const callableImportMap = new Map();
|
|
392
444
|
traverse(ast, {
|
|
393
445
|
VariableDeclarator(astPath) {
|
|
394
446
|
const node = astPath.node;
|
|
@@ -414,6 +466,50 @@ export async function parseRouterFile(routerFilePath, rootDir) {
|
|
|
414
466
|
(declarationParent.isExportNamedDeclaration() &&
|
|
415
467
|
(declarationParent.parentPath?.isProgram() ?? false))
|
|
416
468
|
: false;
|
|
469
|
+
// Collect top-level object expressions with arrow-function properties
|
|
470
|
+
// that contain import() calls (e.g. preload/chunk maps).
|
|
471
|
+
// Unwrap `as const` / `satisfies T` wrappers the same way we do for arrays.
|
|
472
|
+
if (isTopLevel) {
|
|
473
|
+
let objectExpr = null;
|
|
474
|
+
if (node.init.type === "ObjectExpression") {
|
|
475
|
+
objectExpr = node.init;
|
|
476
|
+
}
|
|
477
|
+
else if (node.init.type === "TSAsExpression" &&
|
|
478
|
+
node.init.expression.type === "ObjectExpression") {
|
|
479
|
+
objectExpr = node.init.expression;
|
|
480
|
+
}
|
|
481
|
+
else if (node.init.type === "TSSatisfiesExpression" &&
|
|
482
|
+
node.init.expression.type === "ObjectExpression") {
|
|
483
|
+
objectExpr = node.init.expression;
|
|
484
|
+
}
|
|
485
|
+
if (objectExpr) {
|
|
486
|
+
const propMap = new Map();
|
|
487
|
+
for (const prop of objectExpr.properties) {
|
|
488
|
+
if (prop.type !== "ObjectProperty" ||
|
|
489
|
+
prop.value.type !== "ArrowFunctionExpression") {
|
|
490
|
+
continue;
|
|
491
|
+
}
|
|
492
|
+
// Accept both identifier keys (`Welcome:`) and string-literal
|
|
493
|
+
// keys (`"my-page":`); both look up the same way at call sites.
|
|
494
|
+
let propName = null;
|
|
495
|
+
if (prop.key.type === "Identifier" && !prop.computed) {
|
|
496
|
+
propName = prop.key.name;
|
|
497
|
+
}
|
|
498
|
+
else if (prop.key.type === "StringLiteral") {
|
|
499
|
+
propName = prop.key.value;
|
|
500
|
+
}
|
|
501
|
+
if (!propName)
|
|
502
|
+
continue;
|
|
503
|
+
const importPath = extractImportPathFromArrowFunction(prop.value);
|
|
504
|
+
if (importPath && isRelativeOrAliasImport(importPath)) {
|
|
505
|
+
propMap.set(propName, importPath);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
if (propMap.size > 0) {
|
|
509
|
+
callableImportMap.set(node.id.name, propMap);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
417
513
|
if (isTopLevel && !allImports.has(node.id.name)) {
|
|
418
514
|
const lazyImportPath = extractLazyImportPath(node.init);
|
|
419
515
|
if (lazyImportPath && isRelativeOrAliasImport(lazyImportPath)) {
|
|
@@ -457,7 +553,7 @@ export async function parseRouterFile(routerFilePath, rootDir) {
|
|
|
457
553
|
});
|
|
458
554
|
// Process routes asynchronously after traverse
|
|
459
555
|
if (routesArray) {
|
|
460
|
-
await extractRoutesFromArray(routesArray, routes, routerFilePath, rootDir, "", allImports);
|
|
556
|
+
await extractRoutesFromArray(routesArray, routes, routerFilePath, rootDir, "", allImports, callableImportMap);
|
|
461
557
|
}
|
|
462
558
|
return routes;
|
|
463
559
|
}
|
|
@@ -466,14 +562,14 @@ export async function parseRouterFile(routerFilePath, rootDir) {
|
|
|
466
562
|
return [];
|
|
467
563
|
}
|
|
468
564
|
}
|
|
469
|
-
async function extractRoutesFromArray(node, routes, routerFilePath, rootDir, parentPath, allImports) {
|
|
565
|
+
async function extractRoutesFromArray(node, routes, routerFilePath, rootDir, parentPath, allImports, callableImportMap) {
|
|
470
566
|
for (const element of node.elements) {
|
|
471
567
|
if (element && element.type === "ObjectExpression") {
|
|
472
|
-
await extractRouteFromObject(element, routes, routerFilePath, rootDir, parentPath, allImports);
|
|
568
|
+
await extractRouteFromObject(element, routes, routerFilePath, rootDir, parentPath, allImports, callableImportMap);
|
|
473
569
|
}
|
|
474
570
|
}
|
|
475
571
|
}
|
|
476
|
-
async function extractRouteFromObject(node, routes, routerFilePath, rootDir, parentPath, allImports) {
|
|
572
|
+
async function extractRouteFromObject(node, routes, routerFilePath, rootDir, parentPath, allImports, callableImportMap) {
|
|
477
573
|
let routePath = null;
|
|
478
574
|
let pageImportPath = null;
|
|
479
575
|
let children = null;
|
|
@@ -490,7 +586,7 @@ async function extractRouteFromObject(node, routes, routerFilePath, rootDir, par
|
|
|
490
586
|
}
|
|
491
587
|
else if (key === "lazy" &&
|
|
492
588
|
prop.value.type === "ArrowFunctionExpression") {
|
|
493
|
-
const path = extractImportPathFromArrowFunction(prop.value);
|
|
589
|
+
const path = extractImportPathFromArrowFunction(prop.value, callableImportMap);
|
|
494
590
|
if (path)
|
|
495
591
|
pageImportPath = path;
|
|
496
592
|
}
|
|
@@ -603,7 +699,7 @@ async function extractRouteFromObject(node, routes, routerFilePath, rootDir, par
|
|
|
603
699
|
const currentPath = routePath ? joinURL(parentPath, routePath) : parentPath;
|
|
604
700
|
// Normalize empty path to "/" before passing to children
|
|
605
701
|
const normalizedCurrentPath = currentPath || "/";
|
|
606
|
-
await extractRoutesFromArray(children, routes, routerFilePath, rootDir, normalizedCurrentPath, allImports);
|
|
702
|
+
await extractRoutesFromArray(children, routes, routerFilePath, rootDir, normalizedCurrentPath, allImports, callableImportMap);
|
|
607
703
|
}
|
|
608
704
|
}
|
|
609
705
|
//# sourceMappingURL=router-parser.js.map
|