@adonis-agora/telescope 0.1.0
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/LICENSE +21 -0
- package/README.md +26 -0
- package/dist/configure.d.ts +16 -0
- package/dist/configure.d.ts.map +1 -0
- package/dist/configure.js +75 -0
- package/dist/configure.js.map +1 -0
- package/dist/providers/telescope_ai_provider.d.ts +20 -0
- package/dist/providers/telescope_ai_provider.d.ts.map +1 -0
- package/dist/providers/telescope_ai_provider.js +45 -0
- package/dist/providers/telescope_ai_provider.js.map +1 -0
- package/dist/providers/telescope_alerts_provider.d.ts +23 -0
- package/dist/providers/telescope_alerts_provider.d.ts.map +1 -0
- package/dist/providers/telescope_alerts_provider.js +72 -0
- package/dist/providers/telescope_alerts_provider.js.map +1 -0
- package/dist/providers/telescope_provider.d.ts +43 -0
- package/dist/providers/telescope_provider.d.ts.map +1 -0
- package/dist/providers/telescope_provider.js +103 -0
- package/dist/providers/telescope_provider.js.map +1 -0
- package/dist/providers/telescope_ui_provider.d.ts +21 -0
- package/dist/providers/telescope_ui_provider.d.ts.map +1 -0
- package/dist/providers/telescope_ui_provider.js +119 -0
- package/dist/providers/telescope_ui_provider.js.map +1 -0
- package/dist/providers/telescope_watchers_provider.d.ts +31 -0
- package/dist/providers/telescope_watchers_provider.d.ts.map +1 -0
- package/dist/providers/telescope_watchers_provider.js +116 -0
- package/dist/providers/telescope_watchers_provider.js.map +1 -0
- package/dist/src/ai/define_config.d.ts +56 -0
- package/dist/src/ai/define_config.d.ts.map +1 -0
- package/dist/src/ai/define_config.js +39 -0
- package/dist/src/ai/define_config.js.map +1 -0
- package/dist/src/ai/diagnoser.d.ts +34 -0
- package/dist/src/ai/diagnoser.d.ts.map +1 -0
- package/dist/src/ai/diagnoser.js +74 -0
- package/dist/src/ai/diagnoser.js.map +1 -0
- package/dist/src/ai/diagnosis_cache.d.ts +43 -0
- package/dist/src/ai/diagnosis_cache.d.ts.map +1 -0
- package/dist/src/ai/diagnosis_cache.js +56 -0
- package/dist/src/ai/diagnosis_cache.js.map +1 -0
- package/dist/src/ai/factory.d.ts +15 -0
- package/dist/src/ai/factory.d.ts.map +1 -0
- package/dist/src/ai/factory.js +24 -0
- package/dist/src/ai/factory.js.map +1 -0
- package/dist/src/ai/index.d.ts +14 -0
- package/dist/src/ai/index.d.ts.map +1 -0
- package/dist/src/ai/index.js +15 -0
- package/dist/src/ai/index.js.map +1 -0
- package/dist/src/ai/prompt.d.ts +31 -0
- package/dist/src/ai/prompt.d.ts.map +1 -0
- package/dist/src/ai/prompt.js +66 -0
- package/dist/src/ai/prompt.js.map +1 -0
- package/dist/src/ai/telescope_ai_diagnoser.d.ts +79 -0
- package/dist/src/ai/telescope_ai_diagnoser.d.ts.map +1 -0
- package/dist/src/ai/telescope_ai_diagnoser.js +111 -0
- package/dist/src/ai/telescope_ai_diagnoser.js.map +1 -0
- package/dist/src/alerts/alert_channel.d.ts +69 -0
- package/dist/src/alerts/alert_channel.d.ts.map +1 -0
- package/dist/src/alerts/alert_channel.js +114 -0
- package/dist/src/alerts/alert_channel.js.map +1 -0
- package/dist/src/alerts/alert_rule.d.ts +86 -0
- package/dist/src/alerts/alert_rule.d.ts.map +1 -0
- package/dist/src/alerts/alert_rule.js +2 -0
- package/dist/src/alerts/alert_rule.js.map +1 -0
- package/dist/src/alerts/alerter.d.ts +72 -0
- package/dist/src/alerts/alerter.d.ts.map +1 -0
- package/dist/src/alerts/alerter.js +248 -0
- package/dist/src/alerts/alerter.js.map +1 -0
- package/dist/src/alerts/define_config.d.ts +68 -0
- package/dist/src/alerts/define_config.d.ts.map +1 -0
- package/dist/src/alerts/define_config.js +57 -0
- package/dist/src/alerts/define_config.js.map +1 -0
- package/dist/src/alerts/exception_source.d.ts +44 -0
- package/dist/src/alerts/exception_source.d.ts.map +1 -0
- package/dist/src/alerts/exception_source.js +79 -0
- package/dist/src/alerts/exception_source.js.map +1 -0
- package/dist/src/alerts/index.d.ts +16 -0
- package/dist/src/alerts/index.d.ts.map +1 -0
- package/dist/src/alerts/index.js +17 -0
- package/dist/src/alerts/index.js.map +1 -0
- package/dist/src/alerts/new_exception_tracker.d.ts +50 -0
- package/dist/src/alerts/new_exception_tracker.d.ts.map +1 -0
- package/dist/src/alerts/new_exception_tracker.js +74 -0
- package/dist/src/alerts/new_exception_tracker.js.map +1 -0
- package/dist/src/alerts/parse_duration.d.ts +10 -0
- package/dist/src/alerts/parse_duration.d.ts.map +1 -0
- package/dist/src/alerts/parse_duration.js +27 -0
- package/dist/src/alerts/parse_duration.js.map +1 -0
- package/dist/src/alerts/slack_format.d.ts +60 -0
- package/dist/src/alerts/slack_format.d.ts.map +1 -0
- package/dist/src/alerts/slack_format.js +122 -0
- package/dist/src/alerts/slack_format.js.map +1 -0
- package/dist/src/context_accessor.d.ts +30 -0
- package/dist/src/context_accessor.d.ts.map +1 -0
- package/dist/src/context_accessor.js +20 -0
- package/dist/src/context_accessor.js.map +1 -0
- package/dist/src/define_config.d.ts +109 -0
- package/dist/src/define_config.d.ts.map +1 -0
- package/dist/src/define_config.js +38 -0
- package/dist/src/define_config.js.map +1 -0
- package/dist/src/diagnostics_registry.d.ts +46 -0
- package/dist/src/diagnostics_registry.d.ts.map +1 -0
- package/dist/src/diagnostics_registry.js +34 -0
- package/dist/src/diagnostics_registry.js.map +1 -0
- package/dist/src/diagnostics_watcher.d.ts +72 -0
- package/dist/src/diagnostics_watcher.d.ts.map +1 -0
- package/dist/src/diagnostics_watcher.js +119 -0
- package/dist/src/diagnostics_watcher.js.map +1 -0
- package/dist/src/entry.d.ts +81 -0
- package/dist/src/entry.d.ts.map +1 -0
- package/dist/src/entry.js +34 -0
- package/dist/src/entry.js.map +1 -0
- package/dist/src/exception_family_hash.d.ts +29 -0
- package/dist/src/exception_family_hash.d.ts.map +1 -0
- package/dist/src/exception_family_hash.js +30 -0
- package/dist/src/exception_family_hash.js.map +1 -0
- package/dist/src/exception_watcher.d.ts +66 -0
- package/dist/src/exception_watcher.d.ts.map +1 -0
- package/dist/src/exception_watcher.js +94 -0
- package/dist/src/exception_watcher.js.map +1 -0
- package/dist/src/extension/registry.d.ts +17 -0
- package/dist/src/extension/registry.d.ts.map +1 -0
- package/dist/src/extension/registry.js +56 -0
- package/dist/src/extension/registry.js.map +1 -0
- package/dist/src/extension/types.d.ts +158 -0
- package/dist/src/extension/types.d.ts.map +1 -0
- package/dist/src/extension/types.js +5 -0
- package/dist/src/extension/types.js.map +1 -0
- package/dist/src/index.d.ts +36 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +28 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/redaction/redact.d.ts +93 -0
- package/dist/src/redaction/redact.d.ts.map +1 -0
- package/dist/src/redaction/redact.js +184 -0
- package/dist/src/redaction/redact.js.map +1 -0
- package/dist/src/redaction/redacting_store.d.ts +28 -0
- package/dist/src/redaction/redacting_store.d.ts.map +1 -0
- package/dist/src/redaction/redacting_store.js +49 -0
- package/dist/src/redaction/redacting_store.js.map +1 -0
- package/dist/src/registry.d.ts +26 -0
- package/dist/src/registry.d.ts.map +1 -0
- package/dist/src/registry.js +28 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/src/request_watcher.d.ts +44 -0
- package/dist/src/request_watcher.d.ts.map +1 -0
- package/dist/src/request_watcher.js +37 -0
- package/dist/src/request_watcher.js.map +1 -0
- package/dist/src/service.d.ts +36 -0
- package/dist/src/service.d.ts.map +1 -0
- package/dist/src/service.js +65 -0
- package/dist/src/service.js.map +1 -0
- package/dist/src/store.d.ts +56 -0
- package/dist/src/store.d.ts.map +1 -0
- package/dist/src/store.js +2 -0
- package/dist/src/store.js.map +1 -0
- package/dist/src/stores/factory.d.ts +61 -0
- package/dist/src/stores/factory.d.ts.map +1 -0
- package/dist/src/stores/factory.js +42 -0
- package/dist/src/stores/factory.js.map +1 -0
- package/dist/src/stores/lucid.d.ts +138 -0
- package/dist/src/stores/lucid.d.ts.map +1 -0
- package/dist/src/stores/lucid.js +257 -0
- package/dist/src/stores/lucid.js.map +1 -0
- package/dist/src/stores/memory.d.ts +31 -0
- package/dist/src/stores/memory.d.ts.map +1 -0
- package/dist/src/stores/memory.js +117 -0
- package/dist/src/stores/memory.js.map +1 -0
- package/dist/src/telescope_middleware.d.ts +19 -0
- package/dist/src/telescope_middleware.d.ts.map +1 -0
- package/dist/src/telescope_middleware.js +56 -0
- package/dist/src/telescope_middleware.js.map +1 -0
- package/dist/src/ui/api.d.ts +49 -0
- package/dist/src/ui/api.d.ts.map +1 -0
- package/dist/src/ui/api.js +155 -0
- package/dist/src/ui/api.js.map +1 -0
- package/dist/src/ui/dashboard.d.ts +8 -0
- package/dist/src/ui/dashboard.d.ts.map +1 -0
- package/dist/src/ui/dashboard.html +626 -0
- package/dist/src/ui/dashboard.js +29 -0
- package/dist/src/ui/dashboard.js.map +1 -0
- package/dist/src/ui/define_config.d.ts +87 -0
- package/dist/src/ui/define_config.d.ts.map +1 -0
- package/dist/src/ui/define_config.js +104 -0
- package/dist/src/ui/define_config.js.map +1 -0
- package/dist/src/ui/extension_api.d.ts +23 -0
- package/dist/src/ui/extension_api.d.ts.map +1 -0
- package/dist/src/ui/extension_api.js +50 -0
- package/dist/src/ui/extension_api.js.map +1 -0
- package/dist/src/ui/guard.d.ts +33 -0
- package/dist/src/ui/guard.d.ts.map +1 -0
- package/dist/src/ui/guard.js +47 -0
- package/dist/src/ui/guard.js.map +1 -0
- package/dist/src/ui/http.d.ts +47 -0
- package/dist/src/ui/http.d.ts.map +1 -0
- package/dist/src/ui/http.js +43 -0
- package/dist/src/ui/http.js.map +1 -0
- package/dist/src/ui/index.d.ts +12 -0
- package/dist/src/ui/index.d.ts.map +1 -0
- package/dist/src/ui/index.js +13 -0
- package/dist/src/ui/index.js.map +1 -0
- package/dist/src/watchers/cache_watcher.d.ts +60 -0
- package/dist/src/watchers/cache_watcher.d.ts.map +1 -0
- package/dist/src/watchers/cache_watcher.js +72 -0
- package/dist/src/watchers/cache_watcher.js.map +1 -0
- package/dist/src/watchers/define_config.d.ts +38 -0
- package/dist/src/watchers/define_config.d.ts.map +1 -0
- package/dist/src/watchers/define_config.js +17 -0
- package/dist/src/watchers/define_config.js.map +1 -0
- package/dist/src/watchers/emitter.d.ts +32 -0
- package/dist/src/watchers/emitter.d.ts.map +1 -0
- package/dist/src/watchers/emitter.js +2 -0
- package/dist/src/watchers/emitter.js.map +1 -0
- package/dist/src/watchers/http_client_watcher.d.ts +74 -0
- package/dist/src/watchers/http_client_watcher.d.ts.map +1 -0
- package/dist/src/watchers/http_client_watcher.js +168 -0
- package/dist/src/watchers/http_client_watcher.js.map +1 -0
- package/dist/src/watchers/index.d.ts +19 -0
- package/dist/src/watchers/index.d.ts.map +1 -0
- package/dist/src/watchers/index.js +19 -0
- package/dist/src/watchers/index.js.map +1 -0
- package/dist/src/watchers/logs_watcher.d.ts +82 -0
- package/dist/src/watchers/logs_watcher.d.ts.map +1 -0
- package/dist/src/watchers/logs_watcher.js +145 -0
- package/dist/src/watchers/logs_watcher.js.map +1 -0
- package/dist/src/watchers/lucid_query_watcher.d.ts +64 -0
- package/dist/src/watchers/lucid_query_watcher.d.ts.map +1 -0
- package/dist/src/watchers/lucid_query_watcher.js +84 -0
- package/dist/src/watchers/lucid_query_watcher.js.map +1 -0
- package/dist/src/watchers/mail_watcher.d.ts +51 -0
- package/dist/src/watchers/mail_watcher.d.ts.map +1 -0
- package/dist/src/watchers/mail_watcher.js +93 -0
- package/dist/src/watchers/mail_watcher.js.map +1 -0
- package/dist/src/watchers/normalize_http_target.d.ts +17 -0
- package/dist/src/watchers/normalize_http_target.d.ts.map +1 -0
- package/dist/src/watchers/normalize_http_target.js +41 -0
- package/dist/src/watchers/normalize_http_target.js.map +1 -0
- package/dist/src/watchers/query_family_hash.d.ts +8 -0
- package/dist/src/watchers/query_family_hash.d.ts.map +1 -0
- package/dist/src/watchers/query_family_hash.js +31 -0
- package/dist/src/watchers/query_family_hash.js.map +1 -0
- package/dist/src/watchers/record.d.ts +22 -0
- package/dist/src/watchers/record.d.ts.map +1 -0
- package/dist/src/watchers/record.js +48 -0
- package/dist/src/watchers/record.js.map +1 -0
- package/dist/stubs/config/telescope.stub +56 -0
- package/dist/stubs/config/telescope_ai.stub +36 -0
- package/dist/stubs/config/telescope_alerts.stub +47 -0
- package/dist/stubs/config/telescope_ui.stub +40 -0
- package/dist/stubs/config/telescope_watchers.stub +30 -0
- package/dist/stubs/database/migrations/create_telescope_entries_table.stub +39 -0
- package/dist/stubs/main.d.ts +6 -0
- package/dist/stubs/main.d.ts.map +1 -0
- package/dist/stubs/main.js +7 -0
- package/dist/stubs/main.js.map +1 -0
- package/package.json +140 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ApplicationService } from '@adonisjs/core/types';
|
|
2
|
+
/**
|
|
3
|
+
* Wires `@adonis-agora/telescope/watchers` into the AdonisJS application.
|
|
4
|
+
*
|
|
5
|
+
* - `boot()` reads `config/telescope_watchers.ts` (falling back to a `watchers`
|
|
6
|
+
* key on `config/telescope.ts`), resolves the application emitter from the
|
|
7
|
+
* container, and starts each enabled watcher against it. Each watcher records
|
|
8
|
+
* through `@adonis-agora/telescope`'s runtime store handle — no DI required.
|
|
9
|
+
* - `shutdown()` stops every started watcher (full unsubscribe).
|
|
10
|
+
*
|
|
11
|
+
* Watchers never throw into the app: a missing config, a missing emitter, or a
|
|
12
|
+
* disabled telescope all degrade to recording nothing.
|
|
13
|
+
*/
|
|
14
|
+
export default class TelescopeWatchersProvider {
|
|
15
|
+
protected app: ApplicationService;
|
|
16
|
+
private readonly started;
|
|
17
|
+
constructor(app: ApplicationService);
|
|
18
|
+
/** Read the watchers config from its own file or the telescope config block. */
|
|
19
|
+
private resolve;
|
|
20
|
+
boot(): Promise<void>;
|
|
21
|
+
/** Start the http-client watcher: it patches the global `fetch`, so it needs
|
|
22
|
+
* no emitter and no container resolution. */
|
|
23
|
+
private startHttpClientWatcher;
|
|
24
|
+
/** Start the logs watcher: it taps the application logger resolved from the
|
|
25
|
+
* container (instance-scoped, reversible method tee — no global patching). */
|
|
26
|
+
private startLogsWatcher;
|
|
27
|
+
/** Start one watcher, never letting a watcher's `start` break boot. */
|
|
28
|
+
private startWatcher;
|
|
29
|
+
shutdown(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=telescope_watchers_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telescope_watchers_provider.d.ts","sourceRoot":"","sources":["../../providers/telescope_watchers_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAqB/D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,yBAAyB;IAGhC,SAAS,CAAC,GAAG,EAAE,kBAAkB;IAF7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;gBAE3C,GAAG,EAAE,kBAAkB;IAE7C,gFAAgF;IAChF,OAAO,CAAC,OAAO;IAeT,IAAI;IAoBV;kDAC8C;IAC9C,OAAO,CAAC,sBAAsB;IAW9B;mFAC+E;YACjE,gBAAgB;IAmB9B,uEAAuE;IACvE,OAAO,CAAC,YAAY;IAYd,QAAQ;CAUf"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { CacheWatcher } from '../src/watchers/cache_watcher.js';
|
|
2
|
+
import { resolveConfig, } from '../src/watchers/define_config.js';
|
|
3
|
+
import { HttpClientWatcher } from '../src/watchers/http_client_watcher.js';
|
|
4
|
+
import { LogsWatcher } from '../src/watchers/logs_watcher.js';
|
|
5
|
+
import { LucidQueryWatcher } from '../src/watchers/lucid_query_watcher.js';
|
|
6
|
+
import { MailWatcher } from '../src/watchers/mail_watcher.js';
|
|
7
|
+
/**
|
|
8
|
+
* Wires `@adonis-agora/telescope/watchers` into the AdonisJS application.
|
|
9
|
+
*
|
|
10
|
+
* - `boot()` reads `config/telescope_watchers.ts` (falling back to a `watchers`
|
|
11
|
+
* key on `config/telescope.ts`), resolves the application emitter from the
|
|
12
|
+
* container, and starts each enabled watcher against it. Each watcher records
|
|
13
|
+
* through `@adonis-agora/telescope`'s runtime store handle — no DI required.
|
|
14
|
+
* - `shutdown()` stops every started watcher (full unsubscribe).
|
|
15
|
+
*
|
|
16
|
+
* Watchers never throw into the app: a missing config, a missing emitter, or a
|
|
17
|
+
* disabled telescope all degrade to recording nothing.
|
|
18
|
+
*/
|
|
19
|
+
export default class TelescopeWatchersProvider {
|
|
20
|
+
app;
|
|
21
|
+
started = [];
|
|
22
|
+
constructor(app) {
|
|
23
|
+
this.app = app;
|
|
24
|
+
}
|
|
25
|
+
/** Read the watchers config from its own file or the telescope config block. */
|
|
26
|
+
resolve() {
|
|
27
|
+
const own = this.app.config.get('telescope_watchers', undefined);
|
|
28
|
+
if (own !== undefined)
|
|
29
|
+
return resolveConfig(own);
|
|
30
|
+
// Fall back to a `watchers` block on the main telescope config, if present.
|
|
31
|
+
const fromTelescope = this.app.config.get('telescope.watchers_config', undefined);
|
|
32
|
+
return resolveConfig(fromTelescope);
|
|
33
|
+
}
|
|
34
|
+
async boot() {
|
|
35
|
+
const config = this.resolve();
|
|
36
|
+
if (!config.enabled)
|
|
37
|
+
return;
|
|
38
|
+
let emitter;
|
|
39
|
+
try {
|
|
40
|
+
emitter = (await this.app.container.make('emitter'));
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
44
|
+
console.error(`TelescopeWatchersProvider: could not resolve the emitter: ${message}`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (config.watchers.has('query'))
|
|
48
|
+
this.startWatcher(new LucidQueryWatcher(), emitter);
|
|
49
|
+
if (config.watchers.has('mail'))
|
|
50
|
+
this.startWatcher(new MailWatcher(), emitter);
|
|
51
|
+
if (config.watchers.has('cache'))
|
|
52
|
+
this.startWatcher(new CacheWatcher(), emitter);
|
|
53
|
+
if (config.watchers.has('http-client'))
|
|
54
|
+
this.startHttpClientWatcher();
|
|
55
|
+
if (config.watchers.has('logs'))
|
|
56
|
+
await this.startLogsWatcher();
|
|
57
|
+
}
|
|
58
|
+
/** Start the http-client watcher: it patches the global `fetch`, so it needs
|
|
59
|
+
* no emitter and no container resolution. */
|
|
60
|
+
startHttpClientWatcher() {
|
|
61
|
+
const watcher = new HttpClientWatcher();
|
|
62
|
+
try {
|
|
63
|
+
watcher.start();
|
|
64
|
+
this.started.push(watcher);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
68
|
+
console.error(`TelescopeWatchersProvider: failed to start http-client watcher: ${message}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Start the logs watcher: it taps the application logger resolved from the
|
|
72
|
+
* container (instance-scoped, reversible method tee — no global patching). */
|
|
73
|
+
async startLogsWatcher() {
|
|
74
|
+
let logger;
|
|
75
|
+
try {
|
|
76
|
+
logger = (await this.app.container.make('logger'));
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
80
|
+
console.error(`TelescopeWatchersProvider: could not resolve the logger: ${message}`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const watcher = new LogsWatcher();
|
|
84
|
+
try {
|
|
85
|
+
watcher.start(logger);
|
|
86
|
+
this.started.push(watcher);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
90
|
+
console.error(`TelescopeWatchersProvider: failed to start logs watcher: ${message}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** Start one watcher, never letting a watcher's `start` break boot. */
|
|
94
|
+
startWatcher(watcher, emitter) {
|
|
95
|
+
try {
|
|
96
|
+
watcher.start(emitter);
|
|
97
|
+
this.started.push(watcher);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
101
|
+
console.error(`TelescopeWatchersProvider: failed to start ${watcher.type} watcher: ${message}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async shutdown() {
|
|
105
|
+
for (const watcher of this.started) {
|
|
106
|
+
try {
|
|
107
|
+
watcher.stop();
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// never throw out of shutdown
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
this.started.length = 0;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=telescope_watchers_provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telescope_watchers_provider.js","sourceRoot":"","sources":["../../providers/telescope_watchers_provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default Claude model for diagnosis. Sonnet 4.6 is the best speed/intelligence
|
|
3
|
+
* balance for a short structured triage; override with a more capable model
|
|
4
|
+
* (`claude-opus-4-8`) or a cheaper one (`claude-haiku-4-5-20251001`) in config.
|
|
5
|
+
*/
|
|
6
|
+
declare const DEFAULT_MODEL = "claude-sonnet-4-6";
|
|
7
|
+
/**
|
|
8
|
+
* Default cap on generated tokens. The system prompt asks for a bounded JSON
|
|
9
|
+
* object, but we also cap at the API level so a runaway model can't produce a
|
|
10
|
+
* huge, expensive response. 1024 tokens comfortably fits cause + fix + confidence.
|
|
11
|
+
*/
|
|
12
|
+
declare const DEFAULT_MAX_TOKENS = 1024;
|
|
13
|
+
/**
|
|
14
|
+
* The shape of `config/telescope_ai.ts`. The API key is sourced from the
|
|
15
|
+
* environment via the host's `env.get(...)` — never hardcoded — so it stays out of
|
|
16
|
+
* source control.
|
|
17
|
+
*/
|
|
18
|
+
export interface TelescopeAiConfig {
|
|
19
|
+
/**
|
|
20
|
+
* Master switch. When `false` (or when no `apiKey` resolves), the diagnoser is a
|
|
21
|
+
* no-op: `diagnose` returns `null` and never calls the API. Default `true`.
|
|
22
|
+
*/
|
|
23
|
+
enabled?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* The Anthropic API key, e.g. `env.get('ANTHROPIC_API_KEY')`. When absent the
|
|
26
|
+
* diagnoser is effectively disabled (no-op), so the package degrades safely with
|
|
27
|
+
* no key configured.
|
|
28
|
+
*/
|
|
29
|
+
apiKey?: string;
|
|
30
|
+
/** Claude model id. Default `claude-sonnet-4-6`. */
|
|
31
|
+
model?: string;
|
|
32
|
+
/** Hard cap on generated tokens per diagnosis. Default 1024. */
|
|
33
|
+
maxTokens?: number;
|
|
34
|
+
}
|
|
35
|
+
/** The fully-resolved AI config the diagnoser acts on (no optionals). */
|
|
36
|
+
export interface ResolvedTelescopeAiConfig {
|
|
37
|
+
enabled: boolean;
|
|
38
|
+
apiKey: string | null;
|
|
39
|
+
model: string;
|
|
40
|
+
maxTokens: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Identity helper giving `config/telescope_ai.ts` full type-checking, mirroring the
|
|
44
|
+
* AdonisJS `defineConfig` convention.
|
|
45
|
+
*
|
|
46
|
+
* ```ts
|
|
47
|
+
* import env from '#start/env'
|
|
48
|
+
* import { defineConfig } from '@adonis-agora/telescope/ai'
|
|
49
|
+
* export default defineConfig({ apiKey: env.get('ANTHROPIC_API_KEY') })
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare function defineConfig(config: TelescopeAiConfig): TelescopeAiConfig;
|
|
53
|
+
/** Apply defaults to a (possibly partial) config. */
|
|
54
|
+
export declare function resolveConfig(config?: TelescopeAiConfig): ResolvedTelescopeAiConfig;
|
|
55
|
+
export { DEFAULT_MODEL, DEFAULT_MAX_TOKENS };
|
|
56
|
+
//# sourceMappingURL=define_config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../../src/ai/define_config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,QAAA,MAAM,aAAa,sBAAsB,CAAC;AAE1C;;;;GAIG;AACH,QAAA,MAAM,kBAAkB,OAAO,CAAC;AAEhC;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,yEAAyE;AACzE,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAEzE;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,MAAM,GAAE,iBAAsB,GAAG,yBAAyB,CAWvF;AAED,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default Claude model for diagnosis. Sonnet 4.6 is the best speed/intelligence
|
|
3
|
+
* balance for a short structured triage; override with a more capable model
|
|
4
|
+
* (`claude-opus-4-8`) or a cheaper one (`claude-haiku-4-5-20251001`) in config.
|
|
5
|
+
*/
|
|
6
|
+
const DEFAULT_MODEL = 'claude-sonnet-4-6';
|
|
7
|
+
/**
|
|
8
|
+
* Default cap on generated tokens. The system prompt asks for a bounded JSON
|
|
9
|
+
* object, but we also cap at the API level so a runaway model can't produce a
|
|
10
|
+
* huge, expensive response. 1024 tokens comfortably fits cause + fix + confidence.
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_MAX_TOKENS = 1024;
|
|
13
|
+
/**
|
|
14
|
+
* Identity helper giving `config/telescope_ai.ts` full type-checking, mirroring the
|
|
15
|
+
* AdonisJS `defineConfig` convention.
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* import env from '#start/env'
|
|
19
|
+
* import { defineConfig } from '@adonis-agora/telescope/ai'
|
|
20
|
+
* export default defineConfig({ apiKey: env.get('ANTHROPIC_API_KEY') })
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function defineConfig(config) {
|
|
24
|
+
return config;
|
|
25
|
+
}
|
|
26
|
+
/** Apply defaults to a (possibly partial) config. */
|
|
27
|
+
export function resolveConfig(config = {}) {
|
|
28
|
+
const apiKey = typeof config.apiKey === 'string' && config.apiKey.trim() !== '' ? config.apiKey : null;
|
|
29
|
+
return {
|
|
30
|
+
// A configured-but-keyless install is treated as disabled so nothing ever
|
|
31
|
+
// calls the API without credentials.
|
|
32
|
+
enabled: (config.enabled ?? true) && apiKey !== null,
|
|
33
|
+
apiKey,
|
|
34
|
+
model: config.model ?? DEFAULT_MODEL,
|
|
35
|
+
maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export { DEFAULT_MODEL, DEFAULT_MAX_TOKENS };
|
|
39
|
+
//# sourceMappingURL=define_config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../../src/ai/define_config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAE1C;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAiChC;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,MAAyB;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,aAAa,CAAC,SAA4B,EAAE;IAC1D,MAAM,MAAM,GACV,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1F,OAAO;QACL,0EAA0E;QAC1E,qCAAqC;QACrC,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,MAAM,KAAK,IAAI;QACpD,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,aAAa;QACpC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,kBAAkB;KAClD,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type { ExceptionEntryContent } from '../exception_watcher.js';
|
|
2
|
+
/** A diagnosis confidence level, as returned by the model. */
|
|
3
|
+
export type DiagnosisConfidence = 'high' | 'medium' | 'low';
|
|
4
|
+
/**
|
|
5
|
+
* A structured AI diagnosis of one exception family. Returned by
|
|
6
|
+
* {@link TelescopeAiDiagnoser.diagnose} and cached by family hash.
|
|
7
|
+
*/
|
|
8
|
+
export interface Diagnosis {
|
|
9
|
+
/** Likely root cause — what failed and why. */
|
|
10
|
+
cause: string;
|
|
11
|
+
/** A concrete, actionable suggested fix. */
|
|
12
|
+
fix: string;
|
|
13
|
+
/** The model's confidence in this diagnosis. */
|
|
14
|
+
confidence: DiagnosisConfidence;
|
|
15
|
+
/** The model id that produced this diagnosis. */
|
|
16
|
+
model: string;
|
|
17
|
+
/** Whether this result was served from the cache (vs a fresh API call). */
|
|
18
|
+
cached: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** Narrow an arbitrary string to a {@link DiagnosisConfidence}, defaulting to `low`. */
|
|
21
|
+
export declare function normalizeConfidence(value: unknown): DiagnosisConfidence;
|
|
22
|
+
/**
|
|
23
|
+
* Parse the model's text response into a partial diagnosis ({@link cause} +
|
|
24
|
+
* {@link fix} + {@link confidence}), defensively. The model is asked for a bare
|
|
25
|
+
* JSON object, but it may wrap it in markdown fences or add stray prose; we
|
|
26
|
+
* extract the first balanced `{...}` and tolerate missing fields. Throws only
|
|
27
|
+
* when no JSON object can be located at all.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseDiagnosis(text: string): {
|
|
30
|
+
cause: string;
|
|
31
|
+
fix: string;
|
|
32
|
+
confidence: DiagnosisConfidence;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=diagnoser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnoser.d.ts","sourceRoot":"","sources":["../../../src/ai/diagnoser.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,8DAA8D;AAC9D,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE5D;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,gDAAgD;IAChD,UAAU,EAAE,mBAAmB,CAAC;IAChC,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAMvE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,mBAAmB,CAAC;CACjC,CAqBA"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/** Narrow an arbitrary string to a {@link DiagnosisConfidence}, defaulting to `low`. */
|
|
2
|
+
export function normalizeConfidence(value) {
|
|
3
|
+
if (typeof value === 'string') {
|
|
4
|
+
const v = value.trim().toLowerCase();
|
|
5
|
+
if (v === 'high' || v === 'medium' || v === 'low')
|
|
6
|
+
return v;
|
|
7
|
+
}
|
|
8
|
+
return 'low';
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse the model's text response into a partial diagnosis ({@link cause} +
|
|
12
|
+
* {@link fix} + {@link confidence}), defensively. The model is asked for a bare
|
|
13
|
+
* JSON object, but it may wrap it in markdown fences or add stray prose; we
|
|
14
|
+
* extract the first balanced `{...}` and tolerate missing fields. Throws only
|
|
15
|
+
* when no JSON object can be located at all.
|
|
16
|
+
*/
|
|
17
|
+
export function parseDiagnosis(text) {
|
|
18
|
+
const json = extractJsonObject(text);
|
|
19
|
+
if (json === null) {
|
|
20
|
+
throw new Error('AI diagnosis response did not contain a JSON object');
|
|
21
|
+
}
|
|
22
|
+
let parsed;
|
|
23
|
+
try {
|
|
24
|
+
parsed = JSON.parse(json);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
throw new Error('AI diagnosis response was not valid JSON');
|
|
28
|
+
}
|
|
29
|
+
const record = typeof parsed === 'object' && parsed !== null ? parsed : {};
|
|
30
|
+
return {
|
|
31
|
+
cause: typeof record.cause === 'string' ? record.cause : '',
|
|
32
|
+
fix: typeof record.fix === 'string' ? record.fix : '',
|
|
33
|
+
confidence: normalizeConfidence(record.confidence),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Extract the first balanced top-level `{...}` from `text`, ignoring braces inside
|
|
38
|
+
* strings. Returns `null` when none is found. This survives markdown fences and
|
|
39
|
+
* leading/trailing prose around the JSON.
|
|
40
|
+
*/
|
|
41
|
+
function extractJsonObject(text) {
|
|
42
|
+
const start = text.indexOf('{');
|
|
43
|
+
if (start === -1)
|
|
44
|
+
return null;
|
|
45
|
+
let depth = 0;
|
|
46
|
+
let inString = false;
|
|
47
|
+
let escaped = false;
|
|
48
|
+
for (let i = start; i < text.length; i++) {
|
|
49
|
+
const char = text[i];
|
|
50
|
+
if (escaped) {
|
|
51
|
+
escaped = false;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (char === '\\') {
|
|
55
|
+
escaped = true;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (char === '"') {
|
|
59
|
+
inString = !inString;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (inString)
|
|
63
|
+
continue;
|
|
64
|
+
if (char === '{')
|
|
65
|
+
depth++;
|
|
66
|
+
else if (char === '}') {
|
|
67
|
+
depth--;
|
|
68
|
+
if (depth === 0)
|
|
69
|
+
return text.slice(start, i + 1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=diagnoser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnoser.js","sourceRoot":"","sources":["../../../src/ai/diagnoser.ts"],"names":[],"mappings":"AAwBA,wFAAwF;AACxF,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IAKzC,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,MAAM,GACV,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAE,MAAkC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3F,OAAO;QACL,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAC3D,GAAG,EAAE,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACrD,UAAU,EAAE,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC;KACnD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,GAAG,KAAK,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,QAAQ,GAAG,CAAC,QAAQ,CAAC;YACrB,SAAS;QACX,CAAC;QACD,IAAI,QAAQ;YAAE,SAAS;QACvB,IAAI,IAAI,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACrB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Diagnosis } from './diagnoser.js';
|
|
2
|
+
/** Default cap on cached diagnoses. Bounds memory regardless of error variety. */
|
|
3
|
+
declare const DEFAULT_MAX_ENTRIES = 500;
|
|
4
|
+
/** Default time a cached diagnosis stays fresh: 24h. */
|
|
5
|
+
declare const DEFAULT_TTL_MS: number;
|
|
6
|
+
/**
|
|
7
|
+
* The pluggable cache contract a diagnoser reads/writes through, keyed by
|
|
8
|
+
* exception family hash. A host can swap in a Redis- or DB-backed implementation
|
|
9
|
+
* for cross-process sharing; the default is the in-memory LRU below.
|
|
10
|
+
*/
|
|
11
|
+
export interface DiagnosisStore {
|
|
12
|
+
get(familyHash: string): Diagnosis | null;
|
|
13
|
+
set(familyHash: string, diagnosis: Diagnosis): void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Bounded, TTL'd, in-process LRU cache of AI diagnoses keyed by exception
|
|
17
|
+
* `familyHash`. A family is diagnosed ONCE then served from here, so re-diagnosing
|
|
18
|
+
* the same error never burns model tokens.
|
|
19
|
+
*
|
|
20
|
+
* Eviction is insertion-order (`Map` iteration): at the cap the OLDEST inserted
|
|
21
|
+
* entry is dropped, and a re-set entry moves to the end (LRU-on-write). TTL is
|
|
22
|
+
* checked lazily on read (an expired hit is a miss and is deleted), so stale
|
|
23
|
+
* entries don't linger as false "cached" results.
|
|
24
|
+
*/
|
|
25
|
+
export declare class DiagnosisCache implements DiagnosisStore {
|
|
26
|
+
private readonly entries;
|
|
27
|
+
private readonly maxEntries;
|
|
28
|
+
private readonly ttlMs;
|
|
29
|
+
private readonly now;
|
|
30
|
+
constructor(options?: {
|
|
31
|
+
maxEntries?: number;
|
|
32
|
+
ttlMs?: number;
|
|
33
|
+
now?: () => number;
|
|
34
|
+
});
|
|
35
|
+
/** The cached diagnosis for `familyHash`, or `null` on a miss / expiry. */
|
|
36
|
+
get(familyHash: string): Diagnosis | null;
|
|
37
|
+
/** Store (or refresh) the diagnosis for `familyHash`, evicting if over cap. */
|
|
38
|
+
set(familyHash: string, diagnosis: Diagnosis): void;
|
|
39
|
+
/** Number of live entries (test/observability seam; does not evict expired). */
|
|
40
|
+
get size(): number;
|
|
41
|
+
}
|
|
42
|
+
export { DEFAULT_MAX_ENTRIES as DEFAULT_DIAGNOSIS_CACHE_MAX, DEFAULT_TTL_MS as DEFAULT_DIAGNOSIS_TTL_MS, };
|
|
43
|
+
//# sourceMappingURL=diagnosis_cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnosis_cache.d.ts","sourceRoot":"","sources":["../../../src/ai/diagnosis_cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,kFAAkF;AAClF,QAAA,MAAM,mBAAmB,MAAM,CAAC;AAEhC,wDAAwD;AACxD,QAAA,MAAM,cAAc,QAAsB,CAAC;AAO3C;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;CACrD;AAED;;;;;;;;;GASG;AACH,qBAAa,cAAe,YAAW,cAAc;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KAAE;IAMjF,2EAA2E;IAC3E,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAazC,+EAA+E;IAC/E,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAUnD,gFAAgF;IAChF,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED,OAAO,EACL,mBAAmB,IAAI,2BAA2B,EAClD,cAAc,IAAI,wBAAwB,GAC3C,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** Default cap on cached diagnoses. Bounds memory regardless of error variety. */
|
|
2
|
+
const DEFAULT_MAX_ENTRIES = 500;
|
|
3
|
+
/** Default time a cached diagnosis stays fresh: 24h. */
|
|
4
|
+
const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;
|
|
5
|
+
/**
|
|
6
|
+
* Bounded, TTL'd, in-process LRU cache of AI diagnoses keyed by exception
|
|
7
|
+
* `familyHash`. A family is diagnosed ONCE then served from here, so re-diagnosing
|
|
8
|
+
* the same error never burns model tokens.
|
|
9
|
+
*
|
|
10
|
+
* Eviction is insertion-order (`Map` iteration): at the cap the OLDEST inserted
|
|
11
|
+
* entry is dropped, and a re-set entry moves to the end (LRU-on-write). TTL is
|
|
12
|
+
* checked lazily on read (an expired hit is a miss and is deleted), so stale
|
|
13
|
+
* entries don't linger as false "cached" results.
|
|
14
|
+
*/
|
|
15
|
+
export class DiagnosisCache {
|
|
16
|
+
entries = new Map();
|
|
17
|
+
maxEntries;
|
|
18
|
+
ttlMs;
|
|
19
|
+
now;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.maxEntries = options?.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
22
|
+
this.ttlMs = options?.ttlMs ?? DEFAULT_TTL_MS;
|
|
23
|
+
this.now = options?.now ?? Date.now;
|
|
24
|
+
}
|
|
25
|
+
/** The cached diagnosis for `familyHash`, or `null` on a miss / expiry. */
|
|
26
|
+
get(familyHash) {
|
|
27
|
+
const entry = this.entries.get(familyHash);
|
|
28
|
+
if (entry === undefined)
|
|
29
|
+
return null;
|
|
30
|
+
if (this.now() - entry.storedAt >= this.ttlMs) {
|
|
31
|
+
this.entries.delete(familyHash);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
// Refresh recency so genuinely-cold entries are the ones evicted at the cap.
|
|
35
|
+
this.entries.delete(familyHash);
|
|
36
|
+
this.entries.set(familyHash, entry);
|
|
37
|
+
return entry.diagnosis;
|
|
38
|
+
}
|
|
39
|
+
/** Store (or refresh) the diagnosis for `familyHash`, evicting if over cap. */
|
|
40
|
+
set(familyHash, diagnosis) {
|
|
41
|
+
this.entries.delete(familyHash);
|
|
42
|
+
this.entries.set(familyHash, { diagnosis, storedAt: this.now() });
|
|
43
|
+
while (this.entries.size > this.maxEntries) {
|
|
44
|
+
const oldest = this.entries.keys().next().value;
|
|
45
|
+
if (oldest === undefined)
|
|
46
|
+
break;
|
|
47
|
+
this.entries.delete(oldest);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Number of live entries (test/observability seam; does not evict expired). */
|
|
51
|
+
get size() {
|
|
52
|
+
return this.entries.size;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export { DEFAULT_MAX_ENTRIES as DEFAULT_DIAGNOSIS_CACHE_MAX, DEFAULT_TTL_MS as DEFAULT_DIAGNOSIS_TTL_MS, };
|
|
56
|
+
//# sourceMappingURL=diagnosis_cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnosis_cache.js","sourceRoot":"","sources":["../../../src/ai/diagnosis_cache.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,wDAAwD;AACxD,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAiB3C;;;;;;;;;GASG;AACH,MAAM,OAAO,cAAc;IACR,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IACxC,UAAU,CAAS;IACnB,KAAK,CAAS;IACd,GAAG,CAAe;IAEnC,YAAY,OAAqE;QAC/E,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB,CAAC;QAC7D,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,cAAc,CAAC;QAC9C,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACtC,CAAC;IAED,2EAA2E;IAC3E,GAAG,CAAC,UAAkB;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,6EAA6E;QAC7E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,+EAA+E;IAC/E,GAAG,CAAC,UAAkB,EAAE,SAAoB;QAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM;YAChC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF;AAED,OAAO,EACL,mBAAmB,IAAI,2BAA2B,EAClD,cAAc,IAAI,wBAAwB,GAC3C,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ResolvedTelescopeAiConfig } from './define_config.js';
|
|
2
|
+
import type { DiagnosisStore } from './diagnosis_cache.js';
|
|
3
|
+
import { TelescopeAiDiagnoser } from './telescope_ai_diagnoser.js';
|
|
4
|
+
/**
|
|
5
|
+
* Build a {@link TelescopeAiDiagnoser} from a resolved config, constructing the
|
|
6
|
+
* real Anthropic SDK client from `config.apiKey`. Returns `null` when AI is
|
|
7
|
+
* disabled or no key resolved — so the provider can wire a no-op without callers
|
|
8
|
+
* branching. A custom `cache` (e.g. Redis-backed) can be supplied for
|
|
9
|
+
* cross-process diagnosis sharing.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createDiagnoser(config: ResolvedTelescopeAiConfig, options?: {
|
|
12
|
+
cache?: DiagnosisStore;
|
|
13
|
+
logger?: (message: string) => void;
|
|
14
|
+
}): TelescopeAiDiagnoser | null;
|
|
15
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/ai/factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAgC,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEjG;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,yBAAyB,EACjC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GAC3E,oBAAoB,GAAG,IAAI,CAc7B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import { TelescopeAiDiagnoser } from './telescope_ai_diagnoser.js';
|
|
3
|
+
/**
|
|
4
|
+
* Build a {@link TelescopeAiDiagnoser} from a resolved config, constructing the
|
|
5
|
+
* real Anthropic SDK client from `config.apiKey`. Returns `null` when AI is
|
|
6
|
+
* disabled or no key resolved — so the provider can wire a no-op without callers
|
|
7
|
+
* branching. A custom `cache` (e.g. Redis-backed) can be supplied for
|
|
8
|
+
* cross-process diagnosis sharing.
|
|
9
|
+
*/
|
|
10
|
+
export function createDiagnoser(config, options = {}) {
|
|
11
|
+
if (!config.enabled || config.apiKey === null)
|
|
12
|
+
return null;
|
|
13
|
+
// The SDK's `Anthropic` instance satisfies the structural client contract.
|
|
14
|
+
const client = new Anthropic({ apiKey: config.apiKey });
|
|
15
|
+
return new TelescopeAiDiagnoser({
|
|
16
|
+
client,
|
|
17
|
+
model: config.model,
|
|
18
|
+
maxTokens: config.maxTokens,
|
|
19
|
+
enabled: true,
|
|
20
|
+
...(options.cache !== undefined ? { cache: options.cache } : {}),
|
|
21
|
+
...(options.logger !== undefined ? { logger: options.logger } : {}),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/ai/factory.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,OAAO,EAAgC,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEjG;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAiC,EACjC,UAA0E,EAAE;IAE5E,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE3D,2EAA2E;IAC3E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAuC,CAAC;IAE9F,OAAO,IAAI,oBAAoB,CAAC;QAC9B,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,IAAI;QACb,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Keep in sync with this package's `version` in package.json. */
|
|
2
|
+
export declare const VERSION = "0.1.0";
|
|
3
|
+
export { TelescopeAiDiagnoser } from './telescope_ai_diagnoser.js';
|
|
4
|
+
export type { AnthropicMessagesClient, DiagnoseOptions, TelescopeAiDiagnoserOptions, } from './telescope_ai_diagnoser.js';
|
|
5
|
+
export { normalizeConfidence, parseDiagnosis } from './diagnoser.js';
|
|
6
|
+
export type { Diagnosis, DiagnosisConfidence, ExceptionEntryContent } from './diagnoser.js';
|
|
7
|
+
export { DEFAULT_DIAGNOSIS_CACHE_MAX, DEFAULT_DIAGNOSIS_TTL_MS, DiagnosisCache, } from './diagnosis_cache.js';
|
|
8
|
+
export type { DiagnosisStore } from './diagnosis_cache.js';
|
|
9
|
+
export { buildUserPrompt, STACK_FRAME_LIMIT, SYSTEM_PROMPT } from './prompt.js';
|
|
10
|
+
export type { RelatedEntrySummary } from './prompt.js';
|
|
11
|
+
export { createDiagnoser } from './factory.js';
|
|
12
|
+
export { DEFAULT_MAX_TOKENS, DEFAULT_MODEL, defineConfig, resolveConfig, } from './define_config.js';
|
|
13
|
+
export type { ResolvedTelescopeAiConfig, TelescopeAiConfig, } from './define_config.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,eAAO,MAAM,OAAO,UAAU,CAAC;AAG/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,YAAY,EACV,uBAAuB,EACvB,eAAe,EACf,2BAA2B,GAC5B,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrE,YAAY,EAAE,SAAS,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAG5F,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Keep in sync with this package's `version` in package.json. */
|
|
2
|
+
export const VERSION = '0.1.0';
|
|
3
|
+
// — diagnoser —
|
|
4
|
+
export { TelescopeAiDiagnoser } from './telescope_ai_diagnoser.js';
|
|
5
|
+
// — diagnosis model + parsing —
|
|
6
|
+
export { normalizeConfidence, parseDiagnosis } from './diagnoser.js';
|
|
7
|
+
// — cache —
|
|
8
|
+
export { DEFAULT_DIAGNOSIS_CACHE_MAX, DEFAULT_DIAGNOSIS_TTL_MS, DiagnosisCache, } from './diagnosis_cache.js';
|
|
9
|
+
// — prompt —
|
|
10
|
+
export { buildUserPrompt, STACK_FRAME_LIMIT, SYSTEM_PROMPT } from './prompt.js';
|
|
11
|
+
// — factory (constructs the real Anthropic client) —
|
|
12
|
+
export { createDiagnoser } from './factory.js';
|
|
13
|
+
// — config —
|
|
14
|
+
export { DEFAULT_MAX_TOKENS, DEFAULT_MODEL, defineConfig, resolveConfig, } from './define_config.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,gBAAgB;AAChB,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAOnE,gCAAgC;AAChC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrE,YAAY;AACZ,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAG9B,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGhF,qDAAqD;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,aAAa;AACb,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Entry } from '../entry.js';
|
|
2
|
+
import type { ExceptionEntryContent } from './diagnoser.js';
|
|
3
|
+
/**
|
|
4
|
+
* Cap on stack frames sent to the model. The TOP frames carry the throw site and
|
|
5
|
+
* the immediate callers — the highest-signal part for root-causing — while a deep
|
|
6
|
+
* tail mostly burns input tokens. Clipping keeps the prompt bounded and cheap.
|
|
7
|
+
*/
|
|
8
|
+
declare const STACK_FRAME_LIMIT = 25;
|
|
9
|
+
/**
|
|
10
|
+
* The system prompt. Frames the model as a senior engineer triaging a PRODUCTION
|
|
11
|
+
* exception and pins the OUTPUT CONTRACT to a strict JSON object so the result is
|
|
12
|
+
* machine-parseable (cause / fix / confidence) for the dashboard and any
|
|
13
|
+
* downstream alerting. We ask for confidence explicitly so an operator can
|
|
14
|
+
* calibrate trust — a low-confidence guess is still useful but should be read as
|
|
15
|
+
* such.
|
|
16
|
+
*/
|
|
17
|
+
export declare const SYSTEM_PROMPT: string;
|
|
18
|
+
/** A related (non-exception) entry summary fed into the prompt. */
|
|
19
|
+
export interface RelatedEntrySummary {
|
|
20
|
+
type: string;
|
|
21
|
+
summary: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Assemble the USER message from an exception entry and any related trace entries.
|
|
25
|
+
* Plain labelled sections (not JSON) read better for an LLM. Absent fields are
|
|
26
|
+
* omitted rather than rendered as `null`, so the model isn't nudged to comment on
|
|
27
|
+
* missing data.
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildUserPrompt(entry: Entry<ExceptionEntryContent>, related?: RelatedEntrySummary[]): string;
|
|
30
|
+
export { STACK_FRAME_LIMIT };
|
|
31
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/ai/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D;;;;GAIG;AACH,QAAA,MAAM,iBAAiB,KAAK,CAAC;AAE7B;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,QAgBd,CAAC;AAEb,mEAAmE;AACnE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,KAAK,CAAC,qBAAqB,CAAC,EACnC,OAAO,GAAE,mBAAmB,EAAO,GAClC,MAAM,CAuBR;AAOD,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|