github-issue-tower-defence-management 1.122.7 → 1.122.8
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 +7 -0
- package/bin/domain/usecases/DefaultSilentSessionMessageComposer.js +3 -3
- package/bin/domain/usecases/DefaultSilentSessionMessageComposer.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +4 -2
- package/src/domain/usecases/DefaultSilentSessionMessageComposer.test.ts +36 -6
- package/src/domain/usecases/DefaultSilentSessionMessageComposer.ts +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [1.122.8](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.122.7...v1.122.8) (2026-07-14)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* instruct unconditional re-raise in stale-owner-call reminder ([#1168](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1168)) ([f246cd3](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/f246cd385befd0f29c51576593a1ecb2fd23bf40))
|
|
7
|
+
|
|
1
8
|
## [1.122.7](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.122.6...v1.122.7) (2026-07-14)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -44,9 +44,9 @@ const composeMainStalledWithStaleOwnerCallMessage = (mainSilentSeconds, unanswer
|
|
|
44
44
|
const silentMinutes = Math.floor(mainSilentSeconds / 60);
|
|
45
45
|
const ownerCallAgeMinutes = Math.floor(unansweredOwnerCallAgeSeconds / 60);
|
|
46
46
|
return [
|
|
47
|
-
`${silentSessionReminderSentinel_1.SILENT_SESSION_REMINDER_SENTINEL} This is an automated status check. No output has been observed for ${silentMinutes} minutes, and the owner call raised ${ownerCallAgeMinutes} minutes ago
|
|
48
|
-
`
|
|
49
|
-
`
|
|
47
|
+
`${silentSessionReminderSentinel_1.SILENT_SESSION_REMINDER_SENTINEL} This is an automated status check. No output has been observed for ${silentMinutes} minutes, and the owner call raised ${ownerCallAgeMinutes} minutes ago has not yet been acknowledged by the owner.`,
|
|
48
|
+
`An owner call without an acknowledgment — whether it carried a completion report, a question, or a decision request — is still awaiting the owner's acknowledgment, and the earlier message may have been missed. Please re-raise its content as a fresh, self-contained owner call. ${(0, exports.composeOwnerCallFormatGuidance)(ownerCallMarker)}`,
|
|
49
|
+
`Please also include in your next output an estimate of the remaining minutes to finish all tasks.`,
|
|
50
50
|
].join('\n');
|
|
51
51
|
};
|
|
52
52
|
class DefaultSilentSessionMessageComposer {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultSilentSessionMessageComposer.js","sourceRoot":"","sources":["../../../src/domain/usecases/DefaultSilentSessionMessageComposer.ts"],"names":[],"mappings":";;;AAKA,mFAAmF;AAEnF,MAAM,aAAa,GAAG,CAAC,OAAe,EAAU,EAAE;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,OAAO,GAAG,OAAO,GAAG,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CACjC,aAAiC,EACzB,EAAE;IACV,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAC7B,CAAC,QAAQ,EAAE,EAAE,CACX,KAAK,QAAQ,CAAC,KAAK,mBAAmB,aAAa,CACjD,QAAQ,CAAC,aAAa,CACvB,EAAE,CACN,CAAC;IACF,OAAO;QACL,GAAG,gEAAgC,gKAAgK;QACnM,GAAG,KAAK;QACR,8PAA8P;KAC/P,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,iCAAiC,GAAG,CACxC,oBAAwC,EAChC,EAAE;IACV,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CACpC,CAAC,QAAQ,EAAE,EAAE,CACX,KAAK,QAAQ,CAAC,KAAK,iBAAiB,aAAa,CAC/C,QAAQ,CAAC,cAAc,CACxB,EAAE,CACN,CAAC;IACF,OAAO;QACL,GAAG,gEAAgC,uHAAuH;QAC1J,GAAG,KAAK;QACR,uLAAuL;KACxL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC;AAEK,MAAM,8BAA8B,GAAG,CAC5C,eAA8B,EACtB,EAAE;IACV,MAAM,QAAQ,GACZ,eAAe,KAAK,IAAI,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC;QACpD,CAAC,CAAC,KAAK,eAAe,GAAG;QACzB,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,mDAAmD,QAAQ,sPAAsP,CAAC;AAC3T,CAAC,CAAC;AARW,QAAA,8BAA8B,kCAQzC;AAEF,MAAM,yBAAyB,GAAG,CAChC,iBAAyB,EACzB,eAA8B,EACtB,EAAE;IACV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;IACnD,OAAO;QACL,GAAG,gEAAgC,uEAAuE,OAAO,8LAA8L;QAC/S,wEAAwE;QACxE,kEAAkE;QAClE,sGAAsG;QACtG,2LAA2L,IAAA,sCAA8B,EACvN,eAAe,CAChB,EAAE;QACH,mGAAmG;KACpG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,2CAA2C,GAAG,CAClD,iBAAyB,EACzB,6BAAqC,EACrC,eAA8B,EACtB,EAAE;IACV,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;IACzD,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IAC3E,OAAO;QACL,GAAG,gEAAgC,uEAAuE,aAAa,uCAAuC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"DefaultSilentSessionMessageComposer.js","sourceRoot":"","sources":["../../../src/domain/usecases/DefaultSilentSessionMessageComposer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -308,10 +308,12 @@ describe('notifySilentTmuxSessions', () => {
|
|
|
308
308
|
(call) => call[0] === 'tmux' && call[1][0] === 'send-keys',
|
|
309
309
|
);
|
|
310
310
|
expect(sendCall?.[1][2]).toBe(SESSION_NAME);
|
|
311
|
-
expect(sendCall?.[1][4]).toContain('
|
|
311
|
+
expect(sendCall?.[1][4]).toContain('has not yet been acknowledged');
|
|
312
312
|
expect(sendCall?.[1][4]).toContain(
|
|
313
|
-
're-raise
|
|
313
|
+
're-raise its content as a fresh, self-contained owner call',
|
|
314
314
|
);
|
|
315
|
+
expect(sendCall?.[1][4]).not.toContain('no longer blocked');
|
|
316
|
+
expect(sendCall?.[1][4]).not.toContain('continue with the next step');
|
|
315
317
|
});
|
|
316
318
|
|
|
317
319
|
it('defers the first cycle then notifies on the next cycle once the persisted candidate state confirms a second consecutive cycle', async () => {
|
|
@@ -113,33 +113,63 @@ describe('DefaultSilentSessionMessageComposer', () => {
|
|
|
113
113
|
3659,
|
|
114
114
|
);
|
|
115
115
|
expect(section).toContain(
|
|
116
|
-
'No output has been observed for 10 minutes, and the owner call raised 60 minutes ago
|
|
116
|
+
'No output has been observed for 10 minutes, and the owner call raised 60 minutes ago has not yet been acknowledged by the owner.',
|
|
117
117
|
);
|
|
118
118
|
});
|
|
119
119
|
|
|
120
|
-
it('
|
|
120
|
+
it('instructs unconditionally to re-raise the content as a fresh self-contained owner call', () => {
|
|
121
121
|
const section = composer.composeMainStalledWithStaleOwnerCallSection(
|
|
122
122
|
600,
|
|
123
123
|
3600,
|
|
124
124
|
);
|
|
125
125
|
expect(section).toContain(
|
|
126
|
-
'
|
|
126
|
+
'Please re-raise its content as a fresh, self-contained owner call.',
|
|
127
127
|
);
|
|
128
128
|
});
|
|
129
129
|
|
|
130
|
-
it('
|
|
130
|
+
it('frames every unanswered owner call kind as awaiting acknowledgment', () => {
|
|
131
131
|
const section = composer.composeMainStalledWithStaleOwnerCallSection(
|
|
132
132
|
600,
|
|
133
133
|
3600,
|
|
134
134
|
);
|
|
135
|
+
expect(section).toContain('acknowledg');
|
|
135
136
|
expect(section).toContain(
|
|
136
|
-
'
|
|
137
|
+
'a completion report, a question, or a decision request',
|
|
138
|
+
);
|
|
139
|
+
expect(section).toContain("still awaiting the owner's acknowledgment");
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('contains no not-blocked escape phrasing and no conditional re-raise phrasing', () => {
|
|
143
|
+
const section = composer.composeMainStalledWithStaleOwnerCallSection(
|
|
144
|
+
600,
|
|
145
|
+
3600,
|
|
146
|
+
);
|
|
147
|
+
expect(section).not.toContain('no longer blocked');
|
|
148
|
+
expect(section).not.toContain('continue with the next step');
|
|
149
|
+
expect(section).not.toContain('If you are still waiting');
|
|
150
|
+
expect(section).not.toContain('If you are');
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('requests a remaining-minutes estimate in the stale-owner-call section', () => {
|
|
154
|
+
const section = composer.composeMainStalledWithStaleOwnerCallSection(
|
|
155
|
+
600,
|
|
156
|
+
3600,
|
|
137
157
|
);
|
|
138
158
|
expect(section).toContain(
|
|
139
159
|
'an estimate of the remaining minutes to finish all tasks',
|
|
140
160
|
);
|
|
141
161
|
});
|
|
142
162
|
|
|
163
|
+
it('states the owner-call format guidance exactly once in the stale-owner-call section', () => {
|
|
164
|
+
const section = composer.composeMainStalledWithStaleOwnerCallSection(
|
|
165
|
+
600,
|
|
166
|
+
3600,
|
|
167
|
+
);
|
|
168
|
+
const formatOccurrences =
|
|
169
|
+
section.split('complete opening and closing pair on one line').length - 1;
|
|
170
|
+
expect(formatOccurrences).toBe(1);
|
|
171
|
+
});
|
|
172
|
+
|
|
143
173
|
it('interpolates the configured owner-call marker into the stale-owner-call format guidance', () => {
|
|
144
174
|
const markedComposer = new DefaultSilentSessionMessageComposer(
|
|
145
175
|
'<<OWNER_CALL>>',
|
|
@@ -161,7 +191,7 @@ describe('DefaultSilentSessionMessageComposer', () => {
|
|
|
161
191
|
3600,
|
|
162
192
|
);
|
|
163
193
|
expect(staleSection).not.toBe(plainSection);
|
|
164
|
-
expect(plainSection).not.toContain('
|
|
194
|
+
expect(plainSection).not.toContain('has not yet been acknowledged');
|
|
165
195
|
});
|
|
166
196
|
|
|
167
197
|
it('emits a distinct idle message for a sub-agent that is only output-idle', () => {
|
|
@@ -77,11 +77,11 @@ const composeMainStalledWithStaleOwnerCallMessage = (
|
|
|
77
77
|
const silentMinutes = Math.floor(mainSilentSeconds / 60);
|
|
78
78
|
const ownerCallAgeMinutes = Math.floor(unansweredOwnerCallAgeSeconds / 60);
|
|
79
79
|
return [
|
|
80
|
-
`${SILENT_SESSION_REMINDER_SENTINEL} This is an automated status check. No output has been observed for ${silentMinutes} minutes, and the owner call raised ${ownerCallAgeMinutes} minutes ago
|
|
81
|
-
`
|
|
80
|
+
`${SILENT_SESSION_REMINDER_SENTINEL} This is an automated status check. No output has been observed for ${silentMinutes} minutes, and the owner call raised ${ownerCallAgeMinutes} minutes ago has not yet been acknowledged by the owner.`,
|
|
81
|
+
`An owner call without an acknowledgment — whether it carried a completion report, a question, or a decision request — is still awaiting the owner's acknowledgment, and the earlier message may have been missed. Please re-raise its content as a fresh, self-contained owner call. ${composeOwnerCallFormatGuidance(
|
|
82
82
|
ownerCallMarker,
|
|
83
83
|
)}`,
|
|
84
|
-
`
|
|
84
|
+
`Please also include in your next output an estimate of the remaining minutes to finish all tasks.`,
|
|
85
85
|
].join('\n');
|
|
86
86
|
};
|
|
87
87
|
|