@mikode13/harness 0.1.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 +44 -0
- package/README.md +170 -0
- package/dist/agent/domain/agent.d.ts +63 -0
- package/dist/agent/domain/agent.d.ts.map +1 -0
- package/dist/agent/domain/agent.js +2 -0
- package/dist/agent/domain/agent.js.map +1 -0
- package/dist/agent/domain/errors.d.ts +13 -0
- package/dist/agent/domain/errors.d.ts.map +1 -0
- package/dist/agent/domain/errors.js +15 -0
- package/dist/agent/domain/errors.js.map +1 -0
- package/dist/agent/domain/providerFailure.d.ts +20 -0
- package/dist/agent/domain/providerFailure.d.ts.map +1 -0
- package/dist/agent/domain/providerFailure.js +84 -0
- package/dist/agent/domain/providerFailure.js.map +1 -0
- package/dist/engines/claude/infrastructure/model/claudeAgent.d.ts +17 -0
- package/dist/engines/claude/infrastructure/model/claudeAgent.d.ts.map +1 -0
- package/dist/engines/claude/infrastructure/model/claudeAgent.js +225 -0
- package/dist/engines/claude/infrastructure/model/claudeAgent.js.map +1 -0
- package/dist/engines/codex/infrastructure/model/codexAgent.d.ts +19 -0
- package/dist/engines/codex/infrastructure/model/codexAgent.d.ts.map +1 -0
- package/dist/engines/codex/infrastructure/model/codexAgent.js +119 -0
- package/dist/engines/codex/infrastructure/model/codexAgent.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestration/domain/interface/validator.d.ts +4 -0
- package/dist/orchestration/domain/interface/validator.d.ts.map +1 -0
- package/dist/orchestration/domain/interface/validator.js +2 -0
- package/dist/orchestration/domain/interface/validator.js.map +1 -0
- package/dist/orchestration/domain/model/orchestratorAgent.d.ts +14 -0
- package/dist/orchestration/domain/model/orchestratorAgent.d.ts.map +1 -0
- package/dist/orchestration/domain/model/orchestratorAgent.js +157 -0
- package/dist/orchestration/domain/model/orchestratorAgent.js.map +1 -0
- package/dist/orchestration/domain/model/reviewerDecision.d.ts +7 -0
- package/dist/orchestration/domain/model/reviewerDecision.d.ts.map +1 -0
- package/dist/orchestration/domain/model/reviewerDecision.js +2 -0
- package/dist/orchestration/domain/model/reviewerDecision.js.map +1 -0
- package/dist/orchestration/infrastructure/model/reviewerDecisionValidator.d.ts +6 -0
- package/dist/orchestration/infrastructure/model/reviewerDecisionValidator.d.ts.map +1 -0
- package/dist/orchestration/infrastructure/model/reviewerDecisionValidator.js +12 -0
- package/dist/orchestration/infrastructure/model/reviewerDecisionValidator.js.map +1 -0
- package/dist/retry/domain/model/retryingAgent.d.ts +8 -0
- package/dist/retry/domain/model/retryingAgent.d.ts.map +1 -0
- package/dist/retry/domain/model/retryingAgent.js +38 -0
- package/dist/retry/domain/model/retryingAgent.js.map +1 -0
- package/dist/shared/domain/isAbortError.d.ts +2 -0
- package/dist/shared/domain/isAbortError.d.ts.map +1 -0
- package/dist/shared/domain/isAbortError.js +4 -0
- package/dist/shared/domain/isAbortError.js.map +1 -0
- package/dist/shared/domain/logger.d.ts +6 -0
- package/dist/shared/domain/logger.d.ts.map +1 -0
- package/dist/shared/domain/logger.js +2 -0
- package/dist/shared/domain/logger.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewerDecision.js","sourceRoot":"","sources":["../../../../src/orchestration/domain/model/reviewerDecision.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Validator } from '../../domain/interface/validator.ts';
|
|
2
|
+
import type { ReviewerDecision } from '../../domain/model/reviewerDecision.ts';
|
|
3
|
+
export declare class ReviewerDecisionValidator implements Validator<ReviewerDecision> {
|
|
4
|
+
validate(input: unknown): ReviewerDecision | undefined;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=reviewerDecisionValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewerDecisionValidator.d.ts","sourceRoot":"","sources":["../../../../src/orchestration/infrastructure/model/reviewerDecisionValidator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAO/E,qBAAa,yBAA0B,YAAW,SAAS,CAAC,gBAAgB,CAAC;IAC5E,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS;CAItD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const reviewerDecisionSchema = z.discriminatedUnion('decision', [
|
|
3
|
+
z.object({ decision: z.literal('approved') }),
|
|
4
|
+
z.object({ decision: z.literal('rejected'), feedback: z.string().trim().min(1) }),
|
|
5
|
+
]);
|
|
6
|
+
export class ReviewerDecisionValidator {
|
|
7
|
+
validate(input) {
|
|
8
|
+
const result = reviewerDecisionSchema.safeParse(input);
|
|
9
|
+
return result.success ? result.data : undefined;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=reviewerDecisionValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewerDecisionValidator.js","sourceRoot":"","sources":["../../../../src/orchestration/infrastructure/model/reviewerDecisionValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,sBAAsB,GAAG,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE;IAC/D,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;IAC7C,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;CACjF,CAAC,CAAC;AAEH,MAAM,OAAO,yBAAyB;IACrC,QAAQ,CAAC,KAAc;QACtB,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACjD,CAAC;CACD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Agent, AgentResponse, Callback } from '../../../agent/domain/agent.ts';
|
|
2
|
+
export declare class RetryingAgent implements Agent {
|
|
3
|
+
private inner;
|
|
4
|
+
private maxAttempts;
|
|
5
|
+
constructor(inner: Agent, maxAttempts?: number);
|
|
6
|
+
run(prompt: string, signal: AbortSignal, callback: Callback): Promise<AgentResponse | undefined>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=retryingAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retryingAgent.d.ts","sourceRoot":"","sources":["../../../../src/retry/domain/model/retryingAgent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAKrF,qBAAa,aAAc,YAAW,KAAK;IAC1C,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,WAAW,CAAS;gBAEhB,KAAK,EAAE,KAAK,EAAE,WAAW,SAAI;IAKnC,GAAG,CACR,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CA2BrC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { RecoverableError, UnrecoverableError } from "../../../agent/domain/errors.js";
|
|
2
|
+
import { describeFailure } from "../../../agent/domain/providerFailure.js";
|
|
3
|
+
import { isAbortError } from "../../../shared/domain/isAbortError.js";
|
|
4
|
+
export class RetryingAgent {
|
|
5
|
+
inner;
|
|
6
|
+
maxAttempts;
|
|
7
|
+
constructor(inner, maxAttempts = 3) {
|
|
8
|
+
this.inner = inner;
|
|
9
|
+
this.maxAttempts = maxAttempts;
|
|
10
|
+
}
|
|
11
|
+
async run(prompt, signal, callback) {
|
|
12
|
+
let lastPrompt = null;
|
|
13
|
+
for (let attempt = 1; attempt <= this.maxAttempts; attempt++) {
|
|
14
|
+
try {
|
|
15
|
+
const promptToSend = lastPrompt ?? prompt;
|
|
16
|
+
return await this.inner.run(promptToSend, signal, callback);
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
if (isAbortError(e) || e instanceof UnrecoverableError)
|
|
20
|
+
throw e;
|
|
21
|
+
// Only a failure the agent classified as recoverable earns another call. An
|
|
22
|
+
// unclassified one breaks the `Agent` contract, so nothing here knows whether
|
|
23
|
+
// replaying it is safe — it may already have written files or run commands.
|
|
24
|
+
if (!(e instanceof RecoverableError))
|
|
25
|
+
throw new UnrecoverableError('The agent failed without classifying the failure', {
|
|
26
|
+
cause: describeFailure(e),
|
|
27
|
+
});
|
|
28
|
+
if (attempt === this.maxAttempts)
|
|
29
|
+
throw new UnrecoverableError('Max attempts exhausted', {
|
|
30
|
+
cause: `Gave up after ${String(this.maxAttempts)} attempts. Last failure: ${e.cause}`,
|
|
31
|
+
});
|
|
32
|
+
lastPrompt = `The past prompt failed for the following reason: ${e.cause}`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=retryingAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retryingAgent.js","sourceRoot":"","sources":["../../../../src/retry/domain/model/retryingAgent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAEtE,MAAM,OAAO,aAAa;IACjB,KAAK,CAAQ;IACb,WAAW,CAAS;IAE5B,YAAY,KAAY,EAAE,WAAW,GAAG,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,GAAG,CACR,MAAc,EACd,MAAmB,EACnB,QAAkB;QAElB,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YAC9D,IAAI,CAAC;gBACJ,MAAM,YAAY,GAAG,UAAU,IAAI,MAAM,CAAC;gBAC1C,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,kBAAkB;oBAAE,MAAM,CAAC,CAAC;gBAEhE,4EAA4E;gBAC5E,8EAA8E;gBAC9E,4EAA4E;gBAC5E,IAAI,CAAC,CAAC,CAAC,YAAY,gBAAgB,CAAC;oBACnC,MAAM,IAAI,kBAAkB,CAAC,kDAAkD,EAAE;wBAChF,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC;qBACzB,CAAC,CAAC;gBAEJ,IAAI,OAAO,KAAK,IAAI,CAAC,WAAW;oBAC/B,MAAM,IAAI,kBAAkB,CAAC,wBAAwB,EAAE;wBACtD,KAAK,EAAE,iBAAiB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE;qBACrF,CAAC,CAAC;gBAEJ,UAAU,GAAG,oDAAoD,CAAC,CAAC,KAAK,EAAE,CAAC;YAC5E,CAAC;QACF,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isAbortError.d.ts","sourceRoot":"","sources":["../../../src/shared/domain/isAbortError.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,CAEnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isAbortError.js","sourceRoot":"","sources":["../../../src/shared/domain/isAbortError.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,CAAU;IACtC,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/shared/domain/logger.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACvB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/shared/domain/logger.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mikode13/harness",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Test/agent harness utility",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Mikode13/harness.git"
|
|
10
|
+
},
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": "^22.13.0 || ^24.0.0"
|
|
13
|
+
},
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist"
|
|
21
|
+
],
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@mikode13/code-quality": "0.1.0",
|
|
27
|
+
"@mikode13/cross-platform": "0.1.0",
|
|
28
|
+
"@mikode13/code-style": "0.1.0",
|
|
29
|
+
"@mikode13/git-hooks": "0.1.0",
|
|
30
|
+
"@mikode13/tsconfig": "0.1.0",
|
|
31
|
+
"@types/node": "^26.1.2",
|
|
32
|
+
"@vitest/coverage-v8": "^4.1.11",
|
|
33
|
+
"eslint": "^10.8.0",
|
|
34
|
+
"prettier": "^3.9.6",
|
|
35
|
+
"typescript": "^6.0.3",
|
|
36
|
+
"vitest": "^4.1.11"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.220",
|
|
40
|
+
"@openai/codex-sdk": "^0.146.0",
|
|
41
|
+
"zod": "^4.4.3"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "mikode-scripts clean dist && tsc -p tsconfig.build.json",
|
|
45
|
+
"typecheck": "tsc --noEmit && tsc --noEmit -p tests && tsc --noEmit -p cli",
|
|
46
|
+
"format": "prettier . --write",
|
|
47
|
+
"format:check": "prettier . --check",
|
|
48
|
+
"lint": "eslint . --max-warnings 0",
|
|
49
|
+
"lint:fix": "eslint . --fix",
|
|
50
|
+
"dev": "pnpm --filter @mikode13/harness-cli run dev",
|
|
51
|
+
"test": "vitest run --project unit --project cli",
|
|
52
|
+
"test:unit": "vitest run --project unit --project cli",
|
|
53
|
+
"test:unit:watch": "vitest --project unit --project cli",
|
|
54
|
+
"test:coverage": "vitest run --project unit --project cli --coverage",
|
|
55
|
+
"pack:check": "pnpm run build && node scripts/pack-check.mjs",
|
|
56
|
+
"check": "pnpm run format:check && pnpm run lint && pnpm run typecheck"
|
|
57
|
+
}
|
|
58
|
+
}
|