@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.
@@ -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, _agimon_ai_po_telemetry.createPoTelemetry)({
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: runtime,
447
- activities: runtime.activities
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/po-debug-agent.server.ts
893
- var po_debug_agent_server_default = (0, _agimon_ai_po_core_extensionFile.defineResource)({
894
- name: "po-debug-agent",
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/po-debug-agent/SKILL.md"),
899
- read: () => (0, _agimon_ai_po_core_serverPlugin.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-debug-agent/SKILL.md")
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 po-debug-agent for deeper authorized investigation."
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(po_debug_agent_server_default, contextSession)];
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 [via({ name: "diagnose_agent" }, at(diagnose_agent_server_default, contextSession))];
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() {