@tyvm/knowhow 0.0.137 → 0.0.140
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/autodoc/chat-guide.md +1 -0
- package/package.json +5 -2
- package/scripts/build-for-node.sh +4 -4
- package/src/agents/base/base.ts +254 -29
- package/src/agents/patcher/patcher.ts +1 -1
- package/src/agents/researcher/researcher.ts +2 -2
- package/src/agents/tools/agentCall.ts +6 -0
- package/src/agents/tools/connectAgent.ts +353 -0
- package/src/agents/tools/index.ts +6 -0
- package/src/agents/tools/list.ts +48 -0
- package/src/agents/tools/observe.ts +245 -0
- package/src/agents/tools/replyToParent.ts +122 -0
- package/src/agents/tools/runGenerate.ts +209 -0
- package/src/agents/tools/sendAgentMessage.ts +138 -0
- package/src/agents/tools/startAgentTask.ts +92 -5
- package/src/agents/tools/waitForAgentCompleted.ts +269 -0
- package/src/ai.ts +1 -0
- package/src/chat/modules/AgentModule.ts +89 -27
- package/src/chat/modules/SessionsModule.ts +6 -10
- package/src/clients/contextLimits.ts +26 -0
- package/src/clients/pricing/anthropic.ts +12 -0
- package/src/commands/agent.ts +22 -0
- package/src/commands/agents.ts +83 -0
- package/src/commands/hash.ts +3 -2
- package/src/commands/misc.ts +6 -0
- package/src/commands/services.ts +14 -0
- package/src/generate.ts +25 -3
- package/src/services/AgentService.ts +21 -3
- package/src/services/AgentSyncFs.ts +56 -0
- package/src/services/AgentSyncKnowhowWeb.ts +1 -1
- package/src/services/EventService.ts +4 -1
- package/src/services/KnowhowClient.ts +7 -0
- package/src/services/LazyToolsService.ts +7 -3
- package/src/services/MinimalToolsService.ts +15 -7
- package/src/services/SyncedAgentWatcher.ts +2 -0
- package/src/services/SyncerService.ts +35 -6
- package/src/services/Tools.ts +43 -3
- package/src/services/modules/index.ts +127 -46
- package/src/types.ts +5 -0
- package/tests/agents/interrupt.test.ts +11 -18
- package/tests/agents/observe-base.test.ts +183 -0
- package/tests/agents/tools/connectAgent.test.ts +138 -0
- package/tests/agents/tools/observe.test.ts +179 -0
- package/tests/agents/tools/replyToParent.test.ts +125 -0
- package/tests/agents/tools/sendAgentMessage.test.ts +99 -0
- package/tests/agents/tools/waitForAgentCompleted.test.ts +147 -0
- package/tests/chat/detach-attach-rendering.test.ts +315 -0
- package/tests/clients/contextLimits.test.ts +23 -1
- package/tests/clients/pricing.test.ts +20 -1
- package/tests/services/Tools.test.ts +172 -9
- package/tests/unit/modules/moduleLoading.test.ts +69 -0
- package/ts_build/package.json +5 -2
- package/ts_build/src/agents/base/base.d.ts +24 -1
- package/ts_build/src/agents/base/base.js +111 -16
- package/ts_build/src/agents/base/base.js.map +1 -1
- package/ts_build/src/agents/patcher/patcher.js +1 -1
- package/ts_build/src/agents/patcher/patcher.js.map +1 -1
- package/ts_build/src/agents/researcher/researcher.js +2 -2
- package/ts_build/src/agents/researcher/researcher.js.map +1 -1
- package/ts_build/src/agents/tools/agentCall.js.map +1 -1
- package/ts_build/src/agents/tools/connectAgent.d.ts +21 -0
- package/ts_build/src/agents/tools/connectAgent.js +284 -0
- package/ts_build/src/agents/tools/connectAgent.js.map +1 -0
- package/ts_build/src/agents/tools/index.d.ts +6 -0
- package/ts_build/src/agents/tools/index.js +6 -0
- package/ts_build/src/agents/tools/index.js.map +1 -1
- package/ts_build/src/agents/tools/list.js +40 -0
- package/ts_build/src/agents/tools/list.js.map +1 -1
- package/ts_build/src/agents/tools/observe.d.ts +20 -0
- package/ts_build/src/agents/tools/observe.js +144 -0
- package/ts_build/src/agents/tools/observe.js.map +1 -0
- package/ts_build/src/agents/tools/replyToParent.d.ts +4 -0
- package/ts_build/src/agents/tools/replyToParent.js +118 -0
- package/ts_build/src/agents/tools/replyToParent.js.map +1 -0
- package/ts_build/src/agents/tools/runGenerate.d.ts +19 -0
- package/ts_build/src/agents/tools/runGenerate.js +138 -0
- package/ts_build/src/agents/tools/runGenerate.js.map +1 -0
- package/ts_build/src/agents/tools/sendAgentMessage.d.ts +11 -0
- package/ts_build/src/agents/tools/sendAgentMessage.js +118 -0
- package/ts_build/src/agents/tools/sendAgentMessage.js.map +1 -0
- package/ts_build/src/agents/tools/startAgentTask.d.ts +7 -0
- package/ts_build/src/agents/tools/startAgentTask.js +53 -6
- package/ts_build/src/agents/tools/startAgentTask.js.map +1 -1
- package/ts_build/src/agents/tools/waitForAgentCompleted.d.ts +10 -0
- package/ts_build/src/agents/tools/waitForAgentCompleted.js +229 -0
- package/ts_build/src/agents/tools/waitForAgentCompleted.js.map +1 -0
- package/ts_build/src/ai.d.ts +1 -0
- package/ts_build/src/ai.js.map +1 -1
- package/ts_build/src/chat/modules/AgentModule.d.ts +3 -1
- package/ts_build/src/chat/modules/AgentModule.js +46 -21
- package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
- package/ts_build/src/chat/modules/SessionsModule.js +1 -6
- package/ts_build/src/chat/modules/SessionsModule.js.map +1 -1
- package/ts_build/src/clients/contextLimits.js +21 -0
- package/ts_build/src/clients/contextLimits.js.map +1 -1
- package/ts_build/src/clients/pricing/anthropic.d.ts +2 -0
- package/ts_build/src/clients/pricing/anthropic.js +9 -0
- package/ts_build/src/clients/pricing/anthropic.js.map +1 -1
- package/ts_build/src/commands/agent.js +11 -0
- package/ts_build/src/commands/agent.js.map +1 -1
- package/ts_build/src/commands/agents.js +61 -0
- package/ts_build/src/commands/agents.js.map +1 -1
- package/ts_build/src/commands/hash.js +1 -1
- package/ts_build/src/commands/hash.js.map +1 -1
- package/ts_build/src/commands/misc.js +2 -0
- package/ts_build/src/commands/misc.js.map +1 -1
- package/ts_build/src/commands/services.js +10 -0
- package/ts_build/src/commands/services.js.map +1 -1
- package/ts_build/src/generate.d.ts +2 -0
- package/ts_build/src/generate.js +11 -3
- package/ts_build/src/generate.js.map +1 -1
- package/ts_build/src/services/AgentService.d.ts +4 -1
- package/ts_build/src/services/AgentService.js +9 -2
- package/ts_build/src/services/AgentService.js.map +1 -1
- package/ts_build/src/services/AgentSyncFs.d.ts +2 -0
- package/ts_build/src/services/AgentSyncFs.js +35 -0
- package/ts_build/src/services/AgentSyncFs.js.map +1 -1
- package/ts_build/src/services/AgentSyncKnowhowWeb.d.ts +1 -1
- package/ts_build/src/services/EventService.d.ts +4 -1
- package/ts_build/src/services/EventService.js.map +1 -1
- package/ts_build/src/services/KnowhowClient.js +3 -0
- package/ts_build/src/services/KnowhowClient.js.map +1 -1
- package/ts_build/src/services/LazyToolsService.d.ts +2 -2
- package/ts_build/src/services/LazyToolsService.js +2 -2
- package/ts_build/src/services/LazyToolsService.js.map +1 -1
- package/ts_build/src/services/MinimalToolsService.d.ts +2 -2
- package/ts_build/src/services/MinimalToolsService.js +6 -6
- package/ts_build/src/services/MinimalToolsService.js.map +1 -1
- package/ts_build/src/services/SyncedAgentWatcher.d.ts +1 -0
- package/ts_build/src/services/SyncedAgentWatcher.js.map +1 -1
- package/ts_build/src/services/SyncerService.d.ts +2 -1
- package/ts_build/src/services/SyncerService.js +8 -2
- package/ts_build/src/services/SyncerService.js.map +1 -1
- package/ts_build/src/services/Tools.d.ts +6 -1
- package/ts_build/src/services/Tools.js +9 -3
- package/ts_build/src/services/Tools.js.map +1 -1
- package/ts_build/src/services/modules/index.d.ts +1 -1
- package/ts_build/src/services/modules/index.js +67 -27
- package/ts_build/src/services/modules/index.js.map +1 -1
- package/ts_build/src/types.d.ts +3 -0
- package/ts_build/src/types.js.map +1 -1
- package/ts_build/tests/agents/interrupt.test.d.ts +0 -1
- package/ts_build/tests/agents/interrupt.test.js +3 -13
- package/ts_build/tests/agents/interrupt.test.js.map +1 -1
- package/ts_build/tests/agents/observe-base.test.d.ts +1 -0
- package/ts_build/tests/agents/observe-base.test.js +149 -0
- package/ts_build/tests/agents/observe-base.test.js.map +1 -0
- package/ts_build/tests/agents/tools/connectAgent.test.d.ts +1 -0
- package/ts_build/tests/agents/tools/connectAgent.test.js +142 -0
- package/ts_build/tests/agents/tools/connectAgent.test.js.map +1 -0
- package/ts_build/tests/agents/tools/observe.test.d.ts +1 -0
- package/ts_build/tests/agents/tools/observe.test.js +148 -0
- package/ts_build/tests/agents/tools/observe.test.js.map +1 -0
- package/ts_build/tests/agents/tools/replyToParent.test.d.ts +1 -0
- package/ts_build/tests/agents/tools/replyToParent.test.js +116 -0
- package/ts_build/tests/agents/tools/replyToParent.test.js.map +1 -0
- package/ts_build/tests/agents/tools/sendAgentMessage.test.d.ts +1 -0
- package/ts_build/tests/agents/tools/sendAgentMessage.test.js +112 -0
- package/ts_build/tests/agents/tools/sendAgentMessage.test.js.map +1 -0
- package/ts_build/tests/agents/tools/waitForAgentCompleted.test.d.ts +1 -0
- package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js +147 -0
- package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js.map +1 -0
- package/ts_build/tests/chat/detach-attach-rendering.test.d.ts +1 -0
- package/ts_build/tests/chat/detach-attach-rendering.test.js +168 -0
- package/ts_build/tests/chat/detach-attach-rendering.test.js.map +1 -0
- package/ts_build/tests/clients/contextLimits.test.js +11 -1
- package/ts_build/tests/clients/contextLimits.test.js.map +1 -1
- package/ts_build/tests/clients/pricing.test.js +10 -1
- package/ts_build/tests/clients/pricing.test.js.map +1 -1
- package/ts_build/tests/services/Tools.test.js +126 -8
- package/ts_build/tests/services/Tools.test.js.map +1 -1
- package/ts_build/tests/unit/modules/moduleLoading.test.js +84 -0
- package/ts_build/tests/unit/modules/moduleLoading.test.js.map +1 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const base_1 = require("../../src/agents/base/base");
|
|
4
|
+
const flush = () => new Promise((r) => setTimeout(r, 0));
|
|
5
|
+
function makeStubs() {
|
|
6
|
+
const events = {
|
|
7
|
+
setListener: () => { },
|
|
8
|
+
emit: () => { },
|
|
9
|
+
on: () => { },
|
|
10
|
+
};
|
|
11
|
+
const tools = {
|
|
12
|
+
getContext: () => ({}),
|
|
13
|
+
callTool: async () => "",
|
|
14
|
+
};
|
|
15
|
+
return { events, tools };
|
|
16
|
+
}
|
|
17
|
+
class TestAgent extends base_1.BaseAgent {
|
|
18
|
+
name = "TestAgent";
|
|
19
|
+
description = "test";
|
|
20
|
+
constructor() {
|
|
21
|
+
const { events, tools } = makeStubs();
|
|
22
|
+
super({ Tools: tools, Events: events });
|
|
23
|
+
this.status = this.eventTypes.inProgress;
|
|
24
|
+
}
|
|
25
|
+
async getInitialMessages() {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
get delivered() {
|
|
29
|
+
return this.pendingMessages;
|
|
30
|
+
}
|
|
31
|
+
setStatus(s) {
|
|
32
|
+
this.status = s;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function manualSource(label) {
|
|
36
|
+
let emitFn;
|
|
37
|
+
const state = { torndown: false };
|
|
38
|
+
const source = {
|
|
39
|
+
label,
|
|
40
|
+
start(emit) {
|
|
41
|
+
emitFn = emit;
|
|
42
|
+
return () => {
|
|
43
|
+
state.torndown = true;
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
return {
|
|
48
|
+
source,
|
|
49
|
+
push: (d) => emitFn && emitFn(d),
|
|
50
|
+
state,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
describe("BaseAgent.observe / stopObserving", () => {
|
|
54
|
+
it("delivers emitted data as pending messages", () => {
|
|
55
|
+
const agent = new TestAgent();
|
|
56
|
+
const { source, push } = manualSource("thing");
|
|
57
|
+
const id = agent.observe(source);
|
|
58
|
+
expect(id).toMatch(/^obs_thing_/);
|
|
59
|
+
push("hello");
|
|
60
|
+
expect(agent.delivered.length).toBe(1);
|
|
61
|
+
expect(String(agent.delivered[0].content)).toContain("hello");
|
|
62
|
+
expect(String(agent.delivered[0].content)).toContain(`[observe:${id}]`);
|
|
63
|
+
agent.stopObserving();
|
|
64
|
+
});
|
|
65
|
+
it("dedupes identical consecutive data with onlyOnChange (default)", () => {
|
|
66
|
+
const agent = new TestAgent();
|
|
67
|
+
const { source, push } = manualSource("dup");
|
|
68
|
+
agent.observe(source);
|
|
69
|
+
push("a");
|
|
70
|
+
push("a");
|
|
71
|
+
push("b");
|
|
72
|
+
expect(agent.delivered.length).toBe(2);
|
|
73
|
+
agent.stopObserving();
|
|
74
|
+
});
|
|
75
|
+
it("delivers every emit when onlyOnChange is false", () => {
|
|
76
|
+
const agent = new TestAgent();
|
|
77
|
+
const { source, push } = manualSource("nochange");
|
|
78
|
+
agent.observe(source, { onlyOnChange: false });
|
|
79
|
+
push("x1");
|
|
80
|
+
push("x2");
|
|
81
|
+
push("x3");
|
|
82
|
+
expect(agent.delivered.length).toBe(3);
|
|
83
|
+
agent.stopObserving();
|
|
84
|
+
});
|
|
85
|
+
it("auto-stops after maxUpdates and runs teardown", async () => {
|
|
86
|
+
const agent = new TestAgent();
|
|
87
|
+
const { source, push, state } = manualSource("cap");
|
|
88
|
+
agent.observe(source, { maxUpdates: 2 });
|
|
89
|
+
push("1");
|
|
90
|
+
push("2");
|
|
91
|
+
push("3");
|
|
92
|
+
expect(agent.delivered.length).toBe(2);
|
|
93
|
+
await flush();
|
|
94
|
+
expect(state.torndown).toBe(true);
|
|
95
|
+
agent.stopObserving();
|
|
96
|
+
});
|
|
97
|
+
it("stopObserving(id) cancels one observer and tears it down", async () => {
|
|
98
|
+
const agent = new TestAgent();
|
|
99
|
+
const a = manualSource("a");
|
|
100
|
+
const b = manualSource("b");
|
|
101
|
+
const idA = agent.observe(a.source);
|
|
102
|
+
agent.observe(b.source);
|
|
103
|
+
const res = agent.stopObserving(idA);
|
|
104
|
+
expect(res).toContain(`Stopped observer ${idA}`);
|
|
105
|
+
await flush();
|
|
106
|
+
expect(a.state.torndown).toBe(true);
|
|
107
|
+
expect(b.state.torndown).toBe(false);
|
|
108
|
+
b.push("still here");
|
|
109
|
+
expect(agent.delivered.some((m) => String(m.content).includes("still here"))).toBe(true);
|
|
110
|
+
agent.stopObserving();
|
|
111
|
+
});
|
|
112
|
+
it("stopObserving() with no id cancels all", async () => {
|
|
113
|
+
const agent = new TestAgent();
|
|
114
|
+
const a = manualSource("a");
|
|
115
|
+
const b = manualSource("b");
|
|
116
|
+
agent.observe(a.source);
|
|
117
|
+
agent.observe(b.source);
|
|
118
|
+
const res = agent.stopObserving();
|
|
119
|
+
expect(res).toMatch(/Stopped 2 active observer/);
|
|
120
|
+
await flush();
|
|
121
|
+
expect(a.state.torndown).toBe(true);
|
|
122
|
+
expect(b.state.torndown).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
it("is scoped per-agent — one agent's stopObserving does not affect another", async () => {
|
|
125
|
+
const agentA = new TestAgent();
|
|
126
|
+
const agentB = new TestAgent();
|
|
127
|
+
const sa = manualSource("sa");
|
|
128
|
+
const sb = manualSource("sb");
|
|
129
|
+
agentA.observe(sa.source);
|
|
130
|
+
agentB.observe(sb.source);
|
|
131
|
+
agentA.stopObserving();
|
|
132
|
+
await flush();
|
|
133
|
+
expect(sa.state.torndown).toBe(true);
|
|
134
|
+
expect(sb.state.torndown).toBe(false);
|
|
135
|
+
sb.push("b-data");
|
|
136
|
+
expect(agentB.delivered.some((m) => String(m.content).includes("b-data"))).toBe(true);
|
|
137
|
+
agentB.stopObserving();
|
|
138
|
+
});
|
|
139
|
+
it("does not inject data once the agent is done", () => {
|
|
140
|
+
const agent = new TestAgent();
|
|
141
|
+
const { source, push } = manualSource("late");
|
|
142
|
+
agent.observe(source);
|
|
143
|
+
agent.setStatus(agent.eventTypes.done);
|
|
144
|
+
push("too late");
|
|
145
|
+
expect(agent.delivered.length).toBe(0);
|
|
146
|
+
agent.stopObserving();
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=observe-base.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe-base.test.js","sourceRoot":"","sources":["../../../tests/agents/observe-base.test.ts"],"names":[],"mappings":";;AAcA,qDAA0E;AAI1E,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAGzD,SAAS,SAAS;IAChB,MAAM,MAAM,GAAQ;QAClB,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;QACrB,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;QACd,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC;KACb,CAAC;IACF,MAAM,KAAK,GAAQ;QACjB,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QACtB,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;KACzB,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,SAAU,SAAQ,gBAAS;IAC/B,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,MAAM,CAAC;IACrB;QACE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;QACtC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAEvC,IAAY,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;IACpD,CAAC;IACD,KAAK,CAAC,kBAAkB;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,SAAS;QACX,OAAQ,IAAY,CAAC,eAAe,CAAC;IACvC,CAAC;IACD,SAAS,CAAC,CAAS;QAChB,IAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;CACF;AAGD,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,MAA0C,CAAC;IAC/C,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClC,MAAM,MAAM,GAAsB;QAChC,KAAK;QACL,KAAK,CAAC,IAAI;YACR,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,GAAG,EAAE;gBACV,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;YACxB,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;IACF,OAAO;QACL,MAAM;QACN,IAAI,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC;QACzC,KAAK;KACN,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAElC,IAAI,CAAC,OAAO,CAAC,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACxE,KAAK,CAAC,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7C,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAGlD,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACpD,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,CAAC,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;QACjD,MAAM,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzF,KAAK,CAAC,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC5B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QACjD,MAAM,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAE1B,MAAM,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClB,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,MAAM,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9C,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtB,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
const os = __importStar(require("os"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const connectAgent_1 = require("../../../src/agents/tools/connectAgent");
|
|
40
|
+
describe("connectAgent / stopConnections", () => {
|
|
41
|
+
let tmpCwd;
|
|
42
|
+
let originalCwd;
|
|
43
|
+
let agentsDir;
|
|
44
|
+
const delay = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
originalCwd = process.cwd();
|
|
47
|
+
tmpCwd = fs.mkdtempSync(path.join(os.tmpdir(), "connect-agent-"));
|
|
48
|
+
process.chdir(tmpCwd);
|
|
49
|
+
agentsDir = path.join(tmpCwd, ".knowhow", "processes", "agents");
|
|
50
|
+
fs.mkdirSync(agentsDir, { recursive: true });
|
|
51
|
+
});
|
|
52
|
+
afterEach(async () => {
|
|
53
|
+
await (0, connectAgent_1.stopConnections)({});
|
|
54
|
+
process.chdir(originalCwd);
|
|
55
|
+
fs.rmSync(tmpCwd, { recursive: true, force: true });
|
|
56
|
+
});
|
|
57
|
+
function makeTask(taskId, threads = []) {
|
|
58
|
+
const dir = path.join(agentsDir, taskId);
|
|
59
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
60
|
+
writeThreads(taskId, threads);
|
|
61
|
+
return dir;
|
|
62
|
+
}
|
|
63
|
+
function writeThreads(taskId, threads, extra = {}) {
|
|
64
|
+
fs.writeFileSync(path.join(agentsDir, taskId, "metadata.json"), JSON.stringify({ taskId, threads, ...extra }, null, 2), "utf8");
|
|
65
|
+
}
|
|
66
|
+
function readInput(taskId) {
|
|
67
|
+
const p = path.join(agentsDir, taskId, "input.txt");
|
|
68
|
+
return fs.existsSync(p) ? fs.readFileSync(p, "utf8") : "";
|
|
69
|
+
}
|
|
70
|
+
it("rejects empty connections array", async () => {
|
|
71
|
+
const res = await (0, connectAgent_1.connectAgent)({ connections: [] });
|
|
72
|
+
expect(res).toMatch(/non-empty array/);
|
|
73
|
+
});
|
|
74
|
+
it("reports missing task dirs but still wires valid ones", async () => {
|
|
75
|
+
makeTask("a");
|
|
76
|
+
const res = await (0, connectAgent_1.connectAgent)({
|
|
77
|
+
connections: [
|
|
78
|
+
{ listener: "a", speaker: "missing" },
|
|
79
|
+
{ listener: "a", speaker: "a" },
|
|
80
|
+
],
|
|
81
|
+
});
|
|
82
|
+
expect(res).toMatch(/speaker task dir not found: missing/);
|
|
83
|
+
expect(res).toMatch(/self-connection for a/);
|
|
84
|
+
});
|
|
85
|
+
it("relays only NEW assistant messages from speaker to listener", async () => {
|
|
86
|
+
makeTask("listener", []);
|
|
87
|
+
makeTask("speaker", [
|
|
88
|
+
{ role: "assistant", content: "old message" },
|
|
89
|
+
]);
|
|
90
|
+
await (0, connectAgent_1.connectAgent)({
|
|
91
|
+
connections: [{ listener: "listener", speaker: "speaker" }],
|
|
92
|
+
intervalMs: 1000,
|
|
93
|
+
});
|
|
94
|
+
writeThreads("speaker", [
|
|
95
|
+
{ role: "assistant", content: "old message" },
|
|
96
|
+
{ role: "assistant", content: "new insight" },
|
|
97
|
+
]);
|
|
98
|
+
await delay(1300);
|
|
99
|
+
const input = readInput("listener");
|
|
100
|
+
expect(input).toContain("[from:speaker] new insight");
|
|
101
|
+
expect(input).not.toContain("old message");
|
|
102
|
+
});
|
|
103
|
+
it("supports bidirectional in a single call (array of connections)", async () => {
|
|
104
|
+
makeTask("a", []);
|
|
105
|
+
makeTask("b", []);
|
|
106
|
+
await (0, connectAgent_1.connectAgent)({
|
|
107
|
+
connections: [
|
|
108
|
+
{ listener: "a", speaker: "b" },
|
|
109
|
+
{ listener: "b", speaker: "a" },
|
|
110
|
+
],
|
|
111
|
+
intervalMs: 1000,
|
|
112
|
+
});
|
|
113
|
+
writeThreads("a", [{ role: "assistant", content: "from A" }]);
|
|
114
|
+
writeThreads("b", [{ role: "assistant", content: "from B" }]);
|
|
115
|
+
await delay(1300);
|
|
116
|
+
expect(readInput("a")).toContain("[from:b] from B");
|
|
117
|
+
expect(readInput("b")).toContain("[from:a] from A");
|
|
118
|
+
});
|
|
119
|
+
it("stops a specific connection by id", async () => {
|
|
120
|
+
makeTask("l", []);
|
|
121
|
+
makeTask("s", []);
|
|
122
|
+
const res = await (0, connectAgent_1.connectAgent)({
|
|
123
|
+
connections: [{ listener: "l", speaker: "s" }],
|
|
124
|
+
intervalMs: 1000,
|
|
125
|
+
});
|
|
126
|
+
const idMatch = res.match(/conn_[A-Za-z0-9_]+/);
|
|
127
|
+
expect(idMatch).toBeTruthy();
|
|
128
|
+
const stopRes = await (0, connectAgent_1.stopConnections)({ id: idMatch[0] });
|
|
129
|
+
expect(stopRes).toMatch(/Stopped connection/);
|
|
130
|
+
});
|
|
131
|
+
it("stopConnections() with no id stops all", async () => {
|
|
132
|
+
makeTask("l2", []);
|
|
133
|
+
makeTask("s2", []);
|
|
134
|
+
await (0, connectAgent_1.connectAgent)({
|
|
135
|
+
connections: [{ listener: "l2", speaker: "s2" }],
|
|
136
|
+
intervalMs: 1000,
|
|
137
|
+
});
|
|
138
|
+
const res = await (0, connectAgent_1.stopConnections)({});
|
|
139
|
+
expect(res).toMatch(/Stopped 1 active connection/);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
//# sourceMappingURL=connectAgent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectAgent.test.js","sourceRoot":"","sources":["../../../../tests/agents/tools/connectAgent.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const observe_1 = require("../../../src/agents/tools/observe");
|
|
4
|
+
describe("observe / stopObserving", () => {
|
|
5
|
+
const delay = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
6
|
+
function makeCaller() {
|
|
7
|
+
const messages = [];
|
|
8
|
+
const observations = new Map();
|
|
9
|
+
let seq = 0;
|
|
10
|
+
const done = "done";
|
|
11
|
+
const caller = {
|
|
12
|
+
currentTaskId: "task-x",
|
|
13
|
+
name: "Tester",
|
|
14
|
+
status: "in_progress",
|
|
15
|
+
getEnabledToolNames: () => ["fakeTool"],
|
|
16
|
+
addPendingMessage: (m) => messages.push(m),
|
|
17
|
+
observe(source, opts = {}) {
|
|
18
|
+
const { onlyOnChange = true, maxUpdates = 20, maxDurationMs = 10 * 60 * 1000, } = opts;
|
|
19
|
+
seq += 1;
|
|
20
|
+
const safeLabel = source.label.replace(/[^A-Za-z0-9]+/g, "_").slice(0, 24);
|
|
21
|
+
const id = `obs_${safeLabel}_${Date.now()}_${seq}`;
|
|
22
|
+
let last;
|
|
23
|
+
const emit = (datum) => {
|
|
24
|
+
if (caller.status === done) {
|
|
25
|
+
caller.stopObserving(id);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const str = typeof datum === "string" ? datum : JSON.stringify(datum);
|
|
29
|
+
if (onlyOnChange && str === last)
|
|
30
|
+
return;
|
|
31
|
+
last = str;
|
|
32
|
+
const obs = observations.get(id);
|
|
33
|
+
if (!obs)
|
|
34
|
+
return;
|
|
35
|
+
obs.updates += 1;
|
|
36
|
+
caller.addPendingMessage({
|
|
37
|
+
role: "user",
|
|
38
|
+
content: `[observe:${id}] ${source.label} (update ${obs.updates}/${maxUpdates}):\n${str}`,
|
|
39
|
+
});
|
|
40
|
+
if (obs.updates >= maxUpdates)
|
|
41
|
+
caller.stopObserving(id, "max updates reached");
|
|
42
|
+
};
|
|
43
|
+
const teardownPromise = Promise.resolve(source.start(emit));
|
|
44
|
+
const expiry = maxDurationMs
|
|
45
|
+
? setTimeout(() => caller.stopObserving(id, "max duration reached"), maxDurationMs)
|
|
46
|
+
: undefined;
|
|
47
|
+
expiry?.unref?.();
|
|
48
|
+
observations.set(id, { id, label: source.label, updates: 0, teardownPromise, expiry });
|
|
49
|
+
return id;
|
|
50
|
+
},
|
|
51
|
+
stopObserving(id, reason = "stopped") {
|
|
52
|
+
const ids = id ? [id] : [...observations.keys()];
|
|
53
|
+
let stopped = 0;
|
|
54
|
+
for (const oid of ids) {
|
|
55
|
+
const obs = observations.get(oid);
|
|
56
|
+
if (!obs)
|
|
57
|
+
continue;
|
|
58
|
+
if (obs.expiry)
|
|
59
|
+
clearTimeout(obs.expiry);
|
|
60
|
+
Promise.resolve(obs.teardownPromise).then((fn) => typeof fn === "function" && fn());
|
|
61
|
+
observations.delete(oid);
|
|
62
|
+
stopped += 1;
|
|
63
|
+
}
|
|
64
|
+
return id
|
|
65
|
+
? stopped
|
|
66
|
+
? `Stopped observer ${id} (${reason}).`
|
|
67
|
+
: `No active observer found with id: ${id}.`
|
|
68
|
+
: `Stopped ${stopped} active observer(s) (${reason}).`;
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
return { caller, messages };
|
|
72
|
+
}
|
|
73
|
+
function makeCtx(toolResults) {
|
|
74
|
+
const { caller, messages } = makeCaller();
|
|
75
|
+
let call = 0;
|
|
76
|
+
const Tools = {
|
|
77
|
+
callTool: jest.fn(async () => {
|
|
78
|
+
const r = toolResults[Math.min(call, toolResults.length - 1)];
|
|
79
|
+
call++;
|
|
80
|
+
return r;
|
|
81
|
+
}),
|
|
82
|
+
};
|
|
83
|
+
return { _ctx: { caller, Tools }, messages, Tools, caller };
|
|
84
|
+
}
|
|
85
|
+
it("requires toolName", async () => {
|
|
86
|
+
const res = await (0, observe_1.observe)({ toolName: "" });
|
|
87
|
+
expect(res).toMatch(/toolName is required/);
|
|
88
|
+
});
|
|
89
|
+
it("errors without a ToolsService on _ctx", async () => {
|
|
90
|
+
const res = await (0, observe_1.observe)({ toolName: "fakeTool", _ctx: { caller: {} } });
|
|
91
|
+
expect(res).toMatch(/no ToolsService/);
|
|
92
|
+
});
|
|
93
|
+
it("errors without a caller on _ctx", async () => {
|
|
94
|
+
const res = await (0, observe_1.observe)({
|
|
95
|
+
toolName: "fakeTool",
|
|
96
|
+
_ctx: { Tools: { callTool: jest.fn() } },
|
|
97
|
+
});
|
|
98
|
+
expect(res).toMatch(/no calling agent/);
|
|
99
|
+
});
|
|
100
|
+
it("polls the tool and delivers changed results to the caller", async () => {
|
|
101
|
+
const { _ctx, messages, Tools } = makeCtx(["a", "b", "b", "c"]);
|
|
102
|
+
const res = await (0, observe_1.observe)({
|
|
103
|
+
toolName: "fakeTool",
|
|
104
|
+
intervalMs: 500,
|
|
105
|
+
maxUpdates: 4,
|
|
106
|
+
_ctx: _ctx,
|
|
107
|
+
});
|
|
108
|
+
expect(res).toMatch(/Started observing/);
|
|
109
|
+
await delay(2400);
|
|
110
|
+
expect(Tools.callTool).toHaveBeenCalled();
|
|
111
|
+
const updateMsgs = messages.filter((m) => String(m.content).includes("[observe:"));
|
|
112
|
+
expect(updateMsgs.length).toBeGreaterThanOrEqual(3);
|
|
113
|
+
});
|
|
114
|
+
it("can be stopped early via stopObserving with the returned id", async () => {
|
|
115
|
+
const { _ctx, messages } = makeCtx(["x", "y", "z"]);
|
|
116
|
+
const res = await (0, observe_1.observe)({
|
|
117
|
+
toolName: "fakeTool",
|
|
118
|
+
intervalMs: 500,
|
|
119
|
+
maxUpdates: 20,
|
|
120
|
+
_ctx: _ctx,
|
|
121
|
+
});
|
|
122
|
+
const idMatch = res.match(/id: (obs_[^)]+)\)/);
|
|
123
|
+
expect(idMatch).toBeTruthy();
|
|
124
|
+
const id = idMatch[1];
|
|
125
|
+
await delay(600);
|
|
126
|
+
const stopRes = await (0, observe_1.stopObserving)({ id, _ctx: _ctx });
|
|
127
|
+
expect(stopRes).toContain(`Stopped observer ${id}`);
|
|
128
|
+
const before = messages.length;
|
|
129
|
+
await delay(1000);
|
|
130
|
+
expect(messages.length).toBe(before);
|
|
131
|
+
});
|
|
132
|
+
it("stopObserving with no id stops all observers on that agent", async () => {
|
|
133
|
+
const { _ctx } = makeCtx(["1"]);
|
|
134
|
+
await (0, observe_1.observe)({ toolName: "fakeTool", intervalMs: 1000, _ctx: _ctx });
|
|
135
|
+
const res = await (0, observe_1.stopObserving)({ _ctx: _ctx });
|
|
136
|
+
expect(res).toMatch(/Stopped \d+ active observer/);
|
|
137
|
+
});
|
|
138
|
+
it("stopObserving on an unknown id returns a helpful message", async () => {
|
|
139
|
+
const { _ctx } = makeCtx(["1"]);
|
|
140
|
+
const res = await (0, observe_1.stopObserving)({ id: "obs_does_not_exist", _ctx: _ctx });
|
|
141
|
+
expect(res).toMatch(/No active observer found/);
|
|
142
|
+
});
|
|
143
|
+
it("errors without a caller on _ctx for stopObserving", async () => {
|
|
144
|
+
const res = await (0, observe_1.stopObserving)({ id: "x" });
|
|
145
|
+
expect(res).toMatch(/no calling agent/);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=observe.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe.test.js","sourceRoot":"","sources":["../../../../tests/agents/tools/observe.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
const os = __importStar(require("os"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const replyToParent_1 = require("../../../src/agents/tools/replyToParent");
|
|
40
|
+
describe("replyToParent (_ctx self-referential tool)", () => {
|
|
41
|
+
let tmpCwd;
|
|
42
|
+
let originalCwd;
|
|
43
|
+
let agentsDir;
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
originalCwd = process.cwd();
|
|
46
|
+
tmpCwd = fs.mkdtempSync(path.join(os.tmpdir(), "reply-parent-"));
|
|
47
|
+
process.chdir(tmpCwd);
|
|
48
|
+
agentsDir = path.join(tmpCwd, ".knowhow", "processes", "agents");
|
|
49
|
+
fs.mkdirSync(agentsDir, { recursive: true });
|
|
50
|
+
});
|
|
51
|
+
afterEach(() => {
|
|
52
|
+
process.chdir(originalCwd);
|
|
53
|
+
fs.rmSync(tmpCwd, { recursive: true, force: true });
|
|
54
|
+
});
|
|
55
|
+
function makeTask(taskId, meta = {}) {
|
|
56
|
+
const dir = path.join(agentsDir, taskId);
|
|
57
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
58
|
+
fs.writeFileSync(path.join(dir, "input.txt"), "", "utf8");
|
|
59
|
+
fs.writeFileSync(path.join(dir, "metadata.json"), JSON.stringify({ taskId, ...meta }, null, 2), "utf8");
|
|
60
|
+
return dir;
|
|
61
|
+
}
|
|
62
|
+
it("returns a helpful message when there is no parent", async () => {
|
|
63
|
+
makeTask("child-1");
|
|
64
|
+
const result = await (0, replyToParent_1.replyToParent)("hi", { taskId: "child-1" });
|
|
65
|
+
expect(result).toMatch(/No parent task found/);
|
|
66
|
+
});
|
|
67
|
+
it("uses parentTaskId directly from _ctx when provided", async () => {
|
|
68
|
+
const parentDir = makeTask("parent-1");
|
|
69
|
+
makeTask("child-2", { parentTaskId: "parent-1" });
|
|
70
|
+
const result = await (0, replyToParent_1.replyToParent)("progress update", {
|
|
71
|
+
taskId: "child-2",
|
|
72
|
+
parentTaskId: "parent-1",
|
|
73
|
+
});
|
|
74
|
+
expect(result).toMatch(/Sent message to parent task parent-1/);
|
|
75
|
+
const parentInput = fs.readFileSync(path.join(parentDir, "input.txt"), "utf8");
|
|
76
|
+
expect(parentInput).toContain("progress update");
|
|
77
|
+
expect(parentInput).toContain("[from:child-2]");
|
|
78
|
+
});
|
|
79
|
+
it("falls back to reading parentTaskId from the caller's metadata.json", async () => {
|
|
80
|
+
const parentDir = makeTask("parent-2");
|
|
81
|
+
makeTask("child-3", { parentTaskId: "parent-2" });
|
|
82
|
+
const result = await (0, replyToParent_1.replyToParent)("need help", { taskId: "child-3" });
|
|
83
|
+
expect(result).toMatch(/Sent message to parent task parent-2/);
|
|
84
|
+
const parentInput = fs.readFileSync(path.join(parentDir, "input.txt"), "utf8");
|
|
85
|
+
expect(parentInput).toContain("need help");
|
|
86
|
+
});
|
|
87
|
+
it("reads taskId/name off _ctx.caller when taskId not set directly", async () => {
|
|
88
|
+
const parentDir = makeTask("parent-3");
|
|
89
|
+
makeTask("child-4", { parentTaskId: "parent-3" });
|
|
90
|
+
const fakeAgent = { currentTaskId: "child-4", name: "Researcher" };
|
|
91
|
+
const result = await (0, replyToParent_1.replyToParent)("done researching", {
|
|
92
|
+
caller: fakeAgent,
|
|
93
|
+
});
|
|
94
|
+
expect(result).toMatch(/Sent message to parent task parent-3/);
|
|
95
|
+
const parentInput = fs.readFileSync(path.join(parentDir, "input.txt"), "utf8");
|
|
96
|
+
expect(parentInput).toContain("[agent:Researcher]");
|
|
97
|
+
expect(parentInput).toContain("done researching");
|
|
98
|
+
});
|
|
99
|
+
it("appends rather than clobbers existing parent input", async () => {
|
|
100
|
+
const parentDir = makeTask("parent-4");
|
|
101
|
+
fs.writeFileSync(path.join(parentDir, "input.txt"), "existing message\n", "utf8");
|
|
102
|
+
makeTask("child-5", { parentTaskId: "parent-4" });
|
|
103
|
+
await (0, replyToParent_1.replyToParent)("second message", {
|
|
104
|
+
taskId: "child-5",
|
|
105
|
+
parentTaskId: "parent-4",
|
|
106
|
+
});
|
|
107
|
+
const parentInput = fs.readFileSync(path.join(parentDir, "input.txt"), "utf8");
|
|
108
|
+
expect(parentInput).toContain("existing message");
|
|
109
|
+
expect(parentInput).toContain("second message");
|
|
110
|
+
});
|
|
111
|
+
it("returns error for empty message", async () => {
|
|
112
|
+
const result = await (0, replyToParent_1.replyToParent)(" ", { taskId: "whatever" });
|
|
113
|
+
expect(result).toMatch(/No message provided/);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=replyToParent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replyToParent.test.js","sourceRoot":"","sources":["../../../../tests/agents/tools/replyToParent.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|