@tarquinen/opencode-dcp 0.4.17 → 1.0.0-beta.1
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 +58 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -59
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +30 -13
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +339 -121
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/hooks.d.ts +5 -13
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +26 -125
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/logger.d.ts +5 -9
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +30 -160
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/messages/index.d.ts +2 -0
- package/dist/lib/messages/index.d.ts.map +1 -0
- package/dist/lib/messages/index.js +2 -0
- package/dist/lib/messages/index.js.map +1 -0
- package/dist/lib/messages/prune.d.ts +6 -0
- package/dist/lib/messages/prune.d.ts.map +1 -0
- package/dist/lib/messages/prune.js +85 -0
- package/dist/lib/messages/prune.js.map +1 -0
- package/dist/lib/messages/utils.d.ts +10 -0
- package/dist/lib/messages/utils.d.ts.map +1 -0
- package/dist/lib/messages/utils.js +103 -0
- package/dist/lib/messages/utils.js.map +1 -0
- package/dist/lib/model-selector.js +3 -3
- package/dist/lib/model-selector.js.map +1 -1
- package/dist/lib/{core/prompt.d.ts → prompt.d.ts} +1 -1
- package/dist/lib/prompt.d.ts.map +1 -0
- package/dist/lib/{core/prompt.js → prompt.js} +2 -6
- package/dist/lib/prompt.js.map +1 -0
- package/dist/lib/prompts/pruning.txt +1 -1
- package/dist/lib/prompts/tool.txt +3 -3
- package/dist/lib/state/index.d.ts +3 -27
- package/dist/lib/state/index.d.ts.map +1 -1
- package/dist/lib/state/index.js +3 -40
- package/dist/lib/state/index.js.map +1 -1
- package/dist/lib/state/persistence.d.ts +4 -4
- package/dist/lib/state/persistence.d.ts.map +1 -1
- package/dist/lib/state/persistence.js +24 -20
- package/dist/lib/state/persistence.js.map +1 -1
- package/dist/lib/state/state.d.ts +7 -0
- package/dist/lib/state/state.d.ts.map +1 -0
- package/dist/lib/state/state.js +76 -0
- package/dist/lib/state/state.js.map +1 -0
- package/dist/lib/state/tool-cache.d.ts +4 -6
- package/dist/lib/state/tool-cache.d.ts.map +1 -1
- package/dist/lib/state/tool-cache.js +14 -46
- package/dist/lib/state/tool-cache.js.map +1 -1
- package/dist/lib/state/types.d.ts +30 -0
- package/dist/lib/state/types.d.ts.map +1 -0
- package/dist/lib/state/types.js +2 -0
- package/dist/lib/state/types.js.map +1 -0
- package/dist/lib/strategies/deduplication.d.ts +10 -0
- package/dist/lib/strategies/deduplication.d.ts.map +1 -0
- package/dist/lib/strategies/deduplication.js +89 -0
- package/dist/lib/strategies/deduplication.js.map +1 -0
- package/dist/lib/strategies/index.d.ts +4 -0
- package/dist/lib/strategies/index.d.ts.map +1 -0
- package/dist/lib/strategies/index.js +4 -0
- package/dist/lib/strategies/index.js.map +1 -0
- package/dist/lib/strategies/on-idle.d.ts +14 -0
- package/dist/lib/strategies/on-idle.d.ts.map +1 -0
- package/dist/lib/strategies/on-idle.js +216 -0
- package/dist/lib/strategies/on-idle.js.map +1 -0
- package/dist/lib/strategies/prune-tool.d.ts +17 -0
- package/dist/lib/strategies/prune-tool.d.ts.map +1 -0
- package/dist/lib/strategies/prune-tool.js +70 -0
- package/dist/lib/strategies/prune-tool.js.map +1 -0
- package/dist/lib/ui/display-utils.d.ts +3 -12
- package/dist/lib/ui/display-utils.d.ts.map +1 -1
- package/dist/lib/ui/display-utils.js +12 -79
- package/dist/lib/ui/display-utils.js.map +1 -1
- package/dist/lib/ui/notification.d.ts +7 -23
- package/dist/lib/ui/notification.d.ts.map +1 -1
- package/dist/lib/ui/notification.js +38 -47
- package/dist/lib/ui/notification.js.map +1 -1
- package/dist/lib/utils.d.ts +9 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +61 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +1 -1
- package/dist/lib/core/janitor.d.ts +0 -38
- package/dist/lib/core/janitor.d.ts.map +0 -1
- package/dist/lib/core/janitor.js +0 -294
- package/dist/lib/core/janitor.js.map +0 -1
- package/dist/lib/core/prompt.d.ts.map +0 -1
- package/dist/lib/core/prompt.js.map +0 -1
- package/dist/lib/core/strategies/deduplication.d.ts +0 -7
- package/dist/lib/core/strategies/deduplication.d.ts.map +0 -1
- package/dist/lib/core/strategies/deduplication.js +0 -76
- package/dist/lib/core/strategies/deduplication.js.map +0 -1
- package/dist/lib/core/strategies/index.d.ts +0 -51
- package/dist/lib/core/strategies/index.d.ts.map +0 -1
- package/dist/lib/core/strategies/index.js +0 -48
- package/dist/lib/core/strategies/index.js.map +0 -1
- package/dist/lib/fetch-wrapper/formats/anthropic.d.ts +0 -8
- package/dist/lib/fetch-wrapper/formats/anthropic.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/formats/anthropic.js +0 -96
- package/dist/lib/fetch-wrapper/formats/anthropic.js.map +0 -1
- package/dist/lib/fetch-wrapper/formats/bedrock.d.ts +0 -8
- package/dist/lib/fetch-wrapper/formats/bedrock.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/formats/bedrock.js +0 -97
- package/dist/lib/fetch-wrapper/formats/bedrock.js.map +0 -1
- package/dist/lib/fetch-wrapper/formats/gemini.d.ts +0 -8
- package/dist/lib/fetch-wrapper/formats/gemini.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/formats/gemini.js +0 -134
- package/dist/lib/fetch-wrapper/formats/gemini.js.map +0 -1
- package/dist/lib/fetch-wrapper/formats/index.d.ts +0 -6
- package/dist/lib/fetch-wrapper/formats/index.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/formats/index.js +0 -6
- package/dist/lib/fetch-wrapper/formats/index.js.map +0 -1
- package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts +0 -3
- package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/formats/openai-chat.js +0 -100
- package/dist/lib/fetch-wrapper/formats/openai-chat.js.map +0 -1
- package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts +0 -3
- package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/formats/openai-responses.js +0 -63
- package/dist/lib/fetch-wrapper/formats/openai-responses.js.map +0 -1
- package/dist/lib/fetch-wrapper/gc-tracker.d.ts +0 -4
- package/dist/lib/fetch-wrapper/gc-tracker.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/gc-tracker.js +0 -61
- package/dist/lib/fetch-wrapper/gc-tracker.js.map +0 -1
- package/dist/lib/fetch-wrapper/handler.d.ts +0 -3
- package/dist/lib/fetch-wrapper/handler.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/handler.js +0 -118
- package/dist/lib/fetch-wrapper/handler.js.map +0 -1
- package/dist/lib/fetch-wrapper/index.d.ts +0 -18
- package/dist/lib/fetch-wrapper/index.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/index.js +0 -107
- package/dist/lib/fetch-wrapper/index.js.map +0 -1
- package/dist/lib/fetch-wrapper/prunable-list.d.ts +0 -8
- package/dist/lib/fetch-wrapper/prunable-list.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/prunable-list.js +0 -38
- package/dist/lib/fetch-wrapper/prunable-list.js.map +0 -1
- package/dist/lib/fetch-wrapper/tool-tracker.d.ts +0 -9
- package/dist/lib/fetch-wrapper/tool-tracker.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/tool-tracker.js +0 -12
- package/dist/lib/fetch-wrapper/tool-tracker.js.map +0 -1
- package/dist/lib/fetch-wrapper/types.d.ts +0 -62
- package/dist/lib/fetch-wrapper/types.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/types.js +0 -7
- package/dist/lib/fetch-wrapper/types.js.map +0 -1
- package/dist/lib/pruning-tool.d.ts +0 -20
- package/dist/lib/pruning-tool.d.ts.map +0 -1
- package/dist/lib/pruning-tool.js +0 -160
- package/dist/lib/pruning-tool.js.map +0 -1
- package/dist/lib/state/id-mapping.d.ts +0 -25
- package/dist/lib/state/id-mapping.d.ts.map +0 -1
- package/dist/lib/state/id-mapping.js +0 -51
- package/dist/lib/state/id-mapping.js.map +0 -1
- package/dist/lib/tokenizer.d.ts +0 -3
- package/dist/lib/tokenizer.d.ts.map +0 -1
- package/dist/lib/tokenizer.js +0 -16
- package/dist/lib/tokenizer.js.map +0 -1
- package/dist/lib/version-checker.d.ts +0 -9
- package/dist/lib/version-checker.d.ts.map +0 -1
- package/dist/lib/version-checker.js +0 -77
- package/dist/lib/version-checker.js.map +0 -1
package/dist/lib/hooks.js
CHANGED
|
@@ -1,139 +1,40 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { syncToolCache } from "./state/tool-cache";
|
|
2
|
+
import { deduplicate } from "./strategies";
|
|
3
|
+
import { prune, insertPruneToolContext } from "./messages";
|
|
4
|
+
import { checkSession } from "./state";
|
|
5
|
+
import { runOnIdle } from "./strategies/on-idle";
|
|
6
|
+
export function createChatMessageTransformHandler(client, state, logger, config) {
|
|
7
|
+
return async (input, output) => {
|
|
8
|
+
await checkSession(client, state, logger, output.messages);
|
|
9
|
+
if (state.isSubAgent) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
syncToolCache(state, config, logger, output.messages);
|
|
13
|
+
deduplicate(state, logger, config, output.messages);
|
|
14
|
+
prune(state, logger, config, output.messages);
|
|
15
|
+
insertPruneToolContext(state, config, logger, output.messages);
|
|
16
|
+
};
|
|
15
17
|
}
|
|
16
|
-
export function createEventHandler(client,
|
|
18
|
+
export function createEventHandler(client, config, state, logger, workingDirectory) {
|
|
17
19
|
return async ({ event }) => {
|
|
20
|
+
if (state.sessionId === null || state.isSubAgent) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
18
23
|
if (event.type === "session.status" && event.properties.status.type === "idle") {
|
|
19
|
-
if (
|
|
24
|
+
if (!config.strategies.onIdle.enabled) {
|
|
20
25
|
return;
|
|
21
|
-
|
|
26
|
+
}
|
|
27
|
+
if (state.lastToolPrune) {
|
|
28
|
+
logger.info("Skipping OnIdle pruning - last tool was prune");
|
|
22
29
|
return;
|
|
23
|
-
if (toolTracker?.skipNextIdle) {
|
|
24
|
-
toolTracker.skipNextIdle = false;
|
|
25
|
-
if (toolStrategiesCoveredByIdle(config.strategies.onIdle, config.strategies.onTool)) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
30
|
}
|
|
29
31
|
try {
|
|
30
|
-
|
|
31
|
-
if (result && result.prunedCount > 0 && toolTracker && config.nudge_freq > 0) {
|
|
32
|
-
if (toolStrategiesCoveredByIdle(config.strategies.onIdle, config.strategies.onTool)) {
|
|
33
|
-
resetToolTrackerCount(toolTracker);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
32
|
+
await runOnIdle(client, state, logger, config, workingDirectory);
|
|
36
33
|
}
|
|
37
34
|
catch (err) {
|
|
38
|
-
logger.error("
|
|
35
|
+
logger.error("OnIdle pruning failed", { error: err.message });
|
|
39
36
|
}
|
|
40
37
|
}
|
|
41
38
|
};
|
|
42
39
|
}
|
|
43
|
-
/**
|
|
44
|
-
* Creates the chat.params hook for model caching and Google tool call mapping.
|
|
45
|
-
*/
|
|
46
|
-
export function createChatParamsHandler(client, state, logger, toolTracker) {
|
|
47
|
-
return async (input, _output) => {
|
|
48
|
-
const sessionId = input.sessionID;
|
|
49
|
-
let providerID = input.provider?.info?.id || input.provider?.id;
|
|
50
|
-
const modelID = input.model?.id;
|
|
51
|
-
if (!providerID && input.message?.model?.providerID) {
|
|
52
|
-
providerID = input.message.model.providerID;
|
|
53
|
-
}
|
|
54
|
-
if (state.lastSeenSessionId && state.lastSeenSessionId !== sessionId) {
|
|
55
|
-
logger.info("chat.params", "Session changed, resetting state", {
|
|
56
|
-
from: state.lastSeenSessionId,
|
|
57
|
-
to: sessionId
|
|
58
|
-
});
|
|
59
|
-
clearAllMappings();
|
|
60
|
-
state.toolParameters.clear();
|
|
61
|
-
if (toolTracker) {
|
|
62
|
-
clearToolTracker(toolTracker);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
state.lastSeenSessionId = sessionId;
|
|
66
|
-
if (!state.checkedSessions.has(sessionId)) {
|
|
67
|
-
state.checkedSessions.add(sessionId);
|
|
68
|
-
const isSubagent = await isSubagentSession(client, sessionId);
|
|
69
|
-
if (isSubagent) {
|
|
70
|
-
state.subagentSessions.add(sessionId);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
// Cache model info for the session (used by janitor for model selection)
|
|
74
|
-
if (providerID && modelID) {
|
|
75
|
-
state.model.set(sessionId, {
|
|
76
|
-
providerID: providerID,
|
|
77
|
-
modelID: modelID
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
// Build position-based mapping for Gemini (which loses tool call IDs in native format)
|
|
81
|
-
if (providerID === 'google' || providerID === 'google-vertex') {
|
|
82
|
-
try {
|
|
83
|
-
const messagesResponse = await client.session.messages({
|
|
84
|
-
path: { id: sessionId },
|
|
85
|
-
query: { limit: 500 }
|
|
86
|
-
});
|
|
87
|
-
const messages = messagesResponse.data || messagesResponse;
|
|
88
|
-
if (Array.isArray(messages)) {
|
|
89
|
-
const toolCallsByName = new Map();
|
|
90
|
-
for (const msg of messages) {
|
|
91
|
-
if (msg.parts) {
|
|
92
|
-
for (const part of msg.parts) {
|
|
93
|
-
if (part.type === 'tool' && part.callID && part.tool) {
|
|
94
|
-
const toolName = part.tool.toLowerCase();
|
|
95
|
-
const callId = part.callID.toLowerCase();
|
|
96
|
-
if (!toolCallsByName.has(toolName)) {
|
|
97
|
-
toolCallsByName.set(toolName, []);
|
|
98
|
-
}
|
|
99
|
-
toolCallsByName.get(toolName).push(callId);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
const positionMapping = new Map();
|
|
105
|
-
for (const [toolName, callIds] of toolCallsByName) {
|
|
106
|
-
callIds.forEach((callId, index) => {
|
|
107
|
-
positionMapping.set(`${toolName}:${index}`, callId);
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
state.googleToolCallMapping.set(sessionId, positionMapping);
|
|
111
|
-
logger.info("chat.params", "Built Google tool call mapping", {
|
|
112
|
-
sessionId: sessionId.substring(0, 8),
|
|
113
|
-
toolCount: positionMapping.size,
|
|
114
|
-
toolParamsCount: state.toolParameters.size
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
logger.error("chat.params", "Failed to build Google tool call mapping", {
|
|
120
|
-
error: error.message
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Finds the current agent from messages by scanning backward for user messages.
|
|
128
|
-
*/
|
|
129
|
-
export function findCurrentAgent(messages) {
|
|
130
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
131
|
-
const msg = messages[i];
|
|
132
|
-
const info = msg.info;
|
|
133
|
-
if (info?.role === 'user') {
|
|
134
|
-
return info.agent || 'build';
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return undefined;
|
|
138
|
-
}
|
|
139
40
|
//# sourceMappingURL=hooks.js.map
|
package/dist/lib/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../lib/hooks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../lib/hooks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAGhD,MAAM,UAAU,iCAAiC,CAC7C,MAAW,EACX,KAAmB,EACnB,MAAc,EACd,MAAoB;IAEpB,OAAO,KAAK,EACR,KAAS,EACT,MAAiC,EACnC,EAAE;QACA,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;QAE1D,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,OAAM;QACV,CAAC;QAED,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEtD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;QAEnD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;QAE7C,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IAClE,CAAC,CAAA;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,MAAW,EACX,MAAoB,EACpB,KAAmB,EACnB,MAAc,EACd,gBAAyB;IAEzB,OAAO,KAAK,EACR,EAAE,KAAK,EAAkB,EAC3B,EAAE;QACA,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAC/C,OAAM;QACV,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7E,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,OAAM;YACV,CAAC;YACD,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAA;gBAC5D,OAAM;YACV,CAAC;YAED,IAAI,CAAC;gBACD,MAAM,SAAS,CACX,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,EACN,gBAAgB,CACnB,CAAA;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;YACjE,CAAC;QACL,CAAC;IACL,CAAC,CAAA;AACL,CAAC"}
|
package/dist/lib/logger.d.ts
CHANGED
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
export declare class Logger {
|
|
2
2
|
private logDir;
|
|
3
3
|
enabled: boolean;
|
|
4
|
-
private fileCounter;
|
|
5
4
|
constructor(enabled: boolean);
|
|
6
5
|
private ensureLogDir;
|
|
7
6
|
private formatData;
|
|
7
|
+
private getCallerFile;
|
|
8
8
|
private write;
|
|
9
|
-
info(
|
|
10
|
-
debug(
|
|
11
|
-
warn(
|
|
12
|
-
error(
|
|
13
|
-
private parseJanitorPrompt;
|
|
14
|
-
private escapeNewlinesInJson;
|
|
15
|
-
private extractReasoningBlocks;
|
|
16
|
-
saveWrappedContext(sessionID: string, messages: any[], metadata: any, sessionMessages?: any[]): Promise<void>;
|
|
9
|
+
info(message: string, data?: any): Promise<void>;
|
|
10
|
+
debug(message: string, data?: any): Promise<void>;
|
|
11
|
+
warn(message: string, data?: any): Promise<void>;
|
|
12
|
+
error(message: string, data?: any): Promise<void>;
|
|
17
13
|
}
|
|
18
14
|
//# sourceMappingURL=logger.d.ts.map
|
package/dist/lib/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../lib/logger.ts"],"names":[],"mappings":"AAKA,qBAAa,MAAM;IACf,OAAO,CAAC,MAAM,CAAQ;IACf,OAAO,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../lib/logger.ts"],"names":[],"mappings":"AAKA,qBAAa,MAAM;IACf,OAAO,CAAC,MAAM,CAAQ;IACf,OAAO,EAAE,OAAO,CAAA;gBAEX,OAAO,EAAE,OAAO;YAMd,YAAY;IAM1B,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,aAAa;YAuBP,KAAK;IAsBnB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAKhC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAKjC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAKhC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;CAIpC"}
|
package/dist/lib/logger.js
CHANGED
|
@@ -5,7 +5,6 @@ import { homedir } from "os";
|
|
|
5
5
|
export class Logger {
|
|
6
6
|
logDir;
|
|
7
7
|
enabled;
|
|
8
|
-
fileCounter = 0;
|
|
9
8
|
constructor(enabled) {
|
|
10
9
|
this.enabled = enabled;
|
|
11
10
|
const opencodeConfigDir = join(homedir(), ".config", "opencode");
|
|
@@ -41,6 +40,28 @@ export class Logger {
|
|
|
41
40
|
}
|
|
42
41
|
return parts.join(" ");
|
|
43
42
|
}
|
|
43
|
+
getCallerFile(skipFrames = 3) {
|
|
44
|
+
const originalPrepareStackTrace = Error.prepareStackTrace;
|
|
45
|
+
try {
|
|
46
|
+
const err = new Error();
|
|
47
|
+
Error.prepareStackTrace = (_, stack) => stack;
|
|
48
|
+
const stack = err.stack;
|
|
49
|
+
Error.prepareStackTrace = originalPrepareStackTrace;
|
|
50
|
+
// Skip specified number of frames to get to actual caller
|
|
51
|
+
for (let i = skipFrames; i < stack.length; i++) {
|
|
52
|
+
const filename = stack[i]?.getFileName();
|
|
53
|
+
if (filename && !filename.includes('/logger.')) {
|
|
54
|
+
// Extract just the filename without path and extension
|
|
55
|
+
const match = filename.match(/([^/\\]+)\.[tj]s$/);
|
|
56
|
+
return match ? match[1] : filename;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return 'unknown';
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return 'unknown';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
44
65
|
async write(level, component, message, data) {
|
|
45
66
|
if (!this.enabled)
|
|
46
67
|
return;
|
|
@@ -59,172 +80,21 @@ export class Logger {
|
|
|
59
80
|
catch (error) {
|
|
60
81
|
}
|
|
61
82
|
}
|
|
62
|
-
info(
|
|
83
|
+
info(message, data) {
|
|
84
|
+
const component = this.getCallerFile(2);
|
|
63
85
|
return this.write("INFO", component, message, data);
|
|
64
86
|
}
|
|
65
|
-
debug(
|
|
87
|
+
debug(message, data) {
|
|
88
|
+
const component = this.getCallerFile(2);
|
|
66
89
|
return this.write("DEBUG", component, message, data);
|
|
67
90
|
}
|
|
68
|
-
warn(
|
|
91
|
+
warn(message, data) {
|
|
92
|
+
const component = this.getCallerFile(2);
|
|
69
93
|
return this.write("WARN", component, message, data);
|
|
70
94
|
}
|
|
71
|
-
error(
|
|
95
|
+
error(message, data) {
|
|
96
|
+
const component = this.getCallerFile(2);
|
|
72
97
|
return this.write("ERROR", component, message, data);
|
|
73
98
|
}
|
|
74
|
-
parseJanitorPrompt(prompt) {
|
|
75
|
-
try {
|
|
76
|
-
const idsMatch = prompt.match(/Available tool call IDs for analysis:\s*([^\n]+)/);
|
|
77
|
-
const availableToolCallIds = idsMatch
|
|
78
|
-
? idsMatch[1].split(',').map(id => id.trim())
|
|
79
|
-
: [];
|
|
80
|
-
const historyMatch = prompt.match(/Session history[^\n]*:\s*\n([\s\S]*?)\n\nYou MUST respond/);
|
|
81
|
-
let sessionHistory = [];
|
|
82
|
-
if (historyMatch) {
|
|
83
|
-
const historyText = historyMatch[1];
|
|
84
|
-
const fixedJson = this.escapeNewlinesInJson(historyText);
|
|
85
|
-
sessionHistory = JSON.parse(fixedJson);
|
|
86
|
-
}
|
|
87
|
-
const instructionsMatch = prompt.match(/([\s\S]*?)\n\nIMPORTANT: Available tool call IDs/);
|
|
88
|
-
const instructions = instructionsMatch
|
|
89
|
-
? instructionsMatch[1].trim()
|
|
90
|
-
: '';
|
|
91
|
-
const schemaMatch = prompt.match(/matching this exact schema:\s*\n(\{[\s\S]*?\})\s*$/);
|
|
92
|
-
const responseSchema = schemaMatch
|
|
93
|
-
? schemaMatch[1]
|
|
94
|
-
: null;
|
|
95
|
-
return {
|
|
96
|
-
instructions,
|
|
97
|
-
availableToolCallIds,
|
|
98
|
-
sessionHistory,
|
|
99
|
-
responseSchema
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
catch (error) {
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
escapeNewlinesInJson(jsonText) {
|
|
107
|
-
let result = '';
|
|
108
|
-
let inString = false;
|
|
109
|
-
for (let i = 0; i < jsonText.length; i++) {
|
|
110
|
-
const char = jsonText[i];
|
|
111
|
-
const prevChar = i > 0 ? jsonText[i - 1] : '';
|
|
112
|
-
if (char === '"' && prevChar !== '\\') {
|
|
113
|
-
inString = !inString;
|
|
114
|
-
result += char;
|
|
115
|
-
}
|
|
116
|
-
else if (char === '\n' && inString) {
|
|
117
|
-
result += '\\n';
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
result += char;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return result;
|
|
124
|
-
}
|
|
125
|
-
extractReasoningBlocks(sessionMessages) {
|
|
126
|
-
const reasoningBlocks = [];
|
|
127
|
-
for (const msg of sessionMessages) {
|
|
128
|
-
if (!msg.parts)
|
|
129
|
-
continue;
|
|
130
|
-
for (const part of msg.parts) {
|
|
131
|
-
if (part.type === "reasoning") {
|
|
132
|
-
// Calculate encrypted content size for different providers
|
|
133
|
-
let encryptedContentLength = 0;
|
|
134
|
-
if (part.metadata?.openai?.reasoningEncryptedContent) {
|
|
135
|
-
encryptedContentLength = part.metadata.openai.reasoningEncryptedContent.length;
|
|
136
|
-
}
|
|
137
|
-
else if (part.metadata?.anthropic?.signature) {
|
|
138
|
-
encryptedContentLength = part.metadata.anthropic.signature.length;
|
|
139
|
-
}
|
|
140
|
-
else if (part.metadata?.google?.thoughtSignature) {
|
|
141
|
-
encryptedContentLength = part.metadata.google.thoughtSignature.length;
|
|
142
|
-
}
|
|
143
|
-
reasoningBlocks.push({
|
|
144
|
-
messageId: msg.id,
|
|
145
|
-
messageRole: msg.role,
|
|
146
|
-
text: part.text,
|
|
147
|
-
textLength: part.text?.length || 0,
|
|
148
|
-
encryptedContentLength,
|
|
149
|
-
time: part.time,
|
|
150
|
-
hasMetadata: !!part.metadata,
|
|
151
|
-
metadataKeys: part.metadata ? Object.keys(part.metadata) : []
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
return reasoningBlocks;
|
|
157
|
-
}
|
|
158
|
-
async saveWrappedContext(sessionID, messages, metadata, sessionMessages) {
|
|
159
|
-
if (!this.enabled)
|
|
160
|
-
return;
|
|
161
|
-
try {
|
|
162
|
-
await this.ensureLogDir();
|
|
163
|
-
const aiContextDir = join(this.logDir, "ai-context");
|
|
164
|
-
if (!existsSync(aiContextDir)) {
|
|
165
|
-
await mkdir(aiContextDir, { recursive: true });
|
|
166
|
-
}
|
|
167
|
-
const timestamp = new Date().toISOString().replace(/:/g, '-').replace(/\./g, '-');
|
|
168
|
-
const counter = (this.fileCounter++).toString().padStart(3, '0');
|
|
169
|
-
const filename = `${timestamp}_${counter}_${sessionID.substring(0, 15)}.json`;
|
|
170
|
-
const filepath = join(aiContextDir, filename);
|
|
171
|
-
const isJanitorShadow = sessionID === "janitor-shadow" &&
|
|
172
|
-
messages.length === 1 &&
|
|
173
|
-
messages[0]?.role === 'user' &&
|
|
174
|
-
typeof messages[0]?.content === 'string';
|
|
175
|
-
let content;
|
|
176
|
-
if (isJanitorShadow) {
|
|
177
|
-
const parsed = this.parseJanitorPrompt(messages[0].content);
|
|
178
|
-
if (parsed) {
|
|
179
|
-
content = {
|
|
180
|
-
timestamp: new Date().toISOString(),
|
|
181
|
-
sessionID,
|
|
182
|
-
metadata,
|
|
183
|
-
janitorAnalysis: {
|
|
184
|
-
instructions: parsed.instructions,
|
|
185
|
-
availableToolCallIds: parsed.availableToolCallIds,
|
|
186
|
-
protectedTools: ["task", "todowrite", "todoread"],
|
|
187
|
-
sessionHistory: parsed.sessionHistory,
|
|
188
|
-
responseSchema: parsed.responseSchema
|
|
189
|
-
},
|
|
190
|
-
rawPrompt: messages[0].content
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
content = {
|
|
195
|
-
timestamp: new Date().toISOString(),
|
|
196
|
-
sessionID,
|
|
197
|
-
metadata,
|
|
198
|
-
messages,
|
|
199
|
-
note: "Failed to parse janitor prompt structure"
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
204
|
-
// Extract reasoning blocks from session messages if available
|
|
205
|
-
const reasoningBlocks = sessionMessages
|
|
206
|
-
? this.extractReasoningBlocks(sessionMessages)
|
|
207
|
-
: [];
|
|
208
|
-
content = {
|
|
209
|
-
timestamp: new Date().toISOString(),
|
|
210
|
-
sessionID,
|
|
211
|
-
metadata,
|
|
212
|
-
messages,
|
|
213
|
-
...(reasoningBlocks.length > 0 && {
|
|
214
|
-
reasoning: {
|
|
215
|
-
count: reasoningBlocks.length,
|
|
216
|
-
totalTextCharacters: reasoningBlocks.reduce((sum, b) => sum + b.textLength, 0),
|
|
217
|
-
totalEncryptedCharacters: reasoningBlocks.reduce((sum, b) => sum + b.encryptedContentLength, 0),
|
|
218
|
-
blocks: reasoningBlocks
|
|
219
|
-
}
|
|
220
|
-
})
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
const jsonString = JSON.stringify(content, null, 2);
|
|
224
|
-
await writeFile(filepath, jsonString);
|
|
225
|
-
}
|
|
226
|
-
catch (error) {
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
99
|
}
|
|
230
100
|
//# sourceMappingURL=logger.js.map
|
package/dist/lib/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../lib/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAE5B,MAAM,OAAO,MAAM;IACP,MAAM,CAAQ;IACf,OAAO,CAAS;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../lib/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/messages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/messages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SessionState, WithParts } from "../state";
|
|
2
|
+
import type { Logger } from "../logger";
|
|
3
|
+
import type { PluginConfig } from "../config";
|
|
4
|
+
export declare const insertPruneToolContext: (state: SessionState, config: PluginConfig, logger: Logger, messages: WithParts[]) => void;
|
|
5
|
+
export declare const prune: (state: SessionState, logger: Logger, config: PluginConfig, messages: WithParts[]) => void;
|
|
6
|
+
//# sourceMappingURL=prune.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../../lib/messages/prune.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAoC7C,eAAO,MAAM,sBAAsB,GAC/B,OAAO,YAAY,EACnB,QAAQ,YAAY,EACpB,QAAQ,MAAM,EACd,UAAU,SAAS,EAAE,KACtB,IA0CF,CAAA;AAED,eAAO,MAAM,KAAK,GACd,OAAO,YAAY,EACnB,QAAQ,MAAM,EACd,QAAQ,YAAY,EACpB,UAAU,SAAS,EAAE,KACtB,IAEF,CAAA"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { getLastUserMessage, extractParameterKey, buildToolIdList } from "./utils";
|
|
2
|
+
import { loadPrompt } from "../prompt";
|
|
3
|
+
const PRUNED_TOOL_OUTPUT_REPLACEMENT = '[Output removed to save context - information superseded or no longer needed]';
|
|
4
|
+
const NUDGE_STRING = loadPrompt("nudge");
|
|
5
|
+
const buildPrunableToolsList = (state, config, logger, messages) => {
|
|
6
|
+
const lines = [];
|
|
7
|
+
const toolIdList = buildToolIdList(messages);
|
|
8
|
+
state.toolParameters.forEach((toolParameterEntry, toolCallId) => {
|
|
9
|
+
if (state.prune.toolIds.includes(toolCallId)) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (config.strategies.pruneTool.protectedTools.includes(toolParameterEntry.tool)) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (toolParameterEntry.compacted) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const numericId = toolIdList.indexOf(toolCallId);
|
|
19
|
+
const paramKey = extractParameterKey(toolParameterEntry.tool, toolParameterEntry.parameters);
|
|
20
|
+
const description = paramKey ? `${toolParameterEntry.tool}, ${paramKey}` : toolParameterEntry.tool;
|
|
21
|
+
lines.push(`${numericId}: ${description}`);
|
|
22
|
+
logger.debug(`Prunable tool found - ID: ${numericId}, Tool: ${toolParameterEntry.tool}, Call ID: ${toolCallId}`);
|
|
23
|
+
});
|
|
24
|
+
return `<prunable-tools>\nThe following tools have been invoked and are available for pruning. This list does not mandate immediate action. Consider your current goals and the resources you need before discarding valuable tool outputs. Keep the context free of noise.\n${lines.join('\n')}\n</prunable-tools>`;
|
|
25
|
+
};
|
|
26
|
+
export const insertPruneToolContext = (state, config, logger, messages) => {
|
|
27
|
+
if (!config.strategies.pruneTool.enabled) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const lastUserMessage = getLastUserMessage(messages);
|
|
31
|
+
if (!lastUserMessage || lastUserMessage.info.role !== 'user') {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const prunableToolsList = buildPrunableToolsList(state, config, logger, messages);
|
|
35
|
+
let nudgeString = "";
|
|
36
|
+
if (state.nudgeCounter >= config.strategies.pruneTool.nudge.frequency) {
|
|
37
|
+
logger.info("Inserting prune nudge message");
|
|
38
|
+
nudgeString = "\n" + NUDGE_STRING;
|
|
39
|
+
}
|
|
40
|
+
const userMessage = {
|
|
41
|
+
info: {
|
|
42
|
+
id: "msg_01234567890123456789012345",
|
|
43
|
+
sessionID: lastUserMessage.info.sessionID,
|
|
44
|
+
role: "user",
|
|
45
|
+
time: { created: Date.now() },
|
|
46
|
+
agent: lastUserMessage.info.agent || "build",
|
|
47
|
+
model: {
|
|
48
|
+
providerID: lastUserMessage.info.model.providerID,
|
|
49
|
+
modelID: lastUserMessage.info.model.modelID
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
parts: [
|
|
53
|
+
{
|
|
54
|
+
id: "prt_01234567890123456789012345",
|
|
55
|
+
sessionID: lastUserMessage.info.sessionID,
|
|
56
|
+
messageID: "msg_01234567890123456789012345",
|
|
57
|
+
type: "text",
|
|
58
|
+
text: prunableToolsList + nudgeString,
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
};
|
|
62
|
+
messages.push(userMessage);
|
|
63
|
+
};
|
|
64
|
+
export const prune = (state, logger, config, messages) => {
|
|
65
|
+
pruneToolOutputs(state, logger, messages);
|
|
66
|
+
};
|
|
67
|
+
const pruneToolOutputs = (state, logger, messages) => {
|
|
68
|
+
for (const msg of messages) {
|
|
69
|
+
for (const part of msg.parts) {
|
|
70
|
+
if (part.type !== 'tool') {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (!state.prune.toolIds.includes(part.callID)) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (part.state.status === 'completed') {
|
|
77
|
+
part.state.output = PRUNED_TOOL_OUTPUT_REPLACEMENT;
|
|
78
|
+
}
|
|
79
|
+
// if (part.state.status === 'error') {
|
|
80
|
+
// part.state.error = PRUNED_TOOL_OUTPUT_REPLACEMENT
|
|
81
|
+
// }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=prune.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../lib/messages/prune.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { WithParts } from "../state";
|
|
2
|
+
/**
|
|
3
|
+
* Extracts a human-readable key from tool metadata for display purposes.
|
|
4
|
+
*/
|
|
5
|
+
export declare const extractParameterKey: (tool: string, parameters: any) => string;
|
|
6
|
+
export declare const getLastUserMessage: (messages: WithParts[]) => WithParts | null;
|
|
7
|
+
export declare function findCurrentAgent(messages: WithParts[]): string | undefined;
|
|
8
|
+
export declare function buildToolIdList(messages: WithParts[]): string[];
|
|
9
|
+
export declare function getPruneToolIds(numericToolIds: number[], toolIdList: string[]): string[];
|
|
10
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/messages/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,EAAE,YAAY,GAAG,KAAG,MAkEnE,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC3B,UAAU,SAAS,EAAE,KACtB,SAAS,GAAG,IAQd,CAAA;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,GAAG,SAAS,CAI1E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAY/D;AAED,wBAAgB,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQxF"}
|