@bradygaster/squad-sdk 0.7.0 → 0.8.2
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/README.md +296 -296
- package/dist/adapter/client.d.ts +243 -0
- package/dist/adapter/client.d.ts.map +1 -0
- package/dist/adapter/client.js +567 -0
- package/dist/adapter/client.js.map +1 -0
- package/dist/adapter/errors.d.ts +260 -0
- package/dist/adapter/errors.d.ts.map +1 -0
- package/dist/adapter/errors.js +362 -0
- package/dist/adapter/errors.js.map +1 -0
- package/dist/adapter/types.d.ts +779 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/adapter/types.js +11 -0
- package/dist/adapter/types.js.map +1 -0
- package/dist/agents/charter-compiler.d.ts +102 -0
- package/dist/agents/charter-compiler.d.ts.map +1 -0
- package/dist/agents/charter-compiler.js +157 -0
- package/dist/agents/charter-compiler.js.map +1 -0
- package/dist/agents/history-shadow.d.ts +80 -0
- package/dist/agents/history-shadow.d.ts.map +1 -0
- package/dist/agents/history-shadow.js +239 -0
- package/dist/agents/history-shadow.js.map +1 -0
- package/dist/agents/index.d.ts +71 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +183 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/lifecycle.d.ts +138 -0
- package/dist/agents/lifecycle.d.ts.map +1 -0
- package/dist/agents/lifecycle.js +284 -0
- package/dist/agents/lifecycle.js.map +1 -0
- package/dist/agents/model-selector.d.ts +80 -0
- package/dist/agents/model-selector.d.ts.map +1 -0
- package/dist/agents/model-selector.js +171 -0
- package/dist/agents/model-selector.js.map +1 -0
- package/dist/agents/onboarding.d.ts +65 -0
- package/dist/agents/onboarding.d.ts.map +1 -0
- package/dist/agents/onboarding.js +373 -0
- package/dist/agents/onboarding.js.map +1 -0
- package/dist/build/bundle.d.ts +32 -0
- package/dist/build/bundle.d.ts.map +1 -0
- package/dist/build/bundle.js +97 -0
- package/dist/build/bundle.js.map +1 -0
- package/dist/build/ci-pipeline.d.ts +51 -0
- package/dist/build/ci-pipeline.d.ts.map +1 -0
- package/dist/build/ci-pipeline.js +180 -0
- package/dist/build/ci-pipeline.js.map +1 -0
- package/dist/build/github-dist.d.ts +37 -0
- package/dist/build/github-dist.d.ts.map +1 -0
- package/dist/build/github-dist.js +117 -0
- package/dist/build/github-dist.js.map +1 -0
- package/dist/build/index.d.ts +11 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +11 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/install-migration.d.ts +28 -0
- package/dist/build/install-migration.d.ts.map +1 -0
- package/dist/build/install-migration.js +103 -0
- package/dist/build/install-migration.js.map +1 -0
- package/dist/build/npm-package.d.ts +54 -0
- package/dist/build/npm-package.d.ts.map +1 -0
- package/dist/build/npm-package.js +128 -0
- package/dist/build/npm-package.js.map +1 -0
- package/dist/build/release.d.ts +108 -0
- package/dist/build/release.d.ts.map +1 -0
- package/dist/build/release.js +295 -0
- package/dist/build/release.js.map +1 -0
- package/dist/build/versioning.d.ts +38 -0
- package/dist/build/versioning.d.ts.map +1 -0
- package/dist/build/versioning.js +113 -0
- package/dist/build/versioning.js.map +1 -0
- package/dist/casting/casting-engine.d.ts +60 -0
- package/dist/casting/casting-engine.d.ts.map +1 -0
- package/dist/casting/casting-engine.js +223 -0
- package/dist/casting/casting-engine.js.map +1 -0
- package/dist/casting/casting-history.d.ts +54 -0
- package/dist/casting/casting-history.d.ts.map +1 -0
- package/dist/casting/casting-history.js +63 -0
- package/dist/casting/casting-history.js.map +1 -0
- package/dist/casting/index.d.ts +46 -0
- package/dist/casting/index.d.ts.map +1 -0
- package/dist/casting/index.js +45 -0
- package/dist/casting/index.js.map +1 -0
- package/dist/client/event-bus.d.ts +29 -0
- package/dist/client/event-bus.d.ts.map +1 -0
- package/dist/client/event-bus.js +52 -0
- package/dist/client/event-bus.js.map +1 -0
- package/dist/client/index.d.ts +100 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +170 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/session-pool.d.ts +66 -0
- package/dist/client/session-pool.d.ts.map +1 -0
- package/dist/client/session-pool.js +145 -0
- package/dist/client/session-pool.js.map +1 -0
- package/dist/config/agent-doc.d.ts +43 -0
- package/dist/config/agent-doc.d.ts.map +1 -0
- package/dist/config/agent-doc.js +158 -0
- package/dist/config/agent-doc.js.map +1 -0
- package/dist/config/agent-source.d.ts +95 -0
- package/dist/config/agent-source.d.ts.map +1 -0
- package/dist/config/agent-source.js +274 -0
- package/dist/config/agent-source.js.map +1 -0
- package/dist/config/doc-sync.d.ts +66 -0
- package/dist/config/doc-sync.d.ts.map +1 -0
- package/dist/config/doc-sync.js +270 -0
- package/dist/config/doc-sync.js.map +1 -0
- package/dist/config/feature-audit.d.ts +49 -0
- package/dist/config/feature-audit.d.ts.map +1 -0
- package/dist/config/feature-audit.js +148 -0
- package/dist/config/feature-audit.js.map +1 -0
- package/dist/config/index.d.ts +15 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +15 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/init.d.ts +61 -0
- package/dist/config/init.d.ts.map +1 -0
- package/dist/config/init.js +376 -0
- package/dist/config/init.js.map +1 -0
- package/dist/config/legacy-fallback.d.ts +83 -0
- package/dist/config/legacy-fallback.d.ts.map +1 -0
- package/dist/config/legacy-fallback.js +212 -0
- package/dist/config/legacy-fallback.js.map +1 -0
- package/dist/config/markdown-migration.d.ts +157 -0
- package/dist/config/markdown-migration.d.ts.map +1 -0
- package/dist/config/markdown-migration.js +434 -0
- package/dist/config/markdown-migration.js.map +1 -0
- package/dist/config/migration.d.ts +123 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +273 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/config/migrations/index.d.ts +36 -0
- package/dist/config/migrations/index.d.ts.map +1 -0
- package/dist/config/migrations/index.js +216 -0
- package/dist/config/migrations/index.js.map +1 -0
- package/dist/config/models.d.ts +134 -0
- package/dist/config/models.d.ts.map +1 -0
- package/dist/config/models.js +354 -0
- package/dist/config/models.js.map +1 -0
- package/dist/config/routing.d.ts +118 -0
- package/dist/config/routing.d.ts.map +1 -0
- package/dist/config/routing.js +247 -0
- package/dist/config/routing.js.map +1 -0
- package/dist/config/schema.d.ts +72 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +63 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/coordinator/coordinator.d.ts +82 -0
- package/dist/coordinator/coordinator.d.ts.map +1 -0
- package/dist/coordinator/coordinator.js +192 -0
- package/dist/coordinator/coordinator.js.map +1 -0
- package/dist/coordinator/direct-response.d.ts +83 -0
- package/dist/coordinator/direct-response.d.ts.map +1 -0
- package/dist/coordinator/direct-response.js +187 -0
- package/dist/coordinator/direct-response.js.map +1 -0
- package/dist/coordinator/fan-out.d.ts +83 -0
- package/dist/coordinator/fan-out.d.ts.map +1 -0
- package/dist/coordinator/fan-out.js +161 -0
- package/dist/coordinator/fan-out.js.map +1 -0
- package/dist/coordinator/index.d.ts +62 -0
- package/dist/coordinator/index.d.ts.map +1 -0
- package/dist/coordinator/index.js +171 -0
- package/dist/coordinator/index.js.map +1 -0
- package/dist/coordinator/response-tiers.d.ts +49 -0
- package/dist/coordinator/response-tiers.d.ts.map +1 -0
- package/dist/coordinator/response-tiers.js +149 -0
- package/dist/coordinator/response-tiers.js.map +1 -0
- package/dist/hooks/index.d.ts +103 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +279 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +33 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -3
- package/dist/index.js.map +1 -1
- package/dist/marketplace/backend.d.ts +35 -0
- package/dist/marketplace/backend.d.ts.map +1 -0
- package/dist/marketplace/backend.js +99 -0
- package/dist/marketplace/backend.js.map +1 -0
- package/dist/marketplace/browser.d.ts +33 -0
- package/dist/marketplace/browser.d.ts.map +1 -0
- package/dist/marketplace/browser.js +97 -0
- package/dist/marketplace/browser.js.map +1 -0
- package/dist/marketplace/extension-adapter.d.ts +51 -0
- package/dist/marketplace/extension-adapter.d.ts.map +1 -0
- package/dist/marketplace/extension-adapter.js +81 -0
- package/dist/marketplace/extension-adapter.js.map +1 -0
- package/dist/marketplace/index.d.ts +51 -0
- package/dist/marketplace/index.d.ts.map +1 -0
- package/dist/marketplace/index.js +108 -0
- package/dist/marketplace/index.js.map +1 -0
- package/dist/marketplace/packaging.d.ts +25 -0
- package/dist/marketplace/packaging.d.ts.map +1 -0
- package/dist/marketplace/packaging.js +117 -0
- package/dist/marketplace/packaging.js.map +1 -0
- package/dist/marketplace/schema.d.ts +50 -0
- package/dist/marketplace/schema.d.ts.map +1 -0
- package/dist/marketplace/schema.js +120 -0
- package/dist/marketplace/schema.js.map +1 -0
- package/dist/marketplace/security.d.ts +26 -0
- package/dist/marketplace/security.d.ts.map +1 -0
- package/dist/marketplace/security.js +199 -0
- package/dist/marketplace/security.js.map +1 -0
- package/dist/parsers.d.ts +15 -0
- package/dist/parsers.d.ts.map +1 -0
- package/dist/parsers.js +15 -0
- package/dist/parsers.js.map +1 -0
- package/dist/ralph/index.d.ts +58 -0
- package/dist/ralph/index.d.ts.map +1 -0
- package/dist/ralph/index.js +128 -0
- package/dist/ralph/index.js.map +1 -0
- package/dist/resolution.d.ts +47 -0
- package/dist/resolution.d.ts.map +1 -0
- package/dist/resolution.js +106 -0
- package/dist/resolution.js.map +1 -0
- package/dist/runtime/benchmarks.d.ts +121 -0
- package/dist/runtime/benchmarks.d.ts.map +1 -0
- package/dist/runtime/benchmarks.js +251 -0
- package/dist/runtime/benchmarks.js.map +1 -0
- package/dist/runtime/config.d.ts +314 -0
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/runtime/config.js +467 -0
- package/dist/runtime/config.js.map +1 -0
- package/dist/runtime/constants.d.ts +35 -0
- package/dist/runtime/constants.d.ts.map +1 -0
- package/dist/runtime/constants.js +58 -0
- package/dist/runtime/constants.js.map +1 -0
- package/dist/runtime/cost-tracker.d.ts +73 -0
- package/dist/runtime/cost-tracker.d.ts.map +1 -0
- package/dist/runtime/cost-tracker.js +157 -0
- package/dist/runtime/cost-tracker.js.map +1 -0
- package/dist/runtime/event-bus-otel-bridge.d.ts +19 -0
- package/dist/runtime/event-bus-otel-bridge.d.ts.map +1 -0
- package/dist/runtime/event-bus-otel-bridge.js +61 -0
- package/dist/runtime/event-bus-otel-bridge.js.map +1 -0
- package/dist/runtime/event-bus-ws-bridge.d.ts +35 -0
- package/dist/runtime/event-bus-ws-bridge.d.ts.map +1 -0
- package/dist/runtime/event-bus-ws-bridge.js +55 -0
- package/dist/runtime/event-bus-ws-bridge.js.map +1 -0
- package/dist/runtime/event-bus.d.ts +190 -0
- package/dist/runtime/event-bus.d.ts.map +1 -0
- package/dist/runtime/event-bus.js +218 -0
- package/dist/runtime/event-bus.js.map +1 -0
- package/dist/runtime/event-payloads.d.ts +108 -0
- package/dist/runtime/event-payloads.d.ts.map +1 -0
- package/dist/runtime/event-payloads.js +28 -0
- package/dist/runtime/event-payloads.js.map +1 -0
- package/dist/runtime/health.d.ts +66 -0
- package/dist/runtime/health.d.ts.map +1 -0
- package/dist/runtime/health.js +112 -0
- package/dist/runtime/health.js.map +1 -0
- package/dist/runtime/i18n.d.ts +54 -0
- package/dist/runtime/i18n.d.ts.map +1 -0
- package/dist/runtime/i18n.js +126 -0
- package/dist/runtime/i18n.js.map +1 -0
- package/dist/runtime/offline.d.ts +64 -0
- package/dist/runtime/offline.d.ts.map +1 -0
- package/dist/runtime/offline.js +108 -0
- package/dist/runtime/offline.js.map +1 -0
- package/dist/runtime/otel-bridge.d.ts +52 -0
- package/dist/runtime/otel-bridge.d.ts.map +1 -0
- package/dist/runtime/otel-bridge.js +132 -0
- package/dist/runtime/otel-bridge.js.map +1 -0
- package/dist/runtime/otel-init.d.ts +72 -0
- package/dist/runtime/otel-init.d.ts.map +1 -0
- package/dist/runtime/otel-init.js +68 -0
- package/dist/runtime/otel-init.js.map +1 -0
- package/dist/runtime/otel-metrics.d.ts +42 -0
- package/dist/runtime/otel-metrics.d.ts.map +1 -0
- package/dist/runtime/otel-metrics.js +196 -0
- package/dist/runtime/otel-metrics.js.map +1 -0
- package/dist/runtime/otel.d.ts +53 -0
- package/dist/runtime/otel.d.ts.map +1 -0
- package/dist/runtime/otel.js +127 -0
- package/dist/runtime/otel.js.map +1 -0
- package/dist/runtime/squad-observer.d.ts +75 -0
- package/dist/runtime/squad-observer.d.ts.map +1 -0
- package/dist/runtime/squad-observer.js +190 -0
- package/dist/runtime/squad-observer.js.map +1 -0
- package/dist/runtime/streaming.d.ts +106 -0
- package/dist/runtime/streaming.d.ts.map +1 -0
- package/dist/runtime/streaming.js +192 -0
- package/dist/runtime/streaming.js.map +1 -0
- package/dist/runtime/telemetry.d.ts +82 -0
- package/dist/runtime/telemetry.d.ts.map +1 -0
- package/dist/runtime/telemetry.js +120 -0
- package/dist/runtime/telemetry.js.map +1 -0
- package/dist/sharing/agent-repo.d.ts +33 -0
- package/dist/sharing/agent-repo.d.ts.map +1 -0
- package/dist/sharing/agent-repo.js +79 -0
- package/dist/sharing/agent-repo.js.map +1 -0
- package/dist/sharing/cache.d.ts +36 -0
- package/dist/sharing/cache.d.ts.map +1 -0
- package/dist/sharing/cache.js +85 -0
- package/dist/sharing/cache.js.map +1 -0
- package/dist/sharing/conflicts.d.ts +32 -0
- package/dist/sharing/conflicts.d.ts.map +1 -0
- package/dist/sharing/conflicts.js +121 -0
- package/dist/sharing/conflicts.js.map +1 -0
- package/dist/sharing/export.d.ts +50 -0
- package/dist/sharing/export.d.ts.map +1 -0
- package/dist/sharing/export.js +156 -0
- package/dist/sharing/export.js.map +1 -0
- package/dist/sharing/history-split.d.ts +34 -0
- package/dist/sharing/history-split.d.ts.map +1 -0
- package/dist/sharing/history-split.js +101 -0
- package/dist/sharing/history-split.js.map +1 -0
- package/dist/sharing/import.d.ts +37 -0
- package/dist/sharing/import.d.ts.map +1 -0
- package/dist/sharing/import.js +138 -0
- package/dist/sharing/import.js.map +1 -0
- package/dist/sharing/index.d.ts +11 -0
- package/dist/sharing/index.d.ts.map +1 -0
- package/dist/sharing/index.js +11 -0
- package/dist/sharing/index.js.map +1 -0
- package/dist/sharing/versioning.d.ts +32 -0
- package/dist/sharing/versioning.d.ts.map +1 -0
- package/dist/sharing/versioning.js +64 -0
- package/dist/sharing/versioning.js.map +1 -0
- package/dist/skills/index.d.ts +49 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +85 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +56 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +106 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/skill-source.d.ts +63 -0
- package/dist/skills/skill-source.d.ts.map +1 -0
- package/dist/skills/skill-source.js +199 -0
- package/dist/skills/skill-source.js.map +1 -0
- package/dist/tools/index.d.ts +95 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +475 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/upstream/index.d.ts +8 -0
- package/dist/upstream/index.d.ts.map +1 -0
- package/dist/upstream/index.js +7 -0
- package/dist/upstream/index.js.map +1 -0
- package/dist/upstream/resolver.d.ts +37 -0
- package/dist/upstream/resolver.d.ts.map +1 -0
- package/dist/upstream/resolver.js +234 -0
- package/dist/upstream/resolver.js.map +1 -0
- package/dist/upstream/types.d.ts +55 -0
- package/dist/upstream/types.d.ts.map +1 -0
- package/dist/upstream/types.js +11 -0
- package/dist/upstream/types.js.map +1 -0
- package/dist/utils/normalize-eol.d.ts +6 -0
- package/dist/utils/normalize-eol.d.ts.map +1 -0
- package/dist/utils/normalize-eol.js +8 -0
- package/dist/utils/normalize-eol.js.map +1 -0
- package/package.json +197 -63
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internationalization & Accessibility Support
|
|
3
|
+
*
|
|
4
|
+
* String externalization for CLI output with locale switching
|
|
5
|
+
* and accessibility auditing utilities.
|
|
6
|
+
*
|
|
7
|
+
* @module runtime/i18n
|
|
8
|
+
*/
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Default English Catalog
|
|
11
|
+
// ============================================================================
|
|
12
|
+
export const defaultCatalog = {
|
|
13
|
+
// CLI
|
|
14
|
+
'cli.version': 'squad {version}',
|
|
15
|
+
'cli.help.header': 'squad {version} — Programmable multi-agent runtime for GitHub Copilot',
|
|
16
|
+
'cli.help.usage': 'Usage: squad [command] [options]',
|
|
17
|
+
'cli.unknown_command': 'Unknown command: {command}',
|
|
18
|
+
'cli.init.success': 'Initialized Squad project in {path}',
|
|
19
|
+
'cli.init.already_exists': 'Squad config already exists at {path}',
|
|
20
|
+
// Config
|
|
21
|
+
'config.loading': 'Loading configuration from {path}…',
|
|
22
|
+
'config.valid': 'Configuration is valid.',
|
|
23
|
+
'config.invalid': 'Configuration validation failed: {error}',
|
|
24
|
+
'config.not_found': 'No configuration file found. Run `squad init` to create one.',
|
|
25
|
+
// Routing
|
|
26
|
+
'routing.match': 'Matched route: {pattern} → {agents}',
|
|
27
|
+
'routing.no_match': 'No routing rule matched. Using fallback: {fallback}',
|
|
28
|
+
// Agents
|
|
29
|
+
'agent.spawned': 'Agent {name} spawned with model {model}.',
|
|
30
|
+
'agent.retired': 'Agent {name} retired.',
|
|
31
|
+
'agent.error': 'Agent {name} encountered an error: {error}',
|
|
32
|
+
// Migration
|
|
33
|
+
'migration.detected': 'Legacy setup detected at {path}. Consider migrating to squad.config.ts.',
|
|
34
|
+
'migration.complete': 'Migration complete. Review {path} and remove legacy files when ready.',
|
|
35
|
+
// General
|
|
36
|
+
'error.unexpected': 'An unexpected error occurred: {error}',
|
|
37
|
+
'info.verbose': 'Verbose output enabled. Disable with --no-verbose.',
|
|
38
|
+
};
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// I18nManager
|
|
41
|
+
// ============================================================================
|
|
42
|
+
/**
|
|
43
|
+
* Manages locale-specific message catalogs and string formatting.
|
|
44
|
+
*/
|
|
45
|
+
export class I18nManager {
|
|
46
|
+
locale;
|
|
47
|
+
catalogs;
|
|
48
|
+
constructor(locale = 'en') {
|
|
49
|
+
this.catalogs = new Map();
|
|
50
|
+
this.catalogs.set('en', { ...defaultCatalog });
|
|
51
|
+
this.locale = locale;
|
|
52
|
+
}
|
|
53
|
+
/** Register a catalog for a locale. */
|
|
54
|
+
registerCatalog(locale, catalog) {
|
|
55
|
+
this.catalogs.set(locale, catalog);
|
|
56
|
+
}
|
|
57
|
+
/** Switch the active locale. Throws if no catalog is registered. */
|
|
58
|
+
setLocale(locale) {
|
|
59
|
+
if (!this.catalogs.has(locale)) {
|
|
60
|
+
throw new Error(`No catalog registered for locale: ${locale}`);
|
|
61
|
+
}
|
|
62
|
+
this.locale = locale;
|
|
63
|
+
}
|
|
64
|
+
/** Return the active locale. */
|
|
65
|
+
getLocale() {
|
|
66
|
+
return this.locale;
|
|
67
|
+
}
|
|
68
|
+
/** Return all locales that have a registered catalog. */
|
|
69
|
+
getAvailableLocales() {
|
|
70
|
+
return [...this.catalogs.keys()];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Format a message by key, interpolating `{param}` placeholders.
|
|
74
|
+
* Falls back to 'en' if the key is missing in the active locale.
|
|
75
|
+
* Returns the raw key if no catalog contains it.
|
|
76
|
+
*/
|
|
77
|
+
formatMessage(key, params) {
|
|
78
|
+
const catalog = this.catalogs.get(this.locale);
|
|
79
|
+
const fallback = this.catalogs.get('en');
|
|
80
|
+
const template = catalog?.[key] ?? fallback?.[key] ?? key;
|
|
81
|
+
if (!params)
|
|
82
|
+
return template;
|
|
83
|
+
return template.replace(/\{(\w+)\}/g, (_, name) => params[name] ?? `{${name}}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ============================================================================
|
|
87
|
+
// Accessibility Audit
|
|
88
|
+
// ============================================================================
|
|
89
|
+
/**
|
|
90
|
+
* Audit a Squad configuration for accessibility concerns.
|
|
91
|
+
* Returns findings with severity levels; `passed` is true when no errors exist.
|
|
92
|
+
*/
|
|
93
|
+
export function auditAccessibility(config) {
|
|
94
|
+
const findings = [];
|
|
95
|
+
// Check agent display names for screen-reader friendliness
|
|
96
|
+
for (const agent of config.agents ?? []) {
|
|
97
|
+
if (!agent.displayName) {
|
|
98
|
+
findings.push({
|
|
99
|
+
category: 'screen-reader',
|
|
100
|
+
severity: 'warning',
|
|
101
|
+
message: `Agent "${agent.name}" has no displayName. Screen readers will use the raw name.`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Color-contrast note for CLI consumers
|
|
106
|
+
findings.push({
|
|
107
|
+
category: 'color-contrast',
|
|
108
|
+
severity: 'info',
|
|
109
|
+
message: 'CLI output should use ANSI colors that meet WCAG AA contrast on both light and dark terminals.',
|
|
110
|
+
});
|
|
111
|
+
// Verbose mode flag reminder
|
|
112
|
+
findings.push({
|
|
113
|
+
category: 'verbose-mode',
|
|
114
|
+
severity: 'info',
|
|
115
|
+
message: 'Ensure all commands support --verbose / --quiet flags for assistive-technology users.',
|
|
116
|
+
});
|
|
117
|
+
// Keyboard navigation note
|
|
118
|
+
findings.push({
|
|
119
|
+
category: 'keyboard-nav',
|
|
120
|
+
severity: 'info',
|
|
121
|
+
message: 'Interactive prompts must be navigable via keyboard without mouse input.',
|
|
122
|
+
});
|
|
123
|
+
const passed = findings.every((f) => f.severity !== 'error');
|
|
124
|
+
return { passed, findings };
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/runtime/i18n.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offline Mode — graceful degradation when connectivity is unavailable
|
|
3
|
+
* Issue #142 (M5-14)
|
|
4
|
+
*/
|
|
5
|
+
export type ConnectivityStatus = 'online' | 'offline' | 'degraded';
|
|
6
|
+
export interface PendingOperation {
|
|
7
|
+
id: string;
|
|
8
|
+
type: string;
|
|
9
|
+
payload: Record<string, unknown>;
|
|
10
|
+
timestamp: string;
|
|
11
|
+
retries: number;
|
|
12
|
+
}
|
|
13
|
+
export interface OfflineCapabilities {
|
|
14
|
+
localAgents: boolean;
|
|
15
|
+
cachedSkills: boolean;
|
|
16
|
+
configEditing: boolean;
|
|
17
|
+
marketplaceBrowse: boolean;
|
|
18
|
+
publishing: boolean;
|
|
19
|
+
remoteAgents: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface OfflineStatus {
|
|
22
|
+
connectivity: ConnectivityStatus;
|
|
23
|
+
pendingOps: number;
|
|
24
|
+
lastSync: string | null;
|
|
25
|
+
cachedAgents: string[];
|
|
26
|
+
}
|
|
27
|
+
export declare function detectConnectivity(checker?: () => Promise<boolean>): Promise<ConnectivityStatus>;
|
|
28
|
+
export declare class OfflineManager {
|
|
29
|
+
private connectivity;
|
|
30
|
+
private pendingQueue;
|
|
31
|
+
private lastSyncTime;
|
|
32
|
+
private cachedAgentNames;
|
|
33
|
+
private connectivityChecker?;
|
|
34
|
+
private syncHandler?;
|
|
35
|
+
constructor(options?: {
|
|
36
|
+
connectivityChecker?: () => Promise<boolean>;
|
|
37
|
+
syncHandler?: (op: PendingOperation) => Promise<boolean>;
|
|
38
|
+
cachedAgents?: string[];
|
|
39
|
+
});
|
|
40
|
+
/** Get what works offline */
|
|
41
|
+
getOfflineCapabilities(): OfflineCapabilities;
|
|
42
|
+
/** Queue an operation for later sync */
|
|
43
|
+
queueForSync(operation: PendingOperation): void;
|
|
44
|
+
/** Replay queued operations */
|
|
45
|
+
syncPending(): Promise<SyncResult>;
|
|
46
|
+
/** Get current offline status */
|
|
47
|
+
getOfflineStatus(): OfflineStatus;
|
|
48
|
+
/** Update connectivity status */
|
|
49
|
+
refreshConnectivity(): Promise<ConnectivityStatus>;
|
|
50
|
+
/** Set connectivity directly (useful for testing) */
|
|
51
|
+
setConnectivity(status: ConnectivityStatus): void;
|
|
52
|
+
/** Add a cached agent name */
|
|
53
|
+
addCachedAgent(name: string): void;
|
|
54
|
+
/** Get pending operations */
|
|
55
|
+
getPendingOperations(): PendingOperation[];
|
|
56
|
+
/** Clear all pending operations */
|
|
57
|
+
clearPending(): void;
|
|
58
|
+
}
|
|
59
|
+
export interface SyncResult {
|
|
60
|
+
synced: number;
|
|
61
|
+
failed: number;
|
|
62
|
+
remaining: number;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=offline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline.d.ts","sourceRoot":"","sources":["../../src/runtime/offline.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAInE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAID,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,kBAAkB,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID,wBAAgB,kBAAkB,CAChC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAQ7B;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,mBAAmB,CAAC,CAAyB;IACrD,OAAO,CAAC,WAAW,CAAC,CAA6C;gBAErD,OAAO,CAAC,EAAE;QACpB,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB;IAMD,6BAA6B;IAC7B,sBAAsB,IAAI,mBAAmB;IAY7C,wCAAwC;IACxC,YAAY,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAI/C,+BAA+B;IACzB,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC;IAkCxC,iCAAiC;IACjC,gBAAgB,IAAI,aAAa;IASjC,iCAAiC;IAC3B,mBAAmB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAKxD,qDAAqD;IACrD,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAIjD,8BAA8B;IAC9B,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMlC,6BAA6B;IAC7B,oBAAoB,IAAI,gBAAgB,EAAE;IAI1C,mCAAmC;IACnC,YAAY,IAAI,IAAI;CAGrB;AAID,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offline Mode — graceful degradation when connectivity is unavailable
|
|
3
|
+
* Issue #142 (M5-14)
|
|
4
|
+
*/
|
|
5
|
+
// --- Detect connectivity ---
|
|
6
|
+
export function detectConnectivity(checker) {
|
|
7
|
+
if (!checker) {
|
|
8
|
+
return Promise.resolve('online');
|
|
9
|
+
}
|
|
10
|
+
return checker()
|
|
11
|
+
.then((ok) => (ok ? 'online' : 'offline'))
|
|
12
|
+
.catch(() => 'offline');
|
|
13
|
+
}
|
|
14
|
+
// --- OfflineManager ---
|
|
15
|
+
export class OfflineManager {
|
|
16
|
+
connectivity = 'online';
|
|
17
|
+
pendingQueue = [];
|
|
18
|
+
lastSyncTime = null;
|
|
19
|
+
cachedAgentNames = [];
|
|
20
|
+
connectivityChecker;
|
|
21
|
+
syncHandler;
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.connectivityChecker = options?.connectivityChecker;
|
|
24
|
+
this.syncHandler = options?.syncHandler;
|
|
25
|
+
this.cachedAgentNames = options?.cachedAgents ?? [];
|
|
26
|
+
}
|
|
27
|
+
/** Get what works offline */
|
|
28
|
+
getOfflineCapabilities() {
|
|
29
|
+
const isOnline = this.connectivity === 'online';
|
|
30
|
+
return {
|
|
31
|
+
localAgents: true,
|
|
32
|
+
cachedSkills: true,
|
|
33
|
+
configEditing: true,
|
|
34
|
+
marketplaceBrowse: isOnline || this.connectivity === 'degraded',
|
|
35
|
+
publishing: isOnline,
|
|
36
|
+
remoteAgents: isOnline,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Queue an operation for later sync */
|
|
40
|
+
queueForSync(operation) {
|
|
41
|
+
this.pendingQueue.push({ ...operation });
|
|
42
|
+
}
|
|
43
|
+
/** Replay queued operations */
|
|
44
|
+
async syncPending() {
|
|
45
|
+
if (this.connectivity === 'offline') {
|
|
46
|
+
return { synced: 0, failed: 0, remaining: this.pendingQueue.length };
|
|
47
|
+
}
|
|
48
|
+
let synced = 0;
|
|
49
|
+
let failed = 0;
|
|
50
|
+
const remaining = [];
|
|
51
|
+
for (const op of this.pendingQueue) {
|
|
52
|
+
try {
|
|
53
|
+
const success = this.syncHandler
|
|
54
|
+
? await this.syncHandler(op)
|
|
55
|
+
: true;
|
|
56
|
+
if (success) {
|
|
57
|
+
synced++;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
op.retries++;
|
|
61
|
+
remaining.push(op);
|
|
62
|
+
failed++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
op.retries++;
|
|
67
|
+
remaining.push(op);
|
|
68
|
+
failed++;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
this.pendingQueue = remaining;
|
|
72
|
+
this.lastSyncTime = new Date().toISOString();
|
|
73
|
+
return { synced, failed, remaining: remaining.length };
|
|
74
|
+
}
|
|
75
|
+
/** Get current offline status */
|
|
76
|
+
getOfflineStatus() {
|
|
77
|
+
return {
|
|
78
|
+
connectivity: this.connectivity,
|
|
79
|
+
pendingOps: this.pendingQueue.length,
|
|
80
|
+
lastSync: this.lastSyncTime,
|
|
81
|
+
cachedAgents: [...this.cachedAgentNames],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** Update connectivity status */
|
|
85
|
+
async refreshConnectivity() {
|
|
86
|
+
this.connectivity = await detectConnectivity(this.connectivityChecker);
|
|
87
|
+
return this.connectivity;
|
|
88
|
+
}
|
|
89
|
+
/** Set connectivity directly (useful for testing) */
|
|
90
|
+
setConnectivity(status) {
|
|
91
|
+
this.connectivity = status;
|
|
92
|
+
}
|
|
93
|
+
/** Add a cached agent name */
|
|
94
|
+
addCachedAgent(name) {
|
|
95
|
+
if (!this.cachedAgentNames.includes(name)) {
|
|
96
|
+
this.cachedAgentNames.push(name);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** Get pending operations */
|
|
100
|
+
getPendingOperations() {
|
|
101
|
+
return [...this.pendingQueue];
|
|
102
|
+
}
|
|
103
|
+
/** Clear all pending operations */
|
|
104
|
+
clearPending() {
|
|
105
|
+
this.pendingQueue = [];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=offline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline.js","sourceRoot":"","sources":["../../src/runtime/offline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OTel Bridge for TelemetryCollector (Issue #256)
|
|
3
|
+
*
|
|
4
|
+
* Converts TelemetryEvents into OpenTelemetry spans, providing a
|
|
5
|
+
* TelemetryTransport that can be registered via setTelemetryTransport().
|
|
6
|
+
* Additive — the existing transport pipeline is unaffected.
|
|
7
|
+
*
|
|
8
|
+
* @module runtime/otel-bridge
|
|
9
|
+
*/
|
|
10
|
+
import type { TelemetryTransport } from './telemetry.js';
|
|
11
|
+
import type { EventBus, UnsubscribeFn } from './event-bus.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create a TelemetryTransport that emits OTel spans for each event.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { setTelemetryTransport } from './telemetry.js';
|
|
18
|
+
* import { createOTelTransport } from './otel-bridge.js';
|
|
19
|
+
*
|
|
20
|
+
* setTelemetryTransport(createOTelTransport());
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* The bridge ignores the `endpoint` parameter — OTel exporter config is
|
|
24
|
+
* managed by the OTel provider initialized via `initializeOTel()`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createOTelTransport(): TelemetryTransport;
|
|
27
|
+
/**
|
|
28
|
+
* Subscribe an {@link EventBus} to OpenTelemetry, creating a span for every
|
|
29
|
+
* event that flows through the bus.
|
|
30
|
+
*
|
|
31
|
+
* This is the **mid-level** OTel integration point — it wires the Squad
|
|
32
|
+
* event bus directly into the OTel trace pipeline. If no `TracerProvider`
|
|
33
|
+
* has been registered (e.g. via {@link initializeOTel}), all spans are
|
|
34
|
+
* automatically no-ops with zero overhead.
|
|
35
|
+
*
|
|
36
|
+
* @param bus - The EventBus instance to bridge.
|
|
37
|
+
* @returns An unsubscribe function. Call it to detach the bridge.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* import { EventBus, initializeOTel, bridgeEventBusToOTel } from 'squad-sdk';
|
|
42
|
+
*
|
|
43
|
+
* const bus = new EventBus();
|
|
44
|
+
* initializeOTel({ endpoint: 'http://localhost:4318' });
|
|
45
|
+
* const detach = bridgeEventBusToOTel(bus);
|
|
46
|
+
*
|
|
47
|
+
* // Later, to stop bridging:
|
|
48
|
+
* detach();
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function bridgeEventBusToOTel(bus: EventBus): UnsubscribeFn;
|
|
52
|
+
//# sourceMappingURL=otel-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel-bridge.d.ts","sourceRoot":"","sources":["../../src/runtime/otel-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAkB,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAc,MAAM,gBAAgB,CAAC;AAsE1E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,IAAI,kBAAkB,CAMxD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAejE"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OTel Bridge for TelemetryCollector (Issue #256)
|
|
3
|
+
*
|
|
4
|
+
* Converts TelemetryEvents into OpenTelemetry spans, providing a
|
|
5
|
+
* TelemetryTransport that can be registered via setTelemetryTransport().
|
|
6
|
+
* Additive — the existing transport pipeline is unaffected.
|
|
7
|
+
*
|
|
8
|
+
* @module runtime/otel-bridge
|
|
9
|
+
*/
|
|
10
|
+
import { SpanStatusCode } from '@opentelemetry/api';
|
|
11
|
+
import { getTracer } from './otel.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Span mapping
|
|
14
|
+
// ============================================================================
|
|
15
|
+
function recordSpan(event) {
|
|
16
|
+
const tracer = getTracer('squad-sdk');
|
|
17
|
+
const attrs = {};
|
|
18
|
+
if (event.properties) {
|
|
19
|
+
for (const [k, v] of Object.entries(event.properties)) {
|
|
20
|
+
attrs[k] = v;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (event.timestamp) {
|
|
24
|
+
attrs['event.timestamp'] = event.timestamp;
|
|
25
|
+
}
|
|
26
|
+
switch (event.name) {
|
|
27
|
+
case 'squad.init': {
|
|
28
|
+
const span = tracer.startSpan('squad.init', { attributes: attrs });
|
|
29
|
+
span.end();
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
case 'squad.agent.spawn': {
|
|
33
|
+
const span = tracer.startSpan('squad.agent.spawn', { attributes: attrs });
|
|
34
|
+
span.end();
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case 'squad.error': {
|
|
38
|
+
const span = tracer.startSpan('squad.error', { attributes: attrs });
|
|
39
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: String(attrs['error'] ?? 'unknown') });
|
|
40
|
+
span.addEvent('exception', {
|
|
41
|
+
'exception.message': String(attrs['error'] ?? attrs['message'] ?? 'unknown error'),
|
|
42
|
+
...(attrs['stack'] ? { 'exception.stacktrace': String(attrs['stack']) } : {}),
|
|
43
|
+
});
|
|
44
|
+
span.end();
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case 'squad.run': {
|
|
48
|
+
// Root span for the entire session — start and immediately end
|
|
49
|
+
// (the real duration would be managed by the caller if needed)
|
|
50
|
+
const span = tracer.startSpan('squad.run', { attributes: attrs });
|
|
51
|
+
span.end();
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
case 'squad.upgrade': {
|
|
55
|
+
const span = tracer.startSpan('squad.upgrade', { attributes: attrs });
|
|
56
|
+
span.end();
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
default: {
|
|
60
|
+
// Forward unknown events as generic spans
|
|
61
|
+
const span = tracer.startSpan(event.name, { attributes: attrs });
|
|
62
|
+
span.end();
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// ============================================================================
|
|
68
|
+
// Public API
|
|
69
|
+
// ============================================================================
|
|
70
|
+
/**
|
|
71
|
+
* Create a TelemetryTransport that emits OTel spans for each event.
|
|
72
|
+
*
|
|
73
|
+
* Usage:
|
|
74
|
+
* ```ts
|
|
75
|
+
* import { setTelemetryTransport } from './telemetry.js';
|
|
76
|
+
* import { createOTelTransport } from './otel-bridge.js';
|
|
77
|
+
*
|
|
78
|
+
* setTelemetryTransport(createOTelTransport());
|
|
79
|
+
* ```
|
|
80
|
+
*
|
|
81
|
+
* The bridge ignores the `endpoint` parameter — OTel exporter config is
|
|
82
|
+
* managed by the OTel provider initialized via `initializeOTel()`.
|
|
83
|
+
*/
|
|
84
|
+
export function createOTelTransport() {
|
|
85
|
+
return async (events, _endpoint) => {
|
|
86
|
+
for (const event of events) {
|
|
87
|
+
recordSpan(event);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Subscribe an {@link EventBus} to OpenTelemetry, creating a span for every
|
|
93
|
+
* event that flows through the bus.
|
|
94
|
+
*
|
|
95
|
+
* This is the **mid-level** OTel integration point — it wires the Squad
|
|
96
|
+
* event bus directly into the OTel trace pipeline. If no `TracerProvider`
|
|
97
|
+
* has been registered (e.g. via {@link initializeOTel}), all spans are
|
|
98
|
+
* automatically no-ops with zero overhead.
|
|
99
|
+
*
|
|
100
|
+
* @param bus - The EventBus instance to bridge.
|
|
101
|
+
* @returns An unsubscribe function. Call it to detach the bridge.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```ts
|
|
105
|
+
* import { EventBus, initializeOTel, bridgeEventBusToOTel } from 'squad-sdk';
|
|
106
|
+
*
|
|
107
|
+
* const bus = new EventBus();
|
|
108
|
+
* initializeOTel({ endpoint: 'http://localhost:4318' });
|
|
109
|
+
* const detach = bridgeEventBusToOTel(bus);
|
|
110
|
+
*
|
|
111
|
+
* // Later, to stop bridging:
|
|
112
|
+
* detach();
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export function bridgeEventBusToOTel(bus) {
|
|
116
|
+
return bus.subscribeAll((event) => {
|
|
117
|
+
const tracer = getTracer('squad-sdk');
|
|
118
|
+
const attrs = {
|
|
119
|
+
'event.type': event.type,
|
|
120
|
+
};
|
|
121
|
+
if (event.sessionId)
|
|
122
|
+
attrs['session.id'] = event.sessionId;
|
|
123
|
+
if (event.agentName)
|
|
124
|
+
attrs['agent.name'] = event.agentName;
|
|
125
|
+
const span = tracer.startSpan(`squad.${event.type}`, { attributes: attrs });
|
|
126
|
+
if (event.type === 'session:error') {
|
|
127
|
+
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
128
|
+
}
|
|
129
|
+
span.end();
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=otel-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel-bridge.js","sourceRoot":"","sources":["../../src/runtime/otel-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-Level OTel Initialization (Issue #266)
|
|
3
|
+
*
|
|
4
|
+
* One-call setup that wires OTel providers, the EventBus bridge, and
|
|
5
|
+
* the TelemetryCollector transport in a single invocation. Consumers
|
|
6
|
+
* who don't use OTel pay nothing — if no provider is registered all
|
|
7
|
+
* instrumentation is a no-op.
|
|
8
|
+
*
|
|
9
|
+
* @module runtime/otel-init
|
|
10
|
+
*/
|
|
11
|
+
import type { OTelConfig } from './otel.js';
|
|
12
|
+
import type { EventBus } from './event-bus.js';
|
|
13
|
+
/** Options for the high-level {@link initSquadTelemetry} helper. */
|
|
14
|
+
export interface SquadTelemetryOptions extends OTelConfig {
|
|
15
|
+
/**
|
|
16
|
+
* When provided, all EventBus events are automatically forwarded
|
|
17
|
+
* as OTel spans via {@link bridgeEventBusToOTel}.
|
|
18
|
+
*/
|
|
19
|
+
eventBus?: EventBus;
|
|
20
|
+
/**
|
|
21
|
+
* When `true`, the OTel-backed TelemetryTransport is registered
|
|
22
|
+
* as the active transport for {@link TelemetryCollector}.
|
|
23
|
+
* @default true
|
|
24
|
+
*/
|
|
25
|
+
installTransport?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** Handle returned by {@link initSquadTelemetry} for lifecycle control. */
|
|
28
|
+
export interface SquadTelemetryHandle {
|
|
29
|
+
/** Whether tracing was activated. */
|
|
30
|
+
tracing: boolean;
|
|
31
|
+
/** Whether metrics were activated. */
|
|
32
|
+
metrics: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Flush pending telemetry, detach the EventBus bridge (if any),
|
|
35
|
+
* and shut down OTel providers. Safe to call multiple times.
|
|
36
|
+
*/
|
|
37
|
+
shutdown: () => Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* One-call OTel setup for Squad SDK consumers.
|
|
41
|
+
*
|
|
42
|
+
* This is the **high-level** entry point. It:
|
|
43
|
+
* 1. Initializes tracing and metrics via `initializeOTel()`.
|
|
44
|
+
* 2. Optionally bridges an {@link EventBus} so every Squad event
|
|
45
|
+
* becomes an OTel span.
|
|
46
|
+
* 3. Optionally installs an OTel-backed `TelemetryTransport` so
|
|
47
|
+
* the existing `TelemetryCollector` pipeline emits spans too.
|
|
48
|
+
*
|
|
49
|
+
* If no `OTEL_EXPORTER_OTLP_ENDPOINT` env var is set **and** no
|
|
50
|
+
* `endpoint` is provided in `options`, everything remains a no-op.
|
|
51
|
+
*
|
|
52
|
+
* @param options - Configuration and optional EventBus.
|
|
53
|
+
* @returns A handle with `tracing`, `metrics` status booleans and a
|
|
54
|
+
* `shutdown()` method for graceful cleanup.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* import { initSquadTelemetry, EventBus } from 'squad-sdk';
|
|
59
|
+
*
|
|
60
|
+
* const bus = new EventBus();
|
|
61
|
+
* const telemetry = initSquadTelemetry({
|
|
62
|
+
* endpoint: 'http://localhost:4318',
|
|
63
|
+
* eventBus: bus,
|
|
64
|
+
* });
|
|
65
|
+
*
|
|
66
|
+
* // … run your squad …
|
|
67
|
+
*
|
|
68
|
+
* await telemetry.shutdown();
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare function initSquadTelemetry(options?: SquadTelemetryOptions): SquadTelemetryHandle;
|
|
72
|
+
//# sourceMappingURL=otel-init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel-init.d.ts","sourceRoot":"","sources":["../../src/runtime/otel-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAU/C,oEAAoE;AACpE,MAAM,WAAW,qBAAsB,SAAQ,UAAU;IACvD;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,qBAA0B,GAAG,oBAAoB,CAsB5F"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-Level OTel Initialization (Issue #266)
|
|
3
|
+
*
|
|
4
|
+
* One-call setup that wires OTel providers, the EventBus bridge, and
|
|
5
|
+
* the TelemetryCollector transport in a single invocation. Consumers
|
|
6
|
+
* who don't use OTel pay nothing — if no provider is registered all
|
|
7
|
+
* instrumentation is a no-op.
|
|
8
|
+
*
|
|
9
|
+
* @module runtime/otel-init
|
|
10
|
+
*/
|
|
11
|
+
import { initializeOTel, shutdownOTel } from './otel.js';
|
|
12
|
+
import { bridgeEventBusToOTel, createOTelTransport } from './otel-bridge.js';
|
|
13
|
+
import { setTelemetryTransport } from './telemetry.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Public API
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* One-call OTel setup for Squad SDK consumers.
|
|
19
|
+
*
|
|
20
|
+
* This is the **high-level** entry point. It:
|
|
21
|
+
* 1. Initializes tracing and metrics via `initializeOTel()`.
|
|
22
|
+
* 2. Optionally bridges an {@link EventBus} so every Squad event
|
|
23
|
+
* becomes an OTel span.
|
|
24
|
+
* 3. Optionally installs an OTel-backed `TelemetryTransport` so
|
|
25
|
+
* the existing `TelemetryCollector` pipeline emits spans too.
|
|
26
|
+
*
|
|
27
|
+
* If no `OTEL_EXPORTER_OTLP_ENDPOINT` env var is set **and** no
|
|
28
|
+
* `endpoint` is provided in `options`, everything remains a no-op.
|
|
29
|
+
*
|
|
30
|
+
* @param options - Configuration and optional EventBus.
|
|
31
|
+
* @returns A handle with `tracing`, `metrics` status booleans and a
|
|
32
|
+
* `shutdown()` method for graceful cleanup.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* import { initSquadTelemetry, EventBus } from 'squad-sdk';
|
|
37
|
+
*
|
|
38
|
+
* const bus = new EventBus();
|
|
39
|
+
* const telemetry = initSquadTelemetry({
|
|
40
|
+
* endpoint: 'http://localhost:4318',
|
|
41
|
+
* eventBus: bus,
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* // … run your squad …
|
|
45
|
+
*
|
|
46
|
+
* await telemetry.shutdown();
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export function initSquadTelemetry(options = {}) {
|
|
50
|
+
const { eventBus, installTransport = true, ...otelConfig } = options;
|
|
51
|
+
const result = initializeOTel(otelConfig);
|
|
52
|
+
let unsubscribeBridge;
|
|
53
|
+
if (eventBus) {
|
|
54
|
+
unsubscribeBridge = bridgeEventBusToOTel(eventBus);
|
|
55
|
+
}
|
|
56
|
+
if (installTransport) {
|
|
57
|
+
setTelemetryTransport(createOTelTransport());
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
tracing: result.tracing,
|
|
61
|
+
metrics: result.metrics,
|
|
62
|
+
shutdown: async () => {
|
|
63
|
+
unsubscribeBridge?.();
|
|
64
|
+
await shutdownOTel();
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=otel-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel-init.js","sourceRoot":"","sources":["../../src/runtime/otel-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAmCvD,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAiC,EAAE;IACpE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IAErE,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAE1C,IAAI,iBAA4C,CAAC;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,iBAAiB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,qBAAqB,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,iBAAiB,EAAE,EAAE,CAAC;YACtB,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
|