@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,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marketplace Schema — types and utilities for marketplace entries
|
|
3
|
+
* Issue #134 (M5-10)
|
|
4
|
+
*/
|
|
5
|
+
import type { SquadConfig } from '../config/schema.js';
|
|
6
|
+
import type { MarketplaceManifest } from './index.js';
|
|
7
|
+
export interface MarketplaceEntryStats {
|
|
8
|
+
downloads: number;
|
|
9
|
+
rating: number;
|
|
10
|
+
reviews: number;
|
|
11
|
+
}
|
|
12
|
+
export interface MarketplaceEntry {
|
|
13
|
+
id: string;
|
|
14
|
+
manifest: MarketplaceManifest;
|
|
15
|
+
stats: MarketplaceEntryStats;
|
|
16
|
+
verified: boolean;
|
|
17
|
+
featured: boolean;
|
|
18
|
+
publishedAt: string;
|
|
19
|
+
updatedAt: string;
|
|
20
|
+
}
|
|
21
|
+
export interface MarketplaceIndex {
|
|
22
|
+
entries: MarketplaceEntry[];
|
|
23
|
+
categories: string[];
|
|
24
|
+
tags: string[];
|
|
25
|
+
lastUpdated: string;
|
|
26
|
+
}
|
|
27
|
+
export type MarketplaceSortField = 'downloads' | 'rating' | 'name' | 'recent';
|
|
28
|
+
export interface MarketplaceSearchQuery {
|
|
29
|
+
query?: string;
|
|
30
|
+
category?: string;
|
|
31
|
+
tags?: string[];
|
|
32
|
+
sort?: MarketplaceSortField;
|
|
33
|
+
page?: number;
|
|
34
|
+
perPage?: number;
|
|
35
|
+
}
|
|
36
|
+
export interface MarketplaceSearchResult {
|
|
37
|
+
entries: MarketplaceEntry[];
|
|
38
|
+
total: number;
|
|
39
|
+
page: number;
|
|
40
|
+
perPage: number;
|
|
41
|
+
totalPages: number;
|
|
42
|
+
}
|
|
43
|
+
export declare function searchMarketplace(index: MarketplaceIndex, query: MarketplaceSearchQuery): MarketplaceSearchResult;
|
|
44
|
+
export interface EntryValidationResult {
|
|
45
|
+
valid: boolean;
|
|
46
|
+
errors: string[];
|
|
47
|
+
}
|
|
48
|
+
export declare function validateEntry(entry: MarketplaceEntry): EntryValidationResult;
|
|
49
|
+
export declare function generateEntryFromConfig(config: SquadConfig): MarketplaceEntry;
|
|
50
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/marketplace/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKtD,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,KAAK,EAAE,qBAAqB,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE9E,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,sBAAsB,GAC5B,uBAAuB,CA0DzB;AAID,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,qBAAqB,CAqC5E;AAID,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,CAwB7E"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marketplace Schema — types and utilities for marketplace entries
|
|
3
|
+
* Issue #134 (M5-10)
|
|
4
|
+
*/
|
|
5
|
+
import { ManifestCategory } from './index.js';
|
|
6
|
+
// --- Search ---
|
|
7
|
+
export function searchMarketplace(index, query) {
|
|
8
|
+
let filtered = [...index.entries];
|
|
9
|
+
// Text search
|
|
10
|
+
if (query.query) {
|
|
11
|
+
const q = query.query.toLowerCase();
|
|
12
|
+
filtered = filtered.filter((e) => e.manifest.name.toLowerCase().includes(q) ||
|
|
13
|
+
e.manifest.description.toLowerCase().includes(q) ||
|
|
14
|
+
e.manifest.tags.some((t) => t.toLowerCase().includes(q)));
|
|
15
|
+
}
|
|
16
|
+
// Category filter
|
|
17
|
+
if (query.category) {
|
|
18
|
+
const cat = query.category.toLowerCase();
|
|
19
|
+
filtered = filtered.filter((e) => e.manifest.categories.some((c) => c.toLowerCase() === cat));
|
|
20
|
+
}
|
|
21
|
+
// Tags filter
|
|
22
|
+
if (query.tags && query.tags.length > 0) {
|
|
23
|
+
const queryTags = query.tags.map((t) => t.toLowerCase());
|
|
24
|
+
filtered = filtered.filter((e) => queryTags.every((qt) => e.manifest.tags.some((t) => t.toLowerCase() === qt)));
|
|
25
|
+
}
|
|
26
|
+
// Sort
|
|
27
|
+
const sort = query.sort ?? 'downloads';
|
|
28
|
+
filtered.sort((a, b) => {
|
|
29
|
+
switch (sort) {
|
|
30
|
+
case 'downloads':
|
|
31
|
+
return b.stats.downloads - a.stats.downloads;
|
|
32
|
+
case 'rating':
|
|
33
|
+
return b.stats.rating - a.stats.rating;
|
|
34
|
+
case 'name':
|
|
35
|
+
return a.manifest.name.localeCompare(b.manifest.name);
|
|
36
|
+
case 'recent':
|
|
37
|
+
return new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime();
|
|
38
|
+
default:
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
// Pagination
|
|
43
|
+
const page = Math.max(1, query.page ?? 1);
|
|
44
|
+
const perPage = Math.max(1, Math.min(100, query.perPage ?? 20));
|
|
45
|
+
const total = filtered.length;
|
|
46
|
+
const totalPages = Math.max(1, Math.ceil(total / perPage));
|
|
47
|
+
const start = (page - 1) * perPage;
|
|
48
|
+
const paged = filtered.slice(start, start + perPage);
|
|
49
|
+
return { entries: paged, total, page, perPage, totalPages };
|
|
50
|
+
}
|
|
51
|
+
export function validateEntry(entry) {
|
|
52
|
+
const errors = [];
|
|
53
|
+
if (!entry.id || typeof entry.id !== 'string') {
|
|
54
|
+
errors.push('id is required and must be a string');
|
|
55
|
+
}
|
|
56
|
+
if (!entry.manifest) {
|
|
57
|
+
errors.push('manifest is required');
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
if (!entry.manifest.name)
|
|
61
|
+
errors.push('manifest.name is required');
|
|
62
|
+
if (!entry.manifest.version)
|
|
63
|
+
errors.push('manifest.version is required');
|
|
64
|
+
if (!entry.manifest.description)
|
|
65
|
+
errors.push('manifest.description is required');
|
|
66
|
+
}
|
|
67
|
+
if (!entry.stats || typeof entry.stats !== 'object') {
|
|
68
|
+
errors.push('stats is required');
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
if (typeof entry.stats.downloads !== 'number' || entry.stats.downloads < 0) {
|
|
72
|
+
errors.push('stats.downloads must be a non-negative number');
|
|
73
|
+
}
|
|
74
|
+
if (typeof entry.stats.rating !== 'number' || entry.stats.rating < 0 || entry.stats.rating > 5) {
|
|
75
|
+
errors.push('stats.rating must be between 0 and 5');
|
|
76
|
+
}
|
|
77
|
+
if (typeof entry.stats.reviews !== 'number' || entry.stats.reviews < 0) {
|
|
78
|
+
errors.push('stats.reviews must be a non-negative number');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (typeof entry.verified !== 'boolean') {
|
|
82
|
+
errors.push('verified must be a boolean');
|
|
83
|
+
}
|
|
84
|
+
if (typeof entry.featured !== 'boolean') {
|
|
85
|
+
errors.push('featured must be a boolean');
|
|
86
|
+
}
|
|
87
|
+
return { valid: errors.length === 0, errors };
|
|
88
|
+
}
|
|
89
|
+
// --- Generate entry from config ---
|
|
90
|
+
export function generateEntryFromConfig(config) {
|
|
91
|
+
const name = slugify(config.team.name);
|
|
92
|
+
const now = new Date().toISOString();
|
|
93
|
+
return {
|
|
94
|
+
id: name,
|
|
95
|
+
manifest: {
|
|
96
|
+
name,
|
|
97
|
+
version: config.version,
|
|
98
|
+
description: config.team.description ?? `${config.team.name} — Squad-powered Copilot extension`,
|
|
99
|
+
author: '',
|
|
100
|
+
repository: '',
|
|
101
|
+
categories: [ManifestCategory.Development],
|
|
102
|
+
tags: config.agents.map((a) => a.role),
|
|
103
|
+
icon: 'icon.png',
|
|
104
|
+
screenshots: [],
|
|
105
|
+
pricing: { model: 'free' },
|
|
106
|
+
},
|
|
107
|
+
stats: { downloads: 0, rating: 0, reviews: 0 },
|
|
108
|
+
verified: false,
|
|
109
|
+
featured: false,
|
|
110
|
+
publishedAt: now,
|
|
111
|
+
updatedAt: now,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function slugify(text) {
|
|
115
|
+
return text
|
|
116
|
+
.toLowerCase()
|
|
117
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
118
|
+
.replace(/^-|-$/g, '');
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/marketplace/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security model — remote agent validation for marketplace entries
|
|
3
|
+
* Issue #140 (M5-13)
|
|
4
|
+
*/
|
|
5
|
+
import type { AgentConfig } from '../config/schema.js';
|
|
6
|
+
export interface RemoteAgentDefinition extends AgentConfig {
|
|
7
|
+
charter?: string;
|
|
8
|
+
tools?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface SecurityReport {
|
|
11
|
+
passed: boolean;
|
|
12
|
+
warnings: string[];
|
|
13
|
+
blocked: string[];
|
|
14
|
+
riskScore: number;
|
|
15
|
+
}
|
|
16
|
+
export type SecuritySeverity = 'warning' | 'critical';
|
|
17
|
+
export interface SecurityRule {
|
|
18
|
+
name: string;
|
|
19
|
+
severity: SecuritySeverity;
|
|
20
|
+
check: (agent: RemoteAgentDefinition, source: string) => string | null;
|
|
21
|
+
}
|
|
22
|
+
export declare const SECURITY_RULES: SecurityRule[];
|
|
23
|
+
export declare function validateRemoteAgent(agent: RemoteAgentDefinition, source: string): SecurityReport;
|
|
24
|
+
export declare function quarantineAgent(agent: RemoteAgentDefinition): RemoteAgentDefinition;
|
|
25
|
+
export declare function generateSecurityReport(report: SecurityReport): string;
|
|
26
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/marketplace/security.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAID,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACxE;AA0CD,eAAO,MAAM,cAAc,EAAE,YAAY,EAmFxC,CAAC;AAIF,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE,MAAM,GACb,cAAc,CA0BhB;AAID,wBAAgB,eAAe,CAAC,KAAK,EAAE,qBAAqB,GAAG,qBAAqB,CA4BnF;AAID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAiCrE"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security model — remote agent validation for marketplace entries
|
|
3
|
+
* Issue #140 (M5-13)
|
|
4
|
+
*/
|
|
5
|
+
// --- Prompt injection patterns ---
|
|
6
|
+
const INJECTION_PATTERNS = [
|
|
7
|
+
/ignore\s+(all\s+)?previous\s+instructions/i,
|
|
8
|
+
/you\s+are\s+now\s+(a\s+)?different/i,
|
|
9
|
+
/system\s*:\s*override/i,
|
|
10
|
+
/\bdo\s+not\s+follow\b.*\brules\b/i,
|
|
11
|
+
/\bdisregard\b.*\binstructions\b/i,
|
|
12
|
+
/\bact\s+as\b.*\badmin\b/i,
|
|
13
|
+
];
|
|
14
|
+
// --- Suspicious tool patterns ---
|
|
15
|
+
const SUSPICIOUS_TOOLS = [
|
|
16
|
+
'shell', 'exec', 'eval', 'sudo', 'rm', 'delete',
|
|
17
|
+
'network_raw', 'http_raw', 'file_write_any',
|
|
18
|
+
];
|
|
19
|
+
// --- PII patterns ---
|
|
20
|
+
const PII_PATTERNS = [
|
|
21
|
+
/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/i, // email
|
|
22
|
+
/\b\d{3}[-.]?\d{2}[-.]?\d{4}\b/, // SSN-like
|
|
23
|
+
/\b(?:\d{4}[-\s]?){3}\d{4}\b/, // credit card-like
|
|
24
|
+
/\bghp_[A-Za-z0-9_]{36,}\b/, // GitHub token
|
|
25
|
+
/\bsk-[A-Za-z0-9]{20,}\b/, // API key pattern
|
|
26
|
+
];
|
|
27
|
+
// --- Overly broad permission patterns ---
|
|
28
|
+
const BROAD_PERMISSION_PATTERNS = [
|
|
29
|
+
/\ball\s+files\b/i,
|
|
30
|
+
/\bunrestricted\s+access\b/i,
|
|
31
|
+
/\bfull\s+system\b/i,
|
|
32
|
+
/\broot\s+access\b/i,
|
|
33
|
+
/\bno\s+restrictions\b/i,
|
|
34
|
+
];
|
|
35
|
+
// --- Security Rules ---
|
|
36
|
+
export const SECURITY_RULES = [
|
|
37
|
+
{
|
|
38
|
+
name: 'prompt-injection',
|
|
39
|
+
severity: 'critical',
|
|
40
|
+
check: (agent) => {
|
|
41
|
+
const charter = agent.charter ?? '';
|
|
42
|
+
for (const pattern of INJECTION_PATTERNS) {
|
|
43
|
+
if (pattern.test(charter)) {
|
|
44
|
+
return `Prompt injection pattern detected: ${pattern.source}`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'suspicious-tools',
|
|
52
|
+
severity: 'critical',
|
|
53
|
+
check: (agent) => {
|
|
54
|
+
const tools = agent.tools ?? [];
|
|
55
|
+
const found = tools.filter((t) => SUSPICIOUS_TOOLS.includes(t.toLowerCase()));
|
|
56
|
+
if (found.length > 0) {
|
|
57
|
+
return `Suspicious tool requests: ${found.join(', ')}`;
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'pii-in-charter',
|
|
64
|
+
severity: 'warning',
|
|
65
|
+
check: (agent) => {
|
|
66
|
+
const charter = agent.charter ?? '';
|
|
67
|
+
for (const pattern of PII_PATTERNS) {
|
|
68
|
+
if (pattern.test(charter)) {
|
|
69
|
+
return `Potential PII detected in charter: ${pattern.source}`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: 'overly-broad-permissions',
|
|
77
|
+
severity: 'warning',
|
|
78
|
+
check: (agent) => {
|
|
79
|
+
const charter = agent.charter ?? '';
|
|
80
|
+
for (const pattern of BROAD_PERMISSION_PATTERNS) {
|
|
81
|
+
if (pattern.test(charter)) {
|
|
82
|
+
return `Overly broad permission language: ${pattern.source}`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'untrusted-source',
|
|
90
|
+
severity: 'warning',
|
|
91
|
+
check: (_agent, source) => {
|
|
92
|
+
if (!source || source === 'unknown' || source === '') {
|
|
93
|
+
return 'Agent source is unknown or unverified';
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'missing-charter',
|
|
100
|
+
severity: 'warning',
|
|
101
|
+
check: (agent) => {
|
|
102
|
+
if (!agent.charter || agent.charter.trim().length === 0) {
|
|
103
|
+
return 'Agent has no charter — behavior is unpredictable';
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'excessive-tools',
|
|
110
|
+
severity: 'warning',
|
|
111
|
+
check: (agent) => {
|
|
112
|
+
const tools = agent.tools ?? [];
|
|
113
|
+
if (tools.length > 15) {
|
|
114
|
+
return `Agent requests ${tools.length} tools — consider reducing scope`;
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
// --- Validate remote agent ---
|
|
121
|
+
export function validateRemoteAgent(agent, source) {
|
|
122
|
+
const warnings = [];
|
|
123
|
+
const blocked = [];
|
|
124
|
+
let riskScore = 0;
|
|
125
|
+
for (const rule of SECURITY_RULES) {
|
|
126
|
+
const result = rule.check(agent, source);
|
|
127
|
+
if (result) {
|
|
128
|
+
if (rule.severity === 'critical') {
|
|
129
|
+
blocked.push(result);
|
|
130
|
+
riskScore += 30;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
warnings.push(result);
|
|
134
|
+
riskScore += 10;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
riskScore = Math.min(100, riskScore);
|
|
139
|
+
return {
|
|
140
|
+
passed: blocked.length === 0,
|
|
141
|
+
warnings,
|
|
142
|
+
blocked,
|
|
143
|
+
riskScore,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// --- Quarantine agent ---
|
|
147
|
+
export function quarantineAgent(agent) {
|
|
148
|
+
let charter = agent.charter ?? '';
|
|
149
|
+
// Remove injection patterns
|
|
150
|
+
for (const pattern of INJECTION_PATTERNS) {
|
|
151
|
+
charter = charter.replace(pattern, '[REMOVED]');
|
|
152
|
+
}
|
|
153
|
+
// Remove PII
|
|
154
|
+
for (const pattern of PII_PATTERNS) {
|
|
155
|
+
charter = charter.replace(pattern, '[REDACTED]');
|
|
156
|
+
}
|
|
157
|
+
// Remove broad permission language
|
|
158
|
+
for (const pattern of BROAD_PERMISSION_PATTERNS) {
|
|
159
|
+
charter = charter.replace(pattern, '[RESTRICTED]');
|
|
160
|
+
}
|
|
161
|
+
// Strip suspicious tools
|
|
162
|
+
const safTools = (agent.tools ?? []).filter((t) => !SUSPICIOUS_TOOLS.includes(t.toLowerCase()));
|
|
163
|
+
return {
|
|
164
|
+
...agent,
|
|
165
|
+
charter,
|
|
166
|
+
tools: safTools,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// --- Generate human-readable security report ---
|
|
170
|
+
export function generateSecurityReport(report) {
|
|
171
|
+
const lines = [];
|
|
172
|
+
lines.push('# Security Report');
|
|
173
|
+
lines.push('');
|
|
174
|
+
lines.push(`**Status:** ${report.passed ? '✅ PASSED' : '❌ BLOCKED'}`);
|
|
175
|
+
lines.push(`**Risk Score:** ${report.riskScore}/100`);
|
|
176
|
+
lines.push('');
|
|
177
|
+
if (report.blocked.length > 0) {
|
|
178
|
+
lines.push('## Critical Issues');
|
|
179
|
+
lines.push('');
|
|
180
|
+
for (const issue of report.blocked) {
|
|
181
|
+
lines.push(`- 🚫 ${issue}`);
|
|
182
|
+
}
|
|
183
|
+
lines.push('');
|
|
184
|
+
}
|
|
185
|
+
if (report.warnings.length > 0) {
|
|
186
|
+
lines.push('## Warnings');
|
|
187
|
+
lines.push('');
|
|
188
|
+
for (const warning of report.warnings) {
|
|
189
|
+
lines.push(`- ⚠️ ${warning}`);
|
|
190
|
+
}
|
|
191
|
+
lines.push('');
|
|
192
|
+
}
|
|
193
|
+
if (report.blocked.length === 0 && report.warnings.length === 0) {
|
|
194
|
+
lines.push('No issues detected.');
|
|
195
|
+
lines.push('');
|
|
196
|
+
}
|
|
197
|
+
return lines.join('\n');
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/marketplace/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parsers barrel — re-exports all parser functions and their result types.
|
|
3
|
+
* Zero runtime code, just re-exports.
|
|
4
|
+
*
|
|
5
|
+
* @module parsers
|
|
6
|
+
*/
|
|
7
|
+
export { parseTeamMarkdown, parseRoutingRulesMarkdown, parseDecisionsMarkdown, generateConfigFromParsed, migrateMarkdownToConfig, } from './config/markdown-migration.js';
|
|
8
|
+
export type { ParsedAgent, ParsedRoutingRule, ParsedDecision, MarkdownParseResult, MarkdownMigrationOptions, MarkdownMigrationResult, } from './config/markdown-migration.js';
|
|
9
|
+
export { parseRoutingMarkdown, compileRoutingRules, matchRoute, matchIssueLabels, } from './config/routing.js';
|
|
10
|
+
export type { CompiledRouter, CompiledWorkTypeRule, CompiledIssueRule, RoutingMatch, } from './config/routing.js';
|
|
11
|
+
export { parseCharterMarkdown, compileCharter, compileCharterFull, } from './agents/charter-compiler.js';
|
|
12
|
+
export type { ParsedCharter, CharterCompileOptions, CharterConfigOverrides, CompiledCharter, } from './agents/charter-compiler.js';
|
|
13
|
+
export { parseFrontmatter, parseSkillFile, loadSkillsFromDirectory, } from './skills/skill-loader.js';
|
|
14
|
+
export type { SkillDefinition } from './skills/skill-loader.js';
|
|
15
|
+
//# sourceMappingURL=parsers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../src/parsers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AAExC,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACV,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACb,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,aAAa,EACb,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,GAChB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/parsers.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parsers barrel — re-exports all parser functions and their result types.
|
|
3
|
+
* Zero runtime code, just re-exports.
|
|
4
|
+
*
|
|
5
|
+
* @module parsers
|
|
6
|
+
*/
|
|
7
|
+
// --- config/markdown-migration.ts ---
|
|
8
|
+
export { parseTeamMarkdown, parseRoutingRulesMarkdown, parseDecisionsMarkdown, generateConfigFromParsed, migrateMarkdownToConfig, } from './config/markdown-migration.js';
|
|
9
|
+
// --- config/routing.ts ---
|
|
10
|
+
export { parseRoutingMarkdown, compileRoutingRules, matchRoute, matchIssueLabels, } from './config/routing.js';
|
|
11
|
+
// --- agents/charter-compiler.ts ---
|
|
12
|
+
export { parseCharterMarkdown, compileCharter, compileCharterFull, } from './agents/charter-compiler.js';
|
|
13
|
+
// --- skills/skill-loader.ts ---
|
|
14
|
+
export { parseFrontmatter, parseSkillFile, loadSkillsFromDirectory, } from './skills/skill-loader.js';
|
|
15
|
+
//# sourceMappingURL=parsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../src/parsers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,uCAAuC;AACvC,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AAWxC,4BAA4B;AAC5B,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACV,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAS7B,qCAAqC;AACrC,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAStC,iCAAiC;AACjC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,uBAAuB,GACxB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ralph — Work Monitor (PRD 8)
|
|
3
|
+
*
|
|
4
|
+
* Persistent SDK session that monitors agent work in real time.
|
|
5
|
+
* Replaces ephemeral polling spawns with an event-driven observer
|
|
6
|
+
* that accumulates knowledge across monitoring cycles.
|
|
7
|
+
*
|
|
8
|
+
* Three monitoring layers:
|
|
9
|
+
* 1. In-session: Event subscriptions via EventBus
|
|
10
|
+
* 2. Watchdog: Periodic health checks on session pool
|
|
11
|
+
* 3. Cloud heartbeat: External health signal (future)
|
|
12
|
+
*/
|
|
13
|
+
import type { EventBus } from '../runtime/event-bus.js';
|
|
14
|
+
export interface MonitorConfig {
|
|
15
|
+
/** Team root directory */
|
|
16
|
+
teamRoot: string;
|
|
17
|
+
/** Health check interval (ms, default: 30000) */
|
|
18
|
+
healthCheckInterval?: number;
|
|
19
|
+
/** Stale session threshold (ms, default: 300000) */
|
|
20
|
+
staleSessionThreshold?: number;
|
|
21
|
+
/** Path to persist monitor state for crash recovery */
|
|
22
|
+
statePath?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface AgentWorkStatus {
|
|
25
|
+
agentName: string;
|
|
26
|
+
sessionId: string;
|
|
27
|
+
status: 'working' | 'idle' | 'stale' | 'error';
|
|
28
|
+
lastActivity: Date;
|
|
29
|
+
currentTask?: string;
|
|
30
|
+
milestones: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface MonitorState {
|
|
33
|
+
/** Timestamp of last health check */
|
|
34
|
+
lastHealthCheck: Date | null;
|
|
35
|
+
/** Per-agent work status */
|
|
36
|
+
agents: Map<string, AgentWorkStatus>;
|
|
37
|
+
/** Accumulated observations across cycles */
|
|
38
|
+
observations: string[];
|
|
39
|
+
}
|
|
40
|
+
export declare class RalphMonitor {
|
|
41
|
+
private config;
|
|
42
|
+
private state;
|
|
43
|
+
private eventBus;
|
|
44
|
+
private unsubscribers;
|
|
45
|
+
private healthCheckTimer;
|
|
46
|
+
constructor(config: MonitorConfig);
|
|
47
|
+
/** Start monitoring — subscribe to EventBus and begin health checks */
|
|
48
|
+
start(eventBus: EventBus): Promise<void>;
|
|
49
|
+
/** Handle an incoming event from the EventBus */
|
|
50
|
+
private handleEvent;
|
|
51
|
+
/** Run a health check across all tracked agent sessions */
|
|
52
|
+
healthCheck(): Promise<AgentWorkStatus[]>;
|
|
53
|
+
/** Get current work status for all agents */
|
|
54
|
+
getStatus(): AgentWorkStatus[];
|
|
55
|
+
/** Stop monitoring and persist final state */
|
|
56
|
+
stop(): Promise<void>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ralph/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,yBAAyB,CAAC;AAIpE,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IAEjB,iDAAiD;IACjD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,oDAAoD;IACpD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAC/C,YAAY,EAAE,IAAI,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,qCAAqC;IACrC,eAAe,EAAE,IAAI,GAAG,IAAI,CAAC;IAC7B,4BAA4B;IAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACrC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,gBAAgB,CAA+C;gBAE3D,MAAM,EAAE,aAAa;IASjC,uEAAuE;IACjE,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB9C,iDAAiD;IACjD,OAAO,CAAC,WAAW;IA6CnB,2DAA2D;IACrD,WAAW,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAc/C,6CAA6C;IAC7C,SAAS,IAAI,eAAe,EAAE;IAI9B,8CAA8C;IACxC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAyB5B"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ralph — Work Monitor (PRD 8)
|
|
3
|
+
*
|
|
4
|
+
* Persistent SDK session that monitors agent work in real time.
|
|
5
|
+
* Replaces ephemeral polling spawns with an event-driven observer
|
|
6
|
+
* that accumulates knowledge across monitoring cycles.
|
|
7
|
+
*
|
|
8
|
+
* Three monitoring layers:
|
|
9
|
+
* 1. In-session: Event subscriptions via EventBus
|
|
10
|
+
* 2. Watchdog: Periodic health checks on session pool
|
|
11
|
+
* 3. Cloud heartbeat: External health signal (future)
|
|
12
|
+
*/
|
|
13
|
+
import { writeFile } from 'node:fs/promises';
|
|
14
|
+
// --- Ralph Monitor ---
|
|
15
|
+
export class RalphMonitor {
|
|
16
|
+
config;
|
|
17
|
+
state;
|
|
18
|
+
eventBus = null;
|
|
19
|
+
unsubscribers = [];
|
|
20
|
+
healthCheckTimer = null;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.config = config;
|
|
23
|
+
this.state = {
|
|
24
|
+
lastHealthCheck: null,
|
|
25
|
+
agents: new Map(),
|
|
26
|
+
observations: [],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Start monitoring — subscribe to EventBus and begin health checks */
|
|
30
|
+
async start(eventBus) {
|
|
31
|
+
this.eventBus = eventBus;
|
|
32
|
+
// Subscribe to session lifecycle events
|
|
33
|
+
this.unsubscribers.push(eventBus.subscribe('session:created', (event) => this.handleEvent(event)));
|
|
34
|
+
this.unsubscribers.push(eventBus.subscribe('session:destroyed', (event) => this.handleEvent(event)));
|
|
35
|
+
this.unsubscribers.push(eventBus.subscribe('session:error', (event) => this.handleEvent(event)));
|
|
36
|
+
this.unsubscribers.push(eventBus.subscribe('agent:milestone', (event) => this.handleEvent(event)));
|
|
37
|
+
// Start periodic health check
|
|
38
|
+
const interval = this.config.healthCheckInterval ?? 30_000;
|
|
39
|
+
this.healthCheckTimer = setInterval(() => {
|
|
40
|
+
void this.healthCheck();
|
|
41
|
+
}, interval);
|
|
42
|
+
}
|
|
43
|
+
/** Handle an incoming event from the EventBus */
|
|
44
|
+
handleEvent(event) {
|
|
45
|
+
const agentName = event.agentName ?? 'unknown';
|
|
46
|
+
const sessionId = event.sessionId ?? 'unknown';
|
|
47
|
+
switch (event.type) {
|
|
48
|
+
case 'session:created': {
|
|
49
|
+
this.state.agents.set(agentName, {
|
|
50
|
+
agentName,
|
|
51
|
+
sessionId,
|
|
52
|
+
status: 'working',
|
|
53
|
+
lastActivity: event.timestamp,
|
|
54
|
+
milestones: [],
|
|
55
|
+
});
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case 'session:destroyed': {
|
|
59
|
+
this.state.agents.delete(agentName);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
case 'session:error': {
|
|
63
|
+
const existing = this.state.agents.get(agentName);
|
|
64
|
+
if (existing) {
|
|
65
|
+
existing.status = 'error';
|
|
66
|
+
existing.lastActivity = event.timestamp;
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
case 'agent:milestone': {
|
|
71
|
+
const agent = this.state.agents.get(agentName);
|
|
72
|
+
if (agent) {
|
|
73
|
+
const payload = event.payload;
|
|
74
|
+
if (payload?.milestone) {
|
|
75
|
+
agent.milestones.push(payload.milestone);
|
|
76
|
+
}
|
|
77
|
+
if (payload?.task) {
|
|
78
|
+
agent.currentTask = payload.task;
|
|
79
|
+
}
|
|
80
|
+
agent.lastActivity = event.timestamp;
|
|
81
|
+
agent.status = 'working';
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Run a health check across all tracked agent sessions */
|
|
88
|
+
async healthCheck() {
|
|
89
|
+
const now = new Date();
|
|
90
|
+
const staleThreshold = this.config.staleSessionThreshold ?? 300_000;
|
|
91
|
+
for (const agent of this.state.agents.values()) {
|
|
92
|
+
if (agent.status === 'error')
|
|
93
|
+
continue;
|
|
94
|
+
const elapsed = now.getTime() - agent.lastActivity.getTime();
|
|
95
|
+
agent.status = elapsed > staleThreshold ? 'stale' : agent.status === 'stale' ? 'idle' : agent.status;
|
|
96
|
+
}
|
|
97
|
+
this.state.lastHealthCheck = now;
|
|
98
|
+
return Array.from(this.state.agents.values());
|
|
99
|
+
}
|
|
100
|
+
/** Get current work status for all agents */
|
|
101
|
+
getStatus() {
|
|
102
|
+
return Array.from(this.state.agents.values());
|
|
103
|
+
}
|
|
104
|
+
/** Stop monitoring and persist final state */
|
|
105
|
+
async stop() {
|
|
106
|
+
// Unsubscribe from EventBus
|
|
107
|
+
for (const unsub of this.unsubscribers) {
|
|
108
|
+
unsub();
|
|
109
|
+
}
|
|
110
|
+
this.unsubscribers = [];
|
|
111
|
+
// Stop health check timer
|
|
112
|
+
if (this.healthCheckTimer !== null) {
|
|
113
|
+
clearInterval(this.healthCheckTimer);
|
|
114
|
+
this.healthCheckTimer = null;
|
|
115
|
+
}
|
|
116
|
+
// Persist state if statePath is configured
|
|
117
|
+
if (this.config.statePath) {
|
|
118
|
+
const serializable = {
|
|
119
|
+
lastHealthCheck: this.state.lastHealthCheck?.toISOString() ?? null,
|
|
120
|
+
agents: Array.from(this.state.agents.entries()),
|
|
121
|
+
observations: this.state.observations,
|
|
122
|
+
};
|
|
123
|
+
await writeFile(this.config.statePath, JSON.stringify(serializable, null, 2), 'utf-8');
|
|
124
|
+
}
|
|
125
|
+
this.eventBus = null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=index.js.map
|