@goondan/openharness-base 0.0.1-alpha5 → 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/dist/extensions/compaction.d.ts +12 -0
- package/dist/extensions/compaction.d.ts.map +1 -0
- package/dist/extensions/compaction.js +159 -0
- package/dist/extensions/compaction.js.map +1 -0
- package/dist/extensions/context-message.d.ts +9 -0
- package/dist/extensions/context-message.d.ts.map +1 -0
- package/dist/extensions/context-message.js +446 -0
- package/dist/extensions/context-message.js.map +1 -0
- package/dist/extensions/index.d.ts +13 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +7 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/logging.d.ts +11 -0
- package/dist/extensions/logging.d.ts.map +1 -0
- package/dist/extensions/logging.js +140 -0
- package/dist/extensions/logging.js.map +1 -0
- package/dist/extensions/message-integrity.d.ts +8 -0
- package/dist/extensions/message-integrity.d.ts.map +1 -0
- package/dist/extensions/message-integrity.js +88 -0
- package/dist/extensions/message-integrity.js.map +1 -0
- package/dist/extensions/message-window.d.ts +7 -0
- package/dist/extensions/message-window.d.ts.map +1 -0
- package/dist/extensions/message-window.js +60 -0
- package/dist/extensions/message-window.js.map +1 -0
- package/dist/extensions/required-tools-guard.d.ts +9 -0
- package/dist/extensions/required-tools-guard.d.ts.map +1 -0
- package/dist/extensions/required-tools-guard.js +74 -0
- package/dist/extensions/required-tools-guard.js.map +1 -0
- package/dist/extensions/tool-search.d.ts +10 -0
- package/dist/extensions/tool-search.d.ts.map +1 -0
- package/dist/extensions/tool-search.js +198 -0
- package/dist/extensions/tool-search.js.map +1 -0
- package/dist/harness.yaml +503 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/manifests/base.d.ts +8 -0
- package/dist/manifests/base.d.ts.map +1 -0
- package/dist/manifests/base.js +352 -0
- package/dist/manifests/base.js.map +1 -0
- package/dist/manifests/index.d.ts +3 -0
- package/dist/manifests/index.d.ts.map +1 -0
- package/dist/manifests/index.js +2 -0
- package/dist/manifests/index.js.map +1 -0
- package/dist/tools/bash.d.ts +8 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +119 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/file-system.d.ts +12 -0
- package/dist/tools/file-system.d.ts.map +1 -0
- package/dist/tools/file-system.js +117 -0
- package/dist/tools/file-system.js.map +1 -0
- package/dist/tools/http-fetch.d.ts +8 -0
- package/dist/tools/http-fetch.d.ts.map +1 -0
- package/dist/tools/http-fetch.js +149 -0
- package/dist/tools/http-fetch.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +7 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/json-query.d.ts +12 -0
- package/dist/tools/json-query.d.ts.map +1 -0
- package/dist/tools/json-query.js +176 -0
- package/dist/tools/json-query.js.map +1 -0
- package/dist/tools/text-transform.d.ts +16 -0
- package/dist/tools/text-transform.d.ts.map +1 -0
- package/dist/tools/text-transform.js +127 -0
- package/dist/tools/text-transform.js.map +1 -0
- package/dist/tools/wait.d.ts +6 -0
- package/dist/tools/wait.d.ts.map +1 -0
- package/dist/tools/wait.js +32 -0
- package/dist/tools/wait.js.map +1 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +17 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +159 -0
- package/dist/utils.js.map +1 -0
- package/package.json +13 -10
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { register as registerLoggingExtension, registerLoggingExtension as createLoggingExtension, } from './logging.js';
|
|
2
|
+
export type { LoggingExtensionConfig } from './logging.js';
|
|
3
|
+
export { register as registerCompactionExtension, registerCompactionExtension as createCompactionExtension, } from './compaction.js';
|
|
4
|
+
export type { CompactionExtensionConfig } from './compaction.js';
|
|
5
|
+
export { register as registerMessageWindowExtension, registerMessageWindowExtension as createMessageWindowExtension, } from './message-window.js';
|
|
6
|
+
export type { MessageWindowExtensionConfig } from './message-window.js';
|
|
7
|
+
export { register as registerToolSearchExtension, registerToolSearchExtension as createToolSearchExtension, } from './tool-search.js';
|
|
8
|
+
export type { ToolSearchExtensionConfig } from './tool-search.js';
|
|
9
|
+
export { register as registerContextMessageExtension, register as createContextMessageExtension, } from './context-message.js';
|
|
10
|
+
export type { ContextMessageExtensionConfig } from './context-message.js';
|
|
11
|
+
export { register as registerRequiredToolsGuardExtension } from './required-tools-guard.js';
|
|
12
|
+
export type { RequiredToolsGuardConfig } from './required-tools-guard.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,IAAI,wBAAwB,EACpC,wBAAwB,IAAI,sBAAsB,GACnD,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EACL,QAAQ,IAAI,2BAA2B,EACvC,2BAA2B,IAAI,yBAAyB,GACzD,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAEjE,OAAO,EACL,QAAQ,IAAI,8BAA8B,EAC1C,8BAA8B,IAAI,4BAA4B,GAC/D,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,EACL,QAAQ,IAAI,2BAA2B,EACvC,2BAA2B,IAAI,yBAAyB,GACzD,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,EACL,QAAQ,IAAI,+BAA+B,EAC3C,QAAQ,IAAI,6BAA6B,GAC1C,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,QAAQ,IAAI,mCAAmC,EAAE,MAAM,2BAA2B,CAAC;AAC5F,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { register as registerLoggingExtension, registerLoggingExtension as createLoggingExtension, } from './logging.js';
|
|
2
|
+
export { register as registerCompactionExtension, registerCompactionExtension as createCompactionExtension, } from './compaction.js';
|
|
3
|
+
export { register as registerMessageWindowExtension, registerMessageWindowExtension as createMessageWindowExtension, } from './message-window.js';
|
|
4
|
+
export { register as registerToolSearchExtension, registerToolSearchExtension as createToolSearchExtension, } from './tool-search.js';
|
|
5
|
+
export { register as registerContextMessageExtension, register as createContextMessageExtension, } from './context-message.js';
|
|
6
|
+
export { register as registerRequiredToolsGuardExtension } from './required-tools-guard.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,IAAI,wBAAwB,EACpC,wBAAwB,IAAI,sBAAsB,GACnD,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,QAAQ,IAAI,2BAA2B,EACvC,2BAA2B,IAAI,yBAAyB,GACzD,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,QAAQ,IAAI,8BAA8B,EAC1C,8BAA8B,IAAI,4BAA4B,GAC/D,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,QAAQ,IAAI,2BAA2B,EACvC,2BAA2B,IAAI,yBAAyB,GACzD,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,QAAQ,IAAI,+BAA+B,EAC3C,QAAQ,IAAI,6BAA6B,GAC1C,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,QAAQ,IAAI,mCAAmC,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ExtensionApi } from '../types.js';
|
|
2
|
+
type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
3
|
+
export interface LoggingExtensionConfig {
|
|
4
|
+
level?: LogLevel;
|
|
5
|
+
includeToolArgs?: boolean;
|
|
6
|
+
includeTurnMetadata?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function registerLoggingExtension(api: ExtensionApi, config?: LoggingExtensionConfig): void;
|
|
9
|
+
export declare function register(api: ExtensionApi, config?: LoggingExtensionConfig): void;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/extensions/logging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,aAAa,CAAC;AAErB,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAsCD,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,YAAY,EACjB,MAAM,GAAE,sBAA2B,GAClC,IAAI,CA0GN;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAEjF"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
const LOG_LEVEL_WEIGHT = {
|
|
2
|
+
debug: 10,
|
|
3
|
+
info: 20,
|
|
4
|
+
warn: 30,
|
|
5
|
+
error: 40,
|
|
6
|
+
};
|
|
7
|
+
function toErrorMessage(error) {
|
|
8
|
+
if (error instanceof Error) {
|
|
9
|
+
return error.message;
|
|
10
|
+
}
|
|
11
|
+
return String(error);
|
|
12
|
+
}
|
|
13
|
+
function shouldLog(minimum, level) {
|
|
14
|
+
return LOG_LEVEL_WEIGHT[level] >= LOG_LEVEL_WEIGHT[minimum];
|
|
15
|
+
}
|
|
16
|
+
function buildTurnMeta(ctx) {
|
|
17
|
+
return {
|
|
18
|
+
turnId: ctx.turnId,
|
|
19
|
+
traceId: ctx.traceId,
|
|
20
|
+
inputType: ctx.inputEvent.type,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function buildToolMeta(ctx) {
|
|
24
|
+
return {
|
|
25
|
+
turnId: ctx.turnId,
|
|
26
|
+
traceId: ctx.traceId,
|
|
27
|
+
stepIndex: ctx.stepIndex,
|
|
28
|
+
toolCallId: ctx.toolCallId,
|
|
29
|
+
toolName: ctx.toolName,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function registerLoggingExtension(api, config = {}) {
|
|
33
|
+
const level = config.level ?? 'info';
|
|
34
|
+
const includeToolArgs = config.includeToolArgs ?? false;
|
|
35
|
+
const includeTurnMetadata = config.includeTurnMetadata ?? true;
|
|
36
|
+
api.pipeline.register('turn', async (ctx) => {
|
|
37
|
+
const startedAt = Date.now();
|
|
38
|
+
if (shouldLog(level, 'info')) {
|
|
39
|
+
if (includeTurnMetadata) {
|
|
40
|
+
api.logger.info('[logging.turn] start', buildTurnMeta(ctx));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
api.logger.info(`[logging.turn] start turnId=${ctx.turnId}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const result = await ctx.next();
|
|
48
|
+
if (shouldLog(level, 'info')) {
|
|
49
|
+
api.logger.info('[logging.turn] complete', {
|
|
50
|
+
turnId: ctx.turnId,
|
|
51
|
+
durationMs: Date.now() - startedAt,
|
|
52
|
+
finishReason: result.finishReason,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (shouldLog(level, 'error')) {
|
|
59
|
+
api.logger.error('[logging.turn] failed', {
|
|
60
|
+
turnId: ctx.turnId,
|
|
61
|
+
durationMs: Date.now() - startedAt,
|
|
62
|
+
error: toErrorMessage(error),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
api.pipeline.register('step', async (ctx) => {
|
|
69
|
+
const startedAt = Date.now();
|
|
70
|
+
if (shouldLog(level, 'info')) {
|
|
71
|
+
api.logger.info('[logging.step] start', {
|
|
72
|
+
turnId: ctx.turnId,
|
|
73
|
+
stepIndex: ctx.stepIndex,
|
|
74
|
+
catalogSize: ctx.toolCatalog.length,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const result = await ctx.next();
|
|
79
|
+
if (shouldLog(level, 'info')) {
|
|
80
|
+
api.logger.info('[logging.step] complete', {
|
|
81
|
+
turnId: ctx.turnId,
|
|
82
|
+
stepIndex: ctx.stepIndex,
|
|
83
|
+
durationMs: Date.now() - startedAt,
|
|
84
|
+
shouldContinue: result.shouldContinue,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (shouldLog(level, 'error')) {
|
|
91
|
+
api.logger.error('[logging.step] failed', {
|
|
92
|
+
turnId: ctx.turnId,
|
|
93
|
+
stepIndex: ctx.stepIndex,
|
|
94
|
+
durationMs: Date.now() - startedAt,
|
|
95
|
+
error: toErrorMessage(error),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
api.pipeline.register('toolCall', async (ctx) => {
|
|
102
|
+
const startedAt = Date.now();
|
|
103
|
+
if (shouldLog(level, 'debug')) {
|
|
104
|
+
if (includeToolArgs) {
|
|
105
|
+
api.logger.debug('[logging.toolCall] start', {
|
|
106
|
+
...buildToolMeta(ctx),
|
|
107
|
+
args: ctx.args,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
api.logger.debug('[logging.toolCall] start', buildToolMeta(ctx));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const result = await ctx.next();
|
|
116
|
+
if (shouldLog(level, 'debug')) {
|
|
117
|
+
api.logger.debug('[logging.toolCall] complete', {
|
|
118
|
+
...buildToolMeta(ctx),
|
|
119
|
+
durationMs: Date.now() - startedAt,
|
|
120
|
+
status: result.status,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (shouldLog(level, 'error')) {
|
|
127
|
+
api.logger.error('[logging.toolCall] failed', {
|
|
128
|
+
...buildToolMeta(ctx),
|
|
129
|
+
durationMs: Date.now() - startedAt,
|
|
130
|
+
error: toErrorMessage(error),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
export function register(api, config) {
|
|
138
|
+
registerLoggingExtension(api, config);
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/extensions/logging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Message } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Removes messages that would leave invalid tool_result references after trimming.
|
|
4
|
+
* Anthropic requires every tool_result block to map to a tool_use/tool-call block
|
|
5
|
+
* in the immediately previous assistant message.
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeRemovalTargets(messages: Message[], initialRemovedIds: ReadonlySet<string>): Set<string>;
|
|
8
|
+
//# sourceMappingURL=message-integrity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-integrity.d.ts","sourceRoot":"","sources":["../../src/extensions/message-integrity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAiF3C;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,OAAO,EAAE,EACnB,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,GACrC,GAAG,CAAC,MAAM,CAAC,CAwBb"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
function readToolCallId(part) {
|
|
2
|
+
const value = part.toolCallId;
|
|
3
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
function collectToolCallIds(message) {
|
|
9
|
+
const ids = new Set();
|
|
10
|
+
if (!message) {
|
|
11
|
+
return ids;
|
|
12
|
+
}
|
|
13
|
+
const content = message.data.content;
|
|
14
|
+
if (!Array.isArray(content)) {
|
|
15
|
+
return ids;
|
|
16
|
+
}
|
|
17
|
+
for (const part of content) {
|
|
18
|
+
if (part.type !== 'tool-call') {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const toolCallId = readToolCallId(part);
|
|
22
|
+
if (!toolCallId) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
ids.add(toolCallId);
|
|
26
|
+
}
|
|
27
|
+
return ids;
|
|
28
|
+
}
|
|
29
|
+
function collectToolResultIds(message) {
|
|
30
|
+
const content = message.data.content;
|
|
31
|
+
if (!Array.isArray(content)) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
const ids = [];
|
|
35
|
+
for (const part of content) {
|
|
36
|
+
if (part.type !== 'tool-result') {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const toolCallId = readToolCallId(part);
|
|
40
|
+
if (!toolCallId) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
ids.push(toolCallId);
|
|
44
|
+
}
|
|
45
|
+
return ids;
|
|
46
|
+
}
|
|
47
|
+
function hasDanglingToolResult(message, previousMessage) {
|
|
48
|
+
const toolResultIds = collectToolResultIds(message);
|
|
49
|
+
if (toolResultIds.length === 0) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const previousToolCallIds = collectToolCallIds(previousMessage);
|
|
53
|
+
if (previousToolCallIds.size === 0) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
for (const toolResultId of toolResultIds) {
|
|
57
|
+
if (!previousToolCallIds.has(toolResultId)) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Removes messages that would leave invalid tool_result references after trimming.
|
|
65
|
+
* Anthropic requires every tool_result block to map to a tool_use/tool-call block
|
|
66
|
+
* in the immediately previous assistant message.
|
|
67
|
+
*/
|
|
68
|
+
export function normalizeRemovalTargets(messages, initialRemovedIds) {
|
|
69
|
+
const removedIds = new Set(initialRemovedIds);
|
|
70
|
+
let changed = true;
|
|
71
|
+
while (changed) {
|
|
72
|
+
changed = false;
|
|
73
|
+
let previousRemainingMessage;
|
|
74
|
+
for (const message of messages) {
|
|
75
|
+
if (removedIds.has(message.id)) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (hasDanglingToolResult(message, previousRemainingMessage)) {
|
|
79
|
+
removedIds.add(message.id);
|
|
80
|
+
changed = true;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
previousRemainingMessage = message;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return removedIds;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=message-integrity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-integrity.js","sourceRoot":"","sources":["../../src/extensions/message-integrity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ExtensionApi } from '../types.js';
|
|
2
|
+
export interface MessageWindowExtensionConfig {
|
|
3
|
+
maxMessages?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function registerMessageWindowExtension(api: ExtensionApi, config?: MessageWindowExtensionConfig): void;
|
|
6
|
+
export declare function register(api: ExtensionApi, config?: MessageWindowExtensionConfig): void;
|
|
7
|
+
//# sourceMappingURL=message-window.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-window.d.ts","sourceRoot":"","sources":["../../src/extensions/message-window.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AAGvE,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAmBD,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,YAAY,EACjB,MAAM,CAAC,EAAE,4BAA4B,GACpC,IAAI,CA+CN;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,4BAA4B,GAAG,IAAI,CAEvF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { normalizeRemovalTargets } from './message-integrity.js';
|
|
2
|
+
const DEFAULT_CONFIG = {
|
|
3
|
+
maxMessages: 40,
|
|
4
|
+
};
|
|
5
|
+
function isPinned(message) {
|
|
6
|
+
return message.metadata.pinned === true;
|
|
7
|
+
}
|
|
8
|
+
function resolveMaxMessages(config) {
|
|
9
|
+
const value = config?.maxMessages;
|
|
10
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 1) {
|
|
11
|
+
return DEFAULT_CONFIG.maxMessages;
|
|
12
|
+
}
|
|
13
|
+
return Math.floor(value);
|
|
14
|
+
}
|
|
15
|
+
export function registerMessageWindowExtension(api, config) {
|
|
16
|
+
const maxMessages = resolveMaxMessages(config);
|
|
17
|
+
api.pipeline.register('turn', async (ctx) => {
|
|
18
|
+
const messages = ctx.conversationState.nextMessages;
|
|
19
|
+
const removedIds = new Set();
|
|
20
|
+
if (messages.length > maxMessages) {
|
|
21
|
+
const removeCount = messages.length - maxMessages;
|
|
22
|
+
let removed = 0;
|
|
23
|
+
for (const message of messages) {
|
|
24
|
+
if (removed >= removeCount) {
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
if (!message) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (isPinned(message)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
removedIds.add(message.id);
|
|
34
|
+
removed += 1;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const normalizedRemovedIds = normalizeRemovalTargets(messages, removedIds);
|
|
38
|
+
if (normalizedRemovedIds.size === 0) {
|
|
39
|
+
return ctx.next();
|
|
40
|
+
}
|
|
41
|
+
const events = [];
|
|
42
|
+
for (const message of messages) {
|
|
43
|
+
if (!normalizedRemovedIds.has(message.id)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
events.push({
|
|
47
|
+
type: 'remove',
|
|
48
|
+
targetId: message.id,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
for (const event of events) {
|
|
52
|
+
ctx.emitMessageEvent(event);
|
|
53
|
+
}
|
|
54
|
+
return ctx.next();
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
export function register(api, config) {
|
|
58
|
+
registerMessageWindowExtension(api, config);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=message-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-window.js","sourceRoot":"","sources":["../../src/extensions/message-window.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAMjE,MAAM,cAAc,GAA2C;IAC7D,WAAW,EAAE,EAAE;CAChB,CAAC;AAEF,SAAS,QAAQ,CAAC,OAAgB;IAChC,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC;AAC1C,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAqC;IAC/D,MAAM,KAAK,GAAG,MAAM,EAAE,WAAW,CAAC;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACtE,OAAO,cAAc,CAAC,WAAW,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,GAAiB,EACjB,MAAqC;IAErC,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE/C,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,IAAI,QAAQ,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YAClC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;YAClD,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;oBAC3B,MAAM;gBACR,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,SAAS;gBACX,CAAC;gBACD,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtB,SAAS;gBACX,CAAC;gBACD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC3B,OAAO,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;QAED,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3E,IAAI,oBAAoB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;QAED,MAAM,MAAM,GAAmB,EAAE,CAAC;QAClC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC1C,SAAS;YACX,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,OAAO,CAAC,EAAE;aACrB,CAAC,CAAC;QACL,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAiB,EAAE,MAAqC;IAC/E,8BAA8B,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ExtensionApi } from '../types.js';
|
|
2
|
+
export interface RequiredToolsGuardConfig {
|
|
3
|
+
/** Turn 종료 전 반드시 성공 호출되어야 하는 tool 이름 목록 (최소 1개). */
|
|
4
|
+
requiredTools?: string[];
|
|
5
|
+
/** 미충족 시 LLM에 주입할 오류 메시지. */
|
|
6
|
+
errorMessage?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function register(api: ExtensionApi, config?: RequiredToolsGuardConfig): void;
|
|
9
|
+
//# sourceMappingURL=required-tools-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-tools-guard.d.ts","sourceRoot":"","sources":["../../src/extensions/required-tools-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,wBAAwB;IACvC,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA8BD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAwDnF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
function createUserMessage(text) {
|
|
3
|
+
return {
|
|
4
|
+
id: `rtg_${randomUUID()}`,
|
|
5
|
+
data: { role: 'user', content: text },
|
|
6
|
+
metadata: { __createdBy: 'required-tools-guard' },
|
|
7
|
+
createdAt: new Date(),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function normalizeConfig(raw) {
|
|
11
|
+
const config = {};
|
|
12
|
+
if (Array.isArray(raw?.requiredTools)) {
|
|
13
|
+
const requiredTools = raw.requiredTools.filter((entry) => typeof entry === 'string' && entry.trim().length > 0);
|
|
14
|
+
if (requiredTools.length > 0) {
|
|
15
|
+
config.requiredTools = requiredTools;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (typeof raw?.errorMessage === 'string') {
|
|
19
|
+
config.errorMessage = raw.errorMessage;
|
|
20
|
+
}
|
|
21
|
+
return config;
|
|
22
|
+
}
|
|
23
|
+
export function register(api, config) {
|
|
24
|
+
const rawConfig = normalizeConfig(config);
|
|
25
|
+
const requiredTools = Array.isArray(rawConfig.requiredTools) ? rawConfig.requiredTools : [];
|
|
26
|
+
const errorMessage = typeof rawConfig.errorMessage === 'string' && rawConfig.errorMessage.trim().length > 0
|
|
27
|
+
? rawConfig.errorMessage
|
|
28
|
+
: `다음 도구 중 하나를 반드시 호출하세요: ${requiredTools.join(', ')}`;
|
|
29
|
+
if (requiredTools.length === 0)
|
|
30
|
+
return;
|
|
31
|
+
// turnId별 성공한 tool 호출 추적
|
|
32
|
+
const calledToolsPerTurn = new Map();
|
|
33
|
+
api.pipeline.register('turn', async (ctx) => {
|
|
34
|
+
// turn 경계에서 누적 상태를 강제 리셋한다.
|
|
35
|
+
calledToolsPerTurn.clear();
|
|
36
|
+
calledToolsPerTurn.set(ctx.turnId, new Set());
|
|
37
|
+
try {
|
|
38
|
+
return await ctx.next();
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
calledToolsPerTurn.delete(ctx.turnId);
|
|
42
|
+
calledToolsPerTurn.clear();
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
api.pipeline.register('toolCall', async (ctx) => {
|
|
46
|
+
const result = await ctx.next();
|
|
47
|
+
if (result.status === 'ok') {
|
|
48
|
+
if (!calledToolsPerTurn.has(ctx.turnId)) {
|
|
49
|
+
calledToolsPerTurn.set(ctx.turnId, new Set());
|
|
50
|
+
}
|
|
51
|
+
calledToolsPerTurn.get(ctx.turnId)?.add(ctx.toolName);
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
});
|
|
55
|
+
api.pipeline.register('step', async (ctx) => {
|
|
56
|
+
const result = await ctx.next();
|
|
57
|
+
if (result.shouldContinue)
|
|
58
|
+
return result;
|
|
59
|
+
// 현재 step의 결과도 반영
|
|
60
|
+
const calledTools = calledToolsPerTurn.get(ctx.turnId) ?? new Set();
|
|
61
|
+
for (const tr of result.toolResults) {
|
|
62
|
+
if (tr.status === 'ok')
|
|
63
|
+
calledTools.add(tr.toolName);
|
|
64
|
+
}
|
|
65
|
+
const satisfied = requiredTools.some((t) => calledTools.has(t));
|
|
66
|
+
if (satisfied) {
|
|
67
|
+
calledToolsPerTurn.delete(ctx.turnId);
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
ctx.emitMessageEvent({ type: 'append', message: createUserMessage(errorMessage) });
|
|
71
|
+
return { ...result, shouldContinue: true };
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=required-tools-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-tools-guard.js","sourceRoot":"","sources":["../../src/extensions/required-tools-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAUzC,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO;QACL,EAAE,EAAE,OAAO,UAAU,EAAE,EAAE;QACzB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,IAAI,EAAE;QAC9C,QAAQ,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE;QACjD,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAA8B;IACrD,MAAM,MAAM,GAA6B,EAAE,CAAC;IAE5C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC;QACtC,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAC5C,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CACjF,CAAC;QACF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC;QACvC,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;IACzC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAiB,EAAE,MAAiC;IAC3E,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAa,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IACtG,MAAM,YAAY,GAChB,OAAO,SAAS,CAAC,YAAY,KAAK,QAAQ,IAAI,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACpF,CAAC,CAAC,SAAS,CAAC,YAAY;QACxB,CAAC,CAAC,0BAA0B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAE3D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEvC,yBAAyB;IACzB,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE1D,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC1C,4BAA4B;QAC5B,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAC3B,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEhC,IAAI,MAAM,CAAC,cAAc;YAAE,OAAO,MAAM,CAAC;QAEzC,kBAAkB;QAClB,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QAC5E,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,EAAE,CAAC,MAAM,KAAK,IAAI;gBAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,IAAI,SAAS,EAAE,CAAC;YACd,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtC,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACnF,OAAO,EAAE,GAAG,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExtensionApi } from '../types.js';
|
|
2
|
+
export interface ToolSearchExtensionConfig {
|
|
3
|
+
toolName?: string;
|
|
4
|
+
maxResults?: number;
|
|
5
|
+
minQueryLength?: number;
|
|
6
|
+
persistSelection?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function registerToolSearchExtension(api: ExtensionApi, config?: ToolSearchExtensionConfig): void;
|
|
9
|
+
export declare function register(api: ExtensionApi, config?: ToolSearchExtensionConfig): void;
|
|
10
|
+
//# sourceMappingURL=tool-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-search.d.ts","sourceRoot":"","sources":["../../src/extensions/tool-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAOb,MAAM,aAAa,CAAC;AAOrB,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AA8ND,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,YAAY,EACjB,MAAM,CAAC,EAAE,yBAAyB,GACjC,IAAI,CAqCN;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAEpF"}
|