@ghx-dev/core 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +212 -0
- package/dist/agent-interface/prompt/main-skill.d.ts +3 -0
- package/dist/agent-interface/prompt/main-skill.js +7 -0
- package/dist/agent-interface/prompt/main-skill.js.map +1 -0
- package/dist/agent-interface/tools/execute-tool.d.ts +16 -0
- package/dist/agent-interface/tools/execute-tool.js +7 -0
- package/dist/agent-interface/tools/execute-tool.js.map +1 -0
- package/dist/agent-interface/tools/explain-tool.d.ts +11 -0
- package/dist/agent-interface/tools/explain-tool.js +9 -0
- package/dist/agent-interface/tools/explain-tool.js.map +1 -0
- package/dist/agent-interface/tools/list-capabilities-tool.d.ts +7 -0
- package/dist/agent-interface/tools/list-capabilities-tool.js +9 -0
- package/dist/agent-interface/tools/list-capabilities-tool.js.map +1 -0
- package/dist/agent.d.ts +7 -0
- package/dist/agent.js +21 -0
- package/dist/agent.js.map +1 -0
- package/dist/chunk-2W4L5YCC.js +116 -0
- package/dist/chunk-2W4L5YCC.js.map +1 -0
- package/dist/chunk-3RAT5BCB.js +584 -0
- package/dist/chunk-3RAT5BCB.js.map +1 -0
- package/dist/chunk-3RJCF42N.js +16 -0
- package/dist/chunk-3RJCF42N.js.map +1 -0
- package/dist/chunk-573MDG3I.js +18 -0
- package/dist/chunk-573MDG3I.js.map +1 -0
- package/dist/chunk-5JRLVOF2.js +50 -0
- package/dist/chunk-5JRLVOF2.js.map +1 -0
- package/dist/chunk-B6RLMKS4.js +41 -0
- package/dist/chunk-B6RLMKS4.js.map +1 -0
- package/dist/chunk-BJHVAFTN.js +42 -0
- package/dist/chunk-BJHVAFTN.js.map +1 -0
- package/dist/chunk-D746VR3B.js +38 -0
- package/dist/chunk-D746VR3B.js.map +1 -0
- package/dist/chunk-DJIEG6K7.js +20 -0
- package/dist/chunk-DJIEG6K7.js.map +1 -0
- package/dist/chunk-DLKIQBK6.js +106 -0
- package/dist/chunk-DLKIQBK6.js.map +1 -0
- package/dist/chunk-EBRDO4Y6.js +31 -0
- package/dist/chunk-EBRDO4Y6.js.map +1 -0
- package/dist/chunk-FXN6IIT5.js +14 -0
- package/dist/chunk-FXN6IIT5.js.map +1 -0
- package/dist/chunk-GPU4P7UG.js +92 -0
- package/dist/chunk-GPU4P7UG.js.map +1 -0
- package/dist/chunk-MMG6CIKK.js +44 -0
- package/dist/chunk-MMG6CIKK.js.map +1 -0
- package/dist/chunk-MT4U5DYD.js +88 -0
- package/dist/chunk-MT4U5DYD.js.map +1 -0
- package/dist/chunk-NFF5VF4U.js +28 -0
- package/dist/chunk-NFF5VF4U.js.map +1 -0
- package/dist/chunk-Q4RTT3DV.js +209 -0
- package/dist/chunk-Q4RTT3DV.js.map +1 -0
- package/dist/chunk-QEAMC4IJ.js +34 -0
- package/dist/chunk-QEAMC4IJ.js.map +1 -0
- package/dist/chunk-QX34GTH6.js +30 -0
- package/dist/chunk-QX34GTH6.js.map +1 -0
- package/dist/chunk-QZZC53HF.js +38 -0
- package/dist/chunk-QZZC53HF.js.map +1 -0
- package/dist/chunk-RUQXGZ35.js +34 -0
- package/dist/chunk-RUQXGZ35.js.map +1 -0
- package/dist/chunk-TCLMLVUQ.js +38 -0
- package/dist/chunk-TCLMLVUQ.js.map +1 -0
- package/dist/chunk-TDTKOJKN.js +52 -0
- package/dist/chunk-TDTKOJKN.js.map +1 -0
- package/dist/chunk-UGWIZ3RI.js +7 -0
- package/dist/chunk-UGWIZ3RI.js.map +1 -0
- package/dist/chunk-UOJWOHRM.js +16 -0
- package/dist/chunk-UOJWOHRM.js.map +1 -0
- package/dist/chunk-VD5NXQP7.js +42 -0
- package/dist/chunk-VD5NXQP7.js.map +1 -0
- package/dist/chunk-W2TKG2UL.js +37 -0
- package/dist/chunk-W2TKG2UL.js.map +1 -0
- package/dist/chunk-W6ROKCY5.js +28 -0
- package/dist/chunk-W6ROKCY5.js.map +1 -0
- package/dist/chunk-WYSY75U7.js +156 -0
- package/dist/chunk-WYSY75U7.js.map +1 -0
- package/dist/chunk-YNNDBMNR.js +113 -0
- package/dist/chunk-YNNDBMNR.js.map +1 -0
- package/dist/chunk-YNQNHCRS.js +198 -0
- package/dist/chunk-YNQNHCRS.js.map +1 -0
- package/dist/chunk-YQDQX4BT.js +624 -0
- package/dist/chunk-YQDQX4BT.js.map +1 -0
- package/dist/cli/commands/capabilities-explain.d.ts +3 -0
- package/dist/cli/commands/capabilities-explain.js +10 -0
- package/dist/cli/commands/capabilities-explain.js.map +1 -0
- package/dist/cli/commands/capabilities-list.d.ts +3 -0
- package/dist/cli/commands/capabilities-list.js +10 -0
- package/dist/cli/commands/capabilities-list.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.js +7 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/routes.d.ts +3 -0
- package/dist/cli/commands/routes.js +7 -0
- package/dist/cli/commands/routes.js.map +1 -0
- package/dist/cli/commands/run.d.ts +3 -0
- package/dist/cli/commands/run.js +31 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +3 -0
- package/dist/cli/commands/setup.js +7 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/formatters/json.d.ts +3 -0
- package/dist/cli/formatters/json.js +8 -0
- package/dist/cli/formatters/json.js.map +1 -0
- package/dist/cli/formatters/table.d.ts +3 -0
- package/dist/cli/formatters/table.js +8 -0
- package/dist/cli/formatters/table.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.js +118 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/contracts/envelope.d.ts +43 -0
- package/dist/core/contracts/envelope.js +1 -0
- package/dist/core/contracts/envelope.js.map +1 -0
- package/dist/core/contracts/task.d.ts +7 -0
- package/dist/core/contracts/task.js +1 -0
- package/dist/core/contracts/task.js.map +1 -0
- package/dist/core/contracts/tasks/check_run.annotations.list.d.ts +5 -0
- package/dist/core/contracts/tasks/check_run.annotations.list.js +8 -0
- package/dist/core/contracts/tasks/check_run.annotations.list.js.map +1 -0
- package/dist/core/contracts/tasks/issue.comments.list.d.ts +5 -0
- package/dist/core/contracts/tasks/issue.comments.list.js +8 -0
- package/dist/core/contracts/tasks/issue.comments.list.js.map +1 -0
- package/dist/core/contracts/tasks/issue.list.d.ts +5 -0
- package/dist/core/contracts/tasks/issue.list.js +8 -0
- package/dist/core/contracts/tasks/issue.list.js.map +1 -0
- package/dist/core/contracts/tasks/issue.view.d.ts +5 -0
- package/dist/core/contracts/tasks/issue.view.js +8 -0
- package/dist/core/contracts/tasks/issue.view.js.map +1 -0
- package/dist/core/contracts/tasks/pr.checks.get_failed.d.ts +5 -0
- package/dist/core/contracts/tasks/pr.checks.get_failed.js +8 -0
- package/dist/core/contracts/tasks/pr.checks.get_failed.js.map +1 -0
- package/dist/core/contracts/tasks/pr.comment.reply.d.ts +5 -0
- package/dist/core/contracts/tasks/pr.comment.reply.js +8 -0
- package/dist/core/contracts/tasks/pr.comment.reply.js.map +1 -0
- package/dist/core/contracts/tasks/pr.comment.resolve.d.ts +5 -0
- package/dist/core/contracts/tasks/pr.comment.resolve.js +8 -0
- package/dist/core/contracts/tasks/pr.comment.resolve.js.map +1 -0
- package/dist/core/contracts/tasks/pr.comment.unresolve.d.ts +5 -0
- package/dist/core/contracts/tasks/pr.comment.unresolve.js +8 -0
- package/dist/core/contracts/tasks/pr.comment.unresolve.js.map +1 -0
- package/dist/core/contracts/tasks/pr.comments.list.d.ts +5 -0
- package/dist/core/contracts/tasks/pr.comments.list.js +8 -0
- package/dist/core/contracts/tasks/pr.comments.list.js.map +1 -0
- package/dist/core/contracts/tasks/pr.diff.list_files.d.ts +5 -0
- package/dist/core/contracts/tasks/pr.diff.list_files.js +8 -0
- package/dist/core/contracts/tasks/pr.diff.list_files.js.map +1 -0
- package/dist/core/contracts/tasks/pr.list.d.ts +5 -0
- package/dist/core/contracts/tasks/pr.list.js +8 -0
- package/dist/core/contracts/tasks/pr.list.js.map +1 -0
- package/dist/core/contracts/tasks/pr.mergeability.view.d.ts +5 -0
- package/dist/core/contracts/tasks/pr.mergeability.view.js +8 -0
- package/dist/core/contracts/tasks/pr.mergeability.view.js.map +1 -0
- package/dist/core/contracts/tasks/pr.ready_for_review.set.d.ts +5 -0
- package/dist/core/contracts/tasks/pr.ready_for_review.set.js +8 -0
- package/dist/core/contracts/tasks/pr.ready_for_review.set.js.map +1 -0
- package/dist/core/contracts/tasks/pr.reviews.list.d.ts +5 -0
- package/dist/core/contracts/tasks/pr.reviews.list.js +8 -0
- package/dist/core/contracts/tasks/pr.reviews.list.js.map +1 -0
- package/dist/core/contracts/tasks/pr.status.checks.d.ts +5 -0
- package/dist/core/contracts/tasks/pr.status.checks.js +8 -0
- package/dist/core/contracts/tasks/pr.status.checks.js.map +1 -0
- package/dist/core/contracts/tasks/pr.view.d.ts +5 -0
- package/dist/core/contracts/tasks/pr.view.js +8 -0
- package/dist/core/contracts/tasks/pr.view.js.map +1 -0
- package/dist/core/contracts/tasks/repo.view.d.ts +5 -0
- package/dist/core/contracts/tasks/repo.view.js +8 -0
- package/dist/core/contracts/tasks/repo.view.js.map +1 -0
- package/dist/core/contracts/tasks/workflow_job.logs.analyze.d.ts +5 -0
- package/dist/core/contracts/tasks/workflow_job.logs.analyze.js +8 -0
- package/dist/core/contracts/tasks/workflow_job.logs.analyze.js.map +1 -0
- package/dist/core/contracts/tasks/workflow_job.logs.get.d.ts +5 -0
- package/dist/core/contracts/tasks/workflow_job.logs.get.js +8 -0
- package/dist/core/contracts/tasks/workflow_job.logs.get.js.map +1 -0
- package/dist/core/contracts/tasks/workflow_run.jobs.list.d.ts +5 -0
- package/dist/core/contracts/tasks/workflow_run.jobs.list.js +8 -0
- package/dist/core/contracts/tasks/workflow_run.jobs.list.js.map +1 -0
- package/dist/core/contracts/tasks/workflow_runs.list.d.ts +5 -0
- package/dist/core/contracts/tasks/workflow_runs.list.js +8 -0
- package/dist/core/contracts/tasks/workflow_runs.list.js.map +1 -0
- package/dist/core/errors/codes.d.ts +13 -0
- package/dist/core/errors/codes.js +7 -0
- package/dist/core/errors/codes.js.map +1 -0
- package/dist/core/errors/map-error.d.ts +5 -0
- package/dist/core/errors/map-error.js +8 -0
- package/dist/core/errors/map-error.js.map +1 -0
- package/dist/core/errors/retryability.d.ts +3 -0
- package/dist/core/errors/retryability.js +8 -0
- package/dist/core/errors/retryability.js.map +1 -0
- package/dist/core/execute/execute.d.ts +28 -0
- package/dist/core/execute/execute.js +11 -0
- package/dist/core/execute/execute.js.map +1 -0
- package/dist/core/execution/adapters/cli-adapter.d.ts +22 -0
- package/dist/core/execution/adapters/cli-adapter.js +69 -0
- package/dist/core/execution/adapters/cli-adapter.js.map +1 -0
- package/dist/core/execution/adapters/cli-capability-adapter.d.ts +16 -0
- package/dist/core/execution/adapters/cli-capability-adapter.js +11 -0
- package/dist/core/execution/adapters/cli-capability-adapter.js.map +1 -0
- package/dist/core/execution/adapters/graphql-adapter.d.ts +25 -0
- package/dist/core/execution/adapters/graphql-adapter.js +44 -0
- package/dist/core/execution/adapters/graphql-adapter.js.map +1 -0
- package/dist/core/execution/adapters/graphql-capability-adapter.d.ts +20 -0
- package/dist/core/execution/adapters/graphql-capability-adapter.js +11 -0
- package/dist/core/execution/adapters/graphql-capability-adapter.js.map +1 -0
- package/dist/core/execution/adapters/rest-adapter.d.ts +3 -0
- package/dist/core/execution/adapters/rest-adapter.js +8 -0
- package/dist/core/execution/adapters/rest-adapter.js.map +1 -0
- package/dist/core/execution/cli/safe-runner.d.ts +12 -0
- package/dist/core/execution/cli/safe-runner.js +7 -0
- package/dist/core/execution/cli/safe-runner.js.map +1 -0
- package/dist/core/execution/normalizer.d.ts +13 -0
- package/dist/core/execution/normalizer.js +9 -0
- package/dist/core/execution/normalizer.js.map +1 -0
- package/dist/core/execution/preflight.d.ts +24 -0
- package/dist/core/execution/preflight.js +8 -0
- package/dist/core/execution/preflight.js.map +1 -0
- package/dist/core/registry/cards/check_run.annotations.list.yaml +35 -0
- package/dist/core/registry/cards/issue.comments.list.yaml +48 -0
- package/dist/core/registry/cards/issue.list.yaml +48 -0
- package/dist/core/registry/cards/issue.view.yaml +32 -0
- package/dist/core/registry/cards/pr.checks.get_failed.yaml +42 -0
- package/dist/core/registry/cards/pr.comment.reply.yaml +23 -0
- package/dist/core/registry/cards/pr.comment.resolve.yaml +22 -0
- package/dist/core/registry/cards/pr.comment.unresolve.yaml +22 -0
- package/dist/core/registry/cards/pr.comments.list.yaml +98 -0
- package/dist/core/registry/cards/pr.diff.list_files.yaml +43 -0
- package/dist/core/registry/cards/pr.list.yaml +48 -0
- package/dist/core/registry/cards/pr.mergeability.view.yaml +27 -0
- package/dist/core/registry/cards/pr.ready_for_review.set.yaml +24 -0
- package/dist/core/registry/cards/pr.reviews.list.yaml +47 -0
- package/dist/core/registry/cards/pr.status.checks.yaml +42 -0
- package/dist/core/registry/cards/pr.view.yaml +32 -0
- package/dist/core/registry/cards/repo.view.yaml +34 -0
- package/dist/core/registry/cards/workflow_job.logs.analyze.yaml +33 -0
- package/dist/core/registry/cards/workflow_job.logs.get.yaml +24 -0
- package/dist/core/registry/cards/workflow_run.jobs.list.yaml +35 -0
- package/dist/core/registry/cards/workflow_runs.list.yaml +45 -0
- package/dist/core/registry/index.d.ts +15 -0
- package/dist/core/registry/index.js +12 -0
- package/dist/core/registry/index.js.map +1 -0
- package/dist/core/registry/operation-card-schema.d.ts +167 -0
- package/dist/core/registry/operation-card-schema.js +7 -0
- package/dist/core/registry/operation-card-schema.js.map +1 -0
- package/dist/core/registry/schema-validator.d.ts +16 -0
- package/dist/core/registry/schema-validator.js +9 -0
- package/dist/core/registry/schema-validator.js.map +1 -0
- package/dist/core/registry/types.d.ts +51 -0
- package/dist/core/registry/types.js +1 -0
- package/dist/core/registry/types.js.map +1 -0
- package/dist/core/routing/capability-registry.d.ts +8 -0
- package/dist/core/routing/capability-registry.js +15 -0
- package/dist/core/routing/capability-registry.js.map +1 -0
- package/dist/core/routing/engine.d.ts +32 -0
- package/dist/core/routing/engine.js +23 -0
- package/dist/core/routing/engine.js.map +1 -0
- package/dist/core/routing/policy.d.ts +3 -0
- package/dist/core/routing/policy.js +7 -0
- package/dist/core/routing/policy.js.map +1 -0
- package/dist/core/routing/reason-codes.d.ts +4 -0
- package/dist/core/routing/reason-codes.js +15 -0
- package/dist/core/routing/reason-codes.js.map +1 -0
- package/dist/core/telemetry/logger.d.ts +8 -0
- package/dist/core/telemetry/logger.js +9 -0
- package/dist/core/telemetry/logger.js.map +1 -0
- package/dist/core/telemetry/metrics.d.ts +7 -0
- package/dist/core/telemetry/metrics.js +1 -0
- package/dist/core/telemetry/metrics.js.map +1 -0
- package/dist/gql/client.d.ts +183 -0
- package/dist/gql/client.js +17 -0
- package/dist/gql/client.js.map +1 -0
- package/dist/gql/generated/common-types.d.ts +36 -0
- package/dist/gql/generated/common-types.js +1 -0
- package/dist/gql/generated/common-types.js.map +1 -0
- package/dist/gql/operations/issue-comments-list.generated.d.ts +59 -0
- package/dist/gql/operations/issue-comments-list.generated.js +9 -0
- package/dist/gql/operations/issue-comments-list.generated.js.map +1 -0
- package/dist/gql/operations/issue-list.generated.d.ts +40 -0
- package/dist/gql/operations/issue-list.generated.js +9 -0
- package/dist/gql/operations/issue-list.generated.js.map +1 -0
- package/dist/gql/operations/issue-view.generated.d.ts +31 -0
- package/dist/gql/operations/issue-view.generated.js +9 -0
- package/dist/gql/operations/issue-view.generated.js.map +1 -0
- package/dist/gql/operations/pr-comment-reply.generated.d.ts +26 -0
- package/dist/gql/operations/pr-comment-reply.generated.js +25 -0
- package/dist/gql/operations/pr-comment-reply.generated.js.map +1 -0
- package/dist/gql/operations/pr-comment-resolve.generated.d.ts +26 -0
- package/dist/gql/operations/pr-comment-resolve.generated.js +24 -0
- package/dist/gql/operations/pr-comment-resolve.generated.js.map +1 -0
- package/dist/gql/operations/pr-comment-unresolve.generated.d.ts +26 -0
- package/dist/gql/operations/pr-comment-unresolve.generated.js +24 -0
- package/dist/gql/operations/pr-comment-unresolve.generated.js.map +1 -0
- package/dist/gql/operations/pr-comments-list.generated.d.ts +84 -0
- package/dist/gql/operations/pr-comments-list.generated.js +58 -0
- package/dist/gql/operations/pr-comments-list.generated.js.map +1 -0
- package/dist/gql/operations/pr-diff-list-files.generated.d.ts +42 -0
- package/dist/gql/operations/pr-diff-list-files.generated.js +9 -0
- package/dist/gql/operations/pr-diff-list-files.generated.js.map +1 -0
- package/dist/gql/operations/pr-list.generated.d.ts +40 -0
- package/dist/gql/operations/pr-list.generated.js +9 -0
- package/dist/gql/operations/pr-list.generated.js.map +1 -0
- package/dist/gql/operations/pr-reviews-list.generated.d.ts +64 -0
- package/dist/gql/operations/pr-reviews-list.generated.js +9 -0
- package/dist/gql/operations/pr-reviews-list.generated.js.map +1 -0
- package/dist/gql/operations/pr-view.generated.d.ts +31 -0
- package/dist/gql/operations/pr-view.generated.js +9 -0
- package/dist/gql/operations/pr-view.generated.js.map +1 -0
- package/dist/gql/operations/repo-view.generated.d.ts +33 -0
- package/dist/gql/operations/repo-view.generated.js +9 -0
- package/dist/gql/operations/repo-view.generated.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/shared/constants.d.ts +3 -0
- package/dist/shared/constants.js +6 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/types.d.ts +3 -0
- package/dist/shared/types.js +1 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/shared/utils.d.ts +3 -0
- package/dist/shared/utils.js +8 -0
- package/dist/shared/utils.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import {
|
|
2
|
+
operationCardSchema
|
|
3
|
+
} from "./chunk-2W4L5YCC.js";
|
|
4
|
+
|
|
5
|
+
// src/core/registry/index.ts
|
|
6
|
+
import { readdirSync, readFileSync } from "fs";
|
|
7
|
+
import { dirname, extname, join } from "path";
|
|
8
|
+
import { fileURLToPath } from "url";
|
|
9
|
+
import Ajv from "ajv";
|
|
10
|
+
import { load as parseYaml } from "js-yaml";
|
|
11
|
+
var ajv = new Ajv({ allErrors: true, strict: false });
|
|
12
|
+
var validateCard = ajv.compile(operationCardSchema);
|
|
13
|
+
function cardDirectory() {
|
|
14
|
+
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
return join(currentDir, "cards");
|
|
16
|
+
}
|
|
17
|
+
function loadCardsFromYaml() {
|
|
18
|
+
const directory = cardDirectory();
|
|
19
|
+
const preferredOrder = [
|
|
20
|
+
"repo.view",
|
|
21
|
+
"issue.view",
|
|
22
|
+
"issue.list",
|
|
23
|
+
"issue.comments.list",
|
|
24
|
+
"pr.view",
|
|
25
|
+
"pr.list",
|
|
26
|
+
"pr.comments.list",
|
|
27
|
+
"pr.reviews.list",
|
|
28
|
+
"pr.diff.list_files",
|
|
29
|
+
"pr.status.checks",
|
|
30
|
+
"pr.checks.get_failed",
|
|
31
|
+
"pr.mergeability.view",
|
|
32
|
+
"pr.comment.reply",
|
|
33
|
+
"pr.comment.resolve",
|
|
34
|
+
"pr.comment.unresolve",
|
|
35
|
+
"pr.ready_for_review.set",
|
|
36
|
+
"check_run.annotations.list",
|
|
37
|
+
"workflow_runs.list",
|
|
38
|
+
"workflow_run.jobs.list",
|
|
39
|
+
"workflow_job.logs.get",
|
|
40
|
+
"workflow_job.logs.analyze"
|
|
41
|
+
];
|
|
42
|
+
const orderMap = new Map(preferredOrder.map((id, index) => [id, index]));
|
|
43
|
+
const entries = readdirSync(directory).filter((entry) => {
|
|
44
|
+
const extension = extname(entry).toLowerCase();
|
|
45
|
+
return extension === ".yaml" || extension === ".yml";
|
|
46
|
+
}).sort((a, b) => {
|
|
47
|
+
const capabilityA = a.replace(/\.ya?ml$/i, "");
|
|
48
|
+
const capabilityB = b.replace(/\.ya?ml$/i, "");
|
|
49
|
+
const orderA = orderMap.get(capabilityA) ?? Number.MAX_SAFE_INTEGER;
|
|
50
|
+
const orderB = orderMap.get(capabilityB) ?? Number.MAX_SAFE_INTEGER;
|
|
51
|
+
if (orderA !== orderB) {
|
|
52
|
+
return orderA - orderB;
|
|
53
|
+
}
|
|
54
|
+
return a.localeCompare(b);
|
|
55
|
+
});
|
|
56
|
+
return entries.map((entry) => {
|
|
57
|
+
const filePath = join(directory, entry);
|
|
58
|
+
const raw = readFileSync(filePath, "utf8");
|
|
59
|
+
const parsed = parseYaml(raw);
|
|
60
|
+
const validation = validateOperationCard(parsed);
|
|
61
|
+
if (!validation.ok) {
|
|
62
|
+
throw new Error(`Invalid operation card '${entry}': ${validation.error}`);
|
|
63
|
+
}
|
|
64
|
+
return parsed;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function validateOperationCard(card) {
|
|
68
|
+
const valid = validateCard(card);
|
|
69
|
+
if (!valid) {
|
|
70
|
+
const message = validateCard.errors?.[0]?.message ?? "Operation card schema validation failed";
|
|
71
|
+
return { ok: false, error: message };
|
|
72
|
+
}
|
|
73
|
+
return { ok: true };
|
|
74
|
+
}
|
|
75
|
+
var operationCards = loadCardsFromYaml();
|
|
76
|
+
function listOperationCards() {
|
|
77
|
+
return [...operationCards];
|
|
78
|
+
}
|
|
79
|
+
function getOperationCard(capabilityId) {
|
|
80
|
+
return operationCards.find((card) => card.capability_id === capabilityId);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export {
|
|
84
|
+
validateOperationCard,
|
|
85
|
+
listOperationCards,
|
|
86
|
+
getOperationCard
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=chunk-MT4U5DYD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/registry/index.ts"],"sourcesContent":["import { readdirSync, readFileSync } from \"node:fs\"\nimport { dirname, extname, join } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nimport Ajv from \"ajv\"\nimport { load as parseYaml } from \"js-yaml\"\n\nimport type { OperationCard } from \"./types.js\"\nimport { operationCardSchema } from \"./operation-card-schema.js\"\n\nconst ajv = new Ajv({ allErrors: true, strict: false })\nconst validateCard = ajv.compile(operationCardSchema)\n\nfunction cardDirectory(): string {\n const currentDir = dirname(fileURLToPath(import.meta.url))\n return join(currentDir, \"cards\")\n}\n\nfunction loadCardsFromYaml(): OperationCard[] {\n const directory = cardDirectory()\n const preferredOrder = [\n \"repo.view\",\n \"issue.view\",\n \"issue.list\",\n \"issue.comments.list\",\n \"pr.view\",\n \"pr.list\",\n \"pr.comments.list\",\n \"pr.reviews.list\",\n \"pr.diff.list_files\",\n \"pr.status.checks\",\n \"pr.checks.get_failed\",\n \"pr.mergeability.view\",\n \"pr.comment.reply\",\n \"pr.comment.resolve\",\n \"pr.comment.unresolve\",\n \"pr.ready_for_review.set\",\n \"check_run.annotations.list\",\n \"workflow_runs.list\",\n \"workflow_run.jobs.list\",\n \"workflow_job.logs.get\",\n \"workflow_job.logs.analyze\"\n ]\n const orderMap = new Map(preferredOrder.map((id, index) => [id, index]))\n\n const entries = readdirSync(directory)\n .filter((entry) => {\n const extension = extname(entry).toLowerCase()\n return extension === \".yaml\" || extension === \".yml\"\n })\n .sort((a, b) => {\n const capabilityA = a.replace(/\\.ya?ml$/i, \"\")\n const capabilityB = b.replace(/\\.ya?ml$/i, \"\")\n const orderA = orderMap.get(capabilityA) ?? Number.MAX_SAFE_INTEGER\n const orderB = orderMap.get(capabilityB) ?? Number.MAX_SAFE_INTEGER\n\n if (orderA !== orderB) {\n return orderA - orderB\n }\n\n return a.localeCompare(b)\n })\n\n return entries.map((entry): OperationCard => {\n const filePath = join(directory, entry)\n const raw = readFileSync(filePath, \"utf8\")\n const parsed = parseYaml(raw)\n const validation = validateOperationCard(parsed)\n if (!validation.ok) {\n throw new Error(`Invalid operation card '${entry}': ${validation.error}`)\n }\n\n return parsed as OperationCard\n })\n}\n\nexport function validateOperationCard(card: unknown): { ok: true } | { ok: false; error: string } {\n const valid = validateCard(card)\n if (!valid) {\n const message = validateCard.errors?.[0]?.message ?? \"Operation card schema validation failed\"\n return { ok: false, error: message }\n }\n\n return { ok: true }\n}\n\nconst operationCards = loadCardsFromYaml()\n\nexport function listOperationCards(): OperationCard[] {\n return [...operationCards]\n}\n\nexport function getOperationCard(capabilityId: string): OperationCard | undefined {\n return operationCards.find((card) => card.capability_id === capabilityId)\n}\n"],"mappings":";;;;;AAAA,SAAS,aAAa,oBAAoB;AAC1C,SAAS,SAAS,SAAS,YAAY;AACvC,SAAS,qBAAqB;AAE9B,OAAO,SAAS;AAChB,SAAS,QAAQ,iBAAiB;AAKlC,IAAM,MAAM,IAAI,IAAI,EAAE,WAAW,MAAM,QAAQ,MAAM,CAAC;AACtD,IAAM,eAAe,IAAI,QAAQ,mBAAmB;AAEpD,SAAS,gBAAwB;AAC/B,QAAM,aAAa,QAAQ,cAAc,YAAY,GAAG,CAAC;AACzD,SAAO,KAAK,YAAY,OAAO;AACjC;AAEA,SAAS,oBAAqC;AAC5C,QAAM,YAAY,cAAc;AAChC,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,WAAW,IAAI,IAAI,eAAe,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC;AAEvE,QAAM,UAAU,YAAY,SAAS,EAClC,OAAO,CAAC,UAAU;AACjB,UAAM,YAAY,QAAQ,KAAK,EAAE,YAAY;AAC7C,WAAO,cAAc,WAAW,cAAc;AAAA,EAChD,CAAC,EACA,KAAK,CAAC,GAAG,MAAM;AACd,UAAM,cAAc,EAAE,QAAQ,aAAa,EAAE;AAC7C,UAAM,cAAc,EAAE,QAAQ,aAAa,EAAE;AAC7C,UAAM,SAAS,SAAS,IAAI,WAAW,KAAK,OAAO;AACnD,UAAM,SAAS,SAAS,IAAI,WAAW,KAAK,OAAO;AAEnD,QAAI,WAAW,QAAQ;AACrB,aAAO,SAAS;AAAA,IAClB;AAEA,WAAO,EAAE,cAAc,CAAC;AAAA,EAC1B,CAAC;AAEH,SAAO,QAAQ,IAAI,CAAC,UAAyB;AAC3C,UAAM,WAAW,KAAK,WAAW,KAAK;AACtC,UAAM,MAAM,aAAa,UAAU,MAAM;AACzC,UAAM,SAAS,UAAU,GAAG;AAC5B,UAAM,aAAa,sBAAsB,MAAM;AAC/C,QAAI,CAAC,WAAW,IAAI;AAClB,YAAM,IAAI,MAAM,2BAA2B,KAAK,MAAM,WAAW,KAAK,EAAE;AAAA,IAC1E;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,sBAAsB,MAA4D;AAChG,QAAM,QAAQ,aAAa,IAAI;AAC/B,MAAI,CAAC,OAAO;AACV,UAAM,UAAU,aAAa,SAAS,CAAC,GAAG,WAAW;AACrD,WAAO,EAAE,IAAI,OAAO,OAAO,QAAQ;AAAA,EACrC;AAEA,SAAO,EAAE,IAAI,KAAK;AACpB;AAEA,IAAM,iBAAiB,kBAAkB;AAElC,SAAS,qBAAsC;AACpD,SAAO,CAAC,GAAG,cAAc;AAC3B;AAEO,SAAS,iBAAiB,cAAiD;AAChF,SAAO,eAAe,KAAK,CAAC,SAAS,KAAK,kBAAkB,YAAY;AAC1E;","names":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// src/gql/operations/pr-view.generated.ts
|
|
2
|
+
var PrViewDocument = `
|
|
3
|
+
query PrView($owner: String!, $name: String!, $prNumber: Int!) {
|
|
4
|
+
repository(owner: $owner, name: $name) {
|
|
5
|
+
pullRequest(number: $prNumber) {
|
|
6
|
+
id
|
|
7
|
+
number
|
|
8
|
+
title
|
|
9
|
+
state
|
|
10
|
+
url
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
`;
|
|
15
|
+
var defaultWrapper = (action, _operationName, _operationType, _variables) => action();
|
|
16
|
+
function getSdk(client, withWrapper = defaultWrapper) {
|
|
17
|
+
return {
|
|
18
|
+
PrView(variables, requestHeaders, signal) {
|
|
19
|
+
return withWrapper((wrappedRequestHeaders) => client.request({ document: PrViewDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "PrView", "query", variables);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export {
|
|
25
|
+
PrViewDocument,
|
|
26
|
+
getSdk
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=chunk-NFF5VF4U.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/gql/operations/pr-view.generated.ts"],"sourcesContent":["import type * as Types from '../generated/common-types';\n\nimport type { GraphQLClient, RequestOptions } from 'graphql-request';\ntype GraphQLClientRequestHeaders = RequestOptions['requestHeaders'];\nexport type PrViewQueryVariables = Types.Exact<{\n owner: Types.Scalars['String']['input'];\n name: Types.Scalars['String']['input'];\n prNumber: Types.Scalars['Int']['input'];\n}>;\n\n\nexport type PrViewQuery = { __typename?: 'Query', repository?: { __typename?: 'Repository', pullRequest?: { __typename?: 'PullRequest', id: string, number: number, title: string, state: Types.PullRequestState, url: any } | null } | null };\n\n\nexport const PrViewDocument = `\n query PrView($owner: String!, $name: String!, $prNumber: Int!) {\n repository(owner: $owner, name: $name) {\n pullRequest(number: $prNumber) {\n id\n number\n title\n state\n url\n }\n }\n}\n `;\n\nexport type SdkFunctionWrapper = <T>(action: (requestHeaders?:Record<string, string>) => Promise<T>, operationName: string, operationType?: string, variables?: any) => Promise<T>;\n\n\nconst defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType, _variables) => action();\n\nexport function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {\n return {\n PrView(variables: PrViewQueryVariables, requestHeaders?: GraphQLClientRequestHeaders, signal?: RequestInit['signal']): Promise<PrViewQuery> {\n return withWrapper((wrappedRequestHeaders) => client.request<PrViewQuery>({ document: PrViewDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), 'PrView', 'query', variables);\n }\n };\n}\nexport type Sdk = ReturnType<typeof getSdk>;"],"mappings":";AAcO,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiB9B,IAAM,iBAAqC,CAAC,QAAQ,gBAAgB,gBAAgB,eAAe,OAAO;AAEnG,SAAS,OAAO,QAAuB,cAAkC,gBAAgB;AAC9F,SAAO;AAAA,IACL,OAAO,WAAiC,gBAA8C,QAAsD;AAC1I,aAAO,YAAY,CAAC,0BAA0B,OAAO,QAAqB,EAAE,UAAU,gBAAgB,WAAW,gBAAgB,EAAE,GAAG,gBAAgB,GAAG,sBAAsB,GAAG,OAAO,CAAC,GAAG,UAAU,SAAS,SAAS;AAAA,IAC3N;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import {
|
|
2
|
+
logMetric
|
|
3
|
+
} from "./chunk-W2TKG2UL.js";
|
|
4
|
+
import {
|
|
5
|
+
normalizeError
|
|
6
|
+
} from "./chunk-QEAMC4IJ.js";
|
|
7
|
+
import {
|
|
8
|
+
validateInput,
|
|
9
|
+
validateOutput
|
|
10
|
+
} from "./chunk-5JRLVOF2.js";
|
|
11
|
+
import {
|
|
12
|
+
errorCodes
|
|
13
|
+
} from "./chunk-UOJWOHRM.js";
|
|
14
|
+
|
|
15
|
+
// src/core/execute/execute.ts
|
|
16
|
+
function parsePredicateValue(raw) {
|
|
17
|
+
const value = raw.trim();
|
|
18
|
+
if (value === "true") {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
if (value === "false") {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if (value === "null") {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const numeric = Number(value);
|
|
28
|
+
if (!Number.isNaN(numeric) && value.length > 0) {
|
|
29
|
+
return numeric;
|
|
30
|
+
}
|
|
31
|
+
return value.replace(/^['"]|['"]$/g, "");
|
|
32
|
+
}
|
|
33
|
+
function resolvePathValue(source, path) {
|
|
34
|
+
const segments = path.split(".").filter((segment) => segment.length > 0);
|
|
35
|
+
let current = source;
|
|
36
|
+
for (const segment of segments) {
|
|
37
|
+
if (typeof current !== "object" || current === null || Array.isArray(current)) {
|
|
38
|
+
return void 0;
|
|
39
|
+
}
|
|
40
|
+
current = current[segment];
|
|
41
|
+
}
|
|
42
|
+
return current;
|
|
43
|
+
}
|
|
44
|
+
function evaluateSuitabilityPreferred(card, params, routingContext) {
|
|
45
|
+
const rules = card.routing.suitability ?? [];
|
|
46
|
+
for (const rule of rules) {
|
|
47
|
+
const alwaysMatch = /^(cli|graphql|rest)$/i.exec(rule.predicate.trim());
|
|
48
|
+
const alwaysRoute = alwaysMatch?.[1];
|
|
49
|
+
if (rule.when === "always" && alwaysRoute) {
|
|
50
|
+
return alwaysRoute.toLowerCase();
|
|
51
|
+
}
|
|
52
|
+
const conditionalMatch = /^(cli|graphql|rest)\s+if\s+([a-zA-Z0-9_.]+)\s*(==|!=)\s*(.+)$/i.exec(
|
|
53
|
+
rule.predicate.trim()
|
|
54
|
+
);
|
|
55
|
+
if (!conditionalMatch) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const [, targetRouteRaw = "", rawPath = "", operator = "==", rawExpected = ""] = conditionalMatch;
|
|
59
|
+
const targetRoute = targetRouteRaw.toLowerCase();
|
|
60
|
+
const source = rule.when === "env" ? routingContext : params;
|
|
61
|
+
const path = rawPath.startsWith("params.") || rawPath.startsWith("env.") ? rawPath.split(".").slice(1).join(".") : rawPath;
|
|
62
|
+
const actual = resolvePathValue(source, path);
|
|
63
|
+
const expected = parsePredicateValue(rawExpected);
|
|
64
|
+
const matches = operator === "==" ? actual === expected : actual !== expected;
|
|
65
|
+
if (matches) {
|
|
66
|
+
return targetRoute;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return card.routing.preferred;
|
|
70
|
+
}
|
|
71
|
+
function routePlan(card, params, routingContext) {
|
|
72
|
+
const preferred = evaluateSuitabilityPreferred(card, params, routingContext);
|
|
73
|
+
const planned = /* @__PURE__ */ new Set([preferred, ...card.routing.fallbacks]);
|
|
74
|
+
return [...planned];
|
|
75
|
+
}
|
|
76
|
+
async function execute(options) {
|
|
77
|
+
const inputValidation = validateInput(options.card.input_schema, options.params);
|
|
78
|
+
if (!inputValidation.ok) {
|
|
79
|
+
return normalizeError(
|
|
80
|
+
{
|
|
81
|
+
code: errorCodes.Validation,
|
|
82
|
+
message: "Input schema validation failed",
|
|
83
|
+
retryable: false,
|
|
84
|
+
details: { ajvErrors: inputValidation.errors }
|
|
85
|
+
},
|
|
86
|
+
options.card.routing.preferred,
|
|
87
|
+
{
|
|
88
|
+
capabilityId: options.card.capability_id,
|
|
89
|
+
reason: "INPUT_VALIDATION"
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
const attempts = [];
|
|
94
|
+
const maxAttemptsPerRoute = Math.max(1, options.retry?.maxAttemptsPerRoute ?? 1);
|
|
95
|
+
let lastError;
|
|
96
|
+
let firstError;
|
|
97
|
+
const routingContext = options.routingContext ?? {};
|
|
98
|
+
for (const route of routePlan(options.card, options.params, routingContext)) {
|
|
99
|
+
logMetric("route.plan", 1, {
|
|
100
|
+
capability_id: options.card.capability_id,
|
|
101
|
+
route
|
|
102
|
+
});
|
|
103
|
+
const preflight = await options.preflight(route);
|
|
104
|
+
if (!preflight.ok) {
|
|
105
|
+
logMetric("route.preflight_skipped", 1, {
|
|
106
|
+
capability_id: options.card.capability_id,
|
|
107
|
+
route,
|
|
108
|
+
error_code: preflight.code
|
|
109
|
+
});
|
|
110
|
+
attempts.push({ route, status: "skipped", error_code: preflight.code });
|
|
111
|
+
lastError = {
|
|
112
|
+
code: preflight.code,
|
|
113
|
+
message: preflight.message,
|
|
114
|
+
retryable: preflight.retryable,
|
|
115
|
+
...preflight.details ? { details: preflight.details } : {}
|
|
116
|
+
};
|
|
117
|
+
firstError ??= lastError;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const routeHandler = options.routes[route];
|
|
121
|
+
if (typeof routeHandler !== "function") {
|
|
122
|
+
logMetric("route.missing_handler", 1, {
|
|
123
|
+
capability_id: options.card.capability_id,
|
|
124
|
+
route
|
|
125
|
+
});
|
|
126
|
+
const handlerError = {
|
|
127
|
+
code: errorCodes.AdapterUnsupported,
|
|
128
|
+
message: `No route handler configured for '${route}'`,
|
|
129
|
+
retryable: false,
|
|
130
|
+
details: { route }
|
|
131
|
+
};
|
|
132
|
+
attempts.push({ route, status: "skipped", error_code: errorCodes.AdapterUnsupported });
|
|
133
|
+
lastError = handlerError;
|
|
134
|
+
firstError ??= handlerError;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
for (let attempt = 0; attempt < maxAttemptsPerRoute; attempt += 1) {
|
|
138
|
+
const result = await routeHandler(options.params);
|
|
139
|
+
logMetric("route.attempt", 1, {
|
|
140
|
+
capability_id: options.card.capability_id,
|
|
141
|
+
route,
|
|
142
|
+
ok: result.ok
|
|
143
|
+
});
|
|
144
|
+
const attemptRecord = {
|
|
145
|
+
route,
|
|
146
|
+
status: result.ok ? "success" : "error"
|
|
147
|
+
};
|
|
148
|
+
if (result.error?.code) {
|
|
149
|
+
attemptRecord.error_code = result.error.code;
|
|
150
|
+
}
|
|
151
|
+
attempts.push(attemptRecord);
|
|
152
|
+
if (result.ok) {
|
|
153
|
+
const outputValidation = validateOutput(options.card.output_schema, result.data);
|
|
154
|
+
if (!outputValidation.ok) {
|
|
155
|
+
const envelope2 = normalizeError(
|
|
156
|
+
{
|
|
157
|
+
code: errorCodes.Server,
|
|
158
|
+
message: "Output schema validation failed",
|
|
159
|
+
retryable: false,
|
|
160
|
+
details: { ajvErrors: outputValidation.errors }
|
|
161
|
+
},
|
|
162
|
+
route,
|
|
163
|
+
{
|
|
164
|
+
capabilityId: options.card.capability_id,
|
|
165
|
+
reason: "OUTPUT_VALIDATION"
|
|
166
|
+
}
|
|
167
|
+
);
|
|
168
|
+
if (options.trace) {
|
|
169
|
+
envelope2.meta.attempts = attempts;
|
|
170
|
+
}
|
|
171
|
+
return envelope2;
|
|
172
|
+
}
|
|
173
|
+
if (options.trace) {
|
|
174
|
+
result.meta.attempts = attempts;
|
|
175
|
+
}
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
lastError = result.error;
|
|
179
|
+
firstError ??= result.error;
|
|
180
|
+
if (!result.error?.retryable) {
|
|
181
|
+
if (result.error?.code !== errorCodes.AdapterUnsupported) {
|
|
182
|
+
if (options.trace) {
|
|
183
|
+
result.meta.attempts = attempts;
|
|
184
|
+
}
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const finalError = lastError ?? firstError ?? {
|
|
192
|
+
code: errorCodes.Unknown,
|
|
193
|
+
message: "No route produced a result",
|
|
194
|
+
retryable: false
|
|
195
|
+
};
|
|
196
|
+
const envelope = normalizeError(finalError, options.card.routing.preferred, {
|
|
197
|
+
capabilityId: options.card.capability_id,
|
|
198
|
+
reason: "CARD_FALLBACK"
|
|
199
|
+
});
|
|
200
|
+
if (options.trace) {
|
|
201
|
+
envelope.meta.attempts = attempts;
|
|
202
|
+
}
|
|
203
|
+
return envelope;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export {
|
|
207
|
+
execute
|
|
208
|
+
};
|
|
209
|
+
//# sourceMappingURL=chunk-Q4RTT3DV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/execute/execute.ts"],"sourcesContent":["import type { ErrorCode } from \"../errors/codes.js\"\nimport { errorCodes } from \"../errors/codes.js\"\nimport type { ResultEnvelope, RouteSource } from \"../contracts/envelope.js\"\nimport type { OperationCard } from \"../registry/types.js\"\nimport { validateInput, validateOutput } from \"../registry/schema-validator.js\"\nimport { normalizeError } from \"../execution/normalizer.js\"\nimport { logMetric } from \"../telemetry/logger.js\"\n\ntype PreflightResult =\n | { ok: true }\n | { ok: false; code: ErrorCode; message: string; retryable: boolean; details?: Record<string, unknown> }\n\ntype ExecuteOptions = {\n card: OperationCard\n params: Record<string, unknown>\n routingContext?: Record<string, unknown>\n trace?: boolean\n retry?: {\n maxAttemptsPerRoute?: number\n }\n preflight: (route: RouteSource) => Promise<PreflightResult>\n routes: Record<RouteSource, (params: Record<string, unknown>) => Promise<ResultEnvelope>>\n}\n\nfunction parsePredicateValue(raw: string): unknown {\n const value = raw.trim()\n if (value === \"true\") {\n return true\n }\n if (value === \"false\") {\n return false\n }\n if (value === \"null\") {\n return null\n }\n\n const numeric = Number(value)\n if (!Number.isNaN(numeric) && value.length > 0) {\n return numeric\n }\n\n return value.replace(/^['\"]|['\"]$/g, \"\")\n}\n\nfunction resolvePathValue(source: Record<string, unknown>, path: string): unknown {\n const segments = path.split(\".\").filter((segment) => segment.length > 0)\n let current: unknown = source\n\n for (const segment of segments) {\n if (typeof current !== \"object\" || current === null || Array.isArray(current)) {\n return undefined\n }\n\n current = (current as Record<string, unknown>)[segment]\n }\n\n return current\n}\n\nfunction evaluateSuitabilityPreferred(\n card: OperationCard,\n params: Record<string, unknown>,\n routingContext: Record<string, unknown>\n): RouteSource {\n const rules = card.routing.suitability ?? []\n\n for (const rule of rules) {\n const alwaysMatch = /^(cli|graphql|rest)$/i.exec(rule.predicate.trim())\n const alwaysRoute = alwaysMatch?.[1]\n if (rule.when === \"always\" && alwaysRoute) {\n return alwaysRoute.toLowerCase() as RouteSource\n }\n\n const conditionalMatch = /^(cli|graphql|rest)\\s+if\\s+([a-zA-Z0-9_.]+)\\s*(==|!=)\\s*(.+)$/i.exec(\n rule.predicate.trim()\n )\n\n if (!conditionalMatch) {\n continue\n }\n\n const [, targetRouteRaw = \"\", rawPath = \"\", operator = \"==\", rawExpected = \"\"] = conditionalMatch\n const targetRoute = targetRouteRaw.toLowerCase() as RouteSource\n const source = rule.when === \"env\" ? routingContext : params\n const path = rawPath.startsWith(\"params.\") || rawPath.startsWith(\"env.\")\n ? rawPath.split(\".\").slice(1).join(\".\")\n : rawPath\n const actual = resolvePathValue(source, path)\n const expected = parsePredicateValue(rawExpected)\n const matches = operator === \"==\" ? actual === expected : actual !== expected\n\n if (matches) {\n return targetRoute\n }\n }\n\n return card.routing.preferred\n}\n\nfunction routePlan(\n card: OperationCard,\n params: Record<string, unknown>,\n routingContext: Record<string, unknown>\n): RouteSource[] {\n const preferred = evaluateSuitabilityPreferred(card, params, routingContext)\n const planned = new Set<RouteSource>([preferred, ...card.routing.fallbacks])\n return [...planned]\n}\n\nexport async function execute(options: ExecuteOptions): Promise<ResultEnvelope> {\n const inputValidation = validateInput(options.card.input_schema, options.params)\n if (!inputValidation.ok) {\n return normalizeError(\n {\n code: errorCodes.Validation,\n message: \"Input schema validation failed\",\n retryable: false,\n details: { ajvErrors: inputValidation.errors }\n },\n options.card.routing.preferred,\n {\n capabilityId: options.card.capability_id,\n reason: \"INPUT_VALIDATION\"\n }\n )\n }\n\n const attempts: NonNullable<ResultEnvelope[\"meta\"][\"attempts\"]> = []\n const maxAttemptsPerRoute = Math.max(1, options.retry?.maxAttemptsPerRoute ?? 1)\n let lastError: ResultEnvelope[\"error\"]\n let firstError: ResultEnvelope[\"error\"]\n\n const routingContext = options.routingContext ?? {}\n\n for (const route of routePlan(options.card, options.params, routingContext)) {\n logMetric(\"route.plan\", 1, {\n capability_id: options.card.capability_id,\n route\n })\n\n const preflight = await options.preflight(route)\n if (!preflight.ok) {\n logMetric(\"route.preflight_skipped\", 1, {\n capability_id: options.card.capability_id,\n route,\n error_code: preflight.code\n })\n attempts.push({ route, status: \"skipped\", error_code: preflight.code })\n lastError = {\n code: preflight.code,\n message: preflight.message,\n retryable: preflight.retryable,\n ...(preflight.details ? { details: preflight.details } : {})\n }\n firstError ??= lastError\n continue\n }\n\n const routeHandler = options.routes[route]\n if (typeof routeHandler !== \"function\") {\n logMetric(\"route.missing_handler\", 1, {\n capability_id: options.card.capability_id,\n route\n })\n\n const handlerError = {\n code: errorCodes.AdapterUnsupported,\n message: `No route handler configured for '${route}'`,\n retryable: false,\n details: { route }\n }\n\n attempts.push({ route, status: \"skipped\", error_code: errorCodes.AdapterUnsupported })\n lastError = handlerError\n firstError ??= handlerError\n continue\n }\n\n for (let attempt = 0; attempt < maxAttemptsPerRoute; attempt += 1) {\n const result = await routeHandler(options.params)\n logMetric(\"route.attempt\", 1, {\n capability_id: options.card.capability_id,\n route,\n ok: result.ok\n })\n const attemptRecord: { route: RouteSource; status: \"success\" | \"error\"; error_code?: ErrorCode } = {\n route,\n status: result.ok ? \"success\" : \"error\"\n }\n if (result.error?.code) {\n attemptRecord.error_code = result.error.code\n }\n attempts.push(attemptRecord)\n\n if (result.ok) {\n const outputValidation = validateOutput(options.card.output_schema, result.data)\n if (!outputValidation.ok) {\n const envelope = normalizeError(\n {\n code: errorCodes.Server,\n message: \"Output schema validation failed\",\n retryable: false,\n details: { ajvErrors: outputValidation.errors }\n },\n route,\n {\n capabilityId: options.card.capability_id,\n reason: \"OUTPUT_VALIDATION\"\n }\n )\n\n if (options.trace) {\n envelope.meta.attempts = attempts\n }\n\n return envelope\n }\n\n if (options.trace) {\n result.meta.attempts = attempts\n }\n return result\n }\n\n lastError = result.error\n firstError ??= result.error\n if (!result.error?.retryable) {\n if (result.error?.code !== errorCodes.AdapterUnsupported) {\n if (options.trace) {\n result.meta.attempts = attempts\n }\n return result\n }\n break\n }\n }\n }\n\n const finalError = lastError ?? firstError ?? {\n code: errorCodes.Unknown,\n message: \"No route produced a result\",\n retryable: false\n }\n\n const envelope = normalizeError(finalError, options.card.routing.preferred, {\n capabilityId: options.card.capability_id,\n reason: \"CARD_FALLBACK\"\n })\n\n if (options.trace) {\n envelope.meta.attempts = attempts\n }\n\n return envelope\n}\n"],"mappings":"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","names":["envelope"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// src/core/execution/normalizer.ts
|
|
2
|
+
function buildMeta(route, options) {
|
|
3
|
+
const meta = {
|
|
4
|
+
capability_id: options.capabilityId,
|
|
5
|
+
route_used: route
|
|
6
|
+
};
|
|
7
|
+
if (options.reason !== void 0) {
|
|
8
|
+
meta.reason = options.reason;
|
|
9
|
+
}
|
|
10
|
+
if (options.pagination !== void 0) {
|
|
11
|
+
meta.pagination = options.pagination;
|
|
12
|
+
}
|
|
13
|
+
return meta;
|
|
14
|
+
}
|
|
15
|
+
function normalizeResult(data, route, options) {
|
|
16
|
+
return {
|
|
17
|
+
ok: true,
|
|
18
|
+
data,
|
|
19
|
+
meta: buildMeta(route, options)
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function normalizeError(error, route, options) {
|
|
23
|
+
return {
|
|
24
|
+
ok: false,
|
|
25
|
+
error,
|
|
26
|
+
meta: buildMeta(route, options)
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export {
|
|
31
|
+
normalizeResult,
|
|
32
|
+
normalizeError
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=chunk-QEAMC4IJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/execution/normalizer.ts"],"sourcesContent":["import type { ResultEnvelope } from \"../contracts/envelope.js\"\nimport type { RouteReasonCode } from \"../routing/reason-codes.js\"\n\ntype MetaInput = {\n capabilityId: string\n reason: RouteReasonCode | undefined\n pagination?: ResultEnvelope[\"meta\"][\"pagination\"]\n}\n\nfunction buildMeta(\n route: \"cli\" | \"rest\" | \"graphql\",\n options: MetaInput\n): ResultEnvelope[\"meta\"] {\n const meta: ResultEnvelope[\"meta\"] = {\n capability_id: options.capabilityId,\n route_used: route\n }\n\n if (options.reason !== undefined) {\n meta.reason = options.reason\n }\n\n if (options.pagination !== undefined) {\n meta.pagination = options.pagination\n }\n\n return meta\n}\n\nexport function normalizeResult<TData>(\n data: TData,\n route: \"cli\" | \"rest\" | \"graphql\",\n options: MetaInput\n): ResultEnvelope<TData> {\n return {\n ok: true,\n data,\n meta: buildMeta(route, options)\n }\n}\n\nexport function normalizeError<TData = unknown>(\n error: NonNullable<ResultEnvelope[\"error\"]>,\n route: \"cli\" | \"rest\" | \"graphql\",\n options: MetaInput\n): ResultEnvelope<TData> {\n return {\n ok: false,\n error,\n meta: buildMeta(route, options)\n }\n}\n"],"mappings":";AASA,SAAS,UACP,OACA,SACwB;AACxB,QAAM,OAA+B;AAAA,IACnC,eAAe,QAAQ;AAAA,IACvB,YAAY;AAAA,EACd;AAEA,MAAI,QAAQ,WAAW,QAAW;AAChC,SAAK,SAAS,QAAQ;AAAA,EACxB;AAEA,MAAI,QAAQ,eAAe,QAAW;AACpC,SAAK,aAAa,QAAQ;AAAA,EAC5B;AAEA,SAAO;AACT;AAEO,SAAS,gBACd,MACA,OACA,SACuB;AACvB,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,MAAM,UAAU,OAAO,OAAO;AAAA,EAChC;AACF;AAEO,SAAS,eACd,OACA,OACA,SACuB;AACvB,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,MAAM,UAAU,OAAO,OAAO;AAAA,EAChC;AACF;","names":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {
|
|
2
|
+
listCapabilities
|
|
3
|
+
} from "./chunk-3RJCF42N.js";
|
|
4
|
+
|
|
5
|
+
// src/cli/commands/capabilities-list.ts
|
|
6
|
+
function parseArgs(argv) {
|
|
7
|
+
return {
|
|
8
|
+
asJson: argv.includes("--json")
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
async function capabilitiesListCommand(argv = []) {
|
|
12
|
+
const { asJson } = parseArgs(argv);
|
|
13
|
+
const capabilities = listCapabilities();
|
|
14
|
+
if (asJson) {
|
|
15
|
+
process.stdout.write(`${JSON.stringify(capabilities)}
|
|
16
|
+
`);
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
const lines = capabilities.map(
|
|
20
|
+
(item) => `${item.capability_id} - ${item.description}`
|
|
21
|
+
);
|
|
22
|
+
process.stdout.write(`${lines.join("\n")}
|
|
23
|
+
`);
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
capabilitiesListCommand
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=chunk-QX34GTH6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/capabilities-list.ts"],"sourcesContent":["import { listCapabilities } from \"../../agent-interface/tools/list-capabilities-tool.js\"\n\nfunction parseArgs(argv: string[]): { asJson: boolean } {\n return {\n asJson: argv.includes(\"--json\")\n }\n}\n\nexport async function capabilitiesListCommand(argv: string[] = []): Promise<number> {\n const { asJson } = parseArgs(argv)\n const capabilities = listCapabilities()\n\n if (asJson) {\n process.stdout.write(`${JSON.stringify(capabilities)}\\n`)\n return 0\n }\n\n const lines = capabilities.map(\n (item) => `${item.capability_id} - ${item.description}`\n )\n process.stdout.write(`${lines.join(\"\\n\")}\\n`)\n return 0\n}\n"],"mappings":";;;;;AAEA,SAAS,UAAU,MAAqC;AACtD,SAAO;AAAA,IACL,QAAQ,KAAK,SAAS,QAAQ;AAAA,EAChC;AACF;AAEA,eAAsB,wBAAwB,OAAiB,CAAC,GAAoB;AAClF,QAAM,EAAE,OAAO,IAAI,UAAU,IAAI;AACjC,QAAM,eAAe,iBAAiB;AAEtC,MAAI,QAAQ;AACV,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,YAAY,CAAC;AAAA,CAAI;AACxD,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,aAAa;AAAA,IACzB,CAAC,SAAS,GAAG,KAAK,aAAa,MAAM,KAAK,WAAW;AAAA,EACvD;AACA,UAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAC5C,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// src/gql/operations/issue-comments-list.generated.ts
|
|
2
|
+
var IssueCommentsListDocument = `
|
|
3
|
+
query IssueCommentsList($owner: String!, $name: String!, $issueNumber: Int!, $first: Int!, $after: String) {
|
|
4
|
+
repository(owner: $owner, name: $name) {
|
|
5
|
+
issue(number: $issueNumber) {
|
|
6
|
+
comments(first: $first, after: $after) {
|
|
7
|
+
nodes {
|
|
8
|
+
id
|
|
9
|
+
body
|
|
10
|
+
createdAt
|
|
11
|
+
url
|
|
12
|
+
author {
|
|
13
|
+
login
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
pageInfo {
|
|
17
|
+
endCursor
|
|
18
|
+
hasNextPage
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
var defaultWrapper = (action, _operationName, _operationType, _variables) => action();
|
|
26
|
+
function getSdk(client, withWrapper = defaultWrapper) {
|
|
27
|
+
return {
|
|
28
|
+
IssueCommentsList(variables, requestHeaders, signal) {
|
|
29
|
+
return withWrapper((wrappedRequestHeaders) => client.request({ document: IssueCommentsListDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "IssueCommentsList", "query", variables);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export {
|
|
35
|
+
IssueCommentsListDocument,
|
|
36
|
+
getSdk
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=chunk-QZZC53HF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/gql/operations/issue-comments-list.generated.ts"],"sourcesContent":["import type * as Types from '../generated/common-types';\n\nimport type { GraphQLClient, RequestOptions } from 'graphql-request';\ntype GraphQLClientRequestHeaders = RequestOptions['requestHeaders'];\nexport type IssueCommentsListQueryVariables = Types.Exact<{\n owner: Types.Scalars['String']['input'];\n name: Types.Scalars['String']['input'];\n issueNumber: Types.Scalars['Int']['input'];\n first: Types.Scalars['Int']['input'];\n after?: Types.InputMaybe<Types.Scalars['String']['input']>;\n}>;\n\n\nexport type IssueCommentsListQuery = { __typename?: 'Query', repository?: { __typename?: 'Repository', issue?: { __typename?: 'Issue', comments: { __typename?: 'IssueCommentConnection', nodes?: Array<{ __typename?: 'IssueComment', id: string, body: string, createdAt: any, url: any, author?: { __typename?: 'Bot', login: string } | { __typename?: 'EnterpriseUserAccount', login: string } | { __typename?: 'Mannequin', login: string } | { __typename?: 'Organization', login: string } | { __typename?: 'User', login: string } | null } | null> | null, pageInfo: { __typename?: 'PageInfo', endCursor?: string | null, hasNextPage: boolean } } } | null } | null };\n\n\nexport const IssueCommentsListDocument = `\n query IssueCommentsList($owner: String!, $name: String!, $issueNumber: Int!, $first: Int!, $after: String) {\n repository(owner: $owner, name: $name) {\n issue(number: $issueNumber) {\n comments(first: $first, after: $after) {\n nodes {\n id\n body\n createdAt\n url\n author {\n login\n }\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n `;\n\nexport type SdkFunctionWrapper = <T>(action: (requestHeaders?:Record<string, string>) => Promise<T>, operationName: string, operationType?: string, variables?: any) => Promise<T>;\n\n\nconst defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType, _variables) => action();\n\nexport function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {\n return {\n IssueCommentsList(variables: IssueCommentsListQueryVariables, requestHeaders?: GraphQLClientRequestHeaders, signal?: RequestInit['signal']): Promise<IssueCommentsListQuery> {\n return withWrapper((wrappedRequestHeaders) => client.request<IssueCommentsListQuery>({ document: IssueCommentsListDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), 'IssueCommentsList', 'query', variables);\n }\n };\n}\nexport type Sdk = ReturnType<typeof getSdk>;"],"mappings":";AAgBO,IAAM,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BzC,IAAM,iBAAqC,CAAC,QAAQ,gBAAgB,gBAAgB,eAAe,OAAO;AAEnG,SAAS,OAAO,QAAuB,cAAkC,gBAAgB;AAC9F,SAAO;AAAA,IACL,kBAAkB,WAA4C,gBAA8C,QAAiE;AAC3K,aAAO,YAAY,CAAC,0BAA0B,OAAO,QAAgC,EAAE,UAAU,2BAA2B,WAAW,gBAAgB,EAAE,GAAG,gBAAgB,GAAG,sBAAsB,GAAG,OAAO,CAAC,GAAG,qBAAqB,SAAS,SAAS;AAAA,IAC5P;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// src/gql/operations/pr-diff-list-files.generated.ts
|
|
2
|
+
var PrDiffListFilesDocument = `
|
|
3
|
+
query PrDiffListFiles($owner: String!, $name: String!, $prNumber: Int!, $first: Int!, $after: String) {
|
|
4
|
+
repository(owner: $owner, name: $name) {
|
|
5
|
+
pullRequest(number: $prNumber) {
|
|
6
|
+
files(first: $first, after: $after) {
|
|
7
|
+
nodes {
|
|
8
|
+
path
|
|
9
|
+
additions
|
|
10
|
+
deletions
|
|
11
|
+
}
|
|
12
|
+
pageInfo {
|
|
13
|
+
hasNextPage
|
|
14
|
+
endCursor
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
`;
|
|
21
|
+
var defaultWrapper = (action, _operationName, _operationType, _variables) => action();
|
|
22
|
+
function getSdk(client, withWrapper = defaultWrapper) {
|
|
23
|
+
return {
|
|
24
|
+
PrDiffListFiles(variables, requestHeaders, signal) {
|
|
25
|
+
return withWrapper((wrappedRequestHeaders) => client.request({ document: PrDiffListFilesDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "PrDiffListFiles", "query", variables);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export {
|
|
31
|
+
PrDiffListFilesDocument,
|
|
32
|
+
getSdk
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=chunk-RUQXGZ35.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/gql/operations/pr-diff-list-files.generated.ts"],"sourcesContent":["import type * as Types from '../generated/common-types';\n\nimport type { GraphQLClient, RequestOptions } from 'graphql-request';\ntype GraphQLClientRequestHeaders = RequestOptions['requestHeaders'];\nexport type PrDiffListFilesQueryVariables = Types.Exact<{\n owner: Types.Scalars['String']['input'];\n name: Types.Scalars['String']['input'];\n prNumber: Types.Scalars['Int']['input'];\n first: Types.Scalars['Int']['input'];\n after?: Types.InputMaybe<Types.Scalars['String']['input']>;\n}>;\n\n\nexport type PrDiffListFilesQuery = { __typename?: 'Query', repository?: { __typename?: 'Repository', pullRequest?: { __typename?: 'PullRequest', files?: { __typename?: 'PullRequestChangedFileConnection', nodes?: Array<{ __typename?: 'PullRequestChangedFile', path: string, additions: number, deletions: number } | null> | null, pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null } } | null } | null } | null };\n\n\nexport const PrDiffListFilesDocument = `\n query PrDiffListFiles($owner: String!, $name: String!, $prNumber: Int!, $first: Int!, $after: String) {\n repository(owner: $owner, name: $name) {\n pullRequest(number: $prNumber) {\n files(first: $first, after: $after) {\n nodes {\n path\n additions\n deletions\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n}\n `;\n\nexport type SdkFunctionWrapper = <T>(action: (requestHeaders?:Record<string, string>) => Promise<T>, operationName: string, operationType?: string, variables?: any) => Promise<T>;\n\n\nconst defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType, _variables) => action();\n\nexport function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {\n return {\n PrDiffListFiles(variables: PrDiffListFilesQueryVariables, requestHeaders?: GraphQLClientRequestHeaders, signal?: RequestInit['signal']): Promise<PrDiffListFilesQuery> {\n return withWrapper((wrappedRequestHeaders) => client.request<PrDiffListFilesQuery>({ document: PrDiffListFilesDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), 'PrDiffListFiles', 'query', variables);\n }\n };\n}\nexport type Sdk = ReturnType<typeof getSdk>;"],"mappings":";AAgBO,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBvC,IAAM,iBAAqC,CAAC,QAAQ,gBAAgB,gBAAgB,eAAe,OAAO;AAEnG,SAAS,OAAO,QAAuB,cAAkC,gBAAgB;AAC9F,SAAO;AAAA,IACL,gBAAgB,WAA0C,gBAA8C,QAA+D;AACrK,aAAO,YAAY,CAAC,0BAA0B,OAAO,QAA8B,EAAE,UAAU,yBAAyB,WAAW,gBAAgB,EAAE,GAAG,gBAAgB,GAAG,sBAAsB,GAAG,OAAO,CAAC,GAAG,mBAAmB,SAAS,SAAS;AAAA,IACtP;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// src/gql/operations/pr-list.generated.ts
|
|
2
|
+
var PrListDocument = `
|
|
3
|
+
query PrList($owner: String!, $name: String!, $first: Int!, $after: String) {
|
|
4
|
+
repository(owner: $owner, name: $name) {
|
|
5
|
+
pullRequests(
|
|
6
|
+
first: $first
|
|
7
|
+
after: $after
|
|
8
|
+
orderBy: {field: CREATED_AT, direction: DESC}
|
|
9
|
+
) {
|
|
10
|
+
nodes {
|
|
11
|
+
id
|
|
12
|
+
number
|
|
13
|
+
title
|
|
14
|
+
state
|
|
15
|
+
url
|
|
16
|
+
}
|
|
17
|
+
pageInfo {
|
|
18
|
+
endCursor
|
|
19
|
+
hasNextPage
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
var defaultWrapper = (action, _operationName, _operationType, _variables) => action();
|
|
26
|
+
function getSdk(client, withWrapper = defaultWrapper) {
|
|
27
|
+
return {
|
|
28
|
+
PrList(variables, requestHeaders, signal) {
|
|
29
|
+
return withWrapper((wrappedRequestHeaders) => client.request({ document: PrListDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "PrList", "query", variables);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export {
|
|
35
|
+
PrListDocument,
|
|
36
|
+
getSdk
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=chunk-TCLMLVUQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/gql/operations/pr-list.generated.ts"],"sourcesContent":["import type * as Types from '../generated/common-types';\n\nimport type { GraphQLClient, RequestOptions } from 'graphql-request';\ntype GraphQLClientRequestHeaders = RequestOptions['requestHeaders'];\nexport type PrListQueryVariables = Types.Exact<{\n owner: Types.Scalars['String']['input'];\n name: Types.Scalars['String']['input'];\n first: Types.Scalars['Int']['input'];\n after?: Types.InputMaybe<Types.Scalars['String']['input']>;\n}>;\n\n\nexport type PrListQuery = { __typename?: 'Query', repository?: { __typename?: 'Repository', pullRequests: { __typename?: 'PullRequestConnection', nodes?: Array<{ __typename?: 'PullRequest', id: string, number: number, title: string, state: Types.PullRequestState, url: any } | null> | null, pageInfo: { __typename?: 'PageInfo', endCursor?: string | null, hasNextPage: boolean } } } | null };\n\n\nexport const PrListDocument = `\n query PrList($owner: String!, $name: String!, $first: Int!, $after: String) {\n repository(owner: $owner, name: $name) {\n pullRequests(\n first: $first\n after: $after\n orderBy: {field: CREATED_AT, direction: DESC}\n ) {\n nodes {\n id\n number\n title\n state\n url\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n}\n `;\n\nexport type SdkFunctionWrapper = <T>(action: (requestHeaders?:Record<string, string>) => Promise<T>, operationName: string, operationType?: string, variables?: any) => Promise<T>;\n\n\nconst defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType, _variables) => action();\n\nexport function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {\n return {\n PrList(variables: PrListQueryVariables, requestHeaders?: GraphQLClientRequestHeaders, signal?: RequestInit['signal']): Promise<PrListQuery> {\n return withWrapper((wrappedRequestHeaders) => client.request<PrListQuery>({ document: PrListDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), 'PrList', 'query', variables);\n }\n };\n}\nexport type Sdk = ReturnType<typeof getSdk>;"],"mappings":";AAeO,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2B9B,IAAM,iBAAqC,CAAC,QAAQ,gBAAgB,gBAAgB,eAAe,OAAO;AAEnG,SAAS,OAAO,QAAuB,cAAkC,gBAAgB;AAC9F,SAAO;AAAA,IACL,OAAO,WAAiC,gBAA8C,QAAsD;AAC1I,aAAO,YAAY,CAAC,0BAA0B,OAAO,QAAqB,EAAE,UAAU,gBAAgB,WAAW,gBAAgB,EAAE,GAAG,gBAAgB,GAAG,sBAAsB,GAAG,OAAO,CAAC,GAAG,UAAU,SAAS,SAAS;AAAA,IAC3N;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import {
|
|
2
|
+
errorCodes
|
|
3
|
+
} from "./chunk-UOJWOHRM.js";
|
|
4
|
+
|
|
5
|
+
// src/core/execution/preflight.ts
|
|
6
|
+
function preflightCheck(input) {
|
|
7
|
+
if (input.route === "rest") {
|
|
8
|
+
return {
|
|
9
|
+
ok: false,
|
|
10
|
+
code: errorCodes.AdapterUnsupported,
|
|
11
|
+
message: "REST route is planned but not implemented in v1",
|
|
12
|
+
retryable: false,
|
|
13
|
+
details: { route: input.route }
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (input.route === "cli" && input.ghCliAvailable === false) {
|
|
17
|
+
return {
|
|
18
|
+
ok: false,
|
|
19
|
+
code: errorCodes.Validation,
|
|
20
|
+
message: "GitHub CLI is required for cli route",
|
|
21
|
+
retryable: false,
|
|
22
|
+
details: { route: input.route }
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (input.route === "cli" && input.ghAuthenticated === false) {
|
|
26
|
+
return {
|
|
27
|
+
ok: false,
|
|
28
|
+
code: errorCodes.Auth,
|
|
29
|
+
message: "GitHub CLI authentication is required for cli route",
|
|
30
|
+
retryable: false,
|
|
31
|
+
details: { route: input.route }
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (input.route === "graphql") {
|
|
35
|
+
const token = input.githubToken?.trim();
|
|
36
|
+
if (!token) {
|
|
37
|
+
return {
|
|
38
|
+
ok: false,
|
|
39
|
+
code: errorCodes.Auth,
|
|
40
|
+
message: "GitHub token is required for graphql route",
|
|
41
|
+
retryable: false,
|
|
42
|
+
details: { route: input.route }
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return { ok: true };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export {
|
|
50
|
+
preflightCheck
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=chunk-TDTKOJKN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/execution/preflight.ts"],"sourcesContent":["import type { RouteSource } from \"../contracts/envelope.js\"\nimport type { ErrorCode } from \"../errors/codes.js\"\nimport { errorCodes } from \"../errors/codes.js\"\n\nexport type PreflightInput = {\n route: RouteSource\n githubToken?: string | null\n ghCliAvailable?: boolean\n ghAuthenticated?: boolean\n}\n\nexport type PreflightResult =\n | { ok: true }\n | {\n ok: false\n code: ErrorCode\n message: string\n retryable: boolean\n details: { route: RouteSource }\n }\n\nexport function preflightCheck(input: PreflightInput): PreflightResult {\n if (input.route === \"rest\") {\n return {\n ok: false,\n code: errorCodes.AdapterUnsupported,\n message: \"REST route is planned but not implemented in v1\",\n retryable: false,\n details: { route: input.route }\n }\n }\n\n if (input.route === \"cli\" && input.ghCliAvailable === false) {\n return {\n ok: false,\n code: errorCodes.Validation,\n message: \"GitHub CLI is required for cli route\",\n retryable: false,\n details: { route: input.route }\n }\n }\n\n if (input.route === \"cli\" && input.ghAuthenticated === false) {\n return {\n ok: false,\n code: errorCodes.Auth,\n message: \"GitHub CLI authentication is required for cli route\",\n retryable: false,\n details: { route: input.route }\n }\n }\n\n if (input.route === \"graphql\") {\n const token = input.githubToken?.trim()\n if (!token) {\n return {\n ok: false,\n code: errorCodes.Auth,\n message: \"GitHub token is required for graphql route\",\n retryable: false,\n details: { route: input.route }\n }\n }\n }\n\n return { ok: true }\n}\n"],"mappings":";;;;;AAqBO,SAAS,eAAe,OAAwC;AACrE,MAAI,MAAM,UAAU,QAAQ;AAC1B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,WAAW;AAAA,MACjB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,SAAS,EAAE,OAAO,MAAM,MAAM;AAAA,IAChC;AAAA,EACF;AAEA,MAAI,MAAM,UAAU,SAAS,MAAM,mBAAmB,OAAO;AAC3D,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,WAAW;AAAA,MACjB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,SAAS,EAAE,OAAO,MAAM,MAAM;AAAA,IAChC;AAAA,EACF;AAEA,MAAI,MAAM,UAAU,SAAS,MAAM,oBAAoB,OAAO;AAC5D,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,WAAW;AAAA,MACjB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,SAAS,EAAE,OAAO,MAAM,MAAM;AAAA,IAChC;AAAA,EACF;AAEA,MAAI,MAAM,UAAU,WAAW;AAC7B,UAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,WAAW;AAAA,QACjB,SAAS;AAAA,QACT,WAAW;AAAA,QACX,SAAS,EAAE,OAAO,MAAM,MAAM;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,KAAK;AACpB;","names":[]}
|