github-issue-tower-defence-management 2.39.0 → 2.40.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.
Files changed (55) hide show
  1. package/README.md +6 -14
  2. package/bin/adapter/entry-points/console/ui-dist/assets/{index-CqVIONFD.js → index-DWnS9748.js} +3 -3
  3. package/bin/adapter/entry-points/console/ui-dist/index.html +1 -1
  4. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +0 -22
  5. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  6. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js +2 -7
  7. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js.map +1 -1
  8. package/bin/adapter/repositories/ConfigurableSilentSessionMessageComposer.js +0 -13
  9. package/bin/adapter/repositories/ConfigurableSilentSessionMessageComposer.js.map +1 -1
  10. package/bin/domain/usecases/DefaultSilentSessionMessageComposer.js +1 -31
  11. package/bin/domain/usecases/DefaultSilentSessionMessageComposer.js.map +1 -1
  12. package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js +13 -65
  13. package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js.map +1 -1
  14. package/package.json +2 -2
  15. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  16. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts +0 -6
  17. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts.map +1 -1
  18. package/types/adapter/repositories/ConfigurableSilentSessionMessageComposer.d.ts +0 -4
  19. package/types/adapter/repositories/ConfigurableSilentSessionMessageComposer.d.ts.map +1 -1
  20. package/types/domain/entities/LiveSessionActivitySnapshot.d.ts +0 -2
  21. package/types/domain/entities/LiveSessionActivitySnapshot.d.ts.map +1 -1
  22. package/types/domain/usecases/DefaultSilentSessionMessageComposer.d.ts +0 -3
  23. package/types/domain/usecases/DefaultSilentSessionMessageComposer.d.ts.map +1 -1
  24. package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts +1 -9
  25. package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts.map +1 -1
  26. package/types/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.d.ts +0 -2
  27. package/types/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.d.ts.map +1 -1
  28. package/bin/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.js +0 -64
  29. package/bin/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.js.map +0 -1
  30. package/bin/adapter/repositories/FileSystemSessionOutputActivityRepository.js +0 -103
  31. package/bin/adapter/repositories/FileSystemSessionOutputActivityRepository.js.map +0 -1
  32. package/bin/adapter/repositories/NoUnansweredOwnerCallStatusProvider.js +0 -12
  33. package/bin/adapter/repositories/NoUnansweredOwnerCallStatusProvider.js.map +0 -1
  34. package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js +0 -322
  35. package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js.map +0 -1
  36. package/bin/domain/entities/LiveSessionOutputActivity.js +0 -3
  37. package/bin/domain/entities/LiveSessionOutputActivity.js.map +0 -1
  38. package/bin/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.js +0 -3
  39. package/bin/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.js.map +0 -1
  40. package/bin/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.js +0 -3
  41. package/bin/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.js.map +0 -1
  42. package/types/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.d.ts +0 -2
  43. package/types/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.d.ts.map +0 -1
  44. package/types/adapter/repositories/FileSystemSessionOutputActivityRepository.d.ts +0 -7
  45. package/types/adapter/repositories/FileSystemSessionOutputActivityRepository.d.ts.map +0 -1
  46. package/types/adapter/repositories/NoUnansweredOwnerCallStatusProvider.d.ts +0 -5
  47. package/types/adapter/repositories/NoUnansweredOwnerCallStatusProvider.d.ts.map +0 -1
  48. package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts +0 -18
  49. package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts.map +0 -1
  50. package/types/domain/entities/LiveSessionOutputActivity.d.ts +0 -5
  51. package/types/domain/entities/LiveSessionOutputActivity.d.ts.map +0 -1
  52. package/types/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.d.ts +0 -4
  53. package/types/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.d.ts.map +0 -1
  54. package/types/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.d.ts +0 -5
  55. package/types/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.d.ts.map +0 -1
@@ -1,64 +0,0 @@
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
- exports.ownerReplyMarkerDirectoryResolve = void 0;
37
- const path = __importStar(require("path"));
38
- // The status line writes each session's rendered reply time to
39
- // `<STATUS_LINE_MARKER_ROOT_DIRECTORY>/claude-statusline-call-<uid>/<sessionId>.reply_ts`, and it
40
- // resolves that root without consulting TMPDIR. The silent-session monitor runs from a daemon whose
41
- // TMPDIR points at a separate volume, so resolving the same directory through the operating
42
- // system temporary directory would send the reader to a path the writer never uses and the marker
43
- // would silently never be found. CLAUDE_STATUSLINE_CALL_DIR is the single override both sides honour.
44
- const STATUS_LINE_MARKER_ROOT_DIRECTORY = '/tmp';
45
- const STATUS_LINE_MARKER_DIRECTORY_NAME_PREFIX = 'claude-statusline-call-';
46
- const ownerReplyMarkerDirectoryResolve = (configuredDirectory, environment, userId) => {
47
- if (configuredDirectory !== null) {
48
- return configuredDirectory;
49
- }
50
- const tdpmEnvironmentDirectory = environment.TDPM_SILENT_OWNER_REPLY_MARKER_DIRECTORY;
51
- if (tdpmEnvironmentDirectory !== undefined) {
52
- return tdpmEnvironmentDirectory;
53
- }
54
- const statusLineEnvironmentDirectory = environment.CLAUDE_STATUSLINE_CALL_DIR;
55
- if (statusLineEnvironmentDirectory !== undefined) {
56
- return statusLineEnvironmentDirectory;
57
- }
58
- if (userId === null) {
59
- return null;
60
- }
61
- return path.join(STATUS_LINE_MARKER_ROOT_DIRECTORY, `${STATUS_LINE_MARKER_DIRECTORY_NAME_PREFIX}${userId}`);
62
- };
63
- exports.ownerReplyMarkerDirectoryResolve = ownerReplyMarkerDirectoryResolve;
64
- //# sourceMappingURL=ownerReplyMarkerDirectoryResolve.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ownerReplyMarkerDirectoryResolve.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAE7B,+DAA+D;AAC/D,kGAAkG;AAClG,oGAAoG;AACpG,4FAA4F;AAC5F,kGAAkG;AAClG,sGAAsG;AACtG,MAAM,iCAAiC,GAAG,MAAM,CAAC;AACjD,MAAM,wCAAwC,GAAG,yBAAyB,CAAC;AAEpE,MAAM,gCAAgC,GAAG,CAC9C,mBAAkC,EAClC,WAA8B,EAC9B,MAAqB,EACN,EAAE;IACjB,IAAI,mBAAmB,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,MAAM,wBAAwB,GAC5B,WAAW,CAAC,wCAAwC,CAAC;IACvD,IAAI,wBAAwB,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,wBAAwB,CAAC;IAClC,CAAC;IACD,MAAM,8BAA8B,GAAG,WAAW,CAAC,0BAA0B,CAAC;IAC9E,IAAI,8BAA8B,KAAK,SAAS,EAAE,CAAC;QACjD,OAAO,8BAA8B,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CACd,iCAAiC,EACjC,GAAG,wCAAwC,GAAG,MAAM,EAAE,CACvD,CAAC;AACJ,CAAC,CAAC;AAxBW,QAAA,gCAAgC,oCAwB3C"}
@@ -1,103 +0,0 @@
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
- exports.FileSystemSessionOutputActivityRepository = void 0;
37
- const fs = __importStar(require("fs"));
38
- const isRecord = (value) => typeof value === 'object' && value !== null;
39
- const readString = (value, key) => {
40
- const candidate = value[key];
41
- return typeof candidate === 'string' ? candidate : null;
42
- };
43
- const parseEpochMilliseconds = (timestamp) => {
44
- if (timestamp === null) {
45
- return null;
46
- }
47
- const parsed = Date.parse(timestamp);
48
- return Number.isNaN(parsed) ? null : parsed;
49
- };
50
- class FileSystemSessionOutputActivityRepository {
51
- constructor() {
52
- this.listSessionOutputActivities = async (transcriptPathBySessionName) => {
53
- const activities = [];
54
- for (const [sessionName, transcriptPath] of transcriptPathBySessionName) {
55
- const lastAssistantOutputEpochSeconds = this.readLastAssistantOutputEpochSeconds(transcriptPath);
56
- if (lastAssistantOutputEpochSeconds !== null) {
57
- activities.push({
58
- sessionName,
59
- lastOutputEpochSeconds: lastAssistantOutputEpochSeconds,
60
- });
61
- }
62
- }
63
- return activities;
64
- };
65
- this.readLastAssistantOutputEpochSeconds = (transcriptPath) => {
66
- let content;
67
- try {
68
- content = fs.readFileSync(transcriptPath, 'utf8');
69
- }
70
- catch {
71
- return null;
72
- }
73
- let lastAssistantOutputEpochMs = null;
74
- for (const line of content.split('\n')) {
75
- const trimmed = line.trim();
76
- if (trimmed.length === 0) {
77
- continue;
78
- }
79
- let parsed;
80
- try {
81
- parsed = JSON.parse(trimmed);
82
- }
83
- catch {
84
- continue;
85
- }
86
- if (!isRecord(parsed)) {
87
- continue;
88
- }
89
- if (readString(parsed, 'type') === 'assistant') {
90
- const epochMs = parseEpochMilliseconds(readString(parsed, 'timestamp'));
91
- if (epochMs !== null) {
92
- lastAssistantOutputEpochMs = epochMs;
93
- }
94
- }
95
- }
96
- return lastAssistantOutputEpochMs === null
97
- ? null
98
- : Math.floor(lastAssistantOutputEpochMs / 1000);
99
- };
100
- }
101
- }
102
- exports.FileSystemSessionOutputActivityRepository = FileSystemSessionOutputActivityRepository;
103
- //# sourceMappingURL=FileSystemSessionOutputActivityRepository.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FileSystemSessionOutputActivityRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NoUnansweredOwnerCallStatusProvider = void 0;
4
- class NoUnansweredOwnerCallStatusProvider {
5
- constructor() {
6
- this.listUnansweredOwnerCallEpochSecondsBySessionName = (_transcriptPathBySessionName) => {
7
- return Promise.resolve(new Map());
8
- };
9
- }
10
- }
11
- exports.NoUnansweredOwnerCallStatusProvider = NoUnansweredOwnerCallStatusProvider;
12
- //# sourceMappingURL=NoUnansweredOwnerCallStatusProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NoUnansweredOwnerCallStatusProvider.js","sourceRoot":"","sources":["../../../src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts"],"names":[],"mappings":";;;AAEA,MAAa,mCAAmC;IAAhD;QACE,qDAAgD,GAAG,CACjD,4BAAiD,EACnB,EAAE;YAChC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,EAAkB,CAAC,CAAC;QACpD,CAAC,CAAC;IACJ,CAAC;CAAA;AAND,kFAMC"}
@@ -1,322 +0,0 @@
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
- exports.TranscriptOwnerCallStatusProvider = exports.ownerCallMarkerFamilyResolve = void 0;
37
- const fs = __importStar(require("fs"));
38
- const path = __importStar(require("path"));
39
- const silentSessionReminderSentinel_1 = require("../../domain/usecases/silentSessionReminderSentinel");
40
- const isRecord = (value) => typeof value === 'object' && value !== null;
41
- const readString = (value, key) => {
42
- const candidate = value[key];
43
- return typeof candidate === 'string' ? candidate : null;
44
- };
45
- const parseEpochMilliseconds = (timestamp) => {
46
- if (timestamp === null) {
47
- return null;
48
- }
49
- const parsed = Date.parse(timestamp);
50
- return Number.isNaN(parsed) ? null : parsed;
51
- };
52
- const extractText = (content) => {
53
- if (typeof content === 'string') {
54
- return content;
55
- }
56
- if (!Array.isArray(content)) {
57
- return '';
58
- }
59
- const texts = [];
60
- for (const block of content) {
61
- if (isRecord(block) && block.type === 'text') {
62
- const text = readString(block, 'text');
63
- if (text !== null) {
64
- texts.push(text);
65
- }
66
- }
67
- }
68
- return texts.join('\n');
69
- };
70
- // A transcript user entry is only a genuine owner reply when it was actually
71
- // typed (or queued) by the human owner. Claude Code records the provenance of
72
- // each user entry on the top-level `origin` and `promptSource` fields. A
73
- // genuine human prompt is identified by EITHER `origin.kind === 'human'` OR a
74
- // `promptSource` of `typed`/`queued`; the second condition is required because
75
- // older-format transcripts record genuine human replies with a `promptSource`
76
- // of `queued`/`typed` but no `origin` field, and dropping those would leave a
77
- // real owner reply uncounted and the session waiting forever. Every
78
- // system-injected user entry, by contrast, uses a `promptSource` of `system`
79
- // (sub-agent `task-notification` notices, cross-session `peer` messages) or
80
- // `sdk` (spawn prompts), or has neither field (tool results, skill/meta
81
- // entries) — none of which match. Only a genuine human entry may clear an
82
- // outstanding call-to-user; otherwise a system-injected entry would be
83
- // miscounted as the owner answering and a genuinely waiting session would stop
84
- // being suppressed.
85
- const isGenuineHumanEntry = (parsed) => {
86
- const origin = parsed.origin;
87
- if (isRecord(origin) && readString(origin, 'kind') === 'human') {
88
- return true;
89
- }
90
- const promptSource = readString(parsed, 'promptSource');
91
- return promptSource === 'typed' || promptSource === 'queued';
92
- };
93
- const hasOwnerTextReply = (content) => {
94
- if (typeof content === 'string') {
95
- if (content.length === 0) {
96
- return false;
97
- }
98
- // A monitor-injected self-check reminder lands in the target session's
99
- // transcript as a user text entry. It carries the reminder sentinel, so it
100
- // is the monitor talking to the session, not the owner replying. It MUST NOT
101
- // advance the last-owner-reply time, otherwise an outstanding call-to-user
102
- // is wrongly treated as answered and the session stops being suppressed.
103
- return !content.includes(silentSessionReminderSentinel_1.SILENT_SESSION_REMINDER_SENTINEL);
104
- }
105
- if (!Array.isArray(content)) {
106
- return false;
107
- }
108
- const hasTextBlock = content.some((block) => isRecord(block) && block.type === 'text');
109
- if (!hasTextBlock) {
110
- return false;
111
- }
112
- return !extractText(content).includes(silentSessionReminderSentinel_1.SILENT_SESSION_REMINDER_SENTINEL);
113
- };
114
- const OWNER_CALL_TAG_TERMINATOR = '>';
115
- const OWNER_CALL_CANDIDATE_TAG_INFIX = '-pending';
116
- const OWNER_CALL_CANDIDATE_TAG_SUFFIX = `${OWNER_CALL_CANDIDATE_TAG_INFIX}${OWNER_CALL_TAG_TERMINATOR}`;
117
- const ownerCallMarkerFamilyResolve = (marker) => marker.endsWith(OWNER_CALL_TAG_TERMINATOR)
118
- ? [
119
- marker,
120
- `${marker.slice(0, -OWNER_CALL_TAG_TERMINATOR.length)}${OWNER_CALL_CANDIDATE_TAG_SUFFIX}`,
121
- ]
122
- : [marker];
123
- exports.ownerCallMarkerFamilyResolve = ownerCallMarkerFamilyResolve;
124
- // A reply the owner types while the agent is still working is NOT written as a `user` entry: the
125
- // running turn consumes it from the queue, and the transcript keeps only
126
- // {"type":"queue-operation","operation":"enqueue","content":"<the text>"} plus its `remove` twin.
127
- // Reading `user` entries alone therefore misses every mid-turn reply, leaves the call outstanding
128
- // for the rest of the session, and suppresses the stall reminder of a session the owner has
129
- // already answered. The exclusions match the ones the status line applies to the same entries, so
130
- // a system-injected enqueue never counts as an owner reply.
131
- const INJECTED_ENQUEUE_CONTENT_MARKERS = [
132
- silentSessionReminderSentinel_1.SILENT_SESSION_REMINDER_SENTINEL,
133
- '<system-reminder>',
134
- 'UserPromptSubmit hook',
135
- '<task-notification>',
136
- 'SYSTEM NOTIFICATION',
137
- '<local-command-stdout>',
138
- '<local-command-caveat>',
139
- '<command-name>',
140
- 'This session is being continued from a previous conversation',
141
- ];
142
- const isOwnerEnqueuedReply = (parsed) => {
143
- if (readString(parsed, 'operation') !== 'enqueue') {
144
- return false;
145
- }
146
- const content = readString(parsed, 'content');
147
- if (content === null || content.length === 0) {
148
- return false;
149
- }
150
- return !INJECTED_ENQUEUE_CONTENT_MARKERS.some((injectedMarker) => content.includes(injectedMarker));
151
- };
152
- const TRANSCRIPT_FILE_EXTENSION = '.jsonl';
153
- const OWNER_REPLY_MARKER_FILE_EXTENSION = '.reply_ts';
154
- const SUPPRESSED_OWNER_CALL_MARKER_FILE_EXTENSION = '.suppress_ts';
155
- const APPROVED_OWNER_CALL_MARKER_FILE_EXTENSION = '.call_ts';
156
- const EMITTED_OWNER_CALL_MARKER_FILE_EXTENSION = '.call_emitted';
157
- const UNSAFE_SESSION_ID_CHARACTER_PATTERN = /[^A-Za-z0-9._-]/g;
158
- const isCandidateOwnerCallMarker = (marker) => marker.endsWith(OWNER_CALL_CANDIDATE_TAG_SUFFIX);
159
- class TranscriptOwnerCallStatusProvider {
160
- constructor(ownerCallMarker, ownerReplyMarkerDirectory = null) {
161
- this.ownerReplyMarkerDirectory = ownerReplyMarkerDirectory;
162
- this.transcriptScanByPath = new Map();
163
- this.listUnansweredOwnerCallEpochSecondsBySessionName = async (transcriptPathBySessionName) => {
164
- const unansweredOwnerCallEpochSecondsBySessionName = new Map();
165
- if (this.ownerCallMarkerFamily.length === 0) {
166
- return unansweredOwnerCallEpochSecondsBySessionName;
167
- }
168
- for (const [sessionName, transcriptPath] of transcriptPathBySessionName) {
169
- const unansweredOwnerCallEpochMs = this.findUnansweredOwnerCallEpochMs(transcriptPath);
170
- if (unansweredOwnerCallEpochMs !== null) {
171
- unansweredOwnerCallEpochSecondsBySessionName.set(sessionName, Math.floor(unansweredOwnerCallEpochMs / 1000));
172
- }
173
- }
174
- return unansweredOwnerCallEpochSecondsBySessionName;
175
- };
176
- this.scanTranscript = (transcriptPath) => {
177
- const alreadyScanned = this.transcriptScanByPath.get(transcriptPath);
178
- if (alreadyScanned !== undefined) {
179
- return alreadyScanned;
180
- }
181
- const scan = this.readTranscriptScan(transcriptPath);
182
- this.transcriptScanByPath.set(transcriptPath, scan);
183
- return scan;
184
- };
185
- this.readTranscriptScan = (transcriptPath) => {
186
- const markerFamily = this.ownerCallMarkerFamily;
187
- let content;
188
- try {
189
- content = fs.readFileSync(transcriptPath, 'utf8');
190
- }
191
- catch {
192
- return null;
193
- }
194
- const ownerCalls = [];
195
- let lastOwnerReplyEpochMs = null;
196
- for (const line of content.split('\n')) {
197
- const trimmed = line.trim();
198
- if (trimmed.length === 0) {
199
- continue;
200
- }
201
- let parsed;
202
- try {
203
- parsed = JSON.parse(trimmed);
204
- }
205
- catch {
206
- continue;
207
- }
208
- if (!isRecord(parsed)) {
209
- continue;
210
- }
211
- const epochMs = parseEpochMilliseconds(readString(parsed, 'timestamp'));
212
- if (epochMs === null) {
213
- continue;
214
- }
215
- const type = readString(parsed, 'type');
216
- const message = parsed.message;
217
- const messageContent = isRecord(message) ? message.content : null;
218
- if (type === 'assistant') {
219
- const assistantText = extractText(messageContent);
220
- const matchedMarkers = markerFamily.filter((marker) => assistantText.includes(marker));
221
- if (matchedMarkers.length > 0) {
222
- ownerCalls.push({
223
- epochMs,
224
- candidateOnly: matchedMarkers.every(isCandidateOwnerCallMarker),
225
- });
226
- }
227
- }
228
- if (type === 'user' &&
229
- isGenuineHumanEntry(parsed) &&
230
- hasOwnerTextReply(messageContent)) {
231
- lastOwnerReplyEpochMs = epochMs;
232
- }
233
- if (type === 'queue-operation' && isOwnerEnqueuedReply(parsed)) {
234
- lastOwnerReplyEpochMs =
235
- lastOwnerReplyEpochMs === null || epochMs > lastOwnerReplyEpochMs
236
- ? epochMs
237
- : lastOwnerReplyEpochMs;
238
- }
239
- }
240
- return { ownerCalls, lastOwnerReplyEpochMs };
241
- };
242
- this.resolveReplyEpochMs = (transcriptPath, lastOwnerReplyEpochMs) => {
243
- const markerReplyEpochMs = this.readOwnerReplyMarkerEpochMs(transcriptPath);
244
- return markerReplyEpochMs !== null &&
245
- (lastOwnerReplyEpochMs === null ||
246
- markerReplyEpochMs > lastOwnerReplyEpochMs)
247
- ? markerReplyEpochMs
248
- : lastOwnerReplyEpochMs;
249
- };
250
- this.findUnansweredOwnerCallEpochMs = (transcriptPath) => {
251
- const transcript = this.scanTranscript(transcriptPath);
252
- if (transcript === null) {
253
- return null;
254
- }
255
- const lastOwnerCall = transcript.ownerCalls[transcript.ownerCalls.length - 1] ?? null;
256
- if (lastOwnerCall === null) {
257
- return null;
258
- }
259
- const lastOwnerCallEpochMs = lastOwnerCall.epochMs;
260
- if (this.isCallSuppressedUndelivered(transcriptPath, lastOwnerCallEpochMs)) {
261
- return null;
262
- }
263
- if (lastOwnerCall.candidateOnly &&
264
- !this.isCandidateCallDelivered(transcriptPath, lastOwnerCallEpochMs)) {
265
- return null;
266
- }
267
- const resolvedReplyEpochMs = this.resolveReplyEpochMs(transcriptPath, transcript.lastOwnerReplyEpochMs);
268
- return resolvedReplyEpochMs === null ||
269
- lastOwnerCallEpochMs > resolvedReplyEpochMs
270
- ? lastOwnerCallEpochMs
271
- : null;
272
- };
273
- // The owner sees only the status line, so the reply time it renders is the value the owner
274
- // believes the fleet is acting on. The status line writes that value to a per-session marker
275
- // file, and reading it here keeps this decision and the owner's own view of it from diverging.
276
- // The transcript-derived value still stands on its own: an absent, unreadable, or older marker
277
- // changes nothing, so a fresh host with no markers yet behaves exactly as before.
278
- this.readOwnerReplyMarkerEpochMs = (transcriptPath) => this.readMarkerEpochMs(transcriptPath, OWNER_REPLY_MARKER_FILE_EXTENSION);
279
- this.isCallSuppressedUndelivered = (transcriptPath, ownerCallEpochMs) => {
280
- const suppressedEpochMs = this.readMarkerEpochMs(transcriptPath, SUPPRESSED_OWNER_CALL_MARKER_FILE_EXTENSION);
281
- if (suppressedEpochMs === null || suppressedEpochMs !== ownerCallEpochMs) {
282
- return false;
283
- }
284
- const approvedEpochMs = this.readMarkerEpochMs(transcriptPath, APPROVED_OWNER_CALL_MARKER_FILE_EXTENSION);
285
- return approvedEpochMs !== suppressedEpochMs;
286
- };
287
- this.isCandidateCallDelivered = (transcriptPath, ownerCallEpochMs) => {
288
- if (this.ownerReplyMarkerDirectory === null) {
289
- return true;
290
- }
291
- const emittedEpochMs = this.readMarkerEpochMs(transcriptPath, EMITTED_OWNER_CALL_MARKER_FILE_EXTENSION);
292
- if (emittedEpochMs === ownerCallEpochMs) {
293
- return true;
294
- }
295
- return (this.readMarkerEpochMs(transcriptPath, APPROVED_OWNER_CALL_MARKER_FILE_EXTENSION) === ownerCallEpochMs);
296
- };
297
- this.readMarkerEpochMs = (transcriptPath, markerFileExtension) => {
298
- if (this.ownerReplyMarkerDirectory === null) {
299
- return null;
300
- }
301
- const fileName = path.basename(transcriptPath);
302
- const sessionId = fileName.endsWith(TRANSCRIPT_FILE_EXTENSION)
303
- ? fileName.slice(0, -TRANSCRIPT_FILE_EXTENSION.length)
304
- : fileName;
305
- const safeSessionId = sessionId.replace(UNSAFE_SESSION_ID_CHARACTER_PATTERN, '_');
306
- let markerContent;
307
- try {
308
- markerContent = fs.readFileSync(path.join(this.ownerReplyMarkerDirectory, `${safeSessionId}${markerFileExtension}`), 'utf8');
309
- }
310
- catch {
311
- return null;
312
- }
313
- return parseEpochMilliseconds(markerContent.split('\n')[0].trim());
314
- };
315
- this.ownerCallMarkerFamily =
316
- ownerCallMarker === null || ownerCallMarker.length === 0
317
- ? []
318
- : (0, exports.ownerCallMarkerFamilyResolve)(ownerCallMarker);
319
- }
320
- }
321
- exports.TranscriptOwnerCallStatusProvider = TranscriptOwnerCallStatusProvider;
322
- //# sourceMappingURL=TranscriptOwnerCallStatusProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TranscriptOwnerCallStatusProvider.js","sourceRoot":"","sources":["../../../src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=LiveSessionOutputActivity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LiveSessionOutputActivity.js","sourceRoot":"","sources":["../../../src/domain/entities/LiveSessionOutputActivity.ts"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=OwnerCallStatusProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OwnerCallStatusProvider.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=SessionOutputActivityRepository.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionOutputActivityRepository.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export declare const ownerReplyMarkerDirectoryResolve: (configuredDirectory: string | null, environment: NodeJS.ProcessEnv, userId: number | null) => string | null;
2
- //# sourceMappingURL=ownerReplyMarkerDirectoryResolve.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ownerReplyMarkerDirectoryResolve.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,gCAAgC,GAC3C,qBAAqB,MAAM,GAAG,IAAI,EAClC,aAAa,MAAM,CAAC,UAAU,EAC9B,QAAQ,MAAM,GAAG,IAAI,KACpB,MAAM,GAAG,IAoBX,CAAC"}
@@ -1,7 +0,0 @@
1
- import { LiveSessionOutputActivity } from '../../domain/entities/LiveSessionOutputActivity';
2
- import { SessionOutputActivityRepository } from '../../domain/usecases/adapter-interfaces/SessionOutputActivityRepository';
3
- export declare class FileSystemSessionOutputActivityRepository implements SessionOutputActivityRepository {
4
- listSessionOutputActivities: (transcriptPathBySessionName: Map<string, string>) => Promise<LiveSessionOutputActivity[]>;
5
- private readLastAssistantOutputEpochSeconds;
6
- }
7
- //# sourceMappingURL=FileSystemSessionOutputActivityRepository.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FileSystemSessionOutputActivityRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAE,MAAM,0EAA0E,CAAC;AAqB3H,qBAAa,yCAA0C,YAAW,+BAA+B;IAC/F,2BAA2B,GACzB,6BAA6B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/C,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAarC;IAEF,OAAO,CAAC,mCAAmC,CAkCzC;CACH"}
@@ -1,5 +0,0 @@
1
- import { OwnerCallStatusProvider } from '../../domain/usecases/adapter-interfaces/OwnerCallStatusProvider';
2
- export declare class NoUnansweredOwnerCallStatusProvider implements OwnerCallStatusProvider {
3
- listUnansweredOwnerCallEpochSecondsBySessionName: (_transcriptPathBySessionName: Map<string, string>) => Promise<Map<string, number>>;
4
- }
5
- //# sourceMappingURL=NoUnansweredOwnerCallStatusProvider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NoUnansweredOwnerCallStatusProvider.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kEAAkE,CAAC;AAE3G,qBAAa,mCAAoC,YAAW,uBAAuB;IACjF,gDAAgD,GAC9C,8BAA8B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAChD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAE7B;CACH"}
@@ -1,18 +0,0 @@
1
- import { OwnerCallStatusProvider } from '../../domain/usecases/adapter-interfaces/OwnerCallStatusProvider';
2
- export declare const ownerCallMarkerFamilyResolve: (marker: string) => string[];
3
- export declare class TranscriptOwnerCallStatusProvider implements OwnerCallStatusProvider {
4
- private readonly ownerReplyMarkerDirectory;
5
- private readonly ownerCallMarkerFamily;
6
- private readonly transcriptScanByPath;
7
- constructor(ownerCallMarker: string | null, ownerReplyMarkerDirectory?: string | null);
8
- listUnansweredOwnerCallEpochSecondsBySessionName: (transcriptPathBySessionName: Map<string, string>) => Promise<Map<string, number>>;
9
- private scanTranscript;
10
- private readTranscriptScan;
11
- private resolveReplyEpochMs;
12
- private findUnansweredOwnerCallEpochMs;
13
- private readOwnerReplyMarkerEpochMs;
14
- private isCallSuppressedUndelivered;
15
- private isCandidateCallDelivered;
16
- private readMarkerEpochMs;
17
- }
18
- //# sourceMappingURL=TranscriptOwnerCallStatusProvider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TranscriptOwnerCallStatusProvider.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kEAAkE,CAAC;AAuG3G,eAAO,MAAM,4BAA4B,GAAI,QAAQ,MAAM,KAAG,MAAM,EAMtD,CAAC;AA4Cf,qBAAa,iCAAkC,YAAW,uBAAuB;IAU7E,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAT5C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAW;IAEjD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAGjC;gBAGF,eAAe,EAAE,MAAM,GAAG,IAAI,EACb,yBAAyB,GAAE,MAAM,GAAG,IAAW;IAQlE,gDAAgD,GAC9C,6BAA6B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAmB7B;IAEF,OAAO,CAAC,cAAc,CAUpB;IAEF,OAAO,CAAC,kBAAkB,CA4DxB;IAEF,OAAO,CAAC,mBAAmB,CAUzB;IAEF,OAAO,CAAC,8BAA8B,CAgCpC;IAOF,OAAO,CAAC,2BAA2B,CAGyC;IAE5E,OAAO,CAAC,2BAA2B,CAgBjC;IAEF,OAAO,CAAC,wBAAwB,CAoB9B;IAEF,OAAO,CAAC,iBAAiB,CA4BvB;CACH"}
@@ -1,5 +0,0 @@
1
- export type LiveSessionOutputActivity = {
2
- sessionName: string;
3
- lastOutputEpochSeconds: number;
4
- };
5
- //# sourceMappingURL=LiveSessionOutputActivity.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LiveSessionOutputActivity.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/LiveSessionOutputActivity.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;CAChC,CAAC"}
@@ -1,4 +0,0 @@
1
- export interface OwnerCallStatusProvider {
2
- listUnansweredOwnerCallEpochSecondsBySessionName: (transcriptPathBySessionName: Map<string, string>) => Promise<Map<string, number>>;
3
- }
4
- //# sourceMappingURL=OwnerCallStatusProvider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OwnerCallStatusProvider.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,gDAAgD,EAAE,CAChD,2BAA2B,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC7C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACnC"}