@agimon-ai/po-log 0.0.0-alpha.29 → 0.0.0-alpha.30
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/dist/extensions/server.cjs +329 -14
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +329 -14
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/extensions/web.mjs +284 -1
- package/dist/extensions/web.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/llms.txt +5 -1
- package/package.json +7 -8
- package/src/prompts/codemode-how-to-logsink/SKILL.md +65 -0
- package/src/prompts/{po-debug-agent → help-how-to-log}/SKILL.md +3 -3
|
@@ -29,9 +29,12 @@ let _agimon_ai_po_logsink = require("@agimon-ai/po-logsink");
|
|
|
29
29
|
let _agimon_ai_po_core_serverPlugin = require("@agimon-ai/po-core/serverPlugin");
|
|
30
30
|
let _agimon_ai_po_core_extensionFile = require("@agimon-ai/po-core/extensionFile");
|
|
31
31
|
let _agimon_ai_po_core_childSession = require("@agimon-ai/po-core/childSession");
|
|
32
|
+
let _agimon_ai_po_core_codemode = require("@agimon-ai/po-core/codemode");
|
|
32
33
|
let _agimon_ai_po_core_workflow = require("@agimon-ai/po-core/workflow");
|
|
34
|
+
let _agimon_ai_po_core_telemetry = require("@agimon-ai/po-core/telemetry");
|
|
35
|
+
let _agimon_ai_po_logsink_queryContracts = require("@agimon-ai/po-logsink/queryContracts");
|
|
36
|
+
let typebox = require("typebox");
|
|
33
37
|
let _agimon_ai_po_core_runtimeJson = require("@agimon-ai/po-core/runtimeJson");
|
|
34
|
-
let _agimon_ai_po_telemetry = require("@agimon-ai/po-telemetry");
|
|
35
38
|
let hono = require("hono");
|
|
36
39
|
let node_child_process = require("node:child_process");
|
|
37
40
|
let node_module = require("node:module");
|
|
@@ -40,10 +43,254 @@ node_path = __toESM(node_path, 1);
|
|
|
40
43
|
let _agimon_ai_po_core_web = require("@agimon-ai/po-core/web");
|
|
41
44
|
let _agimon_ai_po_core_help = require("@agimon-ai/po-core/help");
|
|
42
45
|
let typebox_value = require("typebox/value");
|
|
43
|
-
let typebox = require("typebox");
|
|
44
46
|
//#region src/constants/telemetry.ts
|
|
45
47
|
const PACKAGE_NAME$1 = "@agimon-ai/po-log";
|
|
46
48
|
//#endregion
|
|
49
|
+
//#region src/schemas/logsink.ts
|
|
50
|
+
const LOGSINK_METHODS = [
|
|
51
|
+
"status",
|
|
52
|
+
"search",
|
|
53
|
+
"agentIssues",
|
|
54
|
+
"trace",
|
|
55
|
+
"stats",
|
|
56
|
+
"services",
|
|
57
|
+
"metrics"
|
|
58
|
+
];
|
|
59
|
+
const LOGSINK_TOOL_NAMES = LOGSINK_METHODS.map((method) => `logsink_${method.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)}`);
|
|
60
|
+
/** The direct tools advertise the same schema the reader validates, plus Po's scope selector. */
|
|
61
|
+
function logsinkParameters(method) {
|
|
62
|
+
const schema = _agimon_ai_po_logsink_queryContracts.LOG_QUERY_INPUT_SCHEMAS[method];
|
|
63
|
+
return typebox.Type.Unsafe({
|
|
64
|
+
...schema,
|
|
65
|
+
properties: {
|
|
66
|
+
...schema.properties,
|
|
67
|
+
...method === "status" ? {} : { scope: {
|
|
68
|
+
type: "string",
|
|
69
|
+
enum: ["session", "history"],
|
|
70
|
+
description: "Defaults to this session. History requires explicit startTime and endTime."
|
|
71
|
+
} }
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function parseLogsinkInput(method, value, sessionId) {
|
|
76
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("Log query input must be an object.");
|
|
77
|
+
const { scope: requestedScope, ...query } = value;
|
|
78
|
+
const storedSessionId = (0, _agimon_ai_po_core_telemetry.sanitizeTelemetryAttributes)({ "pi.session.id": sessionId })["pi.session.id"];
|
|
79
|
+
if (typeof storedSessionId !== "string") throw new Error("Log queries require a valid session identity.");
|
|
80
|
+
if (method === "status") {
|
|
81
|
+
if (requestedScope !== void 0) throw new Error("status does not accept a scope.");
|
|
82
|
+
return {
|
|
83
|
+
scope: {
|
|
84
|
+
kind: "session",
|
|
85
|
+
sessionId: storedSessionId
|
|
86
|
+
},
|
|
87
|
+
input: (0, _agimon_ai_po_logsink_queryContracts.parseLogQueryInput)(method, query)
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
const kind = requestedScope ?? "session";
|
|
91
|
+
if (kind !== "session" && kind !== "history") throw new Error("scope must be session or history.");
|
|
92
|
+
if (kind === "session") {
|
|
93
|
+
if (query.sessionId !== void 0 && query.sessionId !== sessionId && query.sessionId !== storedSessionId) throw new Error("Use explicit history scope to query another session.");
|
|
94
|
+
query.sessionId = storedSessionId;
|
|
95
|
+
} else if (typeof query.startTime !== "string" || typeof query.endTime !== "string") throw new Error("History queries require explicit ISO startTime and endTime.");
|
|
96
|
+
const input = (0, _agimon_ai_po_logsink_queryContracts.parseLogQueryInput)(method, query);
|
|
97
|
+
const filters = input;
|
|
98
|
+
return {
|
|
99
|
+
scope: {
|
|
100
|
+
kind,
|
|
101
|
+
...typeof filters.sessionId === "string" ? { sessionId: filters.sessionId } : {},
|
|
102
|
+
...typeof filters.startTime === "string" ? { startTime: filters.startTime } : {},
|
|
103
|
+
...typeof filters.endTime === "string" ? { endTime: filters.endTime } : {}
|
|
104
|
+
},
|
|
105
|
+
input
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//#endregion
|
|
109
|
+
//#region src/services/logQuerySource/index.ts
|
|
110
|
+
/** The host supplies its home; inspection must not run the sink's directory-creating resolver. */
|
|
111
|
+
function createLogQuerySource(homeDirectory) {
|
|
112
|
+
if (!homeDirectory) throw new Error("Log queries require the host home directory.");
|
|
113
|
+
return (0, _agimon_ai_po_logsink.createAsyncLogQueryReader)({ dbPath: (0, _agimon_ai_po_logsink.resolveGlobalLogQueryDbPath)(homeDirectory) });
|
|
114
|
+
}
|
|
115
|
+
//#endregion
|
|
116
|
+
//#region src/services/logsink/index.ts
|
|
117
|
+
const DESCRIPTIONS = {
|
|
118
|
+
status: "Check whether retained Log Sink data is available without starting a collector.",
|
|
119
|
+
search: "Search retained logs with structured filters and optional FTS text.",
|
|
120
|
+
agentIssues: "Aggregate captured agent failures, then inspect bounded issue samples and coverage.",
|
|
121
|
+
trace: "Read a bounded chronological trace within the selected session or history scope.",
|
|
122
|
+
stats: "Aggregate retained log statistics within the selected scope.",
|
|
123
|
+
services: "List services with retained records within the selected scope.",
|
|
124
|
+
metrics: "Inspect captured token usage, tool turn costs, and failure metrics."
|
|
125
|
+
};
|
|
126
|
+
function createLogsinkOperations(options) {
|
|
127
|
+
return {
|
|
128
|
+
sessionId: options.sessionId,
|
|
129
|
+
async read(method, value = {}, inputSignal) {
|
|
130
|
+
const active = options.authorize(inputSignal);
|
|
131
|
+
const signal = AbortSignal.any([active, AbortSignal.timeout(25e3)]);
|
|
132
|
+
const parsed = parseLogsinkInput(method, value, options.sessionId);
|
|
133
|
+
signal.throwIfAborted();
|
|
134
|
+
const reader = options.createReader?.() ?? createLogQuerySource(options.homeDirectory);
|
|
135
|
+
let report;
|
|
136
|
+
try {
|
|
137
|
+
const data = method === "status" ? await reader.status(signal) : await reader[method](parsed.input, signal);
|
|
138
|
+
report = JSON.parse(JSON.stringify({
|
|
139
|
+
scope: parsed.scope,
|
|
140
|
+
data
|
|
141
|
+
}));
|
|
142
|
+
} finally {
|
|
143
|
+
await reader.close();
|
|
144
|
+
}
|
|
145
|
+
signal.throwIfAborted();
|
|
146
|
+
options.authorize(inputSignal);
|
|
147
|
+
return report;
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function createLogsinkTool(method, operations) {
|
|
152
|
+
if (!operations) throw new Error("Log Sink tools require a session host.");
|
|
153
|
+
return (0, _agimon_ai_po_core_serverPlugin.defineTool)({
|
|
154
|
+
name: LOGSINK_TOOL_NAMES[LOGSINK_METHODS.indexOf(method)],
|
|
155
|
+
description: `${DESCRIPTIONS[method]} Defaults to this session. Cross-session workflow analysis requires scope: history and explicit startTime/endTime.`,
|
|
156
|
+
parameters: logsinkParameters(method),
|
|
157
|
+
async execute(input, execution) {
|
|
158
|
+
const report = await operations.read(method, input, execution.signal);
|
|
159
|
+
return {
|
|
160
|
+
content: [{
|
|
161
|
+
type: "text",
|
|
162
|
+
text: JSON.stringify(report)
|
|
163
|
+
}],
|
|
164
|
+
details: report
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
//#endregion
|
|
170
|
+
//#region src/services/logsinkNamespace/index.ts
|
|
171
|
+
const DECLARATIONS = `interface LogScope { kind: 'session' | 'history'; sessionId?: string; startTime?: string; endTime?: string }
|
|
172
|
+
interface LogResponse<T> { scope: LogScope; data: T }
|
|
173
|
+
interface LogFilters {
|
|
174
|
+
scope?: 'session' | 'history'; sessionId?: string; startTime?: string; endTime?: string;
|
|
175
|
+
workflowRunId?: string; workflowName?: string; jobName?: string; jobId?: string;
|
|
176
|
+
agentName?: string; workflowRunKey?: string; workflowWorkspace?: string; stepName?: string; phase?: string;
|
|
177
|
+
service?: string | string[];
|
|
178
|
+
}
|
|
179
|
+
interface LogAvailability { available: boolean; reason?: 'missing-database' }
|
|
180
|
+
interface LogRecord {
|
|
181
|
+
id: string; timestamp: string; level: string; service: string; message: string;
|
|
182
|
+
sessionId: string | null; traceId: string | null; spanId: string | null;
|
|
183
|
+
metadata: Record<string, unknown> | null; errorType: string | null; errorMessage: string | null;
|
|
184
|
+
[field: string]: unknown;
|
|
185
|
+
}
|
|
186
|
+
interface LogSearch { mode: 'filter' | 'fts'; count: number; total: number; truncated: boolean; results: LogRecord[] }
|
|
187
|
+
interface LogIssue {
|
|
188
|
+
category: string; timestamp: string; service: string; sessionId: string | null; tool: string | null;
|
|
189
|
+
errorType: string | null; message: string; detail: string | null; fingerprint: string; occurrenceCount: number;
|
|
190
|
+
traceId: string | null; spanId: string | null; [field: string]: unknown;
|
|
191
|
+
}
|
|
192
|
+
interface LogIssues {
|
|
193
|
+
scanned: number; matchingLogs: number; truncated: boolean; coveragePercent: number; oldestScannedTimestamp: string | null;
|
|
194
|
+
totalIssues: number; uniqueIncidents: number; byCategory: Record<string, number>; byTool: Record<string, number>;
|
|
195
|
+
byErrorType: Record<string, number>; bySession: Record<string, number>; issues: LogIssue[];
|
|
196
|
+
}
|
|
197
|
+
interface LogTraceEntry { timestamp: string; service: string; spanId: string | null; parentSpanId: string | null; level: string; message: string; [field: string]: unknown }
|
|
198
|
+
interface LogTrace { traceId: string; count: number; truncated: boolean; timeline: LogTraceEntry[] }
|
|
199
|
+
interface LogStats { groupBy: string; signalType: 'log' | 'span' | 'all'; totalEntries: number; statistics: { service: string; level: string; count: number }[] }
|
|
200
|
+
interface LogServices { count: number; truncated: boolean; services: string[] }
|
|
201
|
+
interface LogTokens { inputTokens: number; outputTokens: number; totalTokens: number; cachedInputTokens: number; reasoningOutputTokens: number; usageEventCount: number }
|
|
202
|
+
interface LogTokenDistribution { samples: number; avgInputTokens: number; p50InputTokens: number; p90InputTokens: number; avgOutputTokens: number; p50OutputTokens: number; p90OutputTokens: number; avgTotalTokens: number; p50TotalTokens: number; p90TotalTokens: number }
|
|
203
|
+
interface LogMetrics {
|
|
204
|
+
generatedAt: string; groupBy: string; sort: string; toolSort: string; period: string; bucket: string;
|
|
205
|
+
filters: Record<string, unknown>;
|
|
206
|
+
totals: LogTokens & { totalRecords: number; issueCount: number; groupCount: number; returnedGroups: number; tokenCoveragePercent: number; [field: string]: unknown };
|
|
207
|
+
groups: (LogTokens & { key: string; sessionId: string | null; issueCount: number; byCategory: Record<string, number>; [field: string]: unknown })[];
|
|
208
|
+
tools: { returnedTools: number; rows: { toolName: string; invocationCount: number; toolCallTurn: LogTokenDistribution; toolOutputImpact: LogTokenDistribution; [field: string]: unknown }[] };
|
|
209
|
+
timeline: (LogTokens & { bucketStart: string; label: string; totalRecords: number; issueCount: number })[];
|
|
210
|
+
}
|
|
211
|
+
declare const logsink: {
|
|
212
|
+
/** Retained storage availability, not proof that the collector is capturing now. */
|
|
213
|
+
status(): Promise<LogResponse<LogAvailability>>;
|
|
214
|
+
/** Scoped structured query or FTS search. History requires explicit startTime/endTime. order is filter-only and rejected with query. */
|
|
215
|
+
search(input?: LogFilters & { query?: string; mode?: 'fts'; level?: string | string[]; traceId?: string; spanId?: string; errorType?: string; parentSessionId?: string; workflowId?: string; signalType?: 'log' | 'span'; limit?: number; order?: 'asc' | 'desc' }): Promise<LogResponse<LogSearch>>;
|
|
216
|
+
/** Failure aggregates and deduplicated samples, including coverage and truncation. */
|
|
217
|
+
agentIssues(input?: LogFilters & { limit?: number; scanLimit?: number }): Promise<LogResponse<LogIssues>>;
|
|
218
|
+
/** A bounded trace, filtered within scope before retrieval. */
|
|
219
|
+
trace(input: LogFilters & { traceId: string; limit?: number }): Promise<LogResponse<LogTrace>>;
|
|
220
|
+
/** Counts by level, service, agent, workflow, job or signal. */
|
|
221
|
+
stats(input?: LogFilters & { groupBy?: 'level' | 'service' | 'both' | 'agent' | 'workflow' | 'job' | 'signal'; signalType?: 'log' | 'span' | 'all' }): Promise<LogResponse<LogStats>>;
|
|
222
|
+
/** Services that have retained records within scope. */
|
|
223
|
+
services(input?: LogFilters & { limit?: number }): Promise<LogResponse<LogServices>>;
|
|
224
|
+
/** Captured usage and tool turn costs, not exclusive per-tool token shares. */
|
|
225
|
+
metrics(input?: LogFilters & { model?: string | string[]; provider?: string | string[]; groupBy?: 'session' | 'workflow-run' | 'workflow-name' | 'job' | 'step' | 'agent' | 'model' | 'provider'; sort?: 'last-seen' | 'total-tokens' | 'issues'; toolSort?: 'p90-total-tokens' | 'avg-total-tokens' | 'invocations'; limit?: number; toolLimit?: number; period?: 'day' | 'week' | 'month' | 'all'; bucket?: 'hour' | 'day' | 'week' | 'month' }): Promise<LogResponse<LogMetrics>>;
|
|
226
|
+
};`;
|
|
227
|
+
function createLogsinkNamespace(operations) {
|
|
228
|
+
return {
|
|
229
|
+
name: "logsink",
|
|
230
|
+
summary: "Read captured log issues, metrics, traces and search results. Defaults to this session; explicit bounded history supports workflow analysis. Read-only, never manages the collector.",
|
|
231
|
+
declarations: DECLARATIONS,
|
|
232
|
+
bind(run) {
|
|
233
|
+
if (run.sessionId !== operations.sessionId) throw new Error("Log Sink namespace belongs to another session.");
|
|
234
|
+
let disposed = false;
|
|
235
|
+
const controller = new AbortController();
|
|
236
|
+
run.onDispose(() => {
|
|
237
|
+
disposed = true;
|
|
238
|
+
controller.abort(/* @__PURE__ */ new Error("Log Sink run is disposed."));
|
|
239
|
+
});
|
|
240
|
+
const signal = AbortSignal.any([run.signal, controller.signal]);
|
|
241
|
+
const check = () => {
|
|
242
|
+
signal.throwIfAborted();
|
|
243
|
+
if (disposed) throw new Error("Log Sink run is disposed.");
|
|
244
|
+
};
|
|
245
|
+
const members = Object.create(null);
|
|
246
|
+
for (const method of LOGSINK_METHODS) members[method] = async (input = {}) => {
|
|
247
|
+
const started = Date.now();
|
|
248
|
+
let args = {};
|
|
249
|
+
let result;
|
|
250
|
+
try {
|
|
251
|
+
check();
|
|
252
|
+
const snapshot = JSON.parse(JSON.stringify(input));
|
|
253
|
+
if (snapshot && typeof snapshot === "object" && !Array.isArray(snapshot)) args = snapshot;
|
|
254
|
+
result = await operations.read(method, input, signal);
|
|
255
|
+
check();
|
|
256
|
+
} catch (error) {
|
|
257
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
258
|
+
run.record?.({
|
|
259
|
+
name: `logsink.${method}`,
|
|
260
|
+
tool: LOGSINK_TOOL_NAMES[LOGSINK_METHODS.indexOf(method)],
|
|
261
|
+
args,
|
|
262
|
+
ok: false,
|
|
263
|
+
ms: Date.now() - started,
|
|
264
|
+
error: message,
|
|
265
|
+
result: { content: [{
|
|
266
|
+
type: "text",
|
|
267
|
+
text: message
|
|
268
|
+
}] }
|
|
269
|
+
});
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
272
|
+
const details = JSON.parse(JSON.stringify(result));
|
|
273
|
+
run.record?.({
|
|
274
|
+
name: `logsink.${method}`,
|
|
275
|
+
tool: LOGSINK_TOOL_NAMES[LOGSINK_METHODS.indexOf(method)],
|
|
276
|
+
args,
|
|
277
|
+
ok: true,
|
|
278
|
+
ms: Date.now() - started,
|
|
279
|
+
result: {
|
|
280
|
+
content: [{
|
|
281
|
+
type: "text",
|
|
282
|
+
text: JSON.stringify(details)
|
|
283
|
+
}],
|
|
284
|
+
details
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
return result;
|
|
288
|
+
};
|
|
289
|
+
return members;
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
//#endregion
|
|
47
294
|
//#region src/services/telemetryEnabled/index.ts
|
|
48
295
|
function isEnabled(value) {
|
|
49
296
|
return value === "1" || value?.toLowerCase() === "true" || value?.toLowerCase() === "yes";
|
|
@@ -179,12 +426,13 @@ function createServerTelemetry(options = {}) {
|
|
|
179
426
|
const activity = {
|
|
180
427
|
name: PACKAGE_NAME$1,
|
|
181
428
|
start(execution) {
|
|
182
|
-
const current = (0,
|
|
429
|
+
const current = (0, _agimon_ai_po_core_telemetry.createPoTelemetry)({
|
|
183
430
|
serviceName: options.serviceName ?? "pi",
|
|
184
431
|
packageName: PACKAGE_NAME$1,
|
|
185
432
|
cwd: execution.cwd,
|
|
186
433
|
env: {
|
|
187
434
|
...options.env ?? execution.environment,
|
|
435
|
+
AGENT_SESSION_ID: execution.sessionId,
|
|
188
436
|
PI_SESSION_ID: execution.sessionId
|
|
189
437
|
},
|
|
190
438
|
allowFileFallback: options.allowFileFallback,
|
|
@@ -437,14 +685,41 @@ function createServerTelemetry(options = {}) {
|
|
|
437
685
|
}
|
|
438
686
|
//#endregion
|
|
439
687
|
//#region src/extensions/workspaces/sessions/(backend)/_lib/serverRoot.ts
|
|
440
|
-
const createLogServerRoot = ({ context }) => {
|
|
688
|
+
const createLogServerRoot = ({ context, agent, host, signal: ownerSignal }) => {
|
|
441
689
|
const runtime = createServerTelemetry({
|
|
442
690
|
workflowContext: (0, _agimon_ai_po_core_workflow.readPoWorkflowContextService)(context),
|
|
443
691
|
childSessionHookRegistry: (0, _agimon_ai_po_core_childSession.readPoChildSessionHookRegistry)(context)
|
|
444
692
|
});
|
|
693
|
+
const sessionId = agent?.context.sessionId;
|
|
694
|
+
const logQueries = agent && sessionId ? createLogsinkOperations({
|
|
695
|
+
sessionId,
|
|
696
|
+
homeDirectory: host.context.homeDirectory,
|
|
697
|
+
authorize(signal) {
|
|
698
|
+
ownerSignal.throwIfAborted();
|
|
699
|
+
signal?.throwIfAborted();
|
|
700
|
+
agent.assertActive(PACKAGE_NAME$1);
|
|
701
|
+
if (agent.context.sessionId !== sessionId) throw new Error("Log Sink session changed.");
|
|
702
|
+
return signal ? AbortSignal.any([ownerSignal, signal]) : ownerSignal;
|
|
703
|
+
}
|
|
704
|
+
}) : void 0;
|
|
445
705
|
return {
|
|
446
|
-
value:
|
|
447
|
-
|
|
706
|
+
value: {
|
|
707
|
+
...runtime,
|
|
708
|
+
logQueries
|
|
709
|
+
},
|
|
710
|
+
activities: runtime.activities,
|
|
711
|
+
services: logQueries ? [(cordis) => {
|
|
712
|
+
cordis.inject([_agimon_ai_po_core_codemode.PO_CODEMODE_SERVICE], (scoped) => {
|
|
713
|
+
const codemode = (0, _agimon_ai_po_core_codemode.readPoCodemode)(scoped);
|
|
714
|
+
if (!codemode) return void 0;
|
|
715
|
+
const registration = codemode.register(PACKAGE_NAME$1, createLogsinkNamespace(logQueries));
|
|
716
|
+
const restriction = agent?.registerToolRestriction({ excludedTools: LOGSINK_TOOL_NAMES });
|
|
717
|
+
return () => {
|
|
718
|
+
restriction?.dispose();
|
|
719
|
+
registration.dispose();
|
|
720
|
+
};
|
|
721
|
+
});
|
|
722
|
+
}] : []
|
|
448
723
|
};
|
|
449
724
|
};
|
|
450
725
|
//#endregion
|
|
@@ -872,6 +1147,16 @@ var turn_end_server_default = (0, _agimon_ai_po_core_extensionFile.defineHook)((
|
|
|
872
1147
|
//#region src/extensions/workspaces/sessions/(backend)/hook/turn-start.server.ts
|
|
873
1148
|
var turn_start_server_default = (0, _agimon_ai_po_core_extensionFile.defineHook)((context) => context.root.hooks[3]);
|
|
874
1149
|
//#endregion
|
|
1150
|
+
//#region src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-logsink.server.ts
|
|
1151
|
+
var codemode_how_to_logsink_server_default = (0, _agimon_ai_po_core_extensionFile.defineResource)({
|
|
1152
|
+
name: "codemode-how-to-logsink",
|
|
1153
|
+
description: "Read captured failures, token usage, logs, and traces through code mode. Debug this session by default; explicitly select bounded cross-session history for workflow improvement.",
|
|
1154
|
+
kind: "skill",
|
|
1155
|
+
pinned: true,
|
|
1156
|
+
path: (0, _agimon_ai_po_core_serverPlugin.packageResourcePath)(require("url").pathToFileURL(__filename).href, "src/prompts/codemode-how-to-logsink/SKILL.md"),
|
|
1157
|
+
read: () => (0, _agimon_ai_po_core_serverPlugin.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/codemode-how-to-logsink/SKILL.md")
|
|
1158
|
+
});
|
|
1159
|
+
//#endregion
|
|
875
1160
|
//#region src/constants/diagnostics.ts
|
|
876
1161
|
const DIAGNOSE_AGENT_NAME = "diagnose_agent";
|
|
877
1162
|
const DIAGNOSE_AGENT_DESCRIPTION = "Inspect captured failures and token usage for the current Po session. Read-only, bounded to the last day or week; omits prompts, tool arguments, credentials, and unrelated sessions.";
|
|
@@ -889,14 +1174,14 @@ const AGENT_ISSUE_CATEGORIES = [
|
|
|
889
1174
|
"log_error"
|
|
890
1175
|
];
|
|
891
1176
|
//#endregion
|
|
892
|
-
//#region src/extensions/workspaces/sessions/(backend)/resource/
|
|
893
|
-
var
|
|
894
|
-
name: "
|
|
1177
|
+
//#region src/extensions/workspaces/sessions/(backend)/resource/help-how-to-log.server.ts
|
|
1178
|
+
var help_how_to_log_server_default = (0, _agimon_ai_po_core_extensionFile.defineResource)({
|
|
1179
|
+
name: "help-how-to-log",
|
|
895
1180
|
description: "Debug a Po agent using session-scoped failure and usage evidence. Distinguish missing telemetry from a healthy run, diagnose expensive or failed tools, and investigate deeper traces without exposing secrets or changing the sink.",
|
|
896
1181
|
when: _agimon_ai_po_core_help.PO_HELP_WHEN,
|
|
897
1182
|
kind: "skill",
|
|
898
|
-
path: (0, _agimon_ai_po_core_serverPlugin.packageResourcePath)(require("url").pathToFileURL(__filename).href, "src/prompts/
|
|
899
|
-
read: () => (0, _agimon_ai_po_core_serverPlugin.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/
|
|
1183
|
+
path: (0, _agimon_ai_po_core_serverPlugin.packageResourcePath)(require("url").pathToFileURL(__filename).href, "src/prompts/help-how-to-log/SKILL.md"),
|
|
1184
|
+
read: () => (0, _agimon_ai_po_core_serverPlugin.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/help-how-to-log/SKILL.md")
|
|
900
1185
|
});
|
|
901
1186
|
//#endregion
|
|
902
1187
|
//#region src/schemas/agentDiagnostics.ts
|
|
@@ -1003,7 +1288,7 @@ async function readAgentDiagnostics(source, sessionId, input, signal) {
|
|
|
1003
1288
|
toolRowLimit: limit,
|
|
1004
1289
|
limitReached: report.tools.rows.length >= limit,
|
|
1005
1290
|
captureCompleteness: "not-reported",
|
|
1006
|
-
limitations: "Only captured records in this window are represented. Empty data is not proof of a healthy run. Token coverage is not event-capture coverage; per-tool token samples describe the containing turn, not exclusive tool cost. Raw prompts, error messages, tool arguments and traces are omitted. Use
|
|
1291
|
+
limitations: "Only captured records in this window are represented. Empty data is not proof of a healthy run. Token coverage is not event-capture coverage; per-tool token samples describe the containing turn, not exclusive tool cost. Raw prompts, error messages, tool arguments and traces are omitted. Use help-how-to-log for deeper authorized investigation."
|
|
1007
1292
|
};
|
|
1008
1293
|
} catch (error) {
|
|
1009
1294
|
if (signal.aborted) throw error;
|
|
@@ -1073,6 +1358,27 @@ var diagnose_agent_server_default = (0, _agimon_ai_po_core_extensionFile.defineT
|
|
|
1073
1358
|
});
|
|
1074
1359
|
});
|
|
1075
1360
|
//#endregion
|
|
1361
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/logsink_agent_issues.server.ts
|
|
1362
|
+
var logsink_agent_issues_server_default = (0, _agimon_ai_po_core_extensionFile.defineTool)((context) => createLogsinkTool("agentIssues", context.root.logQueries));
|
|
1363
|
+
//#endregion
|
|
1364
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/logsink_metrics.server.ts
|
|
1365
|
+
var logsink_metrics_server_default = (0, _agimon_ai_po_core_extensionFile.defineTool)((context) => createLogsinkTool("metrics", context.root.logQueries));
|
|
1366
|
+
//#endregion
|
|
1367
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/logsink_search.server.ts
|
|
1368
|
+
var logsink_search_server_default = (0, _agimon_ai_po_core_extensionFile.defineTool)((context) => createLogsinkTool("search", context.root.logQueries));
|
|
1369
|
+
//#endregion
|
|
1370
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/logsink_services.server.ts
|
|
1371
|
+
var logsink_services_server_default = (0, _agimon_ai_po_core_extensionFile.defineTool)((context) => createLogsinkTool("services", context.root.logQueries));
|
|
1372
|
+
//#endregion
|
|
1373
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/logsink_stats.server.ts
|
|
1374
|
+
var logsink_stats_server_default = (0, _agimon_ai_po_core_extensionFile.defineTool)((context) => createLogsinkTool("stats", context.root.logQueries));
|
|
1375
|
+
//#endregion
|
|
1376
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/logsink_status.server.ts
|
|
1377
|
+
var logsink_status_server_default = (0, _agimon_ai_po_core_extensionFile.defineTool)((context) => createLogsinkTool("status", context.root.logQueries));
|
|
1378
|
+
//#endregion
|
|
1379
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/logsink_trace.server.ts
|
|
1380
|
+
var logsink_trace_server_default = (0, _agimon_ai_po_core_extensionFile.defineTool)((context) => createLogsinkTool("trace", context.root.logQueries));
|
|
1381
|
+
//#endregion
|
|
1076
1382
|
//#region generated/server.ts
|
|
1077
1383
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
1078
1384
|
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
@@ -1118,10 +1424,19 @@ const serverPlugin = (0, _agimon_ai_po_core_serverPlugin.defineServerPlugin)({
|
|
|
1118
1424
|
];
|
|
1119
1425
|
},
|
|
1120
1426
|
get resources() {
|
|
1121
|
-
return [at(
|
|
1427
|
+
return [at(codemode_how_to_logsink_server_default, contextSession), at(help_how_to_log_server_default, contextSession)];
|
|
1122
1428
|
},
|
|
1123
1429
|
get tools() {
|
|
1124
|
-
return [
|
|
1430
|
+
return [
|
|
1431
|
+
via({ name: "diagnose_agent" }, at(diagnose_agent_server_default, contextSession)),
|
|
1432
|
+
via({ name: "logsink_agent_issues" }, at(logsink_agent_issues_server_default, contextSession)),
|
|
1433
|
+
via({ name: "logsink_metrics" }, at(logsink_metrics_server_default, contextSession)),
|
|
1434
|
+
via({ name: "logsink_search" }, at(logsink_search_server_default, contextSession)),
|
|
1435
|
+
via({ name: "logsink_services" }, at(logsink_services_server_default, contextSession)),
|
|
1436
|
+
via({ name: "logsink_stats" }, at(logsink_stats_server_default, contextSession)),
|
|
1437
|
+
via({ name: "logsink_status" }, at(logsink_status_server_default, contextSession)),
|
|
1438
|
+
via({ name: "logsink_trace" }, at(logsink_trace_server_default, contextSession))
|
|
1439
|
+
];
|
|
1125
1440
|
},
|
|
1126
1441
|
services: [...scopeSession.services ?? []],
|
|
1127
1442
|
get activities() {
|