@maadb/core 0.0.1 → 0.7.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +371 -3
- package/dist/architect.d.ts +2 -0
- package/dist/architect.d.ts.map +1 -0
- package/dist/architect.js +273 -0
- package/dist/architect.js.map +1 -0
- package/dist/auth/resolve.d.ts +36 -0
- package/dist/auth/resolve.d.ts.map +1 -0
- package/dist/auth/resolve.js +77 -0
- package/dist/auth/resolve.js.map +1 -0
- package/dist/auth/token-store.d.ts +82 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/auth/token-store.js +464 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/auth/types.d.ts +75 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +15 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/backend/adapter.d.ts +57 -0
- package/dist/backend/adapter.d.ts.map +1 -0
- package/dist/backend/adapter.js +6 -0
- package/dist/backend/adapter.js.map +1 -0
- package/dist/backend/index.d.ts +3 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +2 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/sqlite/index.d.ts +63 -0
- package/dist/backend/sqlite/index.d.ts.map +1 -0
- package/dist/backend/sqlite/index.js +521 -0
- package/dist/backend/sqlite/index.js.map +1 -0
- package/dist/backend/sqlite/schema.d.ts +2 -0
- package/dist/backend/sqlite/schema.d.ts.map +1 -0
- package/dist/backend/sqlite/schema.js +88 -0
- package/dist/backend/sqlite/schema.js.map +1 -0
- package/dist/claude-md.d.ts +2 -0
- package/dist/claude-md.d.ts.map +1 -0
- package/dist/claude-md.js +97 -0
- package/dist/claude-md.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +4 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +39 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +8 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +242 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/discover.d.ts +5 -0
- package/dist/cli/commands/discover.d.ts.map +1 -0
- package/dist/cli/commands/discover.js +48 -0
- package/dist/cli/commands/discover.js.map +1 -0
- package/dist/cli/commands/maintain.d.ts +6 -0
- package/dist/cli/commands/maintain.d.ts.map +1 -0
- package/dist/cli/commands/maintain.js +168 -0
- package/dist/cli/commands/maintain.js.map +1 -0
- package/dist/cli/commands/read.d.ts +7 -0
- package/dist/cli/commands/read.d.ts.map +1 -0
- package/dist/cli/commands/read.js +139 -0
- package/dist/cli/commands/read.js.map +1 -0
- package/dist/cli/commands/write.d.ts +4 -0
- package/dist/cli/commands/write.d.ts.map +1 -0
- package/dist/cli/commands/write.js +99 -0
- package/dist/cli/commands/write.js.map +1 -0
- package/dist/cli/helpers.d.ts +8 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +17 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +296 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/engine/audit.d.ts +15 -0
- package/dist/engine/audit.d.ts.map +1 -0
- package/dist/engine/audit.js +42 -0
- package/dist/engine/audit.js.map +1 -0
- package/dist/engine/composites.d.ts +6 -0
- package/dist/engine/composites.d.ts.map +1 -0
- package/dist/engine/composites.js +102 -0
- package/dist/engine/composites.js.map +1 -0
- package/dist/engine/context.d.ts +47 -0
- package/dist/engine/context.d.ts.map +1 -0
- package/dist/engine/context.js +55 -0
- package/dist/engine/context.js.map +1 -0
- package/dist/engine/docid-safe.d.ts +8 -0
- package/dist/engine/docid-safe.d.ts.map +1 -0
- package/dist/engine/docid-safe.js +0 -0
- package/dist/engine/docid-safe.js.map +1 -0
- package/dist/engine/helpers.d.ts +8 -0
- package/dist/engine/helpers.d.ts.map +1 -0
- package/dist/engine/helpers.js +102 -0
- package/dist/engine/helpers.js.map +1 -0
- package/dist/engine/index.d.ts +209 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +489 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/indexing.d.ts +14 -0
- package/dist/engine/indexing.d.ts.map +1 -0
- package/dist/engine/indexing.js +225 -0
- package/dist/engine/indexing.js.map +1 -0
- package/dist/engine/journal.d.ts +32 -0
- package/dist/engine/journal.d.ts.map +1 -0
- package/dist/engine/journal.js +111 -0
- package/dist/engine/journal.js.map +1 -0
- package/dist/engine/logger.d.ts +19 -0
- package/dist/engine/logger.d.ts.map +1 -0
- package/dist/engine/logger.js +40 -0
- package/dist/engine/logger.js.map +1 -0
- package/dist/engine/maintenance.d.ts +15 -0
- package/dist/engine/maintenance.d.ts.map +1 -0
- package/dist/engine/maintenance.js +87 -0
- package/dist/engine/maintenance.js.map +1 -0
- package/dist/engine/mutex.d.ts +24 -0
- package/dist/engine/mutex.d.ts.map +1 -0
- package/dist/engine/mutex.js +50 -0
- package/dist/engine/mutex.js.map +1 -0
- package/dist/engine/pathguard.d.ts +16 -0
- package/dist/engine/pathguard.d.ts.map +1 -0
- package/dist/engine/pathguard.js +41 -0
- package/dist/engine/pathguard.js.map +1 -0
- package/dist/engine/reads.d.ts +24 -0
- package/dist/engine/reads.d.ts.map +1 -0
- package/dist/engine/reads.js +701 -0
- package/dist/engine/reads.js.map +1 -0
- package/dist/engine/types.d.ts +350 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +5 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/writes.d.ts +10 -0
- package/dist/engine/writes.d.ts.map +1 -0
- package/dist/engine/writes.js +606 -0
- package/dist/engine/writes.js.map +1 -0
- package/dist/engine.d.ts +3 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +6 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors.d.ts +20 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +17 -0
- package/dist/errors.js.map +1 -0
- package/dist/extractor/fields.d.ts +3 -0
- package/dist/extractor/fields.d.ts.map +1 -0
- package/dist/extractor/fields.js +58 -0
- package/dist/extractor/fields.js.map +1 -0
- package/dist/extractor/index.d.ts +7 -0
- package/dist/extractor/index.d.ts.map +1 -0
- package/dist/extractor/index.js +22 -0
- package/dist/extractor/index.js.map +1 -0
- package/dist/extractor/normalizers.d.ts +22 -0
- package/dist/extractor/normalizers.d.ts.map +1 -0
- package/dist/extractor/normalizers.js +250 -0
- package/dist/extractor/normalizers.js.map +1 -0
- package/dist/extractor/objects.d.ts +3 -0
- package/dist/extractor/objects.d.ts.map +1 -0
- package/dist/extractor/objects.js +33 -0
- package/dist/extractor/objects.js.map +1 -0
- package/dist/extractor/relationships.d.ts +3 -0
- package/dist/extractor/relationships.d.ts.map +1 -0
- package/dist/extractor/relationships.js +58 -0
- package/dist/extractor/relationships.js.map +1 -0
- package/dist/git/commit.d.ts +63 -0
- package/dist/git/commit.d.ts.map +1 -0
- package/dist/git/commit.js +161 -0
- package/dist/git/commit.js.map +1 -0
- package/dist/git/diff.d.ts +4 -0
- package/dist/git/diff.d.ts.map +1 -0
- package/dist/git/diff.js +56 -0
- package/dist/git/diff.js.map +1 -0
- package/dist/git/index.d.ts +41 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +86 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/log.d.ts +13 -0
- package/dist/git/log.d.ts.map +1 -0
- package/dist/git/log.js +116 -0
- package/dist/git/log.js.map +1 -0
- package/dist/git/snapshot.d.ts +4 -0
- package/dist/git/snapshot.d.ts.map +1 -0
- package/dist/git/snapshot.js +65 -0
- package/dist/git/snapshot.js.map +1 -0
- package/dist/instance/config.d.ts +19 -0
- package/dist/instance/config.d.ts.map +1 -0
- package/dist/instance/config.js +107 -0
- package/dist/instance/config.js.map +1 -0
- package/dist/instance/pool.d.ts +138 -0
- package/dist/instance/pool.d.ts.map +1 -0
- package/dist/instance/pool.js +335 -0
- package/dist/instance/pool.js.map +1 -0
- package/dist/instance/session.d.ts +140 -0
- package/dist/instance/session.d.ts.map +1 -0
- package/dist/instance/session.js +267 -0
- package/dist/instance/session.js.map +1 -0
- package/dist/logging.d.ts +108 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +120 -0
- package/dist/logging.js.map +1 -0
- package/dist/maad-md.d.ts +11 -0
- package/dist/maad-md.d.ts.map +1 -0
- package/dist/maad-md.js +252 -0
- package/dist/maad-md.js.map +1 -0
- package/dist/mcp/bulk-cap.d.ts +10 -0
- package/dist/mcp/bulk-cap.d.ts.map +1 -0
- package/dist/mcp/bulk-cap.js +37 -0
- package/dist/mcp/bulk-cap.js.map +1 -0
- package/dist/mcp/config.d.ts +18 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +20 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/ctx.d.ts +17 -0
- package/dist/mcp/ctx.d.ts.map +1 -0
- package/dist/mcp/ctx.js +7 -0
- package/dist/mcp/ctx.js.map +1 -0
- package/dist/mcp/guardrails.d.ts +21 -0
- package/dist/mcp/guardrails.d.ts.map +1 -0
- package/dist/mcp/guardrails.js +39 -0
- package/dist/mcp/guardrails.js.map +1 -0
- package/dist/mcp/idempotency.d.ts +69 -0
- package/dist/mcp/idempotency.d.ts.map +1 -0
- package/dist/mcp/idempotency.js +168 -0
- package/dist/mcp/idempotency.js.map +1 -0
- package/dist/mcp/instance-reload.d.ts +23 -0
- package/dist/mcp/instance-reload.d.ts.map +1 -0
- package/dist/mcp/instance-reload.js +126 -0
- package/dist/mcp/instance-reload.js.map +1 -0
- package/dist/mcp/kinds.d.ts +22 -0
- package/dist/mcp/kinds.d.ts.map +1 -0
- package/dist/mcp/kinds.js +110 -0
- package/dist/mcp/kinds.js.map +1 -0
- package/dist/mcp/lifecycle.d.ts +8 -0
- package/dist/mcp/lifecycle.d.ts.map +1 -0
- package/dist/mcp/lifecycle.js +65 -0
- package/dist/mcp/lifecycle.js.map +1 -0
- package/dist/mcp/notifications.d.ts +87 -0
- package/dist/mcp/notifications.d.ts.map +1 -0
- package/dist/mcp/notifications.js +154 -0
- package/dist/mcp/notifications.js.map +1 -0
- package/dist/mcp/query-depth.d.ts +28 -0
- package/dist/mcp/query-depth.d.ts.map +1 -0
- package/dist/mcp/query-depth.js +43 -0
- package/dist/mcp/query-depth.js.map +1 -0
- package/dist/mcp/rate-limit.d.ts +60 -0
- package/dist/mcp/rate-limit.d.ts.map +1 -0
- package/dist/mcp/rate-limit.js +203 -0
- package/dist/mcp/rate-limit.js.map +1 -0
- package/dist/mcp/reload-signal.d.ts +13 -0
- package/dist/mcp/reload-signal.d.ts.map +1 -0
- package/dist/mcp/reload-signal.js +68 -0
- package/dist/mcp/reload-signal.js.map +1 -0
- package/dist/mcp/response.d.ts +109 -0
- package/dist/mcp/response.d.ts.map +1 -0
- package/dist/mcp/response.js +132 -0
- package/dist/mcp/response.js.map +1 -0
- package/dist/mcp/roles.d.ts +7 -0
- package/dist/mcp/roles.d.ts.map +1 -0
- package/dist/mcp/roles.js +56 -0
- package/dist/mcp/roles.js.map +1 -0
- package/dist/mcp/server.d.ts +33 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +242 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/shutdown.d.ts +32 -0
- package/dist/mcp/shutdown.d.ts.map +1 -0
- package/dist/mcp/shutdown.js +130 -0
- package/dist/mcp/shutdown.js.map +1 -0
- package/dist/mcp/tools/audit.d.ts +4 -0
- package/dist/mcp/tools/audit.d.ts.map +1 -0
- package/dist/mcp/tools/audit.js +45 -0
- package/dist/mcp/tools/audit.js.map +1 -0
- package/dist/mcp/tools/auth.d.ts +4 -0
- package/dist/mcp/tools/auth.d.ts.map +1 -0
- package/dist/mcp/tools/auth.js +181 -0
- package/dist/mcp/tools/auth.js.map +1 -0
- package/dist/mcp/tools/discover.d.ts +4 -0
- package/dist/mcp/tools/discover.d.ts.map +1 -0
- package/dist/mcp/tools/discover.js +83 -0
- package/dist/mcp/tools/discover.js.map +1 -0
- package/dist/mcp/tools/instance.d.ts +15 -0
- package/dist/mcp/tools/instance.d.ts.map +1 -0
- package/dist/mcp/tools/instance.js +207 -0
- package/dist/mcp/tools/instance.js.map +1 -0
- package/dist/mcp/tools/maintain.d.ts +4 -0
- package/dist/mcp/tools/maintain.d.ts.map +1 -0
- package/dist/mcp/tools/maintain.js +118 -0
- package/dist/mcp/tools/maintain.js.map +1 -0
- package/dist/mcp/tools/read.d.ts +4 -0
- package/dist/mcp/tools/read.d.ts.map +1 -0
- package/dist/mcp/tools/read.js +260 -0
- package/dist/mcp/tools/read.js.map +1 -0
- package/dist/mcp/tools/write.d.ts +4 -0
- package/dist/mcp/tools/write.d.ts.map +1 -0
- package/dist/mcp/tools/write.js +342 -0
- package/dist/mcp/tools/write.js.map +1 -0
- package/dist/mcp/transport/auth.d.ts +41 -0
- package/dist/mcp/transport/auth.d.ts.map +1 -0
- package/dist/mcp/transport/auth.js +115 -0
- package/dist/mcp/transport/auth.js.map +1 -0
- package/dist/mcp/transport/http.d.ts +62 -0
- package/dist/mcp/transport/http.d.ts.map +1 -0
- package/dist/mcp/transport/http.js +357 -0
- package/dist/mcp/transport/http.js.map +1 -0
- package/dist/mcp/transport/pin.d.ts +15 -0
- package/dist/mcp/transport/pin.d.ts.map +1 -0
- package/dist/mcp/transport/pin.js +71 -0
- package/dist/mcp/transport/pin.js.map +1 -0
- package/dist/mcp/transport/telemetry.d.ts +79 -0
- package/dist/mcp/transport/telemetry.d.ts.map +1 -0
- package/dist/mcp/transport/telemetry.js +97 -0
- package/dist/mcp/transport/telemetry.js.map +1 -0
- package/dist/mcp/with-session.d.ts +26 -0
- package/dist/mcp/with-session.d.ts.map +1 -0
- package/dist/mcp/with-session.js +275 -0
- package/dist/mcp/with-session.js.map +1 -0
- package/dist/parser/annotations.d.ts +3 -0
- package/dist/parser/annotations.d.ts.map +1 -0
- package/dist/parser/annotations.js +41 -0
- package/dist/parser/annotations.js.map +1 -0
- package/dist/parser/blocks.d.ts +3 -0
- package/dist/parser/blocks.d.ts.map +1 -0
- package/dist/parser/blocks.js +99 -0
- package/dist/parser/blocks.js.map +1 -0
- package/dist/parser/frontmatter.d.ts +9 -0
- package/dist/parser/frontmatter.d.ts.map +1 -0
- package/dist/parser/frontmatter.js +33 -0
- package/dist/parser/frontmatter.js.map +1 -0
- package/dist/parser/index.d.ts +11 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +54 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/matter.d.ts +3 -0
- package/dist/parser/matter.d.ts.map +1 -0
- package/dist/parser/matter.js +32 -0
- package/dist/parser/matter.js.map +1 -0
- package/dist/parser/tags.d.ts +3 -0
- package/dist/parser/tags.d.ts.map +1 -0
- package/dist/parser/tags.js +32 -0
- package/dist/parser/tags.js.map +1 -0
- package/dist/parser/verbatim.d.ts +4 -0
- package/dist/parser/verbatim.d.ts.map +1 -0
- package/dist/parser/verbatim.js +121 -0
- package/dist/parser/verbatim.js.map +1 -0
- package/dist/parser/yaml-profile.d.ts +4 -0
- package/dist/parser/yaml-profile.d.ts.map +1 -0
- package/dist/parser/yaml-profile.js +73 -0
- package/dist/parser/yaml-profile.js.map +1 -0
- package/dist/registry/index.d.ts +2 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +2 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/loader.d.ts +4 -0
- package/dist/registry/loader.d.ts.map +1 -0
- package/dist/registry/loader.js +147 -0
- package/dist/registry/loader.js.map +1 -0
- package/dist/registry/types.d.ts +2 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +5 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/scanner.d.ts +57 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +223 -0
- package/dist/scanner.js.map +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/loader.d.ts +4 -0
- package/dist/schema/loader.d.ts.map +1 -0
- package/dist/schema/loader.js +303 -0
- package/dist/schema/loader.js.map +1 -0
- package/dist/schema/precision.d.ts +6 -0
- package/dist/schema/precision.d.ts.map +1 -0
- package/dist/schema/precision.js +59 -0
- package/dist/schema/precision.js.map +1 -0
- package/dist/schema/validator.d.ts +21 -0
- package/dist/schema/validator.d.ts.map +1 -0
- package/dist/schema/validator.js +200 -0
- package/dist/schema/validator.js.map +1 -0
- package/dist/schema-md.d.ts +8 -0
- package/dist/schema-md.d.ts.map +1 -0
- package/dist/schema-md.js +98 -0
- package/dist/schema-md.js.map +1 -0
- package/dist/skill-files.d.ts +3 -0
- package/dist/skill-files.d.ts.map +1 -0
- package/dist/skill-files.js +362 -0
- package/dist/skill-files.js.map +1 -0
- package/dist/skills-scaffold.d.ts +10 -0
- package/dist/skills-scaffold.d.ts.map +1 -0
- package/dist/skills-scaffold.js +52 -0
- package/dist/skills-scaffold.js.map +1 -0
- package/dist/types.d.ts +309 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +111 -0
- package/dist/types.js.map +1 -0
- package/dist/writer/index.d.ts +7 -0
- package/dist/writer/index.d.ts.map +1 -0
- package/dist/writer/index.js +32 -0
- package/dist/writer/index.js.map +1 -0
- package/dist/writer/serializer.d.ts +4 -0
- package/dist/writer/serializer.d.ts.map +1 -0
- package/dist/writer/serializer.js +103 -0
- package/dist/writer/serializer.js.map +1 -0
- package/dist/writer/template.d.ts +3 -0
- package/dist/writer/template.d.ts.map +1 -0
- package/dist/writer/template.js +27 -0
- package/dist/writer/template.js.map +1 -0
- package/package.json +59 -7
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { EnginePool } from '../instance/pool.js';
|
|
2
|
+
import type { SessionRateLimiter } from './rate-limit.js';
|
|
3
|
+
export type ShutdownState = 'running' | 'draining' | 'exiting';
|
|
4
|
+
export interface DrainTarget {
|
|
5
|
+
pool: EnginePool;
|
|
6
|
+
rateLimiter: SessionRateLimiter;
|
|
7
|
+
}
|
|
8
|
+
export interface ShutdownOptions {
|
|
9
|
+
shutdownTimeoutMs?: number;
|
|
10
|
+
exit?: (code: number) => void;
|
|
11
|
+
installHandlers?: boolean;
|
|
12
|
+
finalCleanup?: () => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare function getShutdownState(): ShutdownState;
|
|
15
|
+
export declare function isShuttingDown(): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Test hook — resets module state. NEVER call from production code.
|
|
18
|
+
*/
|
|
19
|
+
export declare function __resetShutdownState(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Begin shutdown. First call flips state to 'draining' and starts the drain
|
|
22
|
+
* loop. Second call short-circuits the wait and accelerates to exiting.
|
|
23
|
+
* Third+ calls are ignored.
|
|
24
|
+
*/
|
|
25
|
+
export declare function beginShutdown(target: DrainTarget, opts?: ShutdownOptions): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Install SIGTERM / SIGINT handlers that call beginShutdown on first hit and
|
|
28
|
+
* accelerate on the second. Call once from server startup. Tests bypass this
|
|
29
|
+
* by installing their own handlers or calling beginShutdown directly.
|
|
30
|
+
*/
|
|
31
|
+
export declare function installSignalHandlers(target: DrainTarget, opts?: ShutdownOptions): void;
|
|
32
|
+
//# sourceMappingURL=shutdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../src/mcp/shutdown.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,kBAAkB,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAE9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AASD,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,IAAI,CAAC,CA6Ef;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,GAAE,eAAoB,GAAG,IAAI,CAQ3F"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Shutdown state machine — running → draining → exiting.
|
|
3
|
+
//
|
|
4
|
+
// SIGTERM / SIGINT trigger DRAINING. New tool calls are rejected at the
|
|
5
|
+
// `withEngine` entry with SHUTTING_DOWN. In-flight writes are given a bounded
|
|
6
|
+
// window to complete (MAAD_SHUTDOWN_TIMEOUT_MS, default 10s). After drain or
|
|
7
|
+
// timeout, EXITING closes engines, flushes audit, and process.exit(code).
|
|
8
|
+
//
|
|
9
|
+
// Second signal during DRAINING skips the wait and force-exits.
|
|
10
|
+
//
|
|
11
|
+
// Cooperative cancellation *inside* engine methods (AbortSignal threaded
|
|
12
|
+
// through stage boundaries) is deferred to 0.8.5 and documented in gaps.md.
|
|
13
|
+
// For 0.4.1: requests already executing run to completion; the drain waits
|
|
14
|
+
// for them; clients see either their response or REQUEST_TIMEOUT if the
|
|
15
|
+
// per-request ceiling was first.
|
|
16
|
+
// ============================================================================
|
|
17
|
+
import { getOpsLog } from '../logging.js';
|
|
18
|
+
const DEFAULT_SHUTDOWN_TIMEOUT_MS = 10_000;
|
|
19
|
+
const DRAIN_POLL_MS = 50;
|
|
20
|
+
let state = 'running';
|
|
21
|
+
let shutdownStartedAt = null;
|
|
22
|
+
let shutdownPromise = null;
|
|
23
|
+
export function getShutdownState() {
|
|
24
|
+
return state;
|
|
25
|
+
}
|
|
26
|
+
export function isShuttingDown() {
|
|
27
|
+
return state !== 'running';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Test hook — resets module state. NEVER call from production code.
|
|
31
|
+
*/
|
|
32
|
+
export function __resetShutdownState() {
|
|
33
|
+
state = 'running';
|
|
34
|
+
shutdownStartedAt = null;
|
|
35
|
+
shutdownPromise = null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Begin shutdown. First call flips state to 'draining' and starts the drain
|
|
39
|
+
* loop. Second call short-circuits the wait and accelerates to exiting.
|
|
40
|
+
* Third+ calls are ignored.
|
|
41
|
+
*/
|
|
42
|
+
export function beginShutdown(target, opts = {}) {
|
|
43
|
+
const log = getOpsLog();
|
|
44
|
+
if (state === 'exiting') {
|
|
45
|
+
// Already on the way out — nothing to do.
|
|
46
|
+
return shutdownPromise ?? Promise.resolve();
|
|
47
|
+
}
|
|
48
|
+
if (state === 'draining') {
|
|
49
|
+
// Second signal: accelerate.
|
|
50
|
+
log.warn({ event: 'shutdown_forced' }, 'shutdown_forced');
|
|
51
|
+
state = 'exiting';
|
|
52
|
+
// The existing shutdownPromise will observe the state change and finalize.
|
|
53
|
+
return shutdownPromise ?? Promise.resolve();
|
|
54
|
+
}
|
|
55
|
+
// First signal: start draining.
|
|
56
|
+
state = 'draining';
|
|
57
|
+
shutdownStartedAt = Date.now();
|
|
58
|
+
log.info({ event: 'shutdown_start' }, 'shutdown_start');
|
|
59
|
+
const exitFn = opts.exit ?? ((code) => process.exit(code));
|
|
60
|
+
const timeoutMs = opts.shutdownTimeoutMs ?? Number(process.env.MAAD_SHUTDOWN_TIMEOUT_MS ?? DEFAULT_SHUTDOWN_TIMEOUT_MS);
|
|
61
|
+
shutdownPromise = (async () => {
|
|
62
|
+
let drainTimedOut = false;
|
|
63
|
+
const deadline = Date.now() + timeoutMs;
|
|
64
|
+
// Drain loop: wait until no writes are queued AND no requests are in flight
|
|
65
|
+
// OR the grace window expires, OR a second signal accelerates.
|
|
66
|
+
while (true) {
|
|
67
|
+
const queueDepth = target.pool.totalWriteQueueDepth();
|
|
68
|
+
const inFlight = target.rateLimiter.totalInFlight();
|
|
69
|
+
if (queueDepth === 0 && inFlight === 0)
|
|
70
|
+
break;
|
|
71
|
+
if (state === 'exiting')
|
|
72
|
+
break; // accelerated by a second signal
|
|
73
|
+
if (Date.now() >= deadline) {
|
|
74
|
+
drainTimedOut = true;
|
|
75
|
+
log.warn({
|
|
76
|
+
event: 'shutdown_timeout',
|
|
77
|
+
queue_depth: queueDepth,
|
|
78
|
+
in_flight: inFlight,
|
|
79
|
+
elapsed_ms: Date.now() - (shutdownStartedAt ?? Date.now()),
|
|
80
|
+
}, 'shutdown_timeout');
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
await sleep(DRAIN_POLL_MS);
|
|
84
|
+
}
|
|
85
|
+
state = 'exiting';
|
|
86
|
+
// EXITING: final cleanup.
|
|
87
|
+
try {
|
|
88
|
+
await target.pool.closeAll();
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// best-effort
|
|
92
|
+
}
|
|
93
|
+
if (opts.finalCleanup) {
|
|
94
|
+
try {
|
|
95
|
+
await opts.finalCleanup();
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// best-effort
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const elapsedMs = Date.now() - (shutdownStartedAt ?? Date.now());
|
|
102
|
+
log.info({
|
|
103
|
+
event: 'shutdown_complete',
|
|
104
|
+
elapsed_ms: elapsedMs,
|
|
105
|
+
drain_timed_out: drainTimedOut,
|
|
106
|
+
}, 'shutdown_complete');
|
|
107
|
+
// Exit code 1 on timed-out drain; 0 on clean drain. Surfaces to operators
|
|
108
|
+
// monitoring container exit codes.
|
|
109
|
+
exitFn(drainTimedOut ? 1 : 0);
|
|
110
|
+
})();
|
|
111
|
+
return shutdownPromise;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Install SIGTERM / SIGINT handlers that call beginShutdown on first hit and
|
|
115
|
+
* accelerate on the second. Call once from server startup. Tests bypass this
|
|
116
|
+
* by installing their own handlers or calling beginShutdown directly.
|
|
117
|
+
*/
|
|
118
|
+
export function installSignalHandlers(target, opts = {}) {
|
|
119
|
+
const onSignal = (sig) => {
|
|
120
|
+
const log = getOpsLog();
|
|
121
|
+
log.info({ event: 'signal_received', signal: sig }, 'signal_received');
|
|
122
|
+
void beginShutdown(target, opts);
|
|
123
|
+
};
|
|
124
|
+
process.on('SIGTERM', () => onSignal('SIGTERM'));
|
|
125
|
+
process.on('SIGINT', () => onSignal('SIGINT'));
|
|
126
|
+
}
|
|
127
|
+
function sleep(ms) {
|
|
128
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=shutdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../../src/mcp/shutdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/audit.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,CAiCpE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Audit tools — maad_history, maad_audit
|
|
3
|
+
// ============================================================================
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { docId, docType } from '../../types.js';
|
|
6
|
+
import { resultToResponse } from '../response.js';
|
|
7
|
+
import { withEngine } from '../with-session.js';
|
|
8
|
+
export function register(server, ctx) {
|
|
9
|
+
server.registerTool('maad_history', {
|
|
10
|
+
description: 'Returns git commit history for a specific document.',
|
|
11
|
+
inputSchema: z.object({
|
|
12
|
+
docId: z.string().describe('Document ID'),
|
|
13
|
+
limit: z.number().optional().describe('Max commits to return'),
|
|
14
|
+
since: z.string().optional().describe('Only commits since this date (ISO or git date format)'),
|
|
15
|
+
project: z.string().optional().describe('Project name (multi-project mode only)'),
|
|
16
|
+
}),
|
|
17
|
+
}, async (args, extra) => withEngine(ctx, extra, 'maad_history', args, async ({ engine }) => {
|
|
18
|
+
const opts = {};
|
|
19
|
+
if (args.limit !== undefined)
|
|
20
|
+
opts.limit = args.limit;
|
|
21
|
+
if (args.since !== undefined)
|
|
22
|
+
opts.since = args.since;
|
|
23
|
+
return resultToResponse(await engine.history(docId(args.docId), opts));
|
|
24
|
+
}));
|
|
25
|
+
server.registerTool('maad_audit', {
|
|
26
|
+
description: 'Returns project-wide activity log from git. Shows most recent action per document.',
|
|
27
|
+
inputSchema: z.object({
|
|
28
|
+
since: z.string().optional().describe('Activity since date'),
|
|
29
|
+
until: z.string().optional().describe('Activity until date'),
|
|
30
|
+
docType: z.string().optional().describe('Filter by document type'),
|
|
31
|
+
project: z.string().optional().describe('Project name (multi-project mode only)'),
|
|
32
|
+
}),
|
|
33
|
+
}, async (args, extra) => withEngine(ctx, extra, 'maad_audit', args, async ({ engine }) => {
|
|
34
|
+
const opts = {};
|
|
35
|
+
if (args.since !== undefined)
|
|
36
|
+
opts.since = args.since;
|
|
37
|
+
if (args.until !== undefined)
|
|
38
|
+
opts.until = args.until;
|
|
39
|
+
if (args.docType !== undefined)
|
|
40
|
+
opts.docType = docType(args.docType);
|
|
41
|
+
return resultToResponse(await engine.audit(opts));
|
|
42
|
+
}));
|
|
43
|
+
return 2;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/mcp/tools/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/auth.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AA4C7C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,CA0HpE"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Admin MCP auth tools — 0.7.0 Scoped Auth & Identity (P3c)
|
|
3
|
+
//
|
|
4
|
+
// maad_issue_token — issue a new token; returns plaintext ONCE + record
|
|
5
|
+
// maad_revoke_token — mark a token revoked; returns record
|
|
6
|
+
// maad_rotate_token — revoke + reissue with preserved caps; returns plaintext + record
|
|
7
|
+
// maad_list_tokens — list registry entries (no hash)
|
|
8
|
+
// maad_show_token — fetch one record by id (no hash)
|
|
9
|
+
//
|
|
10
|
+
// All admin-only and engine-less (same pattern as maad_instance_reload and
|
|
11
|
+
// maad_subscriptions). Refuse if the instance has no token registry (stdio
|
|
12
|
+
// / synthetic). Role gate: admin on every project in the session binding.
|
|
13
|
+
// ============================================================================
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import { successResponse, errorResponse } from '../response.js';
|
|
16
|
+
import { resolveSessionId } from '../../instance/session.js';
|
|
17
|
+
import { roleSatisfies } from '../roles.js';
|
|
18
|
+
import { maadError } from '../../errors.js';
|
|
19
|
+
import { tokenId as toTokenId } from '../../auth/types.js';
|
|
20
|
+
const ROLE_ENUM = z.enum(['reader', 'writer', 'admin']);
|
|
21
|
+
/**
|
|
22
|
+
* Inline admin role check — same pattern as maad_instance_reload. Engine-less
|
|
23
|
+
* tools bypass withEngine's role gate, so we enforce here. Requires admin
|
|
24
|
+
* effective role on EVERY project in the session's binding (least privilege,
|
|
25
|
+
* since token ops affect the instance-wide registry).
|
|
26
|
+
*/
|
|
27
|
+
function requireAdminEverywhere(ctx, sessionId) {
|
|
28
|
+
const state = ctx.sessions.get(sessionId);
|
|
29
|
+
if (!state || state.mode === null) {
|
|
30
|
+
return errorResponse([maadError('SESSION_UNBOUND', 'Session is not bound. Call maad_use_project(s) before admin auth tools.')]);
|
|
31
|
+
}
|
|
32
|
+
for (const [projectName, role] of state.effectiveRoles) {
|
|
33
|
+
if (!roleSatisfies(role, 'admin')) {
|
|
34
|
+
return errorResponse([maadError('INSUFFICIENT_ROLE', `admin auth tools require admin on every project in the session binding; session has "${role}" on "${projectName}".`)]);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
function requireTokenStore(ctx) {
|
|
40
|
+
if (ctx.tokens === null) {
|
|
41
|
+
return errorResponse([maadError('TOKENS_FILE_MISSING', 'Token registry is not available — this MCP instance runs in stdio/synthetic mode with no tokens.yaml. Admin auth tools require --instance with a file-mode registry.')]);
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/** Scrub `hash` from a record before returning to clients — they never need it. */
|
|
46
|
+
function sanitize(record) {
|
|
47
|
+
const { hash, ...rest } = record;
|
|
48
|
+
void hash;
|
|
49
|
+
return rest;
|
|
50
|
+
}
|
|
51
|
+
export function register(server, ctx) {
|
|
52
|
+
server.registerTool('maad_issue_token', {
|
|
53
|
+
description: 'Issue a new auth token. Returns plaintext ONCE plus record metadata — plaintext is never recoverable after. Admin on every bound project required.',
|
|
54
|
+
inputSchema: z.object({
|
|
55
|
+
role: ROLE_ENUM.describe('Token\'s global role (capped by per-project overrides and instance project ceiling)'),
|
|
56
|
+
projects: z.array(z.object({
|
|
57
|
+
name: z.string().describe('Project name or "*" wildcard'),
|
|
58
|
+
role: ROLE_ENUM.optional().describe('Optional per-project role downgrade (never exceeds global)'),
|
|
59
|
+
})).describe('Allowlist. Wildcard `*` matches every project at the token\'s global role.'),
|
|
60
|
+
name: z.string().optional().describe('Human label (e.g. "brain-app-gateway")'),
|
|
61
|
+
agentId: z.string().optional().describe('Ref -> agent for identity attribution'),
|
|
62
|
+
userId: z.string().optional().describe('Ref -> user when token represents a human'),
|
|
63
|
+
expiresAt: z.string().optional().describe('ISO 8601 expiry timestamp'),
|
|
64
|
+
}),
|
|
65
|
+
}, async (args, extra) => {
|
|
66
|
+
const storeErr = requireTokenStore(ctx);
|
|
67
|
+
if (storeErr)
|
|
68
|
+
return storeErr;
|
|
69
|
+
const sid = resolveSessionId(extra);
|
|
70
|
+
const roleErr = requireAdminEverywhere(ctx, sid);
|
|
71
|
+
if (roleErr)
|
|
72
|
+
return roleErr;
|
|
73
|
+
const spec = {
|
|
74
|
+
role: args.role,
|
|
75
|
+
projects: args.projects.map(p => {
|
|
76
|
+
const cap = { name: p.name };
|
|
77
|
+
if (p.role !== undefined)
|
|
78
|
+
cap.role = p.role;
|
|
79
|
+
return cap;
|
|
80
|
+
}),
|
|
81
|
+
};
|
|
82
|
+
if (args.name !== undefined)
|
|
83
|
+
spec.name = args.name;
|
|
84
|
+
if (args.agentId !== undefined)
|
|
85
|
+
spec.agentId = args.agentId;
|
|
86
|
+
if (args.userId !== undefined)
|
|
87
|
+
spec.userId = args.userId;
|
|
88
|
+
if (args.expiresAt !== undefined)
|
|
89
|
+
spec.expiresAt = args.expiresAt;
|
|
90
|
+
const result = await ctx.tokens.issue(spec);
|
|
91
|
+
if (!result.ok)
|
|
92
|
+
return errorResponse(result.errors);
|
|
93
|
+
return successResponse({
|
|
94
|
+
plaintext: result.value.plaintext,
|
|
95
|
+
record: sanitize(result.value.record),
|
|
96
|
+
warning: 'Store the plaintext now — it will not be returned again.',
|
|
97
|
+
}, 'maad_issue_token');
|
|
98
|
+
});
|
|
99
|
+
server.registerTool('maad_revoke_token', {
|
|
100
|
+
description: 'Revoke a token by its id. Idempotent. Admin on every bound project required.',
|
|
101
|
+
inputSchema: z.object({
|
|
102
|
+
id: z.string().describe('Token id (tok-xxx)'),
|
|
103
|
+
}),
|
|
104
|
+
}, async (args, extra) => {
|
|
105
|
+
const storeErr = requireTokenStore(ctx);
|
|
106
|
+
if (storeErr)
|
|
107
|
+
return storeErr;
|
|
108
|
+
const sid = resolveSessionId(extra);
|
|
109
|
+
const roleErr = requireAdminEverywhere(ctx, sid);
|
|
110
|
+
if (roleErr)
|
|
111
|
+
return roleErr;
|
|
112
|
+
const result = await ctx.tokens.revoke(toTokenId(args.id));
|
|
113
|
+
if (!result.ok)
|
|
114
|
+
return errorResponse(result.errors);
|
|
115
|
+
return successResponse({ record: sanitize(result.value) }, 'maad_revoke_token');
|
|
116
|
+
});
|
|
117
|
+
server.registerTool('maad_rotate_token', {
|
|
118
|
+
description: 'Revoke an existing token and issue a new one with the same capabilities. Returns new plaintext ONCE. Admin on every bound project required.',
|
|
119
|
+
inputSchema: z.object({
|
|
120
|
+
id: z.string().describe('Token id to rotate (tok-xxx)'),
|
|
121
|
+
}),
|
|
122
|
+
}, async (args, extra) => {
|
|
123
|
+
const storeErr = requireTokenStore(ctx);
|
|
124
|
+
if (storeErr)
|
|
125
|
+
return storeErr;
|
|
126
|
+
const sid = resolveSessionId(extra);
|
|
127
|
+
const roleErr = requireAdminEverywhere(ctx, sid);
|
|
128
|
+
if (roleErr)
|
|
129
|
+
return roleErr;
|
|
130
|
+
const result = await ctx.tokens.rotate(toTokenId(args.id));
|
|
131
|
+
if (!result.ok)
|
|
132
|
+
return errorResponse(result.errors);
|
|
133
|
+
return successResponse({
|
|
134
|
+
plaintext: result.value.plaintext,
|
|
135
|
+
record: sanitize(result.value.record),
|
|
136
|
+
warning: 'Store the new plaintext now — old token revoked, new plaintext will not be returned again.',
|
|
137
|
+
}, 'maad_rotate_token');
|
|
138
|
+
});
|
|
139
|
+
server.registerTool('maad_list_tokens', {
|
|
140
|
+
description: 'List all tokens in the registry. Active tokens by default; pass includeRevoked:true for full history. Admin on every bound project required.',
|
|
141
|
+
inputSchema: z.object({
|
|
142
|
+
includeRevoked: z.boolean().optional().describe('Include revoked tokens in the response'),
|
|
143
|
+
}),
|
|
144
|
+
}, async (args, extra) => {
|
|
145
|
+
const storeErr = requireTokenStore(ctx);
|
|
146
|
+
if (storeErr)
|
|
147
|
+
return storeErr;
|
|
148
|
+
const sid = resolveSessionId(extra);
|
|
149
|
+
const roleErr = requireAdminEverywhere(ctx, sid);
|
|
150
|
+
if (roleErr)
|
|
151
|
+
return roleErr;
|
|
152
|
+
const all = ctx.tokens.list();
|
|
153
|
+
const filtered = args.includeRevoked === true ? all : all.filter(r => r.revokedAt === undefined);
|
|
154
|
+
return successResponse({
|
|
155
|
+
tokens: filtered.map(sanitize),
|
|
156
|
+
total: filtered.length,
|
|
157
|
+
activeCount: ctx.tokens.activeCount(),
|
|
158
|
+
}, 'maad_list_tokens');
|
|
159
|
+
});
|
|
160
|
+
server.registerTool('maad_show_token', {
|
|
161
|
+
description: 'Fetch a single token record by id. Hash is never returned. Admin on every bound project required.',
|
|
162
|
+
inputSchema: z.object({
|
|
163
|
+
id: z.string().describe('Token id (tok-xxx)'),
|
|
164
|
+
}),
|
|
165
|
+
}, async (args, extra) => {
|
|
166
|
+
const storeErr = requireTokenStore(ctx);
|
|
167
|
+
if (storeErr)
|
|
168
|
+
return storeErr;
|
|
169
|
+
const sid = resolveSessionId(extra);
|
|
170
|
+
const roleErr = requireAdminEverywhere(ctx, sid);
|
|
171
|
+
if (roleErr)
|
|
172
|
+
return roleErr;
|
|
173
|
+
const record = ctx.tokens.lookupById(toTokenId(args.id));
|
|
174
|
+
if (!record) {
|
|
175
|
+
return errorResponse([maadError('TOKEN_NOT_FOUND', `No token with id ${args.id}`)]);
|
|
176
|
+
}
|
|
177
|
+
return successResponse({ record: sanitize(record) }, 'maad_show_token');
|
|
178
|
+
});
|
|
179
|
+
return 5;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/mcp/tools/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/discover.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,CA8EpE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Discover tools — maad_scan, maad_summary, maad_describe
|
|
3
|
+
// ============================================================================
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { scanFile, scanDirectory } from '../../scanner.js';
|
|
7
|
+
import { successResponse, errorResponse, getProvenanceMode } from '../response.js';
|
|
8
|
+
import { isContainedIn } from '../../engine/pathguard.js';
|
|
9
|
+
import { withEngine } from '../with-session.js';
|
|
10
|
+
export function register(server, ctx) {
|
|
11
|
+
server.registerTool('maad_scan', {
|
|
12
|
+
description: 'Analyze raw markdown structure. Works without registry. Use for onboarding new files. Pass a file path for detailed analysis or a directory for corpus-level patterns.',
|
|
13
|
+
inputSchema: z.object({
|
|
14
|
+
path: z.string().describe('File or directory path to scan (relative to project root)'),
|
|
15
|
+
project: z.string().optional().describe('Project name (multi-project mode only)'),
|
|
16
|
+
}),
|
|
17
|
+
}, async (args, extra) => withEngine(ctx, extra, 'maad_scan', args, async ({ projectRoot }) => {
|
|
18
|
+
const absTarget = path.resolve(projectRoot, args.path);
|
|
19
|
+
if (!isContainedIn(absTarget, projectRoot)) {
|
|
20
|
+
return errorResponse([{ code: 'PATH_OUTSIDE_PROJECT', message: `Scan path must be within the project root: ${args.path}` }]);
|
|
21
|
+
}
|
|
22
|
+
const { statSync } = await import('node:fs');
|
|
23
|
+
let stat;
|
|
24
|
+
try {
|
|
25
|
+
stat = statSync(absTarget);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return errorResponse([{ code: 'PATH_NOT_FOUND', message: `Not found: ${args.path}` }]);
|
|
29
|
+
}
|
|
30
|
+
if (stat.isFile()) {
|
|
31
|
+
return successResponse(await scanFile(absTarget));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return successResponse(await scanDirectory(absTarget));
|
|
35
|
+
}
|
|
36
|
+
}));
|
|
37
|
+
server.registerTool('maad_summary', {
|
|
38
|
+
description: 'Lean project snapshot for session bootstrapping. Returns types, counts, sample IDs, totals, warnings. Call maad_describe for subtype inventory detail.',
|
|
39
|
+
inputSchema: z.object({
|
|
40
|
+
project: z.string().optional().describe('Project name (multi-project mode only)'),
|
|
41
|
+
}),
|
|
42
|
+
}, async (args, extra) => withEngine(ctx, extra, 'maad_summary', args, ({ engine }) => {
|
|
43
|
+
const summary = engine.summary();
|
|
44
|
+
const provMode = getProvenanceMode();
|
|
45
|
+
if (provMode === 'off') {
|
|
46
|
+
return successResponse(summary, 'maad_summary');
|
|
47
|
+
}
|
|
48
|
+
const provenanceInstructions = provMode === 'detail'
|
|
49
|
+
? {
|
|
50
|
+
mode: 'detail',
|
|
51
|
+
instructions: [
|
|
52
|
+
'Tag every data value in your responses with its source:',
|
|
53
|
+
'[T:<tool_name>] = from a specific MAAD tool (e.g. [T:maad_get])',
|
|
54
|
+
'[R] = from memory/recall (unverified)',
|
|
55
|
+
'[R*] = inferred/derived — not directly stated in any source',
|
|
56
|
+
'When mixing sources in a table, add a source column.',
|
|
57
|
+
'If joins require N+1 calls and you skip them, disclose which values were recalled.',
|
|
58
|
+
'Never present recalled data with the same confidence as tool-verified data.',
|
|
59
|
+
],
|
|
60
|
+
}
|
|
61
|
+
: {
|
|
62
|
+
mode: 'on',
|
|
63
|
+
instructions: [
|
|
64
|
+
'Tag data sources in responses:',
|
|
65
|
+
'[T] = from a MAAD tool call (verified)',
|
|
66
|
+
'[R] = from memory/recall (unverified)',
|
|
67
|
+
'When mixing sources in a table, add a source column or footnote.',
|
|
68
|
+
'Never present recalled data with the same confidence as tool-verified data.',
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
return successResponse({ ...summary, provenance: provenanceInstructions }, 'maad_summary');
|
|
72
|
+
}));
|
|
73
|
+
server.registerTool('maad_describe', {
|
|
74
|
+
description: 'Returns registry types, extraction primitives, document counts, and subtype inventory (deep detail; maad_summary is the lean orientation call).',
|
|
75
|
+
inputSchema: z.object({
|
|
76
|
+
project: z.string().optional().describe('Project name (multi-project mode only)'),
|
|
77
|
+
}),
|
|
78
|
+
}, async (args, extra) => withEngine(ctx, extra, 'maad_describe', args, ({ engine }) => {
|
|
79
|
+
return successResponse(engine.describe());
|
|
80
|
+
}));
|
|
81
|
+
return 3;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/mcp/tools/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { InstanceCtx } from '../ctx.js';
|
|
3
|
+
export declare function register(server: McpServer, ctx: InstanceCtx): number;
|
|
4
|
+
/**
|
|
5
|
+
* Registers the admin-only `maad_instance_reload` tool separately from the
|
|
6
|
+
* base instance tools. Called regardless of instance source so synthetic
|
|
7
|
+
* instances can surface a clear INSTANCE_RELOAD_SYNTHETIC error rather than
|
|
8
|
+
* an opaque "unknown tool" response.
|
|
9
|
+
*
|
|
10
|
+
* Role gate lives inside the handler (engine-less tools bypass the `withEngine`
|
|
11
|
+
* role check). Requires admin effective role on EVERY project in the session's
|
|
12
|
+
* binding — least privilege, since reload is instance-wide.
|
|
13
|
+
*/
|
|
14
|
+
export declare function registerReload(server: McpServer, ctx: InstanceCtx): number;
|
|
15
|
+
//# sourceMappingURL=instance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/instance.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAQ7C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,CA2IpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,CA6D1E"}
|