openhorse 0.1.15 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +36 -39
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +54 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/framework/index.d.ts +2 -0
- package/dist/framework/index.d.ts.map +1 -1
- package/dist/framework/index.js +8 -1
- package/dist/framework/index.js.map +1 -1
- package/dist/framework/prompt.d.ts.map +1 -1
- package/dist/framework/prompt.js +1 -0
- package/dist/framework/prompt.js.map +1 -1
- package/dist/framework/query.d.ts +3 -0
- package/dist/framework/query.d.ts.map +1 -1
- package/dist/framework/query.js +35 -16
- package/dist/framework/query.js.map +1 -1
- package/dist/framework/store.d.ts +3 -0
- package/dist/framework/store.d.ts.map +1 -1
- package/dist/framework/store.js.map +1 -1
- package/dist/harness/assembler.d.ts +5 -0
- package/dist/harness/assembler.d.ts.map +1 -0
- package/dist/harness/assembler.js +71 -0
- package/dist/harness/assembler.js.map +1 -0
- package/dist/harness/capsule.d.ts +4 -0
- package/dist/harness/capsule.d.ts.map +1 -0
- package/dist/harness/capsule.js +99 -0
- package/dist/harness/capsule.js.map +1 -0
- package/dist/harness/context-harness.d.ts +41 -0
- package/dist/harness/context-harness.d.ts.map +1 -0
- package/dist/harness/context-harness.js +139 -0
- package/dist/harness/context-harness.js.map +1 -0
- package/dist/harness/contract.d.ts +4 -0
- package/dist/harness/contract.d.ts.map +1 -0
- package/dist/harness/contract.js +62 -0
- package/dist/harness/contract.js.map +1 -0
- package/dist/harness/drift-guard.d.ts +12 -0
- package/dist/harness/drift-guard.d.ts.map +1 -0
- package/dist/harness/drift-guard.js +50 -0
- package/dist/harness/drift-guard.js.map +1 -0
- package/dist/harness/index.d.ts +10 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +21 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/ledger.d.ts +29 -0
- package/dist/harness/ledger.d.ts.map +1 -0
- package/dist/harness/ledger.js +122 -0
- package/dist/harness/ledger.js.map +1 -0
- package/dist/harness/types.d.ts +81 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +3 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/services/compact/auto-compact.d.ts +37 -8
- package/dist/services/compact/auto-compact.d.ts.map +1 -1
- package/dist/services/compact/auto-compact.js +80 -17
- package/dist/services/compact/auto-compact.js.map +1 -1
- package/dist/services/compact/compact.d.ts +3 -0
- package/dist/services/compact/compact.d.ts.map +1 -1
- package/dist/services/compact/compact.js +13 -1
- package/dist/services/compact/compact.js.map +1 -1
- package/dist/services/model-context.d.ts +44 -0
- package/dist/services/model-context.d.ts.map +1 -0
- package/dist/services/model-context.js +134 -0
- package/dist/services/model-context.js.map +1 -0
- package/dist/services/session-storage.d.ts +9 -0
- package/dist/services/session-storage.d.ts.map +1 -1
- package/dist/services/session-storage.js +12 -0
- package/dist/services/session-storage.js.map +1 -1
- package/dist/tools/bash_security.d.ts +10 -0
- package/dist/tools/bash_security.d.ts.map +1 -1
- package/dist/tools/bash_security.js +30 -1
- package/dist/tools/bash_security.js.map +1 -1
- package/dist/ui/command-panel.d.ts.map +1 -1
- package/dist/ui/command-panel.js +12 -12
- package/dist/ui/command-panel.js.map +1 -1
- package/dist/ui/stream-markdown.d.ts +1 -8
- package/dist/ui/stream-markdown.d.ts.map +1 -1
- package/dist/ui/stream-markdown.js +4 -129
- package/dist/ui/stream-markdown.js.map +1 -1
- package/dist/ui/user-input.d.ts +10 -0
- package/dist/ui/user-input.d.ts.map +1 -0
- package/dist/ui/user-input.js +66 -0
- package/dist/ui/user-input.js.map +1 -0
- package/package.json +1 -1
package/dist/framework/index.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* - State Store (pub-sub)
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.resetToolState = exports.subscribeToolState = exports.setToolState = exports.getToolState = exports.Store = exports.getSystemPrompt = exports.buildSystemPrompt = exports.query = exports.toOpenAITools = exports.toOpenAITool = exports.buildTool = void 0;
|
|
12
|
+
exports.resetToolState = exports.subscribeToolState = exports.setToolState = exports.getToolState = exports.assembleHarnessMessages = exports.renderContextCapsule = exports.createContextCapsule = exports.ContextLedger = exports.createContextHarness = exports.ContextHarness = exports.Store = exports.getSystemPrompt = exports.buildSystemPrompt = exports.query = exports.toOpenAITools = exports.toOpenAITool = exports.buildTool = void 0;
|
|
13
13
|
var tool_1 = require("./tool");
|
|
14
14
|
Object.defineProperty(exports, "buildTool", { enumerable: true, get: function () { return tool_1.buildTool; } });
|
|
15
15
|
Object.defineProperty(exports, "toOpenAITool", { enumerable: true, get: function () { return tool_1.toOpenAITool; } });
|
|
@@ -21,6 +21,13 @@ Object.defineProperty(exports, "buildSystemPrompt", { enumerable: true, get: fun
|
|
|
21
21
|
Object.defineProperty(exports, "getSystemPrompt", { enumerable: true, get: function () { return prompt_1.getSystemPrompt; } });
|
|
22
22
|
var store_1 = require("./store");
|
|
23
23
|
Object.defineProperty(exports, "Store", { enumerable: true, get: function () { return store_1.Store; } });
|
|
24
|
+
var harness_1 = require("../harness");
|
|
25
|
+
Object.defineProperty(exports, "ContextHarness", { enumerable: true, get: function () { return harness_1.ContextHarness; } });
|
|
26
|
+
Object.defineProperty(exports, "createContextHarness", { enumerable: true, get: function () { return harness_1.createContextHarness; } });
|
|
27
|
+
Object.defineProperty(exports, "ContextLedger", { enumerable: true, get: function () { return harness_1.ContextLedger; } });
|
|
28
|
+
Object.defineProperty(exports, "createContextCapsule", { enumerable: true, get: function () { return harness_1.createContextCapsule; } });
|
|
29
|
+
Object.defineProperty(exports, "renderContextCapsule", { enumerable: true, get: function () { return harness_1.renderContextCapsule; } });
|
|
30
|
+
Object.defineProperty(exports, "assembleHarnessMessages", { enumerable: true, get: function () { return harness_1.assembleHarnessMessages; } });
|
|
24
31
|
var tool_state_1 = require("./tool-state");
|
|
25
32
|
Object.defineProperty(exports, "getToolState", { enumerable: true, get: function () { return tool_state_1.getToolState; } });
|
|
26
33
|
Object.defineProperty(exports, "setToolState", { enumerable: true, get: function () { return tool_state_1.setToolState; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/framework/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,+BAAgE;AAAvD,iGAAA,SAAS,OAAA;AAAE,oGAAA,YAAY,OAAA;AAAE,qGAAA,aAAa,OAAA;AAW/C,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AAGd,mCAA8D;AAArD,2GAAA,iBAAiB,OAAA;AAAE,yGAAA,eAAe,OAAA;AAG3C,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AAGd,2CAKsB;AAJpB,0GAAA,YAAY,OAAA;AACZ,0GAAA,YAAY,OAAA;AACZ,gHAAA,kBAAkB,OAAA;AAClB,4GAAA,cAAc,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/framework/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,+BAAgE;AAAvD,iGAAA,SAAS,OAAA;AAAE,oGAAA,YAAY,OAAA;AAAE,qGAAA,aAAa,OAAA;AAW/C,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AAGd,mCAA8D;AAArD,2GAAA,iBAAiB,OAAA;AAAE,yGAAA,eAAe,OAAA;AAG3C,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AAGd,sCAOoB;AANlB,yGAAA,cAAc,OAAA;AACd,+GAAA,oBAAoB,OAAA;AACpB,wGAAA,aAAa,OAAA;AACb,+GAAA,oBAAoB,OAAA;AACpB,+GAAA,oBAAoB,OAAA;AACpB,kHAAA,uBAAuB,OAAA;AAUzB,2CAKsB;AAJpB,0GAAA,YAAY,OAAA;AACZ,0GAAA,YAAY,OAAA;AACZ,gHAAA,kBAAkB,OAAA;AAClB,4GAAA,cAAc,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/framework/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAM5C,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,6BAA6B;AAC7B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,CAAC;CACxC;
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/framework/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAM5C,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,6BAA6B;AAC7B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,CAAC;CACxC;AAkED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAmBzF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAI1D"}
|
package/dist/framework/prompt.js
CHANGED
|
@@ -29,6 +29,7 @@ Your core mission is to solve the user's problem — be concise, direct, and act
|
|
|
29
29
|
- Ask clarifying questions only when the user's intent is genuinely ambiguous or there are multiple equally-valid paths
|
|
30
30
|
- Write code, don't describe it
|
|
31
31
|
- Output plans/proposals as workspace markdown files, not just text
|
|
32
|
+
- When summarizing repository changes, only name files verified by tool output such as git_status, git diff, or direct file reads
|
|
32
33
|
- Keep responses structured and short
|
|
33
34
|
- Respond in the same language as the user`,
|
|
34
35
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/framework/prompt.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/framework/prompt.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAgGH,8CAmBC;AAMD,0CAIC;AAnGD,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,MAAM,QAAQ,GAAoB;IAChC;QACE,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,GAAG,EAAE,CAAC;4FAC0E;KACzF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,GAAG,EAAE,CAAC;;;;;;;;;2CASyB;KACxC;IACD;QACE,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;YACd,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,OAAO,oBAAoB,SAAS;+EACqC,CAAC;QAC5E,CAAC;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;uBACE,GAAG,CAAC,GAAG;cAChB,GAAG,CAAC,QAAQ;aACb,GAAG,CAAC,WAAW,EAAE;KAC3B;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;YACd,IAAI,CAAC,GAAG,CAAC,aAAa;gBAAE,OAAO,EAAE,CAAC;YAClC,OAAO,oBAAoB,GAAG,CAAC,aAAa,EAAE,CAAC;QACjD,CAAC;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;YACd,IAAI,CAAC,GAAG,CAAC,aAAa;gBAAE,OAAO,EAAE,CAAC;YAClC,OAAO,GAAG,CAAC,aAAa,CAAC;QAC3B,CAAC;KACF;CACF,CAAC;AAEF,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,GAAkB;IAClD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,SAAS;QAE9B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;KACnC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,GAAkB;IAChD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -13,6 +13,7 @@ import type { OpenHorseTool, ToolContext } from './tool';
|
|
|
13
13
|
import type { PermissionMode } from '../commands/types';
|
|
14
14
|
import type { CostTracker } from '../core/cost-tracker';
|
|
15
15
|
import { type StrategyTracker } from '../core/strategy-tracker';
|
|
16
|
+
import type { ContextHarness } from '../harness';
|
|
16
17
|
export type QueryEvent = {
|
|
17
18
|
type: 'request_start';
|
|
18
19
|
model: string;
|
|
@@ -71,6 +72,8 @@ export interface QueryParams {
|
|
|
71
72
|
costTracker?: CostTracker;
|
|
72
73
|
/** Strategy tracker for alternative approaches */
|
|
73
74
|
strategyTracker?: StrategyTracker;
|
|
75
|
+
/** Optional Context Harness for turn-level context, ledger, and completion gates */
|
|
76
|
+
harness?: ContextHarness;
|
|
74
77
|
}
|
|
75
78
|
/**
|
|
76
79
|
* Generator-based agentic loop.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/framework/query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAQ,MAAM,iBAAiB,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAoB,MAAM,QAAQ,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAyB,KAAK,eAAe,EAAuB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/framework/query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAQ,MAAM,iBAAiB,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAoB,MAAM,QAAQ,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAyB,KAAK,eAAe,EAAuB,MAAM,0BAA0B,CAAC;AAE5G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5H;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACzG;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAMrH,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,sBAAsB;IACtB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB;4CACwC;IACxC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1G,2BAA2B;IAC3B,GAAG,EAAE,UAAU,CAAC;IAChB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,2DAA2D;IAC3D,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,yCAAyC;IACzC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,6BAA6B;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,uCAAuC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,kDAAkD;IAClD,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oFAAoF;IACpF,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAuB,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,CAkP5E"}
|
package/dist/framework/query.js
CHANGED
|
@@ -14,7 +14,6 @@ exports.query = query;
|
|
|
14
14
|
const tool_1 = require("./tool");
|
|
15
15
|
const strategy_tracker_1 = require("../core/strategy-tracker");
|
|
16
16
|
const auto_compact_1 = require("../services/compact/auto-compact");
|
|
17
|
-
const compact_1 = require("../services/compact/compact");
|
|
18
17
|
// ============================================================================
|
|
19
18
|
// query() — async generator
|
|
20
19
|
// ============================================================================
|
|
@@ -36,7 +35,7 @@ const compact_1 = require("../services/compact/compact");
|
|
|
36
35
|
async function* query(params) {
|
|
37
36
|
const { messages, tools, toolExecutor, llm, maxTurns, // 无默认值,可选参数
|
|
38
37
|
abortSignal, streamCallbacks, costTracker, strategyTracker = (0, strategy_tracker_1.createStrategyTracker)({ maxAttempts: 5 }), // 增加到 5 次
|
|
39
|
-
|
|
38
|
+
harness, } = params;
|
|
40
39
|
const openaiTools = (0, tool_1.toOpenAITools)(tools);
|
|
41
40
|
let turn = 0;
|
|
42
41
|
// 无限循环,依赖安全机制停止
|
|
@@ -62,8 +61,10 @@ async function* query(params) {
|
|
|
62
61
|
};
|
|
63
62
|
return;
|
|
64
63
|
}
|
|
65
|
-
// Stream the LLM response
|
|
66
|
-
|
|
64
|
+
// Stream the LLM response. Harness context is injected into a cloned
|
|
65
|
+
// request payload so the durable conversation history stays clean.
|
|
66
|
+
const requestMessages = harness ? harness.assembleMessages(messages) : messages;
|
|
67
|
+
const response = await llm.chatStream(requestMessages, streamCallbacks, openaiTools);
|
|
67
68
|
// Save assistant message to history
|
|
68
69
|
const assistantMsg = {
|
|
69
70
|
role: 'assistant',
|
|
@@ -73,6 +74,7 @@ async function* query(params) {
|
|
|
73
74
|
assistantMsg.tool_calls = response.toolCalls;
|
|
74
75
|
}
|
|
75
76
|
messages.push(assistantMsg);
|
|
77
|
+
harness?.recordAssistantResponse(response);
|
|
76
78
|
// Handle tool calls
|
|
77
79
|
if (response.toolCalls && response.toolCalls.length > 0) {
|
|
78
80
|
for (const tc of response.toolCalls) {
|
|
@@ -99,10 +101,14 @@ async function* query(params) {
|
|
|
99
101
|
callId: tc.id,
|
|
100
102
|
};
|
|
101
103
|
const start = Date.now();
|
|
104
|
+
const drift = harness?.beforeToolUse({ name: tc.function.name, args });
|
|
102
105
|
// Permission check before execution
|
|
103
106
|
let result;
|
|
104
107
|
const tool = tools.find(t => t.name === tc.function.name);
|
|
105
|
-
if (
|
|
108
|
+
if (drift?.status === 'block') {
|
|
109
|
+
result = harness.asToolBlockedResult(drift);
|
|
110
|
+
}
|
|
111
|
+
else if (tool?.checkPermissions && params.toolContext) {
|
|
106
112
|
const perm = tool.checkPermissions(args, params.toolContext);
|
|
107
113
|
if (perm.behavior === 'deny') {
|
|
108
114
|
result = JSON.stringify({
|
|
@@ -163,6 +169,14 @@ async function* query(params) {
|
|
|
163
169
|
toolError = 'Invalid JSON result';
|
|
164
170
|
}
|
|
165
171
|
strategyTracker.recordResult(attemptId, strategyResult, errorMsg, duration);
|
|
172
|
+
harness?.recordToolResult({
|
|
173
|
+
name: tc.function.name,
|
|
174
|
+
args,
|
|
175
|
+
result,
|
|
176
|
+
duration,
|
|
177
|
+
success: toolSuccess,
|
|
178
|
+
error: toolError,
|
|
179
|
+
});
|
|
166
180
|
yield {
|
|
167
181
|
type: 'tool_result',
|
|
168
182
|
name: tc.function.name,
|
|
@@ -200,22 +214,27 @@ async function* query(params) {
|
|
|
200
214
|
// Continue to next turn
|
|
201
215
|
continue;
|
|
202
216
|
}
|
|
203
|
-
// No tool calls — done
|
|
217
|
+
// No tool calls — done, unless the harness requires one more pass.
|
|
218
|
+
const completionGate = harness?.beforeComplete();
|
|
219
|
+
if (completionGate && !completionGate.canComplete) {
|
|
220
|
+
messages.push(harness.asCompletionBlockedMessage(completionGate));
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
204
223
|
yield { type: 'message', role: 'assistant', content: response.content };
|
|
205
224
|
// Record usage to cost tracker
|
|
206
225
|
if (costTracker && response.usage) {
|
|
207
226
|
costTracker.record(response.usage, { model: response.model });
|
|
208
227
|
}
|
|
209
|
-
// Auto-compact
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
228
|
+
// Auto-compact at 95% context usage (token-based)
|
|
229
|
+
const totalTokens = response.usage?.promptTokens ?? 0;
|
|
230
|
+
const autoCompact = (0, auto_compact_1.getAutoCompact)({
|
|
231
|
+
modelId: response.model || llm.getModel(),
|
|
232
|
+
getContextCapsule: harness ? () => harness.getCapsule() : undefined,
|
|
233
|
+
});
|
|
234
|
+
const compacted = await autoCompact.checkAndCompact(messages, totalTokens);
|
|
235
|
+
if (compacted.length < messages.length) {
|
|
236
|
+
messages.length = 0;
|
|
237
|
+
messages.push(...compacted);
|
|
219
238
|
}
|
|
220
239
|
yield {
|
|
221
240
|
type: 'complete',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/framework/query.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/framework/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ import type { OpenHorseCLIConfig } from '../services/config';
|
|
|
10
10
|
import type { PermissionMode } from '../commands/types';
|
|
11
11
|
import { CostTracker } from '../core/cost-tracker';
|
|
12
12
|
import type { TodoItem } from './tool-state';
|
|
13
|
+
import type { HarnessState } from '../harness';
|
|
13
14
|
export interface AppState {
|
|
14
15
|
config: OpenHorseCLIConfig;
|
|
15
16
|
tools: OpenHorseTool[];
|
|
@@ -32,6 +33,8 @@ export interface AppState {
|
|
|
32
33
|
planMode: boolean;
|
|
33
34
|
/** Latest plan from exit_plan_mode (mirrored from tool-state) */
|
|
34
35
|
currentPlan: string | null;
|
|
36
|
+
/** Context Harness serializable state */
|
|
37
|
+
harnessState?: HarnessState;
|
|
35
38
|
}
|
|
36
39
|
type Listener = (state: AppState) => void;
|
|
37
40
|
export declare class Store {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/framework/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/framework/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,mBAAmB,EAAE,OAAO,EAAE,CAAC;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACtE,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,aAAa,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAC;IAClB,iEAAiE;IACjE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,yCAAyC;IACzC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAMD,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAE1C,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,SAAS,CAA4B;gBAEjC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,qBAAqB,GAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa,GAAG,eAAe,GAAG,eAAe,GAAG,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgB5N,qCAAqC;IACrC,WAAW,IAAI,QAAQ;IAIvB,mEAAmE;IACnE,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI;IAKzC,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI;IAO1C,8CAA8C;IAC9C,iBAAiB,IAAI,IAAI;IAOzB,wCAAwC;IACxC,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAIjC,4DAA4D;IAC5D,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAM9B,sCAAsC;IACtC,aAAa,CAAC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAI9E,uCAAuC;IACvC,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAI7C,iDAAiD;IACjD,mBAAmB,IAAI,cAAc;CAMtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/framework/store.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAMH,uDAAmD;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/framework/store.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAMH,uDAAmD;AAqCnD,MAAa,KAAK;IAIhB,YAAY,OAAgN;QAFpN,cAAS,GAAkB,IAAI,GAAG,EAAE,CAAC;QAG3C,IAAI,CAAC,KAAK,GAAG;YACX,mBAAmB,EAAE,EAAE;YACvB,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,IAAI;YAChB,cAAc,EAAE,SAAS;YACzB,WAAW,EAAE,IAAI,0BAAW,EAAE;YAC9B,aAAa,EAAE,EAAE;YACjB,aAAa,EAAE,EAAE;YACjB,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,IAAI;YACjB,GAAG,OAAO;SACC,CAAC;IAChB,CAAC;IAED,qCAAqC;IACrC,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,mEAAmE;IACnE,SAAS,CAAC,QAAkB;QAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,8DAA8D;IAC9D,QAAQ,CAAC,OAA0B;QACjC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC;QAC3C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,iBAAiB;QACf,IAAI,CAAC,QAAQ,CAAC;YACZ,mBAAmB,EAAE,EAAE;YACvB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;IACL,CAAC;IAED,wCAAwC;IACxC,aAAa,CAAC,GAAY;QACxB,IAAI,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,4DAA4D;IAC5D,UAAU,CAAC,GAAY;QACrB,IAAI,CAAC,QAAQ,CAAC;YACZ,mBAAmB,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,sCAAsC;IACtC,aAAa,CAAC,KAAyD;QACrE,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,uCAAuC;IACvC,iBAAiB,CAAC,IAAoB;QACpC,IAAI,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,iDAAiD;IACjD,mBAAmB;QACjB,MAAM,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAClE,IAAI,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5C,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AA5ED,sBA4EC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Message } from '../services/llm';
|
|
2
|
+
import type { HarnessConfig, HarnessState } from './types';
|
|
3
|
+
export declare function renderHarnessContext(state: HarnessState, modelId: string, config?: HarnessConfig): string;
|
|
4
|
+
export declare function assembleHarnessMessages(messages: Message[], state: HarnessState, modelId: string, config?: HarnessConfig): Message[];
|
|
5
|
+
//# sourceMappingURL=assembler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assembler.d.ts","sourceRoot":"","sources":["../../src/harness/assembler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAW3D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,aAAkB,GAAG,MAAM,CAwC7G;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,aAAkB,GACzB,OAAO,EAAE,CAkBX"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderHarnessContext = renderHarnessContext;
|
|
4
|
+
exports.assembleHarnessMessages = assembleHarnessMessages;
|
|
5
|
+
const model_context_1 = require("../services/model-context");
|
|
6
|
+
const capsule_1 = require("./capsule");
|
|
7
|
+
function estimateTokens(text) {
|
|
8
|
+
return Math.ceil(text.length / 4);
|
|
9
|
+
}
|
|
10
|
+
function truncateByChars(text, maxChars) {
|
|
11
|
+
if (text.length <= maxChars)
|
|
12
|
+
return text;
|
|
13
|
+
return text.slice(0, Math.max(0, maxChars - 80)) + '\n[truncated by Context Harness]';
|
|
14
|
+
}
|
|
15
|
+
function renderHarnessContext(state, modelId, config = {}) {
|
|
16
|
+
const contract = state.contract;
|
|
17
|
+
if (!contract && state.ledger.length === 0 && !state.capsule)
|
|
18
|
+
return '';
|
|
19
|
+
const contextWindow = (0, model_context_1.getModelContextWindow)(modelId);
|
|
20
|
+
const evidenceBudgetRatio = config.evidenceBudgetRatio ?? 0.3;
|
|
21
|
+
const maxChars = Math.max(2000, Math.floor(contextWindow * evidenceBudgetRatio * 4 * 0.08));
|
|
22
|
+
const lines = ['[OpenHorse Context Harness]'];
|
|
23
|
+
if (contract) {
|
|
24
|
+
lines.push('', 'Task Contract:');
|
|
25
|
+
lines.push(`- Objective: ${contract.objective}`);
|
|
26
|
+
for (const req of contract.requirements.slice(0, 8)) {
|
|
27
|
+
lines.push(`- Requirement: ${req}`);
|
|
28
|
+
}
|
|
29
|
+
for (const item of contract.successCriteria.slice(0, 6)) {
|
|
30
|
+
lines.push(`- Success: ${item}`);
|
|
31
|
+
}
|
|
32
|
+
for (const item of contract.prohibitions.slice(0, 6)) {
|
|
33
|
+
lines.push(`- Prohibition: ${item}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (state.capsule) {
|
|
37
|
+
lines.push('', (0, capsule_1.renderContextCapsule)(state.capsule));
|
|
38
|
+
}
|
|
39
|
+
const evidence = [...state.ledger]
|
|
40
|
+
.sort((a, b) => b.importance - a.importance || b.createdAt - a.createdAt)
|
|
41
|
+
.slice(0, 10);
|
|
42
|
+
if (evidence.length > 0) {
|
|
43
|
+
lines.push('', 'Relevant Evidence:');
|
|
44
|
+
for (const entry of evidence) {
|
|
45
|
+
lines.push(`- [${entry.type}] ${entry.content}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
lines.push('', 'Use this context to stay on the current task. Do not claim verification unless it is listed above or produced by a tool result in this turn.');
|
|
49
|
+
const rendered = lines.join('\n');
|
|
50
|
+
return truncateByChars(rendered, Math.max(maxChars, estimateTokens(rendered) * 2));
|
|
51
|
+
}
|
|
52
|
+
function assembleHarnessMessages(messages, state, modelId, config = {}) {
|
|
53
|
+
if (config.enabled === false)
|
|
54
|
+
return messages;
|
|
55
|
+
const harnessContext = renderHarnessContext(state, modelId, config);
|
|
56
|
+
if (!harnessContext.trim())
|
|
57
|
+
return messages;
|
|
58
|
+
const cloned = messages.map(message => ({ ...message }));
|
|
59
|
+
const systemIndex = cloned.findIndex(message => message.role === 'system');
|
|
60
|
+
if (systemIndex >= 0) {
|
|
61
|
+
cloned[systemIndex] = {
|
|
62
|
+
...cloned[systemIndex],
|
|
63
|
+
content: `${cloned[systemIndex].content}\n\n---\n${harnessContext}`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
cloned.unshift({ role: 'system', content: harnessContext });
|
|
68
|
+
}
|
|
69
|
+
return cloned;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=assembler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assembler.js","sourceRoot":"","sources":["../../src/harness/assembler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ContextCapsule, ContextLedgerEntry, TaskContract } from './types';
|
|
2
|
+
export declare function createContextCapsule(contract: TaskContract | undefined, entries: ContextLedgerEntry[]): ContextCapsule;
|
|
3
|
+
export declare function renderContextCapsule(capsule: ContextCapsule): string;
|
|
4
|
+
//# sourceMappingURL=capsule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capsule.d.ts","sourceRoot":"","sources":["../../src/harness/capsule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAY,YAAY,EAAE,MAAM,SAAS,CAAC;AAqB1F,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,OAAO,EAAE,kBAAkB,EAAE,GAC5B,cAAc,CAgDhB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAsCpE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createContextCapsule = createContextCapsule;
|
|
4
|
+
exports.renderContextCapsule = renderContextCapsule;
|
|
5
|
+
function metadataString(entry, key) {
|
|
6
|
+
const value = entry.metadata?.[key];
|
|
7
|
+
return typeof value === 'string' && value ? value : undefined;
|
|
8
|
+
}
|
|
9
|
+
function metadataBool(entry, key) {
|
|
10
|
+
const value = entry.metadata?.[key];
|
|
11
|
+
return typeof value === 'boolean' ? value : undefined;
|
|
12
|
+
}
|
|
13
|
+
function unique(items) {
|
|
14
|
+
return [...new Set(items.filter(Boolean))];
|
|
15
|
+
}
|
|
16
|
+
function compactLine(text, max = 160) {
|
|
17
|
+
const normalized = text.replace(/\s+/g, ' ').trim();
|
|
18
|
+
return normalized.length > max ? normalized.slice(0, max - 3) + '...' : normalized;
|
|
19
|
+
}
|
|
20
|
+
function createContextCapsule(contract, entries) {
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
const keyFacts = [...entries]
|
|
23
|
+
.filter(entry => entry.importance >= 4 || entry.type === 'user_requirement')
|
|
24
|
+
.sort((a, b) => b.importance - a.importance || b.createdAt - a.createdAt)
|
|
25
|
+
.slice(0, 12);
|
|
26
|
+
const todoEntries = entries.filter(entry => entry.type === 'todo');
|
|
27
|
+
const currentPlan = todoEntries.slice(0, 8).map((entry, index) => ({
|
|
28
|
+
id: entry.id,
|
|
29
|
+
title: compactLine(entry.content),
|
|
30
|
+
status: index === 0 ? 'in_progress' : 'pending',
|
|
31
|
+
}));
|
|
32
|
+
const verificationEntries = entries.filter(entry => entry.type === 'verification' || entry.type === 'test_result');
|
|
33
|
+
const passed = verificationEntries
|
|
34
|
+
.filter(entry => metadataBool(entry, 'success') === true)
|
|
35
|
+
.map(entry => compactLine(entry.content));
|
|
36
|
+
const failed = verificationEntries
|
|
37
|
+
.filter(entry => metadataBool(entry, 'success') === false)
|
|
38
|
+
.map(entry => compactLine(entry.content));
|
|
39
|
+
const commandsRun = unique(verificationEntries.map(entry => metadataString(entry, 'command') || '').filter(Boolean));
|
|
40
|
+
const changedFiles = unique(entries.map(entry => metadataString(entry, 'changedFile') || metadataString(entry, 'path') || '').filter(Boolean));
|
|
41
|
+
const completed = entries
|
|
42
|
+
.filter(entry => entry.type === 'decision' || (entry.type === 'tool_result' && metadataBool(entry, 'success') === true))
|
|
43
|
+
.slice(-8)
|
|
44
|
+
.map(entry => compactLine(entry.content));
|
|
45
|
+
const openTodos = currentPlan.length > 0
|
|
46
|
+
? currentPlan.filter(step => step.status !== 'completed').map(step => step.title)
|
|
47
|
+
: (contract?.successCriteria ?? []).map(item => compactLine(item));
|
|
48
|
+
return {
|
|
49
|
+
contract,
|
|
50
|
+
currentPlan,
|
|
51
|
+
completed,
|
|
52
|
+
openTodos,
|
|
53
|
+
keyFacts,
|
|
54
|
+
changedFiles,
|
|
55
|
+
verification: {
|
|
56
|
+
commandsRun,
|
|
57
|
+
passed,
|
|
58
|
+
failed,
|
|
59
|
+
warnings: entries.filter(entry => entry.type === 'risk' || entry.type === 'blocker').slice(-5).map(entry => compactLine(entry.content)),
|
|
60
|
+
},
|
|
61
|
+
nextAction: openTodos[0] || (contract ? `Continue: ${contract.objective}` : 'Continue the current task.'),
|
|
62
|
+
createdAt: now,
|
|
63
|
+
updatedAt: now,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function renderContextCapsule(capsule) {
|
|
67
|
+
const contract = capsule.contract;
|
|
68
|
+
const lines = ['## Context Capsule'];
|
|
69
|
+
if (contract) {
|
|
70
|
+
lines.push('', `Objective: ${contract.objective}`);
|
|
71
|
+
if (contract.requirements.length > 0) {
|
|
72
|
+
lines.push('Requirements:');
|
|
73
|
+
lines.push(...contract.requirements.map(item => `- ${item}`));
|
|
74
|
+
}
|
|
75
|
+
if (contract.prohibitions.length > 0) {
|
|
76
|
+
lines.push('Prohibitions:');
|
|
77
|
+
lines.push(...contract.prohibitions.map(item => `- ${item}`));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (capsule.openTodos.length > 0) {
|
|
81
|
+
lines.push('', 'Open todos:');
|
|
82
|
+
lines.push(...capsule.openTodos.map(item => `- ${item}`));
|
|
83
|
+
}
|
|
84
|
+
if (capsule.keyFacts.length > 0) {
|
|
85
|
+
lines.push('', 'Key facts:');
|
|
86
|
+
lines.push(...capsule.keyFacts.slice(0, 8).map(entry => `- ${entry.content}`));
|
|
87
|
+
}
|
|
88
|
+
if (capsule.verification.passed.length > 0 || capsule.verification.failed.length > 0) {
|
|
89
|
+
lines.push('', 'Verification:');
|
|
90
|
+
lines.push(...capsule.verification.passed.map(item => `- Passed: ${item}`));
|
|
91
|
+
lines.push(...capsule.verification.failed.map(item => `- Failed: ${item}`));
|
|
92
|
+
}
|
|
93
|
+
if (capsule.changedFiles.length > 0) {
|
|
94
|
+
lines.push('', `Changed files: ${capsule.changedFiles.join(', ')}`);
|
|
95
|
+
}
|
|
96
|
+
lines.push('', `Next action: ${capsule.nextAction}`);
|
|
97
|
+
return lines.join('\n');
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=capsule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capsule.js","sourceRoot":"","sources":["../../src/harness/capsule.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { LLMResponse, Message } from '../services/llm';
|
|
2
|
+
import type { CompletionGateResult, ContextCapsule, DriftCheckResult, HarnessConfig, HarnessState } from './types';
|
|
3
|
+
export interface ContextHarnessOptions {
|
|
4
|
+
cwd: string;
|
|
5
|
+
modelId: string;
|
|
6
|
+
state?: HarnessState;
|
|
7
|
+
config?: HarnessConfig;
|
|
8
|
+
}
|
|
9
|
+
export declare class ContextHarness {
|
|
10
|
+
private readonly cwd;
|
|
11
|
+
private readonly modelId;
|
|
12
|
+
private readonly config;
|
|
13
|
+
private contract;
|
|
14
|
+
private ledger;
|
|
15
|
+
private capsule?;
|
|
16
|
+
private completionBlockCount;
|
|
17
|
+
constructor(options: ContextHarnessOptions);
|
|
18
|
+
updateContractFromUserInput(input: string): void;
|
|
19
|
+
assembleMessages(messages: Message[]): Message[];
|
|
20
|
+
recordAssistantResponse(response: LLMResponse): void;
|
|
21
|
+
beforeToolUse(params: {
|
|
22
|
+
name: string;
|
|
23
|
+
args: Record<string, unknown>;
|
|
24
|
+
}): DriftCheckResult;
|
|
25
|
+
recordToolResult(params: {
|
|
26
|
+
name: string;
|
|
27
|
+
args: Record<string, unknown>;
|
|
28
|
+
result: string;
|
|
29
|
+
duration: number;
|
|
30
|
+
success: boolean;
|
|
31
|
+
error?: string;
|
|
32
|
+
}): void;
|
|
33
|
+
beforeComplete(): CompletionGateResult;
|
|
34
|
+
asCompletionBlockedMessage(result: CompletionGateResult): Message;
|
|
35
|
+
asToolBlockedResult(result: DriftCheckResult): string;
|
|
36
|
+
getCapsule(): ContextCapsule | undefined;
|
|
37
|
+
toJSON(): HarnessState;
|
|
38
|
+
private refreshCapsule;
|
|
39
|
+
}
|
|
40
|
+
export declare function createContextHarness(options: ContextHarnessOptions): ContextHarness;
|
|
41
|
+
//# sourceMappingURL=context-harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-harness.d.ts","sourceRoot":"","sources":["../../src/harness/context-harness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAM5D,OAAO,KAAK,EACV,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,YAAY,EACb,MAAM,SAAS,CAAC;AAcjB,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,oBAAoB,CAAS;gBAEzB,OAAO,EAAE,qBAAqB;IAU1C,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAShD,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE;IAIhD,uBAAuB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAQpD,aAAa,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,gBAAgB;IAsBxF,gBAAgB,CAAC,MAAM,EAAE;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,IAAI;IAMR,cAAc,IAAI,oBAAoB;IAgCtC,0BAA0B,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO;IAOjE,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAQrD,UAAU,IAAI,cAAc,GAAG,SAAS;IAKxC,MAAM,IAAI,YAAY;IAUtB,OAAO,CAAC,cAAc;CAIvB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAEnF"}
|