@jevitate/cli 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/dist/ai-cli.js +40 -30
- package/dist/ai-cli.js.map +1 -1
- package/dist/author-journey-cli.d.ts +4 -0
- package/dist/author-journey-cli.js +109 -0
- package/dist/author-journey-cli.js.map +1 -0
- package/dist/bin.js +58077 -22454
- package/dist/bin.js.map +1 -1
- package/dist/browser-run-options.d.ts +58 -0
- package/dist/browser-run-options.js +106 -0
- package/dist/browser-run-options.js.map +1 -0
- package/dist/build-info.generated.d.ts +2 -0
- package/dist/build-info.generated.js +10 -0
- package/dist/build-info.generated.js.map +1 -0
- package/dist/check-api.d.ts +5 -0
- package/dist/check-api.js +233 -0
- package/dist/check-api.js.map +1 -0
- package/dist/check-budget.d.ts +26 -0
- package/dist/check-budget.js +89 -0
- package/dist/check-budget.js.map +1 -0
- package/dist/check-cli.d.ts +31 -0
- package/dist/check-cli.js +109 -0
- package/dist/check-cli.js.map +1 -0
- package/dist/check-execute.d.ts +25 -0
- package/dist/check-execute.js +385 -0
- package/dist/check-execute.js.map +1 -0
- package/dist/check-plan.d.ts +113 -0
- package/dist/check-plan.js +448 -0
- package/dist/check-plan.js.map +1 -0
- package/dist/check-suite.d.ts +171 -0
- package/dist/check-suite.js +515 -0
- package/dist/check-suite.js.map +1 -0
- package/dist/check-types.d.ts +181 -0
- package/dist/check-types.js +35 -0
- package/dist/check-types.js.map +1 -0
- package/dist/cli-args.d.ts +26 -0
- package/dist/cli-args.js +50 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-output.d.ts +102 -0
- package/dist/cli-output.js +516 -0
- package/dist/cli-output.js.map +1 -0
- package/dist/cli-reference.d.ts +3 -0
- package/dist/cli-reference.js +81 -0
- package/dist/cli-reference.js.map +1 -0
- package/dist/cli-refusal.d.ts +12 -0
- package/dist/cli-refusal.js +52 -0
- package/dist/cli-refusal.js.map +1 -0
- package/dist/cli-shared.d.ts +330 -0
- package/dist/cli-shared.js +492 -0
- package/dist/cli-shared.js.map +1 -0
- package/dist/cli-surface.d.ts +33 -0
- package/dist/cli-surface.js +48 -0
- package/dist/cli-surface.js.map +1 -0
- package/dist/conversation-options.d.ts +15 -0
- package/dist/conversation-options.js +10 -0
- package/dist/conversation-options.js.map +1 -0
- package/dist/credentials-file.d.ts +15 -0
- package/dist/credentials-file.js +56 -0
- package/dist/credentials-file.js.map +1 -0
- package/dist/data-dir.d.ts +1 -1
- package/dist/data-dir.js +1 -1
- package/dist/defect-evidence.d.ts +141 -0
- package/dist/defect-evidence.js +502 -0
- package/dist/defect-evidence.js.map +1 -0
- package/dist/demo-aspect-api.d.ts +209 -0
- package/dist/demo-aspect-api.js +397 -0
- package/dist/demo-aspect-api.js.map +1 -0
- package/dist/demo-aspect-cli.d.ts +3 -0
- package/dist/demo-aspect-cli.js +241 -0
- package/dist/demo-aspect-cli.js.map +1 -0
- package/dist/demo-capture.d.ts +108 -0
- package/dist/demo-capture.js +438 -0
- package/dist/demo-capture.js.map +1 -0
- package/dist/engine.d.ts +35 -0
- package/dist/engine.js +25 -0
- package/dist/engine.js.map +1 -0
- package/dist/environments.d.ts +155 -0
- package/dist/environments.js +364 -0
- package/dist/environments.js.map +1 -0
- package/dist/exit-codes.d.ts +46 -0
- package/dist/exit-codes.js +91 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/explore-adversarial.d.ts +137 -0
- package/dist/explore-adversarial.js +218 -0
- package/dist/explore-adversarial.js.map +1 -0
- package/dist/explore-api.d.ts +7 -187
- package/dist/explore-api.js +7 -301
- package/dist/explore-api.js.map +1 -1
- package/dist/explore-author.d.ts +79 -0
- package/dist/explore-author.js +86 -0
- package/dist/explore-author.js.map +1 -0
- package/dist/explore-cli.d.ts +7 -0
- package/dist/explore-cli.js +963 -0
- package/dist/explore-cli.js.map +1 -0
- package/dist/explore-coverage.d.ts +158 -0
- package/dist/explore-coverage.js +240 -0
- package/dist/explore-coverage.js.map +1 -0
- package/dist/explore-feature.d.ts +127 -0
- package/dist/explore-feature.js +220 -0
- package/dist/explore-feature.js.map +1 -0
- package/dist/explore-goal.d.ts +253 -0
- package/dist/explore-goal.js +374 -0
- package/dist/explore-goal.js.map +1 -0
- package/dist/explore-shared.d.ts +152 -0
- package/dist/explore-shared.js +129 -0
- package/dist/explore-shared.js.map +1 -0
- package/dist/explore-specs.d.ts +53 -0
- package/dist/explore-specs.js +333 -0
- package/dist/explore-specs.js.map +1 -0
- package/dist/findings-filing.d.ts +64 -0
- package/dist/findings-filing.js +108 -0
- package/dist/findings-filing.js.map +1 -0
- package/dist/fixture-auth.d.ts +52 -0
- package/dist/fixture-auth.js +82 -0
- package/dist/fixture-auth.js.map +1 -0
- package/dist/fixture-cli.d.ts +70 -0
- package/dist/fixture-cli.js +178 -0
- package/dist/fixture-cli.js.map +1 -0
- package/dist/github-issue-filer.d.ts +62 -0
- package/dist/github-issue-filer.js +188 -0
- package/dist/github-issue-filer.js.map +1 -0
- package/dist/host-health-run.d.ts +24 -0
- package/dist/host-health-run.js +27 -0
- package/dist/host-health-run.js.map +1 -0
- package/dist/http-5xx-outcome.d.ts +6 -0
- package/dist/http-5xx-outcome.js +39 -0
- package/dist/http-5xx-outcome.js.map +1 -0
- package/dist/inbox-cli.d.ts +7 -0
- package/dist/inbox-cli.js +197 -0
- package/dist/inbox-cli.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init-cli.d.ts +4 -0
- package/dist/init-cli.js +127 -0
- package/dist/init-cli.js.map +1 -0
- package/dist/init-keys.d.ts +19 -2
- package/dist/init-keys.js +15 -4
- package/dist/init-keys.js.map +1 -1
- package/dist/init-next-steps.d.ts +35 -0
- package/dist/init-next-steps.js +79 -0
- package/dist/init-next-steps.js.map +1 -0
- package/dist/invariants-file.d.ts +34 -0
- package/dist/invariants-file.js +68 -0
- package/dist/invariants-file.js.map +1 -0
- package/dist/invariants-validate.d.ts +30 -0
- package/dist/invariants-validate.js +105 -0
- package/dist/invariants-validate.js.map +1 -0
- package/dist/journey-annotate-api.d.ts +76 -0
- package/dist/journey-annotate-api.js +256 -0
- package/dist/journey-annotate-api.js.map +1 -0
- package/dist/journey-annotate-cli.d.ts +9 -0
- package/dist/journey-annotate-cli.js +179 -0
- package/dist/journey-annotate-cli.js.map +1 -0
- package/dist/journey-api.d.ts +79 -2
- package/dist/journey-api.js +136 -19
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +4 -0
- package/dist/journey-cli.js +370 -0
- package/dist/journey-cli.js.map +1 -0
- package/dist/journey-demo-api.d.ts +112 -0
- package/dist/journey-demo-api.js +392 -0
- package/dist/journey-demo-api.js.map +1 -0
- package/dist/journey-demo-cli.d.ts +10 -0
- package/dist/journey-demo-cli.js +155 -0
- package/dist/journey-demo-cli.js.map +1 -0
- package/dist/kill-signal.d.ts +193 -0
- package/dist/kill-signal.js +284 -0
- package/dist/kill-signal.js.map +1 -0
- package/dist/launch-armed.d.ts +37 -0
- package/dist/launch-armed.js +31 -0
- package/dist/launch-armed.js.map +1 -0
- package/dist/ledger-api.d.ts +106 -0
- package/dist/ledger-api.js +237 -0
- package/dist/ledger-api.js.map +1 -0
- package/dist/ledger-cli.d.ts +18 -0
- package/dist/ledger-cli.js +107 -0
- package/dist/ledger-cli.js.map +1 -0
- package/dist/load-api.d.ts +29 -11
- package/dist/load-api.js +23 -15
- package/dist/load-api.js.map +1 -1
- package/dist/load-cli.d.ts +4 -0
- package/dist/load-cli.js +97 -0
- package/dist/load-cli.js.map +1 -0
- package/dist/log-correlation.d.ts +147 -0
- package/dist/log-correlation.js +325 -0
- package/dist/log-correlation.js.map +1 -0
- package/dist/log-lines.d.ts +131 -0
- package/dist/log-lines.js +389 -0
- package/dist/log-lines.js.map +1 -0
- package/dist/log-sources.d.ts +71 -0
- package/dist/log-sources.js +235 -0
- package/dist/log-sources.js.map +1 -0
- package/dist/logs-cli.d.ts +3 -0
- package/dist/logs-cli.js +51 -0
- package/dist/logs-cli.js.map +1 -0
- package/dist/logs-retention.d.ts +28 -0
- package/dist/logs-retention.js +84 -0
- package/dist/logs-retention.js.map +1 -0
- package/dist/mcp-api.d.ts +89 -1
- package/dist/mcp-api.js +472 -18
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-args.d.ts +38 -0
- package/dist/mcp-args.js +131 -0
- package/dist/mcp-args.js.map +1 -0
- package/dist/mcp-cli-bridge.d.ts +34 -0
- package/dist/mcp-cli-bridge.js +62 -0
- package/dist/mcp-cli-bridge.js.map +1 -0
- package/dist/mcp-cli-runner.d.ts +29 -0
- package/dist/mcp-cli-runner.js +44 -0
- package/dist/mcp-cli-runner.js.map +1 -0
- package/dist/mcp-cli-tools.d.ts +125 -0
- package/dist/mcp-cli-tools.js +680 -0
- package/dist/mcp-cli-tools.js.map +1 -0
- package/dist/mcp-paths.d.ts +28 -0
- package/dist/mcp-paths.js +76 -0
- package/dist/mcp-paths.js.map +1 -0
- package/dist/mission-actors.d.ts +40 -0
- package/dist/mission-actors.js +72 -0
- package/dist/mission-actors.js.map +1 -0
- package/dist/mission-api.d.ts +35 -0
- package/dist/mission-api.js +58 -2
- package/dist/mission-api.js.map +1 -1
- package/dist/mission-cli.d.ts +4 -0
- package/dist/mission-cli.js +247 -0
- package/dist/mission-cli.js.map +1 -0
- package/dist/mission-exit.d.ts +22 -0
- package/dist/mission-exit.js +26 -0
- package/dist/mission-exit.js.map +1 -0
- package/dist/mission-fixtures.d.ts +225 -0
- package/dist/mission-fixtures.js +828 -0
- package/dist/mission-fixtures.js.map +1 -0
- package/dist/mission-journal.d.ts +60 -0
- package/dist/mission-journal.js +115 -0
- package/dist/mission-journal.js.map +1 -0
- package/dist/mission-queue-cli.d.ts +10 -0
- package/dist/mission-queue-cli.js +198 -0
- package/dist/mission-queue-cli.js.map +1 -0
- package/dist/mission-queue-runner.d.ts +126 -0
- package/dist/mission-queue-runner.js +397 -0
- package/dist/mission-queue-runner.js.map +1 -0
- package/dist/multi-run-cli.d.ts +37 -0
- package/dist/multi-run-cli.js +110 -0
- package/dist/multi-run-cli.js.map +1 -0
- package/dist/multi-run.d.ts +339 -0
- package/dist/multi-run.js +619 -0
- package/dist/multi-run.js.map +1 -0
- package/dist/openrouter-call.d.ts +22 -0
- package/dist/openrouter-call.js +63 -0
- package/dist/openrouter-call.js.map +1 -0
- package/dist/profile-cli.d.ts +4 -0
- package/dist/profile-cli.js +57 -0
- package/dist/profile-cli.js.map +1 -0
- package/dist/program.d.ts +3 -75
- package/dist/program.js +119 -1921
- package/dist/program.js.map +1 -1
- package/dist/project-dir.d.ts +96 -0
- package/dist/project-dir.js +220 -0
- package/dist/project-dir.js.map +1 -0
- package/dist/record-api.d.ts +10 -6
- package/dist/record-api.js +39 -28
- package/dist/record-api.js.map +1 -1
- package/dist/record-cli.d.ts +4 -0
- package/dist/record-cli.js +64 -0
- package/dist/record-cli.js.map +1 -0
- package/dist/recording-cli.d.ts +4 -0
- package/dist/recording-cli.js +248 -0
- package/dist/recording-cli.js.map +1 -0
- package/dist/regression-api.d.ts +101 -0
- package/dist/regression-api.js +384 -5
- package/dist/regression-api.js.map +1 -1
- package/dist/regression-cli.d.ts +4 -0
- package/dist/regression-cli.js +232 -0
- package/dist/regression-cli.js.map +1 -0
- package/dist/report-api.d.ts +146 -0
- package/dist/report-api.js +430 -0
- package/dist/report-api.js.map +1 -0
- package/dist/report-cli.d.ts +12 -0
- package/dist/report-cli.js +147 -0
- package/dist/report-cli.js.map +1 -0
- package/dist/result-schema.d.ts +22 -0
- package/dist/result-schema.js +28 -0
- package/dist/result-schema.js.map +1 -0
- package/dist/run-index.d.ts +29 -0
- package/dist/run-index.js +70 -0
- package/dist/run-index.js.map +1 -0
- package/dist/run-screenshots.d.ts +123 -0
- package/dist/run-screenshots.js +229 -0
- package/dist/run-screenshots.js.map +1 -0
- package/dist/runtime-env.d.ts +8 -0
- package/dist/runtime-env.js +22 -0
- package/dist/runtime-env.js.map +1 -0
- package/dist/secret-args.d.ts +23 -0
- package/dist/secret-args.js +45 -0
- package/dist/secret-args.js.map +1 -0
- package/dist/serve-cli.d.ts +4 -0
- package/dist/serve-cli.js +95 -0
- package/dist/serve-cli.js.map +1 -0
- package/dist/server-log-verify.d.ts +34 -0
- package/dist/server-log-verify.js +115 -0
- package/dist/server-log-verify.js.map +1 -0
- package/dist/session-check.d.ts +14 -0
- package/dist/session-check.js +44 -0
- package/dist/session-check.js.map +1 -0
- package/dist/site-cli.d.ts +4 -0
- package/dist/site-cli.js +127 -0
- package/dist/site-cli.js.map +1 -0
- package/dist/site-gate-cli.d.ts +28 -0
- package/dist/site-gate-cli.js +58 -0
- package/dist/site-gate-cli.js.map +1 -0
- package/dist/source-api.js +18 -3
- package/dist/source-api.js.map +1 -1
- package/dist/source-cli.d.ts +4 -0
- package/dist/source-cli.js +284 -0
- package/dist/source-cli.js.map +1 -0
- package/dist/source-run-api.d.ts +27 -1
- package/dist/source-run-api.js +22 -11
- package/dist/source-run-api.js.map +1 -1
- package/dist/storage-state-snapshot.d.ts +50 -0
- package/dist/storage-state-snapshot.js +87 -0
- package/dist/storage-state-snapshot.js.map +1 -0
- package/dist/suite-explore-options.d.ts +289 -0
- package/dist/suite-explore-options.js +140 -0
- package/dist/suite-explore-options.js.map +1 -0
- package/dist/target-config.d.ts +109 -0
- package/dist/target-config.js +216 -0
- package/dist/target-config.js.map +1 -0
- package/dist/transcript-file.d.ts +12 -0
- package/dist/transcript-file.js +23 -0
- package/dist/transcript-file.js.map +1 -0
- package/dist/ui-api.d.ts +3 -0
- package/dist/ui-api.js +7 -1
- package/dist/ui-api.js.map +1 -1
- package/dist/usability-capture.d.ts +43 -0
- package/dist/usability-capture.js +326 -0
- package/dist/usability-capture.js.map +1 -0
- package/dist/usage-config.d.ts +36 -0
- package/dist/usage-config.js +114 -0
- package/dist/usage-config.js.map +1 -0
- package/dist/ux-api.d.ts +3 -75
- package/dist/ux-api.js +3 -220
- package/dist/ux-api.js.map +1 -1
- package/dist/ux-cli.d.ts +4 -0
- package/dist/ux-cli.js +102 -0
- package/dist/ux-cli.js.map +1 -0
- package/dist/ux-config.d.ts +29 -0
- package/dist/ux-config.js +103 -0
- package/dist/ux-config.js.map +1 -0
- package/dist/ux-evidence.d.ts +54 -0
- package/dist/ux-evidence.js +197 -0
- package/dist/ux-evidence.js.map +1 -0
- package/dist/ux-review.d.ts +112 -0
- package/dist/ux-review.js +151 -0
- package/dist/ux-review.js.map +1 -0
- package/dist/ux-usability.d.ts +238 -0
- package/dist/ux-usability.js +494 -0
- package/dist/ux-usability.js.map +1 -0
- package/dist/verify-fix-api.d.ts +173 -0
- package/dist/verify-fix-api.js +454 -0
- package/dist/verify-fix-api.js.map +1 -0
- package/dist/verify-fix-cli.d.ts +4 -0
- package/dist/verify-fix-cli.js +110 -0
- package/dist/verify-fix-cli.js.map +1 -0
- package/package.json +19 -14
- package/skills/jevitate-ci-check/SKILL.md +77 -0
- package/skills/jevitate-demo/SKILL.md +61 -0
- package/skills/jevitate-explore/SKILL.md +88 -87
- package/skills/jevitate-getting-started/SKILL.md +88 -0
- package/skills/jevitate-load-test/SKILL.md +11 -2
- package/skills/jevitate-mission-scope/SKILL.md +19 -11
- package/skills/jevitate-record/SKILL.md +23 -5
- package/skills/jevitate-run-journey/SKILL.md +61 -17
- package/skills/jevitate-sources/SKILL.md +57 -14
- package/skills/jevitate-ux-review/SKILL.md +106 -16
- package/skills/jevitate-verify-fix/SKILL.md +76 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { BACKOFF_SCHEDULE_MS, isTransientError, jittered, redactText, retryTransient, } from "@jevitate/ai-core";
|
|
3
|
+
export const defaultExec = (cmd, args, stdin) => new Promise((resolve) => {
|
|
4
|
+
let stdout = "";
|
|
5
|
+
let stderr = "";
|
|
6
|
+
const child = spawn(cmd, [...args], { stdio: ["pipe", "pipe", "pipe"] });
|
|
7
|
+
child.stdout.on("data", (d) => (stdout += d.toString("utf8")));
|
|
8
|
+
child.stderr.on("data", (d) => (stderr += d.toString("utf8")));
|
|
9
|
+
child.on("error", (e) => resolve({ code: -1, stdout, stderr: e.message }));
|
|
10
|
+
child.on("close", (code) => resolve({ code: code ?? -1, stdout, stderr }));
|
|
11
|
+
child.stdin.end(stdin ?? "");
|
|
12
|
+
});
|
|
13
|
+
export class GitHubFilingError extends Error {
|
|
14
|
+
code = "E_ISSUE_FILING";
|
|
15
|
+
/** The HTTP status, for a REST failure (drives the transient-retry decision). */
|
|
16
|
+
status;
|
|
17
|
+
constructor(message, status) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "GitHubFilingError";
|
|
20
|
+
if (status !== undefined)
|
|
21
|
+
this.status = status;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const ISSUE_NUMBER = /\/issues\/(\d+)/;
|
|
25
|
+
/** The dedup marker every jevitate draft body carries (see `fingerprintMarker`). */
|
|
26
|
+
const FINGERPRINT_MARKER = /<!-- jevitate-fingerprint: [0-9a-f]+ -->/;
|
|
27
|
+
function parseIssueUrl(url) {
|
|
28
|
+
const m = ISSUE_NUMBER.exec(url);
|
|
29
|
+
if (m?.[1] === undefined)
|
|
30
|
+
throw new GitHubFilingError(`unexpected issue URL: ${url}`);
|
|
31
|
+
return { number: Number(m[1]), url };
|
|
32
|
+
}
|
|
33
|
+
/** The bare fingerprint inside a `<!-- jevitate-fingerprint: … -->` marker (the searchable token). */
|
|
34
|
+
function markerToken(marker) {
|
|
35
|
+
return marker.replace(/^<!--\s*jevitate-fingerprint:\s*/, "").replace(/\s*-->$/, "");
|
|
36
|
+
}
|
|
37
|
+
function isRecord(v) {
|
|
38
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
39
|
+
}
|
|
40
|
+
export class GitHubIssueFiler {
|
|
41
|
+
#exec;
|
|
42
|
+
#fetch;
|
|
43
|
+
#store;
|
|
44
|
+
#apiBase;
|
|
45
|
+
#retry;
|
|
46
|
+
#mode;
|
|
47
|
+
constructor(deps) {
|
|
48
|
+
this.#exec = deps.exec ?? defaultExec;
|
|
49
|
+
this.#fetch = deps.fetch;
|
|
50
|
+
this.#store = deps.store;
|
|
51
|
+
this.#apiBase = deps.apiBase ?? "https://api.github.com";
|
|
52
|
+
this.#retry = deps.retry ?? {};
|
|
53
|
+
}
|
|
54
|
+
/** `gh` when it is installed and runnable, else REST (which needs `GITHUB_TOKEN`). */
|
|
55
|
+
mode() {
|
|
56
|
+
this.#mode ??= this.#exec("gh", ["--version"]).then((r) => (r.code === 0 ? "gh" : "rest"));
|
|
57
|
+
return this.#mode;
|
|
58
|
+
}
|
|
59
|
+
#scrub(text) {
|
|
60
|
+
const token = this.#store.read("GITHUB_TOKEN");
|
|
61
|
+
return token === undefined ? text : redactText(text, [token]);
|
|
62
|
+
}
|
|
63
|
+
async #gh(args, stdin) {
|
|
64
|
+
const r = await this.#exec("gh", args, stdin);
|
|
65
|
+
if (r.code !== 0) {
|
|
66
|
+
// gh reports API failures as "HTTP 502: Bad Gateway (…)": keep the status so the transient
|
|
67
|
+
// classification is the same as for the REST transport.
|
|
68
|
+
const status = /\bHTTP (\d{3})\b/.exec(r.stderr)?.[1];
|
|
69
|
+
throw new GitHubFilingError(this.#scrub(`gh ${args[0] ?? ""} ${args[1] ?? ""} failed: ${r.stderr.trim()}`), status === undefined ? undefined : Number(status));
|
|
70
|
+
}
|
|
71
|
+
return r.stdout;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* An IDEMPOTENT REST call (a read), retried with backoff on transient failures (429/5xx/network);
|
|
75
|
+
* typed failure after. Writes never go through here — see `create` / `comment`.
|
|
76
|
+
*/
|
|
77
|
+
async #rest(method, path) {
|
|
78
|
+
const r = await retryTransient(() => this.#restOnce(method, path), this.#retry);
|
|
79
|
+
if (r.ok)
|
|
80
|
+
return r.value;
|
|
81
|
+
const e = r.error;
|
|
82
|
+
throw e instanceof GitHubFilingError
|
|
83
|
+
? e
|
|
84
|
+
: new GitHubFilingError(this.#scrub(`GitHub API ${method} ${path} failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
85
|
+
}
|
|
86
|
+
async #restOnce(method, path, body) {
|
|
87
|
+
const token = this.#store.read("GITHUB_TOKEN");
|
|
88
|
+
if (token === undefined) {
|
|
89
|
+
throw new GitHubFilingError("filing needs the gh CLI or a GITHUB_TOKEN in jevitate's credential store");
|
|
90
|
+
}
|
|
91
|
+
const doFetch = this.#fetch ?? globalThis.fetch;
|
|
92
|
+
const res = await doFetch(`${this.#apiBase}${path}`, {
|
|
93
|
+
method,
|
|
94
|
+
headers: {
|
|
95
|
+
Authorization: `Bearer ${token}`,
|
|
96
|
+
Accept: "application/vnd.github+json",
|
|
97
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
98
|
+
"User-Agent": "jevitate",
|
|
99
|
+
...(body === undefined ? {} : { "Content-Type": "application/json" }),
|
|
100
|
+
},
|
|
101
|
+
...(body === undefined ? {} : { body: JSON.stringify(body) }),
|
|
102
|
+
});
|
|
103
|
+
const text = await res.text();
|
|
104
|
+
if (res.status < 200 || res.status >= 300) {
|
|
105
|
+
throw new GitHubFilingError(this.#scrub(`GitHub API ${res.status} on ${method} ${path}: ${text.slice(0, 300)}`), res.status);
|
|
106
|
+
}
|
|
107
|
+
return text === "" ? null : JSON.parse(text);
|
|
108
|
+
}
|
|
109
|
+
async findOpenByMarker(repo, marker) {
|
|
110
|
+
const token = markerToken(marker);
|
|
111
|
+
if ((await this.mode()) === "gh") {
|
|
112
|
+
const out = await this.#gh([
|
|
113
|
+
"issue", "list", "--repo", repo, "--state", "open", "--search", `${token} in:body`,
|
|
114
|
+
"--json", "number,url,body", "--limit", "20",
|
|
115
|
+
]);
|
|
116
|
+
const list = JSON.parse(out === "" ? "[]" : out);
|
|
117
|
+
if (!Array.isArray(list))
|
|
118
|
+
return null;
|
|
119
|
+
for (const item of list) {
|
|
120
|
+
if (isRecord(item) && typeof item.body === "string" && item.body.includes(marker) && typeof item.number === "number" && typeof item.url === "string") {
|
|
121
|
+
return { number: item.number, url: item.url };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
const q = encodeURIComponent(`repo:${repo} is:issue is:open in:body ${token}`);
|
|
127
|
+
const res = await this.#rest("GET", `/search/issues?q=${q}&per_page=20`);
|
|
128
|
+
const items = isRecord(res) && Array.isArray(res.items) ? res.items : [];
|
|
129
|
+
for (const item of items) {
|
|
130
|
+
if (isRecord(item) && typeof item.body === "string" && item.body.includes(marker) && typeof item.number === "number" && typeof item.html_url === "string") {
|
|
131
|
+
return { number: item.number, url: item.html_url };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
/** One create attempt, on whichever transport is in use. */
|
|
137
|
+
async #createOnce(repo, issue) {
|
|
138
|
+
if ((await this.mode()) === "gh") {
|
|
139
|
+
const out = await this.#gh(["issue", "create", "--repo", repo, "--title", issue.title, "--body-file", "-"], issue.body);
|
|
140
|
+
return parseIssueUrl(out.trim());
|
|
141
|
+
}
|
|
142
|
+
const res = await this.#restOnce("POST", `/repos/${repo}/issues`, { title: issue.title, body: issue.body });
|
|
143
|
+
if (!isRecord(res) || typeof res.number !== "number" || typeof res.html_url !== "string") {
|
|
144
|
+
throw new GitHubFilingError("GitHub API returned no issue");
|
|
145
|
+
}
|
|
146
|
+
return { number: res.number, url: res.html_url };
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Creating an issue is NOT idempotent, so it is never blindly retried: a "failed" create (a 502,
|
|
150
|
+
* a dropped connection) may well have persisted. After a transient failure the fingerprint
|
|
151
|
+
* search runs again — if the issue now exists it IS the one this call created and is returned;
|
|
152
|
+
* only if it is still absent is the create tried again, on the backoff schedule. A body without a
|
|
153
|
+
* fingerprint marker cannot be checked, so it gets exactly one attempt. Same for both transports.
|
|
154
|
+
*/
|
|
155
|
+
async create(repo, issue) {
|
|
156
|
+
const marker = FINGERPRINT_MARKER.exec(issue.body)?.[0];
|
|
157
|
+
const schedule = this.#retry.schedule ?? BACKOFF_SCHEDULE_MS;
|
|
158
|
+
const sleep = this.#retry.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
159
|
+
const random = this.#retry.random ?? Math.random;
|
|
160
|
+
for (let attempt = 0;; attempt++) {
|
|
161
|
+
try {
|
|
162
|
+
return await this.#createOnce(repo, issue);
|
|
163
|
+
}
|
|
164
|
+
catch (e) {
|
|
165
|
+
const delay = schedule[attempt];
|
|
166
|
+
if (marker === undefined || delay === undefined || !isTransientError(e))
|
|
167
|
+
throw e;
|
|
168
|
+
const landed = await this.findOpenByMarker(repo, marker);
|
|
169
|
+
if (landed !== null)
|
|
170
|
+
return landed;
|
|
171
|
+
await sleep(jittered(delay, random));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* An occurrence comment is not idempotent either: it gets exactly one attempt (a duplicate
|
|
177
|
+
* comment is worse than a missing one — the draft on disk keeps the occurrence either way).
|
|
178
|
+
*/
|
|
179
|
+
async comment(repo, number, body) {
|
|
180
|
+
if ((await this.mode()) === "gh") {
|
|
181
|
+
const out = await this.#gh(["issue", "comment", String(number), "--repo", repo, "--body-file", "-"], body);
|
|
182
|
+
return { number, url: out.trim() };
|
|
183
|
+
}
|
|
184
|
+
const res = await this.#restOnce("POST", `/repos/${repo}/issues/${number}/comments`, { body });
|
|
185
|
+
return { number, url: isRecord(res) && typeof res.html_url === "string" ? res.html_url : "" };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=github-issue-filer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-issue-filer.js","sourceRoot":"","sources":["../src/github-issue-filer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { HostHealthSampler, degradedEnvironmentOutcome } from "@jevitate/explore";
|
|
2
|
+
import type { EnvironmentDegraded, HostHealthSummary, MissionFailure } from "@jevitate/domain";
|
|
3
|
+
/**
|
|
4
|
+
* One host-health sampler per mission run (#203), shared by every strategy's runner: started (with
|
|
5
|
+
* one sample taken) BEFORE the browser opens, fed every transcript entry, handed to the mission so a
|
|
6
|
+
* hang/no-progress met on a starved host is marked `environment-degraded`, and summarised into the
|
|
7
|
+
* result's `hostHealth`. `injected` is the test seam (a deterministic fake host).
|
|
8
|
+
*/
|
|
9
|
+
export declare function startHostHealth(injected?: HostHealthSampler): Promise<HostHealthSampler>;
|
|
10
|
+
/** What every result carries from the sampler, and the degraded-environment verdict rule applied. */
|
|
11
|
+
export interface HostHealthVerdict<O extends string> {
|
|
12
|
+
readonly outcome: O | "inconclusive";
|
|
13
|
+
/** Set when the rule turned the outcome `inconclusive` (reason `degraded-environment`). */
|
|
14
|
+
readonly failure?: MissionFailure;
|
|
15
|
+
readonly fields: {
|
|
16
|
+
readonly hostHealth: HostHealthSummary;
|
|
17
|
+
readonly environmentDegraded: EnvironmentDegraded[];
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Takes the closing sample and applies the run-level rule: most steps starved → `inconclusive`
|
|
22
|
+
* (`degraded-environment`), never `clean` (see `degradedEnvironmentOutcome`).
|
|
23
|
+
*/
|
|
24
|
+
export declare function finishHostHealth<O extends string>(health: HostHealthSampler, outcome: O, opts?: Parameters<typeof degradedEnvironmentOutcome>[2]): Promise<HostHealthVerdict<O>>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { HostHealthSampler, degradedEnvironmentOutcome } from "@jevitate/explore";
|
|
2
|
+
/**
|
|
3
|
+
* One host-health sampler per mission run (#203), shared by every strategy's runner: started (with
|
|
4
|
+
* one sample taken) BEFORE the browser opens, fed every transcript entry, handed to the mission so a
|
|
5
|
+
* hang/no-progress met on a starved host is marked `environment-degraded`, and summarised into the
|
|
6
|
+
* result's `hostHealth`. `injected` is the test seam (a deterministic fake host).
|
|
7
|
+
*/
|
|
8
|
+
export async function startHostHealth(injected) {
|
|
9
|
+
const health = (injected ?? new HostHealthSampler()).start();
|
|
10
|
+
await health.sample();
|
|
11
|
+
return health;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Takes the closing sample and applies the run-level rule: most steps starved → `inconclusive`
|
|
15
|
+
* (`degraded-environment`), never `clean` (see `degradedEnvironmentOutcome`).
|
|
16
|
+
*/
|
|
17
|
+
export async function finishHostHealth(health, outcome, opts = {}) {
|
|
18
|
+
await health.sample();
|
|
19
|
+
const hostHealth = health.summary();
|
|
20
|
+
const verdict = degradedEnvironmentOutcome(outcome, hostHealth, opts);
|
|
21
|
+
return {
|
|
22
|
+
outcome: verdict.outcome,
|
|
23
|
+
...(verdict.failure === undefined ? {} : { failure: verdict.failure }),
|
|
24
|
+
fields: { hostHealth, environmentDegraded: health.findings() },
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=host-health-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-health-run.js","sourceRoot":"","sources":["../src/host-health-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAGlF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAA4B;IAChE,MAAM,MAAM,GAAG,CAAC,QAAQ,IAAI,IAAI,iBAAiB,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7D,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC;AAUD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAyB,EACzB,OAAU,EACV,OAAyD,EAAE;IAE3D,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACtB,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,0BAA0B,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACtE,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QACtE,MAAM,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE;KAC/D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { GoalBasedOutcome, Http5xxDefect } from "@jevitate/explore";
|
|
2
|
+
export declare function applyHttp5xxGoalOutcome(outcome: GoalBasedOutcome, defects: readonly Http5xxDefect[]): GoalBasedOutcome;
|
|
3
|
+
/** `PUT /api/profile → 500` for each defect (first three), for a one-line `reason`. */
|
|
4
|
+
export declare function describeHttp5xx(defects: readonly Http5xxDefect[]): string;
|
|
5
|
+
/** The `reason` of a goal run that `applyHttp5xxGoalOutcome` turned into `defects-found`. */
|
|
6
|
+
export declare function http5xxGoalReason(defects: readonly Http5xxDefect[], assertionPassed: boolean): string;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How an HTTP 5xx hard-signal defect (#208, `Http5xxOracle`) folds into a run's outcome — the same
|
|
3
|
+
* rule a `server-log` defect follows (#142):
|
|
4
|
+
*
|
|
5
|
+
* - coverage/exploratory and feature runs count it with their own defects (a found defect wins
|
|
6
|
+
* over a thin run's `inconclusive`, exactly like a declared-invariant defect);
|
|
7
|
+
* - a goal run's own `GoalBasedOutcome`: `defects-found` over `succeeded` / `exhausted` /
|
|
8
|
+
* `blocked`. A goal whose checks held but whose run hit a server error is NOT a success: the
|
|
9
|
+
* checks' verdict stays on the result (`assertionPassed`, `checks`), and `reason` says both.
|
|
10
|
+
* A broken run (`inconclusive` / `crashed`) and a hang keep their outcome; the defect is still
|
|
11
|
+
* listed in `defects`, and `reason` names it.
|
|
12
|
+
*/
|
|
13
|
+
const BROKEN_GOAL_OUTCOMES = new Set(["inconclusive", "crashed", "hang", "intermittent"]);
|
|
14
|
+
export function applyHttp5xxGoalOutcome(outcome, defects) {
|
|
15
|
+
return defects.length > 0 && !BROKEN_GOAL_OUTCOMES.has(outcome) ? "defects-found" : outcome;
|
|
16
|
+
}
|
|
17
|
+
/** `PUT /api/profile → 500` for each defect (first three), for a one-line `reason`. */
|
|
18
|
+
export function describeHttp5xx(defects) {
|
|
19
|
+
const shown = defects.slice(0, 3).map((d) => {
|
|
20
|
+
const s = d.signals[0];
|
|
21
|
+
let path = s?.url ?? d.route;
|
|
22
|
+
try {
|
|
23
|
+
path = new URL(path).pathname;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
/* keep the raw (redacted) url */
|
|
27
|
+
}
|
|
28
|
+
return `${d.method} ${path} → ${s?.status ?? "5xx"}`;
|
|
29
|
+
});
|
|
30
|
+
const more = defects.length > 3 ? ` (+${defects.length - 3} more)` : "";
|
|
31
|
+
return `${shown.join(", ")}${more}`;
|
|
32
|
+
}
|
|
33
|
+
/** The `reason` of a goal run that `applyHttp5xxGoalOutcome` turned into `defects-found`. */
|
|
34
|
+
export function http5xxGoalReason(defects, assertionPassed) {
|
|
35
|
+
const n = defects.length;
|
|
36
|
+
const found = `${n} HTTP 5xx defect${n === 1 ? "" : "s"} found: ${describeHttp5xx(defects)}`;
|
|
37
|
+
return assertionPassed ? `${found} — the goal's success checks held, but the app answered with a server error` : found;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=http-5xx-outcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-5xx-outcome.js","sourceRoot":"","sources":["../src/http-5xx-outcome.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,oBAAoB,GAAkC,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAEzH,MAAM,UAAU,uBAAuB,CAAC,OAAyB,EAAE,OAAiC;IAClG,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9F,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,eAAe,CAAC,OAAiC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QACD,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,MAAM,CAAC,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,iBAAiB,CAAC,OAAiC,EAAE,eAAwB;IAC3F,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7F,OAAO,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,6EAA6E,CAAC,CAAC,CAAC,KAAK,CAAC;AACzH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type CliDeps } from "./cli-shared.js";
|
|
3
|
+
export declare function formatInboxListHuman(data: unknown): string;
|
|
4
|
+
export declare function formatInboxThreadHuman(id: string): (data: unknown) => string;
|
|
5
|
+
export declare function formatInboxCommandHuman(data: unknown): string;
|
|
6
|
+
export declare function formatInboxHealthHuman(data: unknown): string;
|
|
7
|
+
export declare function registerInboxCommands(program: Command, deps: CliDeps): void;
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { Option } from "commander";
|
|
3
|
+
import { ok, fail } from "./envelope.js";
|
|
4
|
+
import { emitEnvelope } from "./cli-output.js";
|
|
5
|
+
import { emitJsonOrRefusal } from "./cli-refusal.js";
|
|
6
|
+
import { commandPath } from "./cli-refusal.js";
|
|
7
|
+
import { FsInboxStore } from "@jevitate/inbox";
|
|
8
|
+
import { resolveInboxDir } from "./cli-shared.js";
|
|
9
|
+
import { currentEngineInfo } from "./engine.js";
|
|
10
|
+
import { callMcpTool, mcpErrorOf, mcpToolDeps, refusalFor } from "./mcp-cli-bridge.js";
|
|
11
|
+
/**
|
|
12
|
+
* `jevitate inbox …` (#254): the HITL inbox from the CLI — one command per MCP inbox tool, each calling
|
|
13
|
+
* the SAME served handler (mcp-cli-bridge.ts) over the SAME store `jevitate mcp` and `jevitate ui`
|
|
14
|
+
* use (`~/.jevitate/inbox`, or `--inbox-dir`):
|
|
15
|
+
*
|
|
16
|
+
* list → list_incoming show <id> → get_thread
|
|
17
|
+
* command <id> → get_command health → get_site_health
|
|
18
|
+
* queue-retrieval → queue_retrieval queue-action → queue_action
|
|
19
|
+
* approve <id> → approve_action cancel <id> → cancel_command (both always refused)
|
|
20
|
+
*
|
|
21
|
+
* SM1: approving or cancelling is human-only, in the `jevitate ui` dashboard — `inbox approve` /
|
|
22
|
+
* `inbox cancel` refuse exactly as MCP does (E_HUMAN_APPROVAL_REQUIRED, exit 64).
|
|
23
|
+
* `inbox command` keeps get_command's burn-after-read. A human's unread input is consumed only with
|
|
24
|
+
* `--reveal`, which prints it exactly as MCP returns it; without it the command refuses
|
|
25
|
+
* (E_INBOX_INPUT_PENDING) and consumes nothing, so the input is never burned unseen.
|
|
26
|
+
*/
|
|
27
|
+
const INBOX_DIR_HELP = "inbox store directory (default: ~/.jevitate/inbox — the dir `jevitate mcp` and `jevitate ui` use)";
|
|
28
|
+
const REDACTED = "***REDACTED***";
|
|
29
|
+
function withInboxFlags(cmd) {
|
|
30
|
+
return cmd.option("--inbox-dir <path>", INBOX_DIR_HELP).option("--json", "emit a JSON envelope");
|
|
31
|
+
}
|
|
32
|
+
function isRecord(v) {
|
|
33
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
34
|
+
}
|
|
35
|
+
function ageText(sec) {
|
|
36
|
+
const s = typeof sec === "number" && Number.isFinite(sec) ? sec : 0;
|
|
37
|
+
if (s < 90)
|
|
38
|
+
return `${s}s`;
|
|
39
|
+
if (s < 5400)
|
|
40
|
+
return `${Math.round(s / 60)}m`;
|
|
41
|
+
return `${Math.round(s / 3600)}h`;
|
|
42
|
+
}
|
|
43
|
+
export function formatInboxListHuman(data) {
|
|
44
|
+
const items = isRecord(data) && Array.isArray(data.items) ? data.items.filter(isRecord) : [];
|
|
45
|
+
if (items.length === 0)
|
|
46
|
+
return "no pending inbox items\n";
|
|
47
|
+
const lines = items.map((i) => `${String(i.id)} ${String(i.kind)} ${String(i.status)} ${ageText(i.ageSec)} ${String(i.run)} / ${String(i.journey)} / ${String(i.step)} (${String(i.agent)})`);
|
|
48
|
+
return `${lines.join("\n")}\nnext: jevitate inbox show <id> · approve or cancel in \`jevitate ui\`\n`;
|
|
49
|
+
}
|
|
50
|
+
export function formatInboxThreadHuman(id) {
|
|
51
|
+
return (data) => {
|
|
52
|
+
const thread = isRecord(data) && Array.isArray(data.thread) ? data.thread.filter(isRecord) : [];
|
|
53
|
+
if (thread.length === 0)
|
|
54
|
+
return `${id}: no messages yet\n`;
|
|
55
|
+
return `${thread.map((e) => `${String(e.at)} ${String(e.author)}: ${String(e.text)}`).join("\n")}\n`;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function formatInboxCommandHuman(data) {
|
|
59
|
+
if (!isRecord(data))
|
|
60
|
+
return "";
|
|
61
|
+
const lines = [`${String(data.id)} ${String(data.kind)} ${String(data.status)}`, ` ${String(data.run)} / ${String(data.journey)} / ${String(data.step)}: ${String(data.reason)}`];
|
|
62
|
+
if (isRecord(data.resolution))
|
|
63
|
+
lines.push(` resolution: ${String(data.resolution.decision)} by ${String(data.resolution.by)} at ${String(data.resolution.at)}`);
|
|
64
|
+
if (data.humanInput === REDACTED)
|
|
65
|
+
lines.push(" human input: provided concurrently — consumed by this poll without --reveal; its value is not printed");
|
|
66
|
+
else if (data.humanInput !== undefined)
|
|
67
|
+
lines.push(` human input (consumed now, burn-after-read): ${String(data.humanInput)}`);
|
|
68
|
+
else if (data.secretConsumedAt !== undefined)
|
|
69
|
+
lines.push(` human input: already consumed at ${String(data.secretConsumedAt)}`);
|
|
70
|
+
return `${lines.join("\n")}\n`;
|
|
71
|
+
}
|
|
72
|
+
export function formatInboxHealthHuman(data) {
|
|
73
|
+
if (!isRecord(data))
|
|
74
|
+
return "";
|
|
75
|
+
const build = [data.version, data.commit].filter((v) => typeof v === "string").join(" ");
|
|
76
|
+
return `inbox ${data.ok === true ? "ok" : "NOT ok"}: ${String(data.pending)} pending, oldest ${ageText(data.oldestPendingAgeSec)} · build ${build}\n`;
|
|
77
|
+
}
|
|
78
|
+
function formatQueuedHuman(data) {
|
|
79
|
+
if (!isRecord(data))
|
|
80
|
+
return "";
|
|
81
|
+
return `queued inbox item ${String(data.id)} (${String(data.status)})\nnext: a human answers it in \`jevitate ui\`; poll with \`jevitate inbox command ${String(data.id)}\`\n`;
|
|
82
|
+
}
|
|
83
|
+
/** get_command's item with the input's VALUE replaced — only for a poll without --reveal that raced a human's answer. */
|
|
84
|
+
function withoutSecretValue(body) {
|
|
85
|
+
if (!isRecord(body) || body.humanInput === undefined)
|
|
86
|
+
return body;
|
|
87
|
+
return { ...body, humanInput: REDACTED };
|
|
88
|
+
}
|
|
89
|
+
export function registerInboxCommands(program, deps) {
|
|
90
|
+
const inbox = program.command("inbox").description("the HITL inbox from the CLI — the same tools `jevitate mcp` serves (approve/cancel stay human-only in `jevitate ui`)");
|
|
91
|
+
/** Calls MCP `tool` and prints its result (or its typed error as the matching CLI refusal). */
|
|
92
|
+
const run = async (cmd, tool, args, human, fallback, project = (b) => b) => {
|
|
93
|
+
const o = cmd.opts();
|
|
94
|
+
const json = o.json === true;
|
|
95
|
+
let envelope;
|
|
96
|
+
try {
|
|
97
|
+
const { body } = await callMcpTool(mcpToolDeps(deps, { inboxDir: resolveInboxDir(deps, o.inboxDir) }), tool, args);
|
|
98
|
+
const err = mcpErrorOf(body);
|
|
99
|
+
envelope = err === undefined ? ok(project(body)) : refusalFor(cmd, "INBOX", err, fallback);
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
envelope = fail("E_INBOX_INTERNAL", e instanceof Error ? e.message : String(e));
|
|
103
|
+
}
|
|
104
|
+
if (envelope.ok)
|
|
105
|
+
emitEnvelope(program, envelope, { json, human, command: commandPath(cmd) });
|
|
106
|
+
else
|
|
107
|
+
emitJsonOrRefusal(program, envelope);
|
|
108
|
+
};
|
|
109
|
+
withInboxFlags(inbox.command("list").description("list pending inbox items (MCP list_incoming)")).action(async function () {
|
|
110
|
+
await run(this, "list_incoming", {}, formatInboxListHuman, "cannot list the inbox");
|
|
111
|
+
});
|
|
112
|
+
withInboxFlags(inbox.command("show <id>").description("an inbox item's conversation thread — never its secret input (MCP get_thread)")).action(async function (id) {
|
|
113
|
+
await run(this, "get_thread", { id }, formatInboxThreadHuman(id), `no inbox item '${id}'`);
|
|
114
|
+
});
|
|
115
|
+
withInboxFlags(inbox
|
|
116
|
+
.command("command <id>")
|
|
117
|
+
.description("poll one inbox item as the agent does (MCP get_command): burn-after-read — unread human input needs --reveal, which consumes and prints it")).option("--reveal", "consume the human's unread input and print it, exactly as MCP get_command returns it")
|
|
118
|
+
.action(async function (id) {
|
|
119
|
+
const o = this.opts();
|
|
120
|
+
if (o.reveal !== true) {
|
|
121
|
+
// Peek without consuming: a poll that would burn unread input needs --reveal. (A bad id falls
|
|
122
|
+
// through to get_command, which refuses it exactly as MCP does.)
|
|
123
|
+
const store = new FsInboxStore(resolveInboxDir(deps, o.inboxDir), currentEngineInfo());
|
|
124
|
+
const item = await store.get(id).catch(() => null);
|
|
125
|
+
if (item?.humanInput !== undefined && item.secretConsumedAt === undefined) {
|
|
126
|
+
emitJsonOrRefusal(program, fail("E_INBOX_INPUT_PENDING", `inbox item '${id}' has unread human input; reading it consumes it (burn-after-read). Rerun with --reveal to receive it`));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
await run(this, "get_command", { id }, formatInboxCommandHuman, `no inbox item '${id}'`, o.reveal === true ? (b) => b : withoutSecretValue);
|
|
131
|
+
});
|
|
132
|
+
withInboxFlags(inbox.command("health").description("inbox store health: pending count, oldest pending age, build (MCP get_site_health)")).action(async function () {
|
|
133
|
+
await run(this, "get_site_health", {}, formatInboxHealthHuman, "cannot read inbox health");
|
|
134
|
+
});
|
|
135
|
+
const queueFlags = (cmd) => withInboxFlags(cmd
|
|
136
|
+
.option("--run <id>", "the run this item belongs to (required)")
|
|
137
|
+
.option("--journey <id>", "the Journey (required)")
|
|
138
|
+
.option("--step <step>", "the step it stopped at (required)")
|
|
139
|
+
.option("--reason <text>", "what the human is asked for (required)")
|
|
140
|
+
.option("--agent <name>", "who is asking (required)")
|
|
141
|
+
.option("--target-url <url>", "the page it concerns")
|
|
142
|
+
.option("--has-screenshot", "a screenshot accompanies the item")
|
|
143
|
+
.option("--findings <file>", "a JSON file holding an array of {id, title, severity: low|med|high, evidence?}"));
|
|
144
|
+
const queueArgs = (cmd) => {
|
|
145
|
+
const o = cmd.opts();
|
|
146
|
+
let findings;
|
|
147
|
+
if (o.findings !== undefined) {
|
|
148
|
+
try {
|
|
149
|
+
findings = JSON.parse(readFileSync(o.findings, "utf8"));
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
const code = `E_${commandPath(cmd).toUpperCase().replace(/[^A-Z0-9]+/g, "_")}_INPUT`;
|
|
153
|
+
emitJsonOrRefusal(program, fail(code, `cannot read --findings ${o.findings}: ${e instanceof Error ? e.message.split("\n")[0] : String(e)}`));
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Only what was given: the facade validates (required fields, finding shape) — never re-decided here.
|
|
158
|
+
return {
|
|
159
|
+
...(o.run === undefined ? {} : { run: o.run }),
|
|
160
|
+
...(o.journey === undefined ? {} : { journey: o.journey }),
|
|
161
|
+
...(o.step === undefined ? {} : { step: o.step }),
|
|
162
|
+
...(o.reason === undefined ? {} : { reason: o.reason }),
|
|
163
|
+
...(o.agent === undefined ? {} : { agent: o.agent }),
|
|
164
|
+
...(o.targetUrl === undefined ? {} : { targetUrl: o.targetUrl }),
|
|
165
|
+
...(o.hasScreenshot === true ? { hasScreenshot: true } : {}),
|
|
166
|
+
...(findings === undefined ? {} : { findings }),
|
|
167
|
+
...(o.kind === undefined ? {} : { kind: o.kind }),
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
queueFlags(inbox.command("queue-retrieval").description("ask a human to provide something back to the agent — a 'handback' item; only queues (MCP queue_retrieval)")).action(async function () {
|
|
171
|
+
const args = queueArgs(this);
|
|
172
|
+
if (args !== undefined)
|
|
173
|
+
await run(this, "queue_retrieval", args, formatQueuedHuman, "cannot queue the item");
|
|
174
|
+
});
|
|
175
|
+
queueFlags(inbox
|
|
176
|
+
.command("queue-action")
|
|
177
|
+
.description("ask a human for a decision — an 'approval' item by default; only queues (MCP queue_action)")
|
|
178
|
+
.addOption(new Option("--kind <kind>", "approval (default) | handback | review").choices(["approval", "handback", "review"]))).action(async function () {
|
|
179
|
+
const args = queueArgs(this);
|
|
180
|
+
if (args !== undefined)
|
|
181
|
+
await run(this, "queue_action", args, formatQueuedHuman, "cannot queue the item");
|
|
182
|
+
});
|
|
183
|
+
// SM1: human-only. Registered so the CLI names the refusal (and where to go instead) rather than
|
|
184
|
+
// pretending the capability does not exist — they call the same always-refusing MCP handlers.
|
|
185
|
+
for (const [name, tool, verb] of [
|
|
186
|
+
["approve", "approve_action", "approve"],
|
|
187
|
+
["cancel", "cancel_command", "cancel"],
|
|
188
|
+
]) {
|
|
189
|
+
withInboxFlags(inbox.command(`${name} <id>`).description(`always refused (MCP ${tool}): only a human can ${verb} an inbox item, in \`jevitate ui\``)).action(async function (id) {
|
|
190
|
+
const { body } = await callMcpTool(mcpToolDeps(deps), tool, { id });
|
|
191
|
+
const err = mcpErrorOf(body) ?? { error: "human_approval_required" };
|
|
192
|
+
const refusal = refusalFor(this, "INBOX", { error: err.error, message: `${err.message ?? `${verb} is human-only`} — run \`jevitate ui\`` }, "");
|
|
193
|
+
emitJsonOrRefusal(program, refusal);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=inbox-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox-cli.js","sourceRoot":"","sources":["../src/inbox-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC"}
|