github-issue-tower-defence-management 1.123.0 → 1.123.2
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/CHANGELOG.md +14 -0
- package/bin/adapter/repositories/TranscriptSessionSubAgentActivityRepository.js +15 -1
- package/bin/adapter/repositories/TranscriptSessionSubAgentActivityRepository.js.map +1 -1
- package/jest.config.js +1 -1
- package/package.json +2 -2
- package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.test.ts +135 -0
- package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts +22 -4
- package/types/adapter/repositories/TranscriptSessionSubAgentActivityRepository.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [1.123.2](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.123.1...v1.123.2) (2026-07-17)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **silent-monitor:** treat a pending nested Agent/Task tool_use tail as waiting on an external process ([#1190](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1190)) ([feaf6c0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/feaf6c0b63920f4d36cfa85e4c9a5c88cd131ec2))
|
|
7
|
+
|
|
8
|
+
## [1.123.1](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.123.0...v1.123.1) (2026-07-17)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **deps:** update dependency commander to v15 ([#767](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/767)) ([a3af965](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/a3af96592f255fa22bfbc22110c973025d586019))
|
|
14
|
+
|
|
1
15
|
# [1.123.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.122.14...v1.123.0) (2026-07-16)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -65,6 +65,13 @@ const readContentBlocks = (message) => {
|
|
|
65
65
|
// tool_result is recorded, the sub-agent has delivered its output and is
|
|
66
66
|
// genuinely complete even though the transcript tail is a user entry.
|
|
67
67
|
const COMPLETION_TOOL_NAMES = new Set(['StructuredOutput']);
|
|
68
|
+
// Tools that delegate work to a nested child sub-agent. A parent whose
|
|
69
|
+
// transcript tail is a pending tool_use of one of these tools is waiting for
|
|
70
|
+
// the child to run (possibly queued), produces no transcript writes of its
|
|
71
|
+
// own, and therefore looks "silent" by mtime alone. Such a parent is treated
|
|
72
|
+
// as waiting on an external process so it is excluded from both the
|
|
73
|
+
// sub-agent-idle and sub-agent-long-running selections.
|
|
74
|
+
const DELEGATION_TOOL_NAMES = new Set(['Agent', 'Task']);
|
|
68
75
|
const entryToolUseNames = (message) => readContentBlocks(message)
|
|
69
76
|
.filter((block) => readString(block, 'type') === 'tool_use')
|
|
70
77
|
.map((block) => readString(block, 'name'))
|
|
@@ -138,6 +145,7 @@ const parseTranscript = (content) => {
|
|
|
138
145
|
let firstEntryEpochSeconds = null;
|
|
139
146
|
let lastEntryIndicatesCompletion = false;
|
|
140
147
|
let pendingToolCommands = [];
|
|
148
|
+
let pendingDelegationToolUse = false;
|
|
141
149
|
let precedingAssistantToolUseNames = [];
|
|
142
150
|
for (const line of content.split('\n')) {
|
|
143
151
|
const trimmed = line.trim();
|
|
@@ -163,6 +171,10 @@ const parseTranscript = (content) => {
|
|
|
163
171
|
pendingToolCommands = entryPendingToolCommands(parsed);
|
|
164
172
|
if (readString(parsed, 'type') === 'assistant') {
|
|
165
173
|
precedingAssistantToolUseNames = entryToolUseNames(parsed.message);
|
|
174
|
+
pendingDelegationToolUse = precedingAssistantToolUseNames.some((name) => DELEGATION_TOOL_NAMES.has(name));
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
pendingDelegationToolUse = false;
|
|
166
178
|
}
|
|
167
179
|
}
|
|
168
180
|
}
|
|
@@ -170,6 +182,7 @@ const parseTranscript = (content) => {
|
|
|
170
182
|
firstEntryEpochSeconds,
|
|
171
183
|
lastEntryIndicatesCompletion,
|
|
172
184
|
pendingToolCommands,
|
|
185
|
+
pendingDelegationToolUse,
|
|
173
186
|
};
|
|
174
187
|
};
|
|
175
188
|
const clampToZero = (value) => (value > 0 ? value : 0);
|
|
@@ -246,7 +259,8 @@ class TranscriptSessionSubAgentActivityRepository {
|
|
|
246
259
|
label: fileName.replace(/\.jsonl$/, ''),
|
|
247
260
|
silentSeconds,
|
|
248
261
|
runningSeconds,
|
|
249
|
-
waitingOnExternalProcess:
|
|
262
|
+
waitingOnExternalProcess: transcript.pendingDelegationToolUse ||
|
|
263
|
+
(await this.hasLiveMatchingProcess(transcript.pendingToolCommands, loadNormalizedProcessCommandLines)),
|
|
250
264
|
};
|
|
251
265
|
};
|
|
252
266
|
this.hasLiveMatchingProcess = async (pendingToolCommands, loadNormalizedProcessCommandLines) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranscriptSessionSubAgentActivityRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAM7B,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AAE9C,MAAM,UAAU,GAAG,CACjB,KAA8B,EAC9B,GAAW,EACI,EAAE;IACjB,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,SAAwB,EAAiB,EAAE;IACpE,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,oCAAoC,GAAG,EAAE,CAAC;AAEzC,MAAM,wBAAwB,GAAG,CAAC,OAAe,EAAU,EAAE,CAClE,OAAO;KACJ,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;KACpB,IAAI,EAAE;KACN,KAAK,CAAC,CAAC,EAAE,oCAAoC,CAAC,CAAC;AAJvC,QAAA,wBAAwB,4BAIe;
|
|
1
|
+
{"version":3,"file":"TranscriptSessionSubAgentActivityRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts"],"names":[],"mappings":"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"}
|
package/jest.config.js
CHANGED
|
@@ -30,7 +30,7 @@ module.exports = {
|
|
|
30
30
|
'^.+\\.ts?$': 'ts-jest',
|
|
31
31
|
'^.+\\.js$': ['ts-jest', { tsconfig: { allowJs: true } }],
|
|
32
32
|
},
|
|
33
|
-
transformIgnorePatterns: ['<rootDir>/node_modules/(?!(ky)/)'],
|
|
33
|
+
transformIgnorePatterns: ['<rootDir>/node_modules/(?!(ky|commander)/)'],
|
|
34
34
|
testPathIgnorePatterns: [
|
|
35
35
|
'/node_modules/',
|
|
36
36
|
'/bin/',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "github-issue-tower-defence-management",
|
|
3
|
-
"version": "1.123.
|
|
3
|
+
"version": "1.123.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "bin/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
},
|
|
102
102
|
"dependencies": {
|
|
103
103
|
"better-sqlite3": "12.10.0",
|
|
104
|
-
"commander": "^
|
|
104
|
+
"commander": "^15.0.0",
|
|
105
105
|
"dompurify": "3.4.11",
|
|
106
106
|
"dotenv": "^17.0.0",
|
|
107
107
|
"gemoji": "8.1.0",
|
|
@@ -770,6 +770,141 @@ describe('TranscriptSessionSubAgentActivityRepository', () => {
|
|
|
770
770
|
]);
|
|
771
771
|
});
|
|
772
772
|
|
|
773
|
+
describe('delegation-wait classification from a pending nested agent tool call', () => {
|
|
774
|
+
const pendingDelegationEntries = (
|
|
775
|
+
startTimestamp: string,
|
|
776
|
+
toolName: string,
|
|
777
|
+
): object[] => [
|
|
778
|
+
{ type: 'user', timestamp: startTimestamp, message: { role: 'user' } },
|
|
779
|
+
{
|
|
780
|
+
type: 'assistant',
|
|
781
|
+
timestamp: startTimestamp,
|
|
782
|
+
message: {
|
|
783
|
+
role: 'assistant',
|
|
784
|
+
stop_reason: 'tool_use',
|
|
785
|
+
content: [
|
|
786
|
+
{
|
|
787
|
+
type: 'tool_use',
|
|
788
|
+
name: toolName,
|
|
789
|
+
input: { prompt: 'do the sub-task', subagent_type: 'impl' },
|
|
790
|
+
},
|
|
791
|
+
],
|
|
792
|
+
},
|
|
793
|
+
},
|
|
794
|
+
];
|
|
795
|
+
|
|
796
|
+
it.each(['Agent', 'Task'])(
|
|
797
|
+
'classifies a parent as waiting when its transcript tail is a pending %s tool call spawning a nested child',
|
|
798
|
+
async (toolName) => {
|
|
799
|
+
const sessionName = 'https_//github_com/owner/repo/issues/9';
|
|
800
|
+
writeAgentTranscript(
|
|
801
|
+
sessionName,
|
|
802
|
+
'delegating',
|
|
803
|
+
pendingDelegationEntries('2026-06-27T11:45:00.000Z', toolName),
|
|
804
|
+
nowEpochSeconds - 600,
|
|
805
|
+
);
|
|
806
|
+
const repository = new TranscriptSessionSubAgentActivityRepository(
|
|
807
|
+
createResolver(),
|
|
808
|
+
emptyProcessLister(),
|
|
809
|
+
now,
|
|
810
|
+
);
|
|
811
|
+
|
|
812
|
+
const result = await repository.listSubAgentActivitiesBySessionName(
|
|
813
|
+
[sessionName],
|
|
814
|
+
transcriptMapFor([sessionName]),
|
|
815
|
+
);
|
|
816
|
+
|
|
817
|
+
expect(result.get(sessionName)).toEqual([
|
|
818
|
+
{
|
|
819
|
+
label: 'agent-delegating',
|
|
820
|
+
silentSeconds: 600,
|
|
821
|
+
runningSeconds: 900,
|
|
822
|
+
waitingOnExternalProcess: true,
|
|
823
|
+
},
|
|
824
|
+
]);
|
|
825
|
+
},
|
|
826
|
+
);
|
|
827
|
+
|
|
828
|
+
it('stops classifying as waiting once the nested agent tool call has returned its tool result', async () => {
|
|
829
|
+
const sessionName = 'https_//github_com/owner/repo/issues/9';
|
|
830
|
+
const startTimestamp = '2026-06-27T11:45:00.000Z';
|
|
831
|
+
writeAgentTranscript(
|
|
832
|
+
sessionName,
|
|
833
|
+
'childdone',
|
|
834
|
+
[
|
|
835
|
+
...pendingDelegationEntries(startTimestamp, 'Agent'),
|
|
836
|
+
{
|
|
837
|
+
type: 'user',
|
|
838
|
+
timestamp: startTimestamp,
|
|
839
|
+
message: {
|
|
840
|
+
role: 'user',
|
|
841
|
+
content: [{ type: 'tool_result', content: 'child finished' }],
|
|
842
|
+
},
|
|
843
|
+
},
|
|
844
|
+
],
|
|
845
|
+
nowEpochSeconds - 600,
|
|
846
|
+
);
|
|
847
|
+
const repository = new TranscriptSessionSubAgentActivityRepository(
|
|
848
|
+
createResolver(),
|
|
849
|
+
emptyProcessLister(),
|
|
850
|
+
now,
|
|
851
|
+
);
|
|
852
|
+
|
|
853
|
+
const result = await repository.listSubAgentActivitiesBySessionName(
|
|
854
|
+
[sessionName],
|
|
855
|
+
transcriptMapFor([sessionName]),
|
|
856
|
+
);
|
|
857
|
+
|
|
858
|
+
expect(result.get(sessionName)?.[0]?.waitingOnExternalProcess).toBe(
|
|
859
|
+
false,
|
|
860
|
+
);
|
|
861
|
+
});
|
|
862
|
+
|
|
863
|
+
it('does not classify as waiting when a later pending Bash call follows an already-consumed nested agent call', async () => {
|
|
864
|
+
const sessionName = 'https_//github_com/owner/repo/issues/9';
|
|
865
|
+
const startTimestamp = '2026-06-27T11:45:00.000Z';
|
|
866
|
+
writeAgentTranscript(
|
|
867
|
+
sessionName,
|
|
868
|
+
'laterpending',
|
|
869
|
+
[
|
|
870
|
+
...pendingDelegationEntries(startTimestamp, 'Agent'),
|
|
871
|
+
{
|
|
872
|
+
type: 'user',
|
|
873
|
+
timestamp: startTimestamp,
|
|
874
|
+
message: {
|
|
875
|
+
role: 'user',
|
|
876
|
+
content: [{ type: 'tool_result', content: 'child finished' }],
|
|
877
|
+
},
|
|
878
|
+
},
|
|
879
|
+
{
|
|
880
|
+
type: 'assistant',
|
|
881
|
+
timestamp: startTimestamp,
|
|
882
|
+
message: {
|
|
883
|
+
role: 'assistant',
|
|
884
|
+
stop_reason: 'tool_use',
|
|
885
|
+
content: [{ type: 'tool_use', name: 'Bash', input: {} }],
|
|
886
|
+
},
|
|
887
|
+
},
|
|
888
|
+
],
|
|
889
|
+
nowEpochSeconds - 600,
|
|
890
|
+
);
|
|
891
|
+
const repository = new TranscriptSessionSubAgentActivityRepository(
|
|
892
|
+
createResolver(),
|
|
893
|
+
emptyProcessLister(),
|
|
894
|
+
now,
|
|
895
|
+
);
|
|
896
|
+
|
|
897
|
+
const result = await repository.listSubAgentActivitiesBySessionName(
|
|
898
|
+
[sessionName],
|
|
899
|
+
transcriptMapFor([sessionName]),
|
|
900
|
+
);
|
|
901
|
+
|
|
902
|
+
expect(result.get(sessionName)?.[0]?.waitingOnExternalProcess).toBe(
|
|
903
|
+
false,
|
|
904
|
+
);
|
|
905
|
+
});
|
|
906
|
+
});
|
|
907
|
+
|
|
773
908
|
describe('external-wait classification from the pending tool command', () => {
|
|
774
909
|
const CI_WATCH_COMMAND =
|
|
775
910
|
'gh pr checks 123 --watch -i 60 -R owner/repo 2>&1 | tail -5';
|
|
@@ -36,6 +36,7 @@ type ParsedTranscript = {
|
|
|
36
36
|
firstEntryEpochSeconds: number | null;
|
|
37
37
|
lastEntryIndicatesCompletion: boolean;
|
|
38
38
|
pendingToolCommands: string[];
|
|
39
|
+
pendingDelegationToolUse: boolean;
|
|
39
40
|
};
|
|
40
41
|
|
|
41
42
|
const readContentBlocks = (
|
|
@@ -53,6 +54,14 @@ const readContentBlocks = (
|
|
|
53
54
|
// genuinely complete even though the transcript tail is a user entry.
|
|
54
55
|
const COMPLETION_TOOL_NAMES = new Set(['StructuredOutput']);
|
|
55
56
|
|
|
57
|
+
// Tools that delegate work to a nested child sub-agent. A parent whose
|
|
58
|
+
// transcript tail is a pending tool_use of one of these tools is waiting for
|
|
59
|
+
// the child to run (possibly queued), produces no transcript writes of its
|
|
60
|
+
// own, and therefore looks "silent" by mtime alone. Such a parent is treated
|
|
61
|
+
// as waiting on an external process so it is excluded from both the
|
|
62
|
+
// sub-agent-idle and sub-agent-long-running selections.
|
|
63
|
+
const DELEGATION_TOOL_NAMES = new Set(['Agent', 'Task']);
|
|
64
|
+
|
|
56
65
|
const entryToolUseNames = (message: Record<string, unknown>): string[] =>
|
|
57
66
|
readContentBlocks(message)
|
|
58
67
|
.filter((block) => readString(block, 'type') === 'tool_use')
|
|
@@ -135,6 +144,7 @@ const parseTranscript = (content: string): ParsedTranscript => {
|
|
|
135
144
|
let firstEntryEpochSeconds: number | null = null;
|
|
136
145
|
let lastEntryIndicatesCompletion = false;
|
|
137
146
|
let pendingToolCommands: string[] = [];
|
|
147
|
+
let pendingDelegationToolUse = false;
|
|
138
148
|
let precedingAssistantToolUseNames: string[] = [];
|
|
139
149
|
for (const line of content.split('\n')) {
|
|
140
150
|
const trimmed = line.trim();
|
|
@@ -162,6 +172,11 @@ const parseTranscript = (content: string): ParsedTranscript => {
|
|
|
162
172
|
pendingToolCommands = entryPendingToolCommands(parsed);
|
|
163
173
|
if (readString(parsed, 'type') === 'assistant') {
|
|
164
174
|
precedingAssistantToolUseNames = entryToolUseNames(parsed.message);
|
|
175
|
+
pendingDelegationToolUse = precedingAssistantToolUseNames.some((name) =>
|
|
176
|
+
DELEGATION_TOOL_NAMES.has(name),
|
|
177
|
+
);
|
|
178
|
+
} else {
|
|
179
|
+
pendingDelegationToolUse = false;
|
|
165
180
|
}
|
|
166
181
|
}
|
|
167
182
|
}
|
|
@@ -169,6 +184,7 @@ const parseTranscript = (content: string): ParsedTranscript => {
|
|
|
169
184
|
firstEntryEpochSeconds,
|
|
170
185
|
lastEntryIndicatesCompletion,
|
|
171
186
|
pendingToolCommands,
|
|
187
|
+
pendingDelegationToolUse,
|
|
172
188
|
};
|
|
173
189
|
};
|
|
174
190
|
|
|
@@ -279,10 +295,12 @@ export class TranscriptSessionSubAgentActivityRepository implements SessionSubAg
|
|
|
279
295
|
label: fileName.replace(/\.jsonl$/, ''),
|
|
280
296
|
silentSeconds,
|
|
281
297
|
runningSeconds,
|
|
282
|
-
waitingOnExternalProcess:
|
|
283
|
-
transcript.
|
|
284
|
-
|
|
285
|
-
|
|
298
|
+
waitingOnExternalProcess:
|
|
299
|
+
transcript.pendingDelegationToolUse ||
|
|
300
|
+
(await this.hasLiveMatchingProcess(
|
|
301
|
+
transcript.pendingToolCommands,
|
|
302
|
+
loadNormalizedProcessCommandLines,
|
|
303
|
+
)),
|
|
286
304
|
};
|
|
287
305
|
};
|
|
288
306
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranscriptSessionSubAgentActivityRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mDAAmD,CAAC;AACrF,OAAO,EAAE,iCAAiC,EAAE,MAAM,4EAA4E,CAAC;AAC/H,OAAO,EAAE,qBAAqB,EAAE,MAAM,gEAAgE,CAAC;AACvG,OAAO,EAAE,mCAAmC,EAAE,MAAM,8EAA8E,CAAC;AAuBnI,eAAO,MAAM,wBAAwB,GAAI,SAAS,MAAM,KAAG,MAIR,CAAC;
|
|
1
|
+
{"version":3,"file":"TranscriptSessionSubAgentActivityRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mDAAmD,CAAC;AACrF,OAAO,EAAE,iCAAiC,EAAE,MAAM,4EAA4E,CAAC;AAC/H,OAAO,EAAE,qBAAqB,EAAE,MAAM,gEAAgE,CAAC;AACvG,OAAO,EAAE,mCAAmC,EAAE,MAAM,8EAA8E,CAAC;AAuBnI,eAAO,MAAM,wBAAwB,GAAI,SAAS,MAAM,KAAG,MAIR,CAAC;AAgKpD,qBAAa,2CAA4C,YAAW,iCAAiC;IAEjG,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAFH,iBAAiB,EAAE,mCAAmC,EACtD,aAAa,EAAE,qBAAqB,EACpC,GAAG,EAAE,IAAI;IAG5B,mCAAmC,GACjC,cAAc,MAAM,EAAE,EACtB,6BAA6B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAiCzC;IAEF,OAAO,CAAC,iBAAiB,CA6BvB;IAEF,OAAO,CAAC,UAAU,CAoChB;IAEF,OAAO,CAAC,sBAAsB,CAiB5B;CACH"}
|