@principal-ai/subsystems-core 0.44.0 → 0.44.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 (61) hide show
  1. package/dist/agent-sessions/fixture.d.ts +80 -0
  2. package/dist/agent-sessions/fixture.d.ts.map +1 -0
  3. package/dist/agent-sessions/fixture.js +130 -0
  4. package/dist/agent-sessions/fixture.js.map +1 -0
  5. package/dist/agent-sessions/index.d.ts +3 -0
  6. package/dist/agent-sessions/index.d.ts.map +1 -0
  7. package/dist/agent-sessions/index.js +6 -0
  8. package/dist/agent-sessions/index.js.map +1 -0
  9. package/dist/index.d.ts +16 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +36 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/node.d.ts +22 -0
  14. package/dist/node.d.ts.map +1 -0
  15. package/dist/node.js +55 -0
  16. package/dist/node.js.map +1 -0
  17. package/dist/opencode/OpenCodeEventStore.d.ts +25 -0
  18. package/dist/opencode/OpenCodeEventStore.d.ts.map +1 -0
  19. package/dist/opencode/OpenCodeEventStore.js +182 -0
  20. package/dist/opencode/OpenCodeEventStore.js.map +1 -0
  21. package/dist/opencode/agent-sessions.d.ts +46 -0
  22. package/dist/opencode/agent-sessions.d.ts.map +1 -0
  23. package/dist/opencode/agent-sessions.js +302 -0
  24. package/dist/opencode/agent-sessions.js.map +1 -0
  25. package/dist/opencode/index.d.ts +6 -0
  26. package/dist/opencode/index.d.ts.map +1 -0
  27. package/dist/opencode/index.js +15 -0
  28. package/dist/opencode/index.js.map +1 -0
  29. package/dist/opencode/node-path-adapter.d.ts +25 -0
  30. package/dist/opencode/node-path-adapter.d.ts.map +1 -0
  31. package/dist/opencode/node-path-adapter.js +188 -0
  32. package/dist/opencode/node-path-adapter.js.map +1 -0
  33. package/dist/opencode/pipeline.d.ts +42 -0
  34. package/dist/opencode/pipeline.d.ts.map +1 -0
  35. package/dist/opencode/pipeline.js +90 -0
  36. package/dist/opencode/pipeline.js.map +1 -0
  37. package/dist/opencode/types.d.ts +39 -0
  38. package/dist/opencode/types.d.ts.map +1 -0
  39. package/dist/opencode/types.js +3 -0
  40. package/dist/opencode/types.js.map +1 -0
  41. package/dist/storage/topic-types.d.ts +203 -0
  42. package/dist/storage/topic-types.d.ts.map +1 -0
  43. package/dist/storage/topic-types.js +60 -0
  44. package/dist/storage/topic-types.js.map +1 -0
  45. package/dist/storage/topicStore.d.ts +131 -0
  46. package/dist/storage/topicStore.d.ts.map +1 -0
  47. package/dist/storage/topicStore.js +341 -0
  48. package/dist/storage/topicStore.js.map +1 -0
  49. package/dist/types/index.d.ts +7 -0
  50. package/dist/types/index.d.ts.map +1 -0
  51. package/dist/types/index.js +23 -0
  52. package/dist/types/index.js.map +1 -0
  53. package/dist/types/subsystem-model.d.ts +388 -0
  54. package/dist/types/subsystem-model.d.ts.map +1 -0
  55. package/dist/types/subsystem-model.js +87 -0
  56. package/dist/types/subsystem-model.js.map +1 -0
  57. package/dist/validation.d.ts +24 -0
  58. package/dist/validation.d.ts.map +1 -0
  59. package/dist/validation.js +112 -0
  60. package/dist/validation.js.map +1 -0
  61. package/package.json +2 -1
@@ -0,0 +1,46 @@
1
+ import { type UniversalAgentSessionEvent } from "@principal-ai/agent-monitoring";
2
+ import { NodePathNormalizationAdapter, accumulateEvents, collectRepositories, normalizeEvents, normalizeEventsWithAdapter } from "./pipeline";
3
+ export { NodePathNormalizationAdapter, normalizeEvents, normalizeEventsWithAdapter, accumulateEvents, collectRepositories, };
4
+ /**
5
+ * Shared, agent-agnostic session access: list + fetch across Cline, opencode,
6
+ * pi, Grok, and Codex, normalizing raw events into repo-aware universal events.
7
+ *
8
+ * This is the single source of truth for CLI and principal-studio session pulling.
9
+ * opencode listing delegates to `OpenCodeEventStore.listSessionsWithSummaries()`,
10
+ * which already builds parent/child groups and excludes subagent (child) sessions
11
+ * from the standalone list.
12
+ */
13
+ export type SupportedSessionAgent = "cline" | "codex" | "cursor" | "opencode" | "pi" | "grok" | "unknown";
14
+ export interface AgentSessionSummary {
15
+ agent: SupportedSessionAgent;
16
+ sessionId: string;
17
+ title: string;
18
+ createdAt: string;
19
+ eventCount: number;
20
+ isFinished: boolean;
21
+ parentID?: string;
22
+ }
23
+ export interface AgentSessionMeta {
24
+ sessionName: string;
25
+ sessionTask: string;
26
+ workingDirectory: string;
27
+ createdAt?: string;
28
+ }
29
+ /** List sessions from all supported agents. Top-level only by default. */
30
+ export declare function listAgentSessions(options?: {
31
+ dbPath?: string;
32
+ }): AgentSessionSummary[];
33
+ /** Detect which agent a session id belongs to. */
34
+ export declare function detectAgent(sessionId: string): "cline" | "opencode" | "pi" | "grok" | "codex" | "cursor";
35
+ /**
36
+ * Fetch a session's raw universal events from the appropriate source.
37
+ */
38
+ export declare function fetchRawEvents(sessionId: string, options?: {
39
+ agent?: "cline" | "codex" | "cursor" | "opencode" | "pi" | "grok";
40
+ dbPath?: string;
41
+ }): {
42
+ agent: "cline" | "codex" | "cursor" | "opencode" | "pi" | "grok";
43
+ events: UniversalAgentSessionEvent[];
44
+ sessionMeta: AgentSessionMeta;
45
+ };
46
+ //# sourceMappingURL=agent-sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-sessions.d.ts","sourceRoot":"","sources":["../../src/opencode/agent-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,0BAA0B,EAChC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,0BAA0B,EAE3B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,4BAA4B,EAC5B,eAAe,EACf,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,GACpB,CAAC;AAEF;;;;;;;;GAQG;AAEH,MAAM,MAAM,qBAAqB,GAC7B,OAAO,GACP,OAAO,GACP,QAAQ,GACR,UAAU,GACV,IAAI,GACJ,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsJD,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,mBAAmB,EAAE,CAqCvB;AAED,kDAAkD;AAClD,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,GAChB,OAAO,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAO3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,CAAC;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,GACL;IACD,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,CAAC;IACjE,MAAM,EAAE,0BAA0B,EAAE,CAAC;IACrC,WAAW,EAAE,gBAAgB,CAAC;CAC/B,CAkGA"}
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchRawEvents = exports.detectAgent = exports.listAgentSessions = exports.collectRepositories = exports.accumulateEvents = exports.normalizeEventsWithAdapter = exports.normalizeEvents = exports.NodePathNormalizationAdapter = void 0;
4
+ const agent_monitoring_1 = require("@principal-ai/agent-monitoring");
5
+ const OpenCodeEventStore_1 = require("./OpenCodeEventStore");
6
+ const pipeline_1 = require("./pipeline");
7
+ Object.defineProperty(exports, "NodePathNormalizationAdapter", { enumerable: true, get: function () { return pipeline_1.NodePathNormalizationAdapter; } });
8
+ Object.defineProperty(exports, "accumulateEvents", { enumerable: true, get: function () { return pipeline_1.accumulateEvents; } });
9
+ Object.defineProperty(exports, "collectRepositories", { enumerable: true, get: function () { return pipeline_1.collectRepositories; } });
10
+ Object.defineProperty(exports, "normalizeEvents", { enumerable: true, get: function () { return pipeline_1.normalizeEvents; } });
11
+ Object.defineProperty(exports, "normalizeEventsWithAdapter", { enumerable: true, get: function () { return pipeline_1.normalizeEventsWithAdapter; } });
12
+ const clineReader = new agent_monitoring_1.ClineSessionReader();
13
+ const piReader = new agent_monitoring_1.PiSessionReader();
14
+ const grokReader = new agent_monitoring_1.GrokSessionReader();
15
+ const codexReader = new agent_monitoring_1.CodexSessionReader();
16
+ const cursorReader = new agent_monitoring_1.CursorSessionReader();
17
+ function isClineSession(sessionId) {
18
+ return clineReader.readSession(sessionId) !== null;
19
+ }
20
+ function isPiSession(sessionId) {
21
+ return piReader.readSession(sessionId) !== null;
22
+ }
23
+ function isGrokSession(sessionId) {
24
+ return grokReader.readSession(sessionId) !== null;
25
+ }
26
+ function isCodexSession(sessionId) {
27
+ return codexReader.readSession(sessionId) !== null;
28
+ }
29
+ function isCursorSession(sessionId) {
30
+ return cursorReader.readSession(sessionId) !== null;
31
+ }
32
+ /** List Cline CLI sessions from the durable on-disk transcript. */
33
+ function listClineSessions() {
34
+ return clineReader.listSessions().map((record) => {
35
+ const meta = record.metadata;
36
+ const promptText = (meta.prompt ?? "").trim();
37
+ const title = promptText.length > 0
38
+ ? promptText.length > 80
39
+ ? `${promptText.slice(0, 80)}…`
40
+ : promptText
41
+ : "Cline session";
42
+ return {
43
+ agent: "cline",
44
+ sessionId: record.sessionId,
45
+ title,
46
+ createdAt: meta.started_at ?? "",
47
+ eventCount: clineReader.readMessages(record.sessionId)?.messages.length ?? 0,
48
+ isFinished: meta.status === "completed" || meta.status === "failed",
49
+ };
50
+ });
51
+ }
52
+ /** List pi CLI sessions from the durable on-disk JSONL transcripts. */
53
+ function listPiSessions() {
54
+ return piReader.listSessions().map((record) => {
55
+ const promptText = (record.firstPrompt ?? "").trim();
56
+ const title = promptText.length > 0
57
+ ? promptText.length > 80
58
+ ? `${promptText.slice(0, 80)}…`
59
+ : promptText
60
+ : "pi session";
61
+ return {
62
+ agent: "pi",
63
+ sessionId: record.sessionId,
64
+ title,
65
+ createdAt: record.header.timestamp ?? "",
66
+ eventCount: record.messageCount,
67
+ // pi transcripts carry no finished marker; the principal-studio appends a
68
+ // synthesized session-end event at read time.
69
+ isFinished: false,
70
+ };
71
+ });
72
+ }
73
+ /** List Grok Build sessions from ~/.grok/sessions durable JSONL. */
74
+ function listGrokSessions() {
75
+ return grokReader.listSessions().map((record) => {
76
+ return {
77
+ agent: "grok",
78
+ sessionId: record.sessionId,
79
+ title: record.title || "Grok session",
80
+ createdAt: record.createdAt,
81
+ eventCount: record.messageCount,
82
+ isFinished: false,
83
+ parentID: record.parentSessionId,
84
+ };
85
+ });
86
+ }
87
+ /** List Codex sessions from durable rollout JSONL. */
88
+ function listCodexSessions() {
89
+ return codexReader.listSessions().map((record) => ({
90
+ agent: "codex",
91
+ sessionId: record.sessionId,
92
+ title: record.firstPrompt || "Codex session",
93
+ createdAt: typeof record.meta.timestamp === "string"
94
+ ? record.meta.timestamp
95
+ : new Date(record.lastActivity).toISOString(),
96
+ eventCount: record.messageCount,
97
+ isFinished: false,
98
+ }));
99
+ }
100
+ /** List Cursor IDE agent chats from ~/.cursor/chats. */
101
+ function listCursorSessions() {
102
+ return cursorReader.listSessions().map((record) => ({
103
+ agent: "cursor",
104
+ sessionId: record.sessionId,
105
+ title: record.title || "Cursor session",
106
+ createdAt: record.createdAt || new Date(record.lastActivity).toISOString(),
107
+ eventCount: record.messageCount,
108
+ isFinished: false,
109
+ }));
110
+ }
111
+ /**
112
+ * List opencode sessions, top-level only by default. Delegates to the store's
113
+ * grouped `listSessionsWithSummaries()` which excludes subagent (child) sessions.
114
+ */
115
+ function listOpencodeSessions(dbPath) {
116
+ const store = new OpenCodeEventStore_1.OpenCodeEventStore({ dbPath });
117
+ try {
118
+ const result = store.listSessionsWithSummaries(50);
119
+ const toSummary = (s) => ({
120
+ agent: "opencode",
121
+ sessionId: s.id,
122
+ title: s.title,
123
+ createdAt: s.createdAt,
124
+ eventCount: s.eventCount,
125
+ isFinished: s.isFinished,
126
+ });
127
+ const standalone = [
128
+ ...result.standalone.map(toSummary),
129
+ ...result.groups.map((g) => toSummary(g.parent)),
130
+ ];
131
+ // Sort newest-first by createdAt
132
+ return standalone.sort((a, b) => b.createdAt < a.createdAt ? -1 : b.createdAt > a.createdAt ? 1 : 0);
133
+ }
134
+ finally {
135
+ store.close();
136
+ }
137
+ }
138
+ /** List sessions from all supported agents. Top-level only by default. */
139
+ function listAgentSessions(options = {}) {
140
+ const all = [];
141
+ let firstError = null;
142
+ try {
143
+ all.push(...listOpencodeSessions(options.dbPath));
144
+ }
145
+ catch (err) {
146
+ firstError = err;
147
+ }
148
+ try {
149
+ all.push(...listClineSessions());
150
+ }
151
+ catch (err) {
152
+ if (!firstError)
153
+ firstError = err;
154
+ }
155
+ try {
156
+ all.push(...listPiSessions());
157
+ }
158
+ catch (err) {
159
+ if (!firstError)
160
+ firstError = err;
161
+ }
162
+ try {
163
+ all.push(...listGrokSessions());
164
+ }
165
+ catch (err) {
166
+ if (!firstError)
167
+ firstError = err;
168
+ }
169
+ try {
170
+ all.push(...listCodexSessions());
171
+ }
172
+ catch (err) {
173
+ if (!firstError)
174
+ firstError = err;
175
+ }
176
+ try {
177
+ all.push(...listCursorSessions());
178
+ }
179
+ catch (err) {
180
+ if (!firstError)
181
+ firstError = err;
182
+ }
183
+ if (all.length === 0 && firstError) {
184
+ throw firstError;
185
+ }
186
+ return all;
187
+ }
188
+ exports.listAgentSessions = listAgentSessions;
189
+ /** Detect which agent a session id belongs to. */
190
+ function detectAgent(sessionId) {
191
+ if (isClineSession(sessionId))
192
+ return "cline";
193
+ if (isPiSession(sessionId))
194
+ return "pi";
195
+ if (isGrokSession(sessionId))
196
+ return "grok";
197
+ if (isCodexSession(sessionId))
198
+ return "codex";
199
+ if (isCursorSession(sessionId))
200
+ return "cursor";
201
+ return "opencode";
202
+ }
203
+ exports.detectAgent = detectAgent;
204
+ /**
205
+ * Fetch a session's raw universal events from the appropriate source.
206
+ */
207
+ function fetchRawEvents(sessionId, options = {}) {
208
+ const agent = options.agent ?? detectAgent(sessionId);
209
+ if (agent === "cline") {
210
+ const record = clineReader.readSession(sessionId);
211
+ const promptText = (record?.metadata.prompt ?? "").trim();
212
+ return {
213
+ agent,
214
+ events: clineReader.toUniversalEvents(sessionId),
215
+ sessionMeta: {
216
+ sessionName: "cline",
217
+ sessionTask: (promptText.length > 80 ? `${promptText.slice(0, 80)}…` : promptText) ||
218
+ "Cline session",
219
+ workingDirectory: record?.metadata.workspace_root ?? record?.metadata.cwd ?? "",
220
+ },
221
+ };
222
+ }
223
+ if (agent === "pi") {
224
+ const record = piReader.readSession(sessionId);
225
+ const promptText = (record?.firstPrompt ?? "").trim();
226
+ return {
227
+ agent,
228
+ events: piReader.toUniversalEvents(sessionId),
229
+ sessionMeta: {
230
+ sessionName: "pi",
231
+ sessionTask: (promptText.length > 80 ? `${promptText.slice(0, 80)}…` : promptText) || "pi session",
232
+ workingDirectory: "",
233
+ },
234
+ };
235
+ }
236
+ if (agent === "grok") {
237
+ const record = grokReader.readSession(sessionId);
238
+ return {
239
+ agent,
240
+ events: grokReader.toUniversalEvents(sessionId),
241
+ sessionMeta: {
242
+ sessionName: "grok",
243
+ sessionTask: record?.title || "Grok session",
244
+ workingDirectory: record?.cwd ?? "",
245
+ createdAt: record?.createdAt,
246
+ },
247
+ };
248
+ }
249
+ if (agent === "codex") {
250
+ const record = codexReader.readSession(sessionId);
251
+ const promptText = (record?.firstPrompt ?? "").trim();
252
+ return {
253
+ agent,
254
+ events: codexReader.toUniversalEvents(sessionId),
255
+ sessionMeta: {
256
+ sessionName: "codex",
257
+ sessionTask: (promptText.length > 80 ? `${promptText.slice(0, 80)}…` : promptText) ||
258
+ "Codex session",
259
+ workingDirectory: record?.cwd ?? "",
260
+ createdAt: typeof record?.meta.timestamp === "string"
261
+ ? record.meta.timestamp
262
+ : undefined,
263
+ },
264
+ };
265
+ }
266
+ if (agent === "cursor") {
267
+ const record = cursorReader.readSession(sessionId);
268
+ const promptText = (record?.firstPrompt ?? "").trim();
269
+ return {
270
+ agent,
271
+ events: cursorReader.toUniversalEvents(sessionId),
272
+ sessionMeta: {
273
+ sessionName: "cursor",
274
+ sessionTask: record?.title ||
275
+ (promptText.length > 80 ? `${promptText.slice(0, 80)}…` : promptText) ||
276
+ "Cursor session",
277
+ workingDirectory: record?.cwd ?? "",
278
+ createdAt: record?.createdAt,
279
+ },
280
+ };
281
+ }
282
+ const store = new OpenCodeEventStore_1.OpenCodeEventStore({ dbPath: options.dbPath });
283
+ try {
284
+ const { events } = store.readAggregate(sessionId, { limit: 10000 });
285
+ const meta = store.getSessionMeta(sessionId);
286
+ const title = meta.title && !meta.title.startsWith("New session") ? meta.title : meta.slug;
287
+ return {
288
+ agent,
289
+ events: (0, pipeline_1.opencodeRowsToUniversalEvents)(events),
290
+ sessionMeta: {
291
+ sessionName: meta.slug || "opencode",
292
+ sessionTask: title || meta.slug || "opencode",
293
+ workingDirectory: meta.directory,
294
+ },
295
+ };
296
+ }
297
+ finally {
298
+ store.close();
299
+ }
300
+ }
301
+ exports.fetchRawEvents = fetchRawEvents;
302
+ //# sourceMappingURL=agent-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-sessions.js","sourceRoot":"","sources":["../../src/opencode/agent-sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type { OpenCodeRawEvent, OpenCodeSessionEvents, OpenCodeEventRetriever, OpenCodeStoreOptions, } from "./types";
2
+ export { listAgentSessions, detectAgent, fetchRawEvents } from "./agent-sessions";
3
+ export type { AgentSessionSummary, AgentSessionMeta, SupportedSessionAgent, } from "./agent-sessions";
4
+ export { NodePathNormalizationAdapter, normalizeEvents, normalizeEventsWithAdapter, accumulateEvents, collectRepositories, opencodeRowsToUniversalEvents, } from "./pipeline";
5
+ export type { OpenCodeEventRow } from "./pipeline";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/opencode/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClF,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,4BAA4B,EAC5B,eAAe,EACf,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.opencodeRowsToUniversalEvents = exports.collectRepositories = exports.accumulateEvents = exports.normalizeEventsWithAdapter = exports.normalizeEvents = exports.NodePathNormalizationAdapter = exports.fetchRawEvents = exports.detectAgent = exports.listAgentSessions = void 0;
4
+ var agent_sessions_1 = require("./agent-sessions");
5
+ Object.defineProperty(exports, "listAgentSessions", { enumerable: true, get: function () { return agent_sessions_1.listAgentSessions; } });
6
+ Object.defineProperty(exports, "detectAgent", { enumerable: true, get: function () { return agent_sessions_1.detectAgent; } });
7
+ Object.defineProperty(exports, "fetchRawEvents", { enumerable: true, get: function () { return agent_sessions_1.fetchRawEvents; } });
8
+ var pipeline_1 = require("./pipeline");
9
+ Object.defineProperty(exports, "NodePathNormalizationAdapter", { enumerable: true, get: function () { return pipeline_1.NodePathNormalizationAdapter; } });
10
+ Object.defineProperty(exports, "normalizeEvents", { enumerable: true, get: function () { return pipeline_1.normalizeEvents; } });
11
+ Object.defineProperty(exports, "normalizeEventsWithAdapter", { enumerable: true, get: function () { return pipeline_1.normalizeEventsWithAdapter; } });
12
+ Object.defineProperty(exports, "accumulateEvents", { enumerable: true, get: function () { return pipeline_1.accumulateEvents; } });
13
+ Object.defineProperty(exports, "collectRepositories", { enumerable: true, get: function () { return pipeline_1.collectRepositories; } });
14
+ Object.defineProperty(exports, "opencodeRowsToUniversalEvents", { enumerable: true, get: function () { return pipeline_1.opencodeRowsToUniversalEvents; } });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/opencode/index.ts"],"names":[],"mappings":";;;AAOA,mDAAkF;AAAzE,mHAAA,iBAAiB,OAAA;AAAE,6GAAA,WAAW,OAAA;AAAE,gHAAA,cAAc,OAAA;AAOvD,uCAOoB;AANlB,wHAAA,4BAA4B,OAAA;AAC5B,2GAAA,eAAe,OAAA;AACf,sHAAA,0BAA0B,OAAA;AAC1B,4GAAA,gBAAgB,OAAA;AAChB,+GAAA,mBAAmB,OAAA;AACnB,yHAAA,6BAA6B,OAAA"}
@@ -0,0 +1,25 @@
1
+ import type { PathNormalizationAdapter, RepositoryInfo, SystemInfo } from "@principal-ai/agent-monitoring";
2
+ export declare class NodePathNormalizationAdapter implements PathNormalizationAdapter {
3
+ private homeDir;
4
+ private gitRootCache;
5
+ private canonicalCaseCache;
6
+ private knownRoots;
7
+ /** Roots discovered via .git walk-up that weren't in the initial knownRoots */
8
+ readonly newlyDiscovered: RepositoryInfo[];
9
+ constructor(knownRoots?: Map<string, RepositoryInfo>);
10
+ /**
11
+ * Resolve the on-disk spelling of a directory path segment by segment. On
12
+ * case-insensitive filesystems (macOS APFS) the same directory is reachable
13
+ * under any casing, so git-root discovery can surface `/repo` and `/Repo` as
14
+ * two distinct roots unless we pin them to the actual on-disk spelling.
15
+ */
16
+ private canonicalizeCase;
17
+ getRawRepositoryInfo(absolutePath: string): Promise<RepositoryInfo | null>;
18
+ private findGitRoot;
19
+ getSystemInfo(): SystemInfo;
20
+ resolvePath(relativePath: string, workingDirectory: string): string;
21
+ isAbsolutePath(path: string): boolean;
22
+ getRelativePath(fromPath: string, toPath: string): string;
23
+ isAvailable(): boolean;
24
+ }
25
+ //# sourceMappingURL=node-path-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-path-adapter.d.ts","sourceRoot":"","sources":["../../src/opencode/node-path-adapter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,wBAAwB,EACxB,cAAc,EACd,UAAU,EACX,MAAM,gCAAgC,CAAC;AAuCxC,qBAAa,4BAA6B,YAAW,wBAAwB;IAC3E,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,UAAU,CAA8B;IAChD,+EAA+E;IAC/E,QAAQ,CAAC,eAAe,EAAE,cAAc,EAAE,CAAM;gBAEpC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IAKpD;;;;;OAKG;YACW,gBAAgB;IAsBxB,oBAAoB,CACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;YAoEnB,WAAW;IAsBzB,aAAa,IAAI,UAAU;IAS3B,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM;IAInE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAIzD,WAAW,IAAI,OAAO;CAGvB"}
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.NodePathNormalizationAdapter = void 0;
7
+ const node_child_process_1 = require("node:child_process");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
10
+ const node_os_1 = __importDefault(require("node:os"));
11
+ /**
12
+ * NodePathNormalizationAdapter — a Node.js implementation of the
13
+ * `PathNormalizationAdapter` interface from `@principal-ai/agent-monitoring`.
14
+ *
15
+ * This is the shared, agent-agnostic adapter used by the CLI's `agent-session`
16
+ * command. It discovers git roots by walking up directories and enriches them
17
+ * with git metadata via the `git` CLI (spawnSync). It keeps the same interface
18
+ * so `PathNormalizationService` can be shared verbatim. It is the Node.js
19
+ * analogue of the principal-studio's `BunNormalizationAdapter` and the desktop
20
+ * app's `ServerPathNormalizationAdapter`.
21
+ */
22
+ function gitCommand(cwd, subcommand) {
23
+ const result = (0, node_child_process_1.spawnSync)("git", ["-C", cwd, ...subcommand.split(" ")], {
24
+ encoding: "utf8",
25
+ stdio: ["ignore", "pipe", "ignore"],
26
+ timeout: 5000,
27
+ });
28
+ if (result.status !== 0 || !result.stdout)
29
+ return undefined;
30
+ return result.stdout.trim() || undefined;
31
+ }
32
+ /** Basic GitHub owner/repo extraction from a remote URL. */
33
+ function githubIdentityFromRemoteUrl(remoteUrl) {
34
+ const cleaned = remoteUrl
35
+ .replace(/^git@github\.com:/, "")
36
+ .replace(/^https?:\/\/github\.com\//, "")
37
+ .replace(/\.git$/, "");
38
+ const parts = cleaned.split("/").filter(Boolean);
39
+ if (parts.length >= 2) {
40
+ return { owner: parts[0], name: parts[1] };
41
+ }
42
+ return null;
43
+ }
44
+ class NodePathNormalizationAdapter {
45
+ constructor(knownRoots) {
46
+ this.gitRootCache = new Map();
47
+ this.canonicalCaseCache = new Map();
48
+ /** Roots discovered via .git walk-up that weren't in the initial knownRoots */
49
+ this.newlyDiscovered = [];
50
+ this.homeDir = node_os_1.default.homedir();
51
+ this.knownRoots = knownRoots ?? new Map();
52
+ }
53
+ /**
54
+ * Resolve the on-disk spelling of a directory path segment by segment. On
55
+ * case-insensitive filesystems (macOS APFS) the same directory is reachable
56
+ * under any casing, so git-root discovery can surface `/repo` and `/Repo` as
57
+ * two distinct roots unless we pin them to the actual on-disk spelling.
58
+ */
59
+ async canonicalizeCase(input) {
60
+ const cached = this.canonicalCaseCache.get(input);
61
+ if (cached !== undefined)
62
+ return cached;
63
+ const segments = input.split("/").filter(Boolean);
64
+ let current = "/";
65
+ for (const seg of segments) {
66
+ let real = seg;
67
+ try {
68
+ const entries = await node_fs_1.promises.readdir(current);
69
+ const match = entries.find((name) => name.toLowerCase() === seg.toLowerCase());
70
+ if (match)
71
+ real = match;
72
+ }
73
+ catch {
74
+ // segment vanished; keep the given spelling
75
+ }
76
+ current = current === "/" ? `/${real}` : `${current}/${real}`;
77
+ }
78
+ this.canonicalCaseCache.set(input, current);
79
+ return current;
80
+ }
81
+ async getRawRepositoryInfo(absolutePath) {
82
+ // Canonicalize the input: strip trailing slashes and collapse redundant
83
+ // separators (e.g. a tool that reads a directory as "/repo/" vs "/repo").
84
+ // findGitRoot returns its input verbatim when it IS the git root, so an
85
+ // uncanonical input would surface the same repo under two distinct root
86
+ // strings and duplicate it in the session's repo list. NOTE: use resolve,
87
+ // not normalize — path.normalize preserves trailing slashes.
88
+ const target = (0, node_path_1.resolve)(absolutePath);
89
+ // Fast path: prefix-match against known roots (zero I/O).
90
+ // Match on a path boundary so sibling dirs (/repo vs /repo2) don't collide.
91
+ let bestMatch = null;
92
+ let bestLen = 0;
93
+ for (const [root, info] of this.knownRoots) {
94
+ const rootCanon = (0, node_path_1.resolve)(root);
95
+ if ((target === rootCanon || target.startsWith(`${rootCanon}/`)) && rootCanon.length > bestLen) {
96
+ bestMatch = info;
97
+ bestLen = rootCanon.length;
98
+ }
99
+ }
100
+ if (bestMatch) {
101
+ // A registry entry can carry a case-variant spelling of the same dir
102
+ // (e.g. `developer/...` on a case-insensitive fs). Pin it to the on-disk
103
+ // casing too, so a polluted registry can't surface the same repo twice.
104
+ const canonicalRoot = await this.canonicalizeCase(bestMatch.root);
105
+ return { ...bestMatch, root: canonicalRoot };
106
+ }
107
+ const gitRoot = await this.findGitRoot(target);
108
+ if (!gitRoot)
109
+ return null;
110
+ // Pin the root to its on-disk casing so a case-variant spelling of the same
111
+ // directory never surfaces as a second repo (see canonicalizeCase).
112
+ const canonicalRoot = await this.canonicalizeCase(gitRoot);
113
+ const remoteUrl = gitCommand(canonicalRoot, "remote get-url origin");
114
+ const branch = gitCommand(canonicalRoot, "rev-parse --abbrev-ref HEAD");
115
+ const headCommit = gitCommand(canonicalRoot, "rev-parse HEAD");
116
+ let owner;
117
+ let repo;
118
+ if (remoteUrl) {
119
+ const identity = githubIdentityFromRemoteUrl(remoteUrl);
120
+ if (identity) {
121
+ owner = identity.owner;
122
+ repo = identity.name;
123
+ }
124
+ }
125
+ if (!repo) {
126
+ const parts = canonicalRoot.replace(/\/+$/, "").split("/");
127
+ repo = parts[parts.length - 1] ?? undefined;
128
+ }
129
+ const info = {
130
+ root: canonicalRoot,
131
+ remoteUrl,
132
+ owner,
133
+ repo,
134
+ branch,
135
+ headCommit,
136
+ };
137
+ if (!this.knownRoots.has(canonicalRoot)) {
138
+ this.knownRoots.set(canonicalRoot, info);
139
+ this.newlyDiscovered.push(info);
140
+ }
141
+ return info;
142
+ }
143
+ async findGitRoot(dir) {
144
+ const cached = this.gitRootCache.get(dir);
145
+ if (cached !== undefined)
146
+ return cached;
147
+ try {
148
+ const s = await node_fs_1.promises.stat((0, node_path_1.resolve)(dir, ".git"));
149
+ if (s.isDirectory() || s.isFile()) {
150
+ this.gitRootCache.set(dir, dir);
151
+ return dir;
152
+ }
153
+ }
154
+ catch {
155
+ // not a git root; walk up
156
+ }
157
+ const parent = (0, node_path_1.dirname)(dir);
158
+ if (parent === dir || parent.length >= dir.length) {
159
+ this.gitRootCache.set(dir, null);
160
+ return null;
161
+ }
162
+ const result = await this.findGitRoot(parent);
163
+ this.gitRootCache.set(dir, result);
164
+ return result;
165
+ }
166
+ getSystemInfo() {
167
+ return {
168
+ homeDir: this.homeDir,
169
+ pathSeparator: "/",
170
+ platform: process.platform,
171
+ machineId: "",
172
+ };
173
+ }
174
+ resolvePath(relativePath, workingDirectory) {
175
+ return (0, node_path_1.resolve)(workingDirectory, relativePath);
176
+ }
177
+ isAbsolutePath(path) {
178
+ return (0, node_path_1.isAbsolute)(path);
179
+ }
180
+ getRelativePath(fromPath, toPath) {
181
+ return (0, node_path_1.relative)(fromPath, toPath);
182
+ }
183
+ isAvailable() {
184
+ return true;
185
+ }
186
+ }
187
+ exports.NodePathNormalizationAdapter = NodePathNormalizationAdapter;
188
+ //# sourceMappingURL=node-path-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-path-adapter.js","sourceRoot":"","sources":["../../src/opencode/node-path-adapter.ts"],"names":[],"mappings":"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"}