memory-journal-mcp 6.1.2 → 6.2.1
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 +44 -28
- package/dist/{chunk-X4SWFATC.js → chunk-BI4ZNSKA.js} +38 -24
- package/dist/{chunk-HCEWINSB.js → chunk-N6EBIDN7.js} +99 -102
- package/dist/cli.js +2 -2
- package/dist/index.js +2 -2
- package/dist/tools-WPRY5MJ6.js +2 -0
- package/package.json +10 -1
- package/skills/github-commander/SKILL.md +151 -0
- package/skills/github-commander/config/project-config.example.md +125 -0
- package/skills/github-commander/workflows/code-quality-audit.md +80 -0
- package/skills/github-commander/workflows/full-audit.md +134 -0
- package/skills/github-commander/workflows/issue-triage.md +239 -0
- package/skills/github-commander/workflows/milestone-sprint.md +81 -0
- package/skills/github-commander/workflows/perf-audit.md +142 -0
- package/skills/github-commander/workflows/pr-review.md +123 -0
- package/skills/github-commander/workflows/security-audit.md +170 -0
- package/skills/github-commander/workflows/update-deps.md +109 -0
- package/.dockerignore +0 -139
- package/.gitattributes +0 -20
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -95
- package/.github/ISSUE_TEMPLATE/config.yml +0 -11
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -110
- package/.github/ISSUE_TEMPLATE/question.md +0 -78
- package/.github/aw/actions-lock.json +0 -14
- package/.github/copilot-instructions.md +0 -122
- package/.github/dependabot.yml +0 -93
- package/.github/pull_request_template.md +0 -135
- package/.github/workflows/README.md +0 -133
- package/.github/workflows/agentics-maintenance.yml +0 -141
- package/.github/workflows/auto-release.yml +0 -68
- package/.github/workflows/ci-health-monitor.lock.yml +0 -1121
- package/.github/workflows/ci-health-monitor.md +0 -87
- package/.github/workflows/codeql.yml +0 -41
- package/.github/workflows/dependabot-auto-merge.yml +0 -42
- package/.github/workflows/dependency-maintenance.lock.yml +0 -1182
- package/.github/workflows/dependency-maintenance.md +0 -147
- package/.github/workflows/docker-publish.yml +0 -254
- package/.github/workflows/docs-drift-detector.lock.yml +0 -1142
- package/.github/workflows/docs-drift-detector.md +0 -115
- package/.github/workflows/lint-and-test.yml +0 -60
- package/.github/workflows/publish-npm.yml +0 -85
- package/.github/workflows/secrets-scanning.yml +0 -32
- package/.github/workflows/security-update.yml +0 -127
- package/.gitleaks.toml +0 -9
- package/.prettierignore +0 -21
- package/.prettierrc +0 -33
- package/.scout-ignore +0 -12
- package/.trivyignore +0 -21
- package/CHANGELOG.md +0 -1814
- package/CODE_OF_CONDUCT.md +0 -133
- package/CONTRIBUTING.md +0 -263
- package/DOCKER_README.md +0 -331
- package/Dockerfile +0 -128
- package/SECURITY.md +0 -227
- package/UNRELEASED.md +0 -1
- package/dist/tools-T4U5A3X4.js +0 -2
- package/docker-compose.yml +0 -71
- package/docs/README.md +0 -18
- package/docs/agentic-journal-synergy.md +0 -175
- package/docs/copilot-setup.md +0 -72
- package/eslint.config.js +0 -110
- package/mcp-config-example.json +0 -21
- package/playwright.config.ts +0 -35
- package/releases/v2.1.0.md +0 -220
- package/releases/v2.2.0.md +0 -168
- package/releases/v3.0.0.md +0 -237
- package/releases/v3.1.0.md +0 -104
- package/releases/v3.1.1.md +0 -42
- package/releases/v3.1.2.md +0 -40
- package/releases/v3.1.3.md +0 -64
- package/releases/v3.1.4.md +0 -32
- package/releases/v3.1.5.md +0 -44
- package/releases/v4.0.0.md +0 -71
- package/releases/v4.1.0.md +0 -88
- package/releases/v4.2.0.md +0 -90
- package/releases/v4.3.0.md +0 -92
- package/releases/v4.3.1.md +0 -69
- package/releases/v4.4.0.md +0 -120
- package/releases/v4.4.1.md +0 -33
- package/releases/v4.4.2.md +0 -31
- package/releases/v4.5.0.md +0 -116
- package/releases/v5.0.0.md +0 -105
- package/releases/v5.0.1.md +0 -25
- package/releases/v5.1.0.md +0 -83
- package/releases/v5.1.1.md +0 -10
- package/releases/v6.0.0.md +0 -48
- package/releases/v6.0.1.md +0 -36
- package/releases/v6.1.0.md +0 -68
- package/releases/v6.1.1.md +0 -30
- package/releases/v6.1.2.md +0 -23
- package/scripts/generate-server-instructions.ts +0 -306
- package/scripts/server-instructions-function-body.ts +0 -107
- package/scripts/server-instructions-gotchas.ts +0 -45
- package/server.json +0 -42
- package/social-preview.png +0 -0
- package/src/auth/auth-context.ts +0 -78
- package/src/auth/authorization-server-discovery.ts +0 -263
- package/src/auth/errors.ts +0 -215
- package/src/auth/index.ts +0 -58
- package/src/auth/middleware.ts +0 -392
- package/src/auth/oauth-resource-server.ts +0 -170
- package/src/auth/scope-map.ts +0 -46
- package/src/auth/scopes.ts +0 -256
- package/src/auth/token-validator.ts +0 -293
- package/src/auth/transport-agnostic.ts +0 -164
- package/src/auth/types.ts +0 -372
- package/src/cli.ts +0 -279
- package/src/codemode/api-constants.ts +0 -263
- package/src/codemode/api.ts +0 -302
- package/src/codemode/auto-return.ts +0 -65
- package/src/codemode/index.ts +0 -47
- package/src/codemode/sandbox-factory.ts +0 -144
- package/src/codemode/sandbox.ts +0 -220
- package/src/codemode/security.ts +0 -155
- package/src/codemode/types.ts +0 -228
- package/src/codemode/worker-sandbox.ts +0 -277
- package/src/codemode/worker-script.ts +0 -239
- package/src/constants/icons.ts +0 -183
- package/src/constants/server-instructions.md +0 -166
- package/src/constants/server-instructions.ts +0 -514
- package/src/database/adapter-factory.ts +0 -16
- package/src/database/core/entry-columns.ts +0 -10
- package/src/database/core/interfaces.ts +0 -188
- package/src/database/core/schema.ts +0 -152
- package/src/database/sqlite-adapter/backup.ts +0 -167
- package/src/database/sqlite-adapter/entries/crud.ts +0 -233
- package/src/database/sqlite-adapter/entries/importance.ts +0 -76
- package/src/database/sqlite-adapter/entries/index.ts +0 -142
- package/src/database/sqlite-adapter/entries/search.ts +0 -294
- package/src/database/sqlite-adapter/entries/shared.ts +0 -102
- package/src/database/sqlite-adapter/entries/statistics.ts +0 -162
- package/src/database/sqlite-adapter/index.ts +0 -265
- package/src/database/sqlite-adapter/native-connection.ts +0 -301
- package/src/database/sqlite-adapter/relationships.ts +0 -70
- package/src/database/sqlite-adapter/tags.ts +0 -182
- package/src/filtering/tool-filter.ts +0 -312
- package/src/github/github-integration/client.ts +0 -114
- package/src/github/github-integration/index.ts +0 -297
- package/src/github/github-integration/insights.ts +0 -155
- package/src/github/github-integration/issues.ts +0 -213
- package/src/github/github-integration/milestones.ts +0 -262
- package/src/github/github-integration/projects.ts +0 -414
- package/src/github/github-integration/pull-requests.ts +0 -235
- package/src/github/github-integration/repository.ts +0 -110
- package/src/github/github-integration/types.ts +0 -43
- package/src/handlers/prompts/github.ts +0 -210
- package/src/handlers/prompts/index.ts +0 -97
- package/src/handlers/prompts/workflow.ts +0 -361
- package/src/handlers/resources/core/briefing/context-section.ts +0 -182
- package/src/handlers/resources/core/briefing/github-section.ts +0 -354
- package/src/handlers/resources/core/briefing/index.ts +0 -106
- package/src/handlers/resources/core/briefing/user-message.ts +0 -114
- package/src/handlers/resources/core/health.ts +0 -75
- package/src/handlers/resources/core/index.ts +0 -31
- package/src/handlers/resources/core/instructions.ts +0 -45
- package/src/handlers/resources/core/utilities.ts +0 -310
- package/src/handlers/resources/github.ts +0 -340
- package/src/handlers/resources/graph.ts +0 -218
- package/src/handlers/resources/help.ts +0 -410
- package/src/handlers/resources/index.ts +0 -143
- package/src/handlers/resources/shared.ts +0 -219
- package/src/handlers/resources/team.ts +0 -134
- package/src/handlers/resources/templates.ts +0 -334
- package/src/handlers/tools/admin.ts +0 -351
- package/src/handlers/tools/analytics.ts +0 -346
- package/src/handlers/tools/backup.ts +0 -272
- package/src/handlers/tools/codemode.ts +0 -188
- package/src/handlers/tools/core.ts +0 -359
- package/src/handlers/tools/error-fields-mixin.ts +0 -10
- package/src/handlers/tools/export.ts +0 -150
- package/src/handlers/tools/github/copilot-tools.ts +0 -72
- package/src/handlers/tools/github/helpers.ts +0 -125
- package/src/handlers/tools/github/insights-tools.ts +0 -112
- package/src/handlers/tools/github/issue-tools.ts +0 -442
- package/src/handlers/tools/github/kanban-tools.ts +0 -153
- package/src/handlers/tools/github/milestone-tools.ts +0 -371
- package/src/handlers/tools/github/mutation-tools.ts +0 -17
- package/src/handlers/tools/github/read-tools.ts +0 -302
- package/src/handlers/tools/github/schemas.ts +0 -435
- package/src/handlers/tools/github.ts +0 -39
- package/src/handlers/tools/index.ts +0 -255
- package/src/handlers/tools/relationships.ts +0 -390
- package/src/handlers/tools/schemas.ts +0 -165
- package/src/handlers/tools/search.ts +0 -448
- package/src/handlers/tools/team/admin-tools.ts +0 -164
- package/src/handlers/tools/team/analytics-tools.ts +0 -233
- package/src/handlers/tools/team/backup-tools.ts +0 -83
- package/src/handlers/tools/team/core-tools.ts +0 -197
- package/src/handlers/tools/team/export-tools.ts +0 -130
- package/src/handlers/tools/team/helpers.ts +0 -66
- package/src/handlers/tools/team/index.ts +0 -45
- package/src/handlers/tools/team/relationship-tools.ts +0 -219
- package/src/handlers/tools/team/schemas.ts +0 -558
- package/src/handlers/tools/team/search-tools.ts +0 -145
- package/src/handlers/tools/team/vector-tools.ts +0 -261
- package/src/index.ts +0 -57
- package/src/server/mcp-server.ts +0 -446
- package/src/server/registration.ts +0 -141
- package/src/server/scheduler.ts +0 -283
- package/src/transports/http/handlers.ts +0 -78
- package/src/transports/http/index.ts +0 -8
- package/src/transports/http/security.ts +0 -147
- package/src/transports/http/server/index.ts +0 -397
- package/src/transports/http/server/legacy-sse.ts +0 -87
- package/src/transports/http/server/stateful.ts +0 -222
- package/src/transports/http/server/stateless.ts +0 -42
- package/src/transports/http/types.ts +0 -132
- package/src/types/entities.ts +0 -145
- package/src/types/error-types.ts +0 -92
- package/src/types/errors.ts +0 -200
- package/src/types/filtering.ts +0 -55
- package/src/types/github.ts +0 -216
- package/src/types/index.ts +0 -348
- package/src/utils/error-helpers.ts +0 -78
- package/src/utils/errors/error-response-fields.ts +0 -29
- package/src/utils/errors/suggestions.ts +0 -94
- package/src/utils/github-helpers.ts +0 -33
- package/src/utils/logger.ts +0 -107
- package/src/utils/mcp-logger.ts +0 -155
- package/src/utils/progress-utils.ts +0 -100
- package/src/utils/query-helpers.ts +0 -78
- package/src/utils/resource-annotations.ts +0 -75
- package/src/utils/security-utils.ts +0 -198
- package/src/utils/vector-index-helpers.ts +0 -24
- package/src/vector/vector-search-manager.ts +0 -409
- package/src/version.ts +0 -15
- package/test-server/README.md +0 -193
- package/test-server/code-map.md +0 -399
- package/test-server/test-agent-experience.md +0 -213
- package/test-server/test-filter-instructions.mjs +0 -295
- package/test-server/test-instruction-levels.mjs +0 -102
- package/test-server/test-preflight.md +0 -55
- package/test-server/test-prompts.mjs +0 -185
- package/test-server/test-scheduler.mjs +0 -174
- package/test-server/test-tool-annotations.mjs +0 -115
- package/test-server/test-tools-codemode.md +0 -632
- package/test-server/test-tools-codemode2.md +0 -1218
- package/test-server/test-tools-team.md +0 -215
- package/test-server/test-tools.md +0 -429
- package/test-server/test-tools2.md +0 -361
- package/test-server/test-tools3.md +0 -396
- package/test-server/tool-reference.md +0 -231
- package/tests/README.md +0 -54
- package/tests/auth/auth-context.test.ts +0 -162
- package/tests/auth/authorization-server-discovery.test.ts +0 -265
- package/tests/auth/errors.test.ts +0 -170
- package/tests/auth/middleware.test.ts +0 -585
- package/tests/auth/oauth-resource-server.test.ts +0 -173
- package/tests/auth/scope-map.test.ts +0 -66
- package/tests/auth/scopes.test.ts +0 -347
- package/tests/auth/token-validator.test.ts +0 -271
- package/tests/codemode/api.test.ts +0 -396
- package/tests/codemode/auto-return.test.ts +0 -167
- package/tests/codemode/codemode-tool-handlers.test.ts +0 -197
- package/tests/codemode/sandbox-factory.test.ts +0 -152
- package/tests/codemode/sandbox.test.ts +0 -190
- package/tests/codemode/security.test.ts +0 -242
- package/tests/codemode/worker-sandbox.test.ts +0 -106
- package/tests/constants/icons.test.ts +0 -101
- package/tests/constants/server-instructions.test.ts +0 -514
- package/tests/database/crud-workflow-branches.test.ts +0 -418
- package/tests/database/database-branches.test.ts +0 -132
- package/tests/database/entries-auth-branches.test.ts +0 -390
- package/tests/database/native-connection.test.ts +0 -249
- package/tests/database/shared-helpers.test.ts +0 -103
- package/tests/database/sqlite-adapter.bench.ts +0 -63
- package/tests/database/sqlite-adapter.test.ts +0 -690
- package/tests/database/tags.test.ts +0 -134
- package/tests/e2e/README.md +0 -39
- package/tests/e2e/auth.spec.ts +0 -106
- package/tests/e2e/codemode-abuse.spec.ts +0 -75
- package/tests/e2e/health.spec.ts +0 -63
- package/tests/e2e/helpers.ts +0 -139
- package/tests/e2e/oauth-discovery.spec.ts +0 -102
- package/tests/e2e/oauth-scopes.spec.ts +0 -222
- package/tests/e2e/payloads-admin.spec.ts +0 -76
- package/tests/e2e/payloads-analytics.spec.ts +0 -37
- package/tests/e2e/payloads-backup-restore.spec.ts +0 -102
- package/tests/e2e/payloads-backup.spec.ts +0 -44
- package/tests/e2e/payloads-codemode-api.spec.ts +0 -131
- package/tests/e2e/payloads-codemode-readonly.spec.ts +0 -116
- package/tests/e2e/payloads-codemode.spec.ts +0 -116
- package/tests/e2e/payloads-core.spec.ts +0 -82
- package/tests/e2e/payloads-error-contracts.spec.ts +0 -159
- package/tests/e2e/payloads-export.spec.ts +0 -46
- package/tests/e2e/payloads-github-degradation.spec.ts +0 -73
- package/tests/e2e/payloads-github.spec.ts +0 -176
- package/tests/e2e/payloads-relationships.spec.ts +0 -56
- package/tests/e2e/payloads-search.spec.ts +0 -64
- package/tests/e2e/payloads-team-happy.spec.ts +0 -231
- package/tests/e2e/payloads-team.spec.ts +0 -174
- package/tests/e2e/prompts-expanded.spec.ts +0 -137
- package/tests/e2e/prompts.spec.ts +0 -62
- package/tests/e2e/protocols.spec.ts +0 -134
- package/tests/e2e/rate-limiting.spec.ts +0 -291
- package/tests/e2e/resources-briefing-env.spec.ts +0 -106
- package/tests/e2e/resources-complete.spec.ts +0 -180
- package/tests/e2e/resources-expanded.spec.ts +0 -83
- package/tests/e2e/resources-instructions-levels.spec.ts +0 -145
- package/tests/e2e/resources-templates.spec.ts +0 -123
- package/tests/e2e/resources.spec.ts +0 -103
- package/tests/e2e/scheduler.spec.ts +0 -79
- package/tests/e2e/security.spec.ts +0 -112
- package/tests/e2e/session-advanced.spec.ts +0 -152
- package/tests/e2e/sessions.spec.ts +0 -95
- package/tests/e2e/stateless.spec.ts +0 -79
- package/tests/e2e/streaming.spec.ts +0 -176
- package/tests/e2e/tool-filtering-presets.spec.ts +0 -192
- package/tests/e2e/tool-filtering.spec.ts +0 -77
- package/tests/e2e/tools.spec.ts +0 -111
- package/tests/filtering/tool-filter.test.ts +0 -314
- package/tests/github/client-issues-errors.test.ts +0 -433
- package/tests/github/github-integration-branches.test.ts +0 -490
- package/tests/github/github-integration.test.ts +0 -1015
- package/tests/github/github-managers-branches.test.ts +0 -907
- package/tests/github/pull-requests.test.ts +0 -334
- package/tests/handlers/analytics-branches.test.ts +0 -222
- package/tests/handlers/backup-branches.test.ts +0 -270
- package/tests/handlers/briefing-context-section.test.ts +0 -388
- package/tests/handlers/briefing-github-section.test.ts +0 -392
- package/tests/handlers/briefing-user-message.test.ts +0 -405
- package/tests/handlers/codemode-tools.test.ts +0 -85
- package/tests/handlers/copilot-tools.test.ts +0 -126
- package/tests/handlers/error-path-coverage.test.ts +0 -324
- package/tests/handlers/export-tools.test.ts +0 -203
- package/tests/handlers/github-resource-handlers.test.ts +0 -929
- package/tests/handlers/github-tool-handlers.test.ts +0 -1452
- package/tests/handlers/handler-error-branches.test.ts +0 -346
- package/tests/handlers/help-resource.test.ts +0 -92
- package/tests/handlers/prompt-handler-coverage.test.ts +0 -108
- package/tests/handlers/prompt-handlers.test.ts +0 -131
- package/tests/handlers/resource-handler-coverage.test.ts +0 -281
- package/tests/handlers/resource-handlers.test.ts +0 -357
- package/tests/handlers/resource-prompt-branches.test.ts +0 -495
- package/tests/handlers/search-tool-handlers.test.ts +0 -379
- package/tests/handlers/targeted-gap-closure.test.ts +0 -387
- package/tests/handlers/team-admin.test.ts +0 -291
- package/tests/handlers/team-analytics.test.ts +0 -220
- package/tests/handlers/team-core.test.ts +0 -148
- package/tests/handlers/team-data.test.ts +0 -198
- package/tests/handlers/team-relationships.test.ts +0 -271
- package/tests/handlers/team-resource-handlers.test.ts +0 -161
- package/tests/handlers/team-search.test.ts +0 -134
- package/tests/handlers/team-tool-handlers.test.ts +0 -301
- package/tests/handlers/team-vector.test.ts +0 -213
- package/tests/handlers/template-github-branches.test.ts +0 -676
- package/tests/handlers/tool-annotations.test.ts +0 -90
- package/tests/handlers/tool-handler-coverage.test.ts +0 -514
- package/tests/handlers/tool-handlers.test.ts +0 -510
- package/tests/handlers/tool-output-schemas.test.ts +0 -116
- package/tests/handlers/vector-tool-handlers.test.ts +0 -238
- package/tests/security/sql-injection.test.ts +0 -284
- package/tests/server/mcp-server.bench.ts +0 -55
- package/tests/server/mcp-server.test.ts +0 -1326
- package/tests/server/scheduler.test.ts +0 -400
- package/tests/transports/http-legacy-sse.test.ts +0 -275
- package/tests/transports/http-security.test.ts +0 -322
- package/tests/transports/http-stateful.test.ts +0 -487
- package/tests/transports/http-transport-server.test.ts +0 -301
- package/tests/transports/http-transport.test.ts +0 -771
- package/tests/utils/github-helpers.test.ts +0 -58
- package/tests/utils/logger.test.ts +0 -180
- package/tests/utils/mcp-logger.test.ts +0 -211
- package/tests/utils/progress-utils.test.ts +0 -156
- package/tests/utils/query-helpers.test.ts +0 -80
- package/tests/utils/security-utils.test.ts +0 -82
- package/tests/vector/vector-search-branches.test.ts +0 -111
- package/tests/vector/vector-search-manager.test.ts +0 -375
- package/tests/vector/vector-search.bench.ts +0 -48
- package/tsconfig.json +0 -42
- package/tsup.config.ts +0 -19
- package/vitest.config.ts +0 -25
package/src/codemode/types.ts
DELETED
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* memory-journal-mcp - Code Mode Types
|
|
3
|
-
*
|
|
4
|
-
* Type definitions for the sandboxed code execution environment.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { ToolGroup } from '../types/index.js'
|
|
8
|
-
|
|
9
|
-
// =============================================================================
|
|
10
|
-
// Sandbox Configuration
|
|
11
|
-
// =============================================================================
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Options for sandbox execution
|
|
15
|
-
*/
|
|
16
|
-
export interface SandboxOptions {
|
|
17
|
-
/** Memory limit in MB (default: 128) */
|
|
18
|
-
memoryLimitMb?: number
|
|
19
|
-
/** Execution timeout in milliseconds (default: 30000) */
|
|
20
|
-
timeoutMs?: number
|
|
21
|
-
/** CPU time limit in milliseconds (default: 10000) */
|
|
22
|
-
cpuLimitMs?: number
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Options for the sandbox pool
|
|
27
|
-
*/
|
|
28
|
-
export interface PoolOptions {
|
|
29
|
-
/** Minimum instances to keep warm (default: 2) */
|
|
30
|
-
minInstances?: number
|
|
31
|
-
/** Maximum instances in pool (default: 10) */
|
|
32
|
-
maxInstances?: number
|
|
33
|
-
/** Idle timeout before disposing instance (default: 60000ms) */
|
|
34
|
-
idleTimeoutMs?: number
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Default sandbox configuration
|
|
39
|
-
*/
|
|
40
|
-
export const DEFAULT_SANDBOX_OPTIONS: Required<SandboxOptions> = {
|
|
41
|
-
memoryLimitMb: 128,
|
|
42
|
-
timeoutMs: 30000,
|
|
43
|
-
cpuLimitMs: 10000,
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Default pool configuration
|
|
48
|
-
*/
|
|
49
|
-
export const DEFAULT_POOL_OPTIONS: Required<PoolOptions> = {
|
|
50
|
-
minInstances: 2,
|
|
51
|
-
maxInstances: 10,
|
|
52
|
-
idleTimeoutMs: 60000,
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// =============================================================================
|
|
56
|
-
// Execution Results
|
|
57
|
-
// =============================================================================
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Metrics collected during sandbox execution
|
|
61
|
-
*/
|
|
62
|
-
export interface ExecutionMetrics {
|
|
63
|
-
/** Wall clock time in milliseconds */
|
|
64
|
-
wallTimeMs: number
|
|
65
|
-
/** CPU time consumed in milliseconds */
|
|
66
|
-
cpuTimeMs: number
|
|
67
|
-
/** Peak memory usage in MB */
|
|
68
|
-
memoryUsedMb: number
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Result of sandbox code execution
|
|
73
|
-
*/
|
|
74
|
-
export interface SandboxResult {
|
|
75
|
-
/** Whether execution completed successfully */
|
|
76
|
-
success: boolean
|
|
77
|
-
/** Return value from the code (if successful) */
|
|
78
|
-
result?: unknown
|
|
79
|
-
/** Error message (if failed) */
|
|
80
|
-
error?: string | undefined
|
|
81
|
-
/** Stack trace (if failed) */
|
|
82
|
-
stack?: string | undefined
|
|
83
|
-
/** Execution metrics */
|
|
84
|
-
metrics: ExecutionMetrics
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// =============================================================================
|
|
88
|
-
// Security Configuration
|
|
89
|
-
// =============================================================================
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Security configuration for code validation
|
|
93
|
-
*/
|
|
94
|
-
export interface SecurityConfig {
|
|
95
|
-
/** Maximum code length in bytes (default: 50KB) */
|
|
96
|
-
maxCodeLength: number
|
|
97
|
-
/** Maximum executions per minute per client (default: 60) */
|
|
98
|
-
maxExecutionsPerMinute: number
|
|
99
|
-
/** Maximum result size in bytes (default: 10MB) */
|
|
100
|
-
maxResultSize: number
|
|
101
|
-
/** Patterns to block in code */
|
|
102
|
-
blockedPatterns: RegExp[]
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Default security configuration
|
|
107
|
-
*/
|
|
108
|
-
export const DEFAULT_SECURITY_CONFIG: SecurityConfig = {
|
|
109
|
-
maxCodeLength: 50 * 1024, // 50KB
|
|
110
|
-
maxExecutionsPerMinute: 60,
|
|
111
|
-
maxResultSize: 10 * 1024 * 1024, // 10MB
|
|
112
|
-
blockedPatterns: [
|
|
113
|
-
/\brequire\s*\(/, // No require()
|
|
114
|
-
/\bimport\s*\(/, // No dynamic import()
|
|
115
|
-
/\bprocess\./, // No process access
|
|
116
|
-
/\bglobal\./, // No global access
|
|
117
|
-
/\bglobalThis\./, // No globalThis access
|
|
118
|
-
/\beval\s*\(/, // No eval()
|
|
119
|
-
/\bFunction\s*\(/, // No Function constructor
|
|
120
|
-
/\b__proto__\b/, // No prototype pollution
|
|
121
|
-
/\bconstructor\.constructor/, // No constructor chaining
|
|
122
|
-
/\[['"]constructor['"]\]/i, // No bracket-notation constructor access
|
|
123
|
-
/\bReflect\s*\.\s*construct/i, // No Reflect.construct bypass
|
|
124
|
-
/\bchild_process/, // No child processes
|
|
125
|
-
/\bfs\./, // No filesystem
|
|
126
|
-
/\bnet\./, // No networking
|
|
127
|
-
/\bhttp\./, // No HTTP
|
|
128
|
-
/\bhttps\./, // No HTTPS
|
|
129
|
-
],
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Validation result from security checks
|
|
134
|
-
*/
|
|
135
|
-
export interface ValidationResult {
|
|
136
|
-
/** Whether the code passed validation */
|
|
137
|
-
valid: boolean
|
|
138
|
-
/** Validation errors (if any) */
|
|
139
|
-
errors: string[]
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Execution record for audit logging
|
|
144
|
-
*/
|
|
145
|
-
export interface ExecutionRecord {
|
|
146
|
-
/** Unique execution ID */
|
|
147
|
-
id: string
|
|
148
|
-
/** Client identifier (for rate limiting) */
|
|
149
|
-
clientId?: string | undefined
|
|
150
|
-
/** Timestamp of execution start */
|
|
151
|
-
timestamp: Date
|
|
152
|
-
/** Code that was executed (truncated for logging) */
|
|
153
|
-
codePreview: string
|
|
154
|
-
/** Execution result */
|
|
155
|
-
result: SandboxResult
|
|
156
|
-
/** Whether code was in readonly mode */
|
|
157
|
-
readonly: boolean
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// =============================================================================
|
|
161
|
-
// API Types
|
|
162
|
-
// =============================================================================
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Tool group API interface — each group exposes its tools as methods
|
|
166
|
-
*/
|
|
167
|
-
export interface GroupApi {
|
|
168
|
-
/** Tool group name */
|
|
169
|
-
readonly groupName: ToolGroup
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Options passed to mj_execute_code tool
|
|
174
|
-
*/
|
|
175
|
-
export interface ExecuteCodeOptions {
|
|
176
|
-
/** JavaScript code to execute */
|
|
177
|
-
code: string
|
|
178
|
-
/** Timeout in milliseconds (max 30000) */
|
|
179
|
-
timeout?: number
|
|
180
|
-
/** Restrict to read-only operations */
|
|
181
|
-
readonly?: boolean
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Result returned by mj_execute_code tool
|
|
186
|
-
*/
|
|
187
|
-
export interface ExecuteCodeResult {
|
|
188
|
-
/** Whether execution succeeded */
|
|
189
|
-
success: boolean
|
|
190
|
-
/** Return value from the code */
|
|
191
|
-
result?: unknown
|
|
192
|
-
/** Error message (if failed) */
|
|
193
|
-
error?: string
|
|
194
|
-
/** Execution metrics */
|
|
195
|
-
metrics: ExecutionMetrics
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// =============================================================================
|
|
199
|
-
// Worker RPC Types
|
|
200
|
-
// =============================================================================
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* RPC request from worker thread to main thread.
|
|
204
|
-
* Sent over the MessagePort to invoke API methods on the main thread.
|
|
205
|
-
*/
|
|
206
|
-
export interface RpcRequest {
|
|
207
|
-
/** Unique request ID for correlating responses */
|
|
208
|
-
id: number
|
|
209
|
-
/** API group name (e.g., "core", "search") */
|
|
210
|
-
group: string
|
|
211
|
-
/** Method name within the group (e.g., "createEntry") */
|
|
212
|
-
method: string
|
|
213
|
-
/** Arguments to pass to the method */
|
|
214
|
-
args: unknown[]
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* RPC response from main thread to worker thread.
|
|
219
|
-
* Sent back over the MessagePort with the result or error.
|
|
220
|
-
*/
|
|
221
|
-
export interface RpcResponse {
|
|
222
|
-
/** Matching request ID */
|
|
223
|
-
id: number
|
|
224
|
-
/** Return value from the method (if successful) */
|
|
225
|
-
result?: unknown
|
|
226
|
-
/** Error message (if failed) */
|
|
227
|
-
error?: string
|
|
228
|
-
}
|
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* memory-journal-mcp - Worker Sandbox (worker_threads)
|
|
3
|
-
*
|
|
4
|
-
* Production-grade sandboxed execution using `node:worker_threads`.
|
|
5
|
-
* Provides true V8 isolate boundary with resource limits,
|
|
6
|
-
* hard timeouts, and MessagePort RPC bridge.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { Worker, MessageChannel, type ResourceLimits } from 'node:worker_threads'
|
|
10
|
-
import * as crypto from 'node:crypto'
|
|
11
|
-
import { fileURLToPath } from 'node:url'
|
|
12
|
-
import * as path from 'node:path'
|
|
13
|
-
import {
|
|
14
|
-
DEFAULT_SANDBOX_OPTIONS,
|
|
15
|
-
DEFAULT_POOL_OPTIONS,
|
|
16
|
-
type SandboxOptions,
|
|
17
|
-
type PoolOptions,
|
|
18
|
-
type SandboxResult,
|
|
19
|
-
type RpcRequest,
|
|
20
|
-
type RpcResponse,
|
|
21
|
-
} from './types.js'
|
|
22
|
-
|
|
23
|
-
// =============================================================================
|
|
24
|
-
// Worker Script Path Resolution
|
|
25
|
-
// =============================================================================
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Resolve the worker script path relative to this module.
|
|
29
|
-
* The worker-script.ts compiles to worker-script.js in the dist/ directory.
|
|
30
|
-
*/
|
|
31
|
-
function getWorkerScriptPath(): string {
|
|
32
|
-
const currentDir = path.dirname(fileURLToPath(import.meta.url))
|
|
33
|
-
return path.join(currentDir, 'worker-script.js')
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// =============================================================================
|
|
37
|
-
// Worker Sandbox
|
|
38
|
-
// =============================================================================
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Worker-thread sandbox for secure code execution.
|
|
42
|
-
* Each execution spawns a fresh worker for clean state.
|
|
43
|
-
*/
|
|
44
|
-
export class WorkerSandbox {
|
|
45
|
-
private readonly options: Required<SandboxOptions>
|
|
46
|
-
|
|
47
|
-
constructor(options?: SandboxOptions) {
|
|
48
|
-
this.options = { ...DEFAULT_SANDBOX_OPTIONS, ...options }
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Execute code in a worker thread with RPC bridge.
|
|
53
|
-
*
|
|
54
|
-
* @param code - JavaScript code to execute
|
|
55
|
-
* @param apiBindings - Map of group → method record for RPC dispatch
|
|
56
|
-
*/
|
|
57
|
-
async execute(
|
|
58
|
-
code: string,
|
|
59
|
-
apiBindings: Record<string, unknown>,
|
|
60
|
-
timeoutMs?: number
|
|
61
|
-
): Promise<SandboxResult> {
|
|
62
|
-
const effectiveTimeout = timeoutMs ?? this.options.timeoutMs
|
|
63
|
-
const startTime = performance.now()
|
|
64
|
-
const startRss = process.memoryUsage.rss()
|
|
65
|
-
|
|
66
|
-
return new Promise<SandboxResult>((resolve) => {
|
|
67
|
-
// Serialize bindings: group objects → method name arrays,
|
|
68
|
-
// top-level functions → collected under '_topLevel'
|
|
69
|
-
const methodList: Record<string, string[]> = {}
|
|
70
|
-
const topLevel: string[] = []
|
|
71
|
-
|
|
72
|
-
for (const [key, value] of Object.entries(apiBindings)) {
|
|
73
|
-
if (typeof value === 'function') {
|
|
74
|
-
topLevel.push(key)
|
|
75
|
-
} else if (typeof value === 'object' && value !== null) {
|
|
76
|
-
const methods: string[] = []
|
|
77
|
-
for (const [methodName, methodValue] of Object.entries(
|
|
78
|
-
value as Record<string, unknown>
|
|
79
|
-
)) {
|
|
80
|
-
if (typeof methodValue === 'function') {
|
|
81
|
-
methods.push(methodName)
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
if (methods.length > 0) {
|
|
85
|
-
methodList[key] = methods
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (topLevel.length > 0) {
|
|
91
|
-
methodList['_topLevel'] = topLevel
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Create MessageChannel for RPC
|
|
95
|
-
const { port1: hostPort, port2: workerPort } = new MessageChannel()
|
|
96
|
-
|
|
97
|
-
// Resource limits
|
|
98
|
-
const resourceLimits: ResourceLimits = {
|
|
99
|
-
maxOldGenerationSizeMb: this.options.memoryLimitMb,
|
|
100
|
-
maxYoungGenerationSizeMb: Math.max(8, Math.floor(this.options.memoryLimitMb / 8)),
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const worker = new Worker(getWorkerScriptPath(), {
|
|
104
|
-
workerData: {
|
|
105
|
-
code,
|
|
106
|
-
methodList,
|
|
107
|
-
timeoutMs: effectiveTimeout,
|
|
108
|
-
rpcPort: workerPort,
|
|
109
|
-
},
|
|
110
|
-
transferList: [workerPort],
|
|
111
|
-
resourceLimits,
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
// Hard timeout — terminate worker if it runs too long
|
|
115
|
-
const timeoutHandle = setTimeout(() => {
|
|
116
|
-
worker.terminate().catch(() => {
|
|
117
|
-
// Worker already dead
|
|
118
|
-
})
|
|
119
|
-
}, effectiveTimeout + 1000) // +1s grace for cleanup
|
|
120
|
-
|
|
121
|
-
// Handle RPC requests from the worker (via MessageChannel)
|
|
122
|
-
hostPort.on('message', (msg: RpcRequest) => {
|
|
123
|
-
void handleRpcRequest(msg, apiBindings, hostPort)
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
// Handle worker completion (results sent via parentPort)
|
|
127
|
-
worker.on('message', (msg: SandboxResult) => {
|
|
128
|
-
clearTimeout(timeoutHandle)
|
|
129
|
-
hostPort.close()
|
|
130
|
-
|
|
131
|
-
const endTime = performance.now()
|
|
132
|
-
const endRss = process.memoryUsage.rss()
|
|
133
|
-
const result = msg
|
|
134
|
-
result.metrics = {
|
|
135
|
-
wallTimeMs: Math.round(endTime - startTime),
|
|
136
|
-
cpuTimeMs: result.metrics.cpuTimeMs,
|
|
137
|
-
memoryUsedMb: Math.round((endRss - startRss) / 1024 / 1024),
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
resolve(result)
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
// Handle worker errors and exit
|
|
144
|
-
worker.on('error', (err: Error) => {
|
|
145
|
-
clearTimeout(timeoutHandle)
|
|
146
|
-
hostPort.close()
|
|
147
|
-
|
|
148
|
-
const endTime = performance.now()
|
|
149
|
-
const endRss = process.memoryUsage.rss()
|
|
150
|
-
const errorMessage: string = err.message
|
|
151
|
-
const errorStack: string | undefined = err.stack
|
|
152
|
-
resolve({
|
|
153
|
-
success: false,
|
|
154
|
-
error: errorMessage,
|
|
155
|
-
stack: errorStack,
|
|
156
|
-
metrics: {
|
|
157
|
-
wallTimeMs: Math.round(endTime - startTime),
|
|
158
|
-
cpuTimeMs: 0,
|
|
159
|
-
memoryUsedMb: Math.round((endRss - startRss) / 1024 / 1024),
|
|
160
|
-
},
|
|
161
|
-
})
|
|
162
|
-
})
|
|
163
|
-
|
|
164
|
-
worker.on('exit', (exitCode) => {
|
|
165
|
-
clearTimeout(timeoutHandle)
|
|
166
|
-
hostPort.close()
|
|
167
|
-
|
|
168
|
-
if (exitCode !== 0) {
|
|
169
|
-
const endTime = performance.now()
|
|
170
|
-
const endRss = process.memoryUsage.rss()
|
|
171
|
-
resolve({
|
|
172
|
-
success: false,
|
|
173
|
-
error: `Worker exited with code ${String(exitCode)} (likely timeout or OOM)`,
|
|
174
|
-
metrics: {
|
|
175
|
-
wallTimeMs: Math.round(endTime - startTime),
|
|
176
|
-
cpuTimeMs: 0,
|
|
177
|
-
memoryUsedMb: Math.round((endRss - startRss) / 1024 / 1024),
|
|
178
|
-
},
|
|
179
|
-
})
|
|
180
|
-
}
|
|
181
|
-
})
|
|
182
|
-
})
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// =============================================================================
|
|
187
|
-
// RPC Handler (Main Thread)
|
|
188
|
-
// =============================================================================
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Handle an RPC request from the worker thread.
|
|
192
|
-
* Looks up the method in apiBindings and sends the response back.
|
|
193
|
-
*/
|
|
194
|
-
async function handleRpcRequest(
|
|
195
|
-
req: RpcRequest,
|
|
196
|
-
apiBindings: Record<string, unknown>,
|
|
197
|
-
hostPort: MessagePort
|
|
198
|
-
): Promise<void> {
|
|
199
|
-
const response: RpcResponse = { id: req.id }
|
|
200
|
-
|
|
201
|
-
try {
|
|
202
|
-
// _topLevel methods are direct keys on apiBindings
|
|
203
|
-
let target: unknown
|
|
204
|
-
if (req.group === '_topLevel') {
|
|
205
|
-
target = apiBindings[req.method]
|
|
206
|
-
} else {
|
|
207
|
-
const groupApi = apiBindings[req.group]
|
|
208
|
-
if (groupApi !== undefined && groupApi !== null && typeof groupApi === 'object') {
|
|
209
|
-
target = (groupApi as Record<string, unknown>)[req.method]
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if (typeof target === 'function') {
|
|
214
|
-
response.result = await (target as (...args: unknown[]) => Promise<unknown>)(
|
|
215
|
-
...req.args
|
|
216
|
-
)
|
|
217
|
-
} else {
|
|
218
|
-
response.error = `Unknown method: ${req.group}.${req.method}`
|
|
219
|
-
}
|
|
220
|
-
} catch (err) {
|
|
221
|
-
response.error = err instanceof Error ? err.message : String(err)
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
hostPort.postMessage(response)
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// =============================================================================
|
|
228
|
-
// Worker Sandbox Pool
|
|
229
|
-
// =============================================================================
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Pool of worker-thread sandboxes for concurrent execution.
|
|
233
|
-
* Creates a fresh worker for every execution to guarantee clean state.
|
|
234
|
-
*/
|
|
235
|
-
export class WorkerSandboxPool {
|
|
236
|
-
private readonly options: Required<PoolOptions>
|
|
237
|
-
private readonly sandboxOptions: SandboxOptions
|
|
238
|
-
private activeCount = 0
|
|
239
|
-
|
|
240
|
-
constructor(sandboxOptions?: SandboxOptions, poolOptions?: PoolOptions) {
|
|
241
|
-
this.sandboxOptions = sandboxOptions ?? {}
|
|
242
|
-
this.options = { ...DEFAULT_POOL_OPTIONS, ...poolOptions }
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Execute code in a pooled worker sandbox.
|
|
247
|
-
*/
|
|
248
|
-
async execute(
|
|
249
|
-
code: string,
|
|
250
|
-
apiBindings: Record<string, unknown>,
|
|
251
|
-
timeoutMs?: number
|
|
252
|
-
): Promise<SandboxResult> {
|
|
253
|
-
if (this.activeCount >= this.options.maxInstances) {
|
|
254
|
-
return {
|
|
255
|
-
success: false,
|
|
256
|
-
error: `Sandbox pool exhausted (max ${String(this.options.maxInstances)} concurrent executions)`,
|
|
257
|
-
metrics: { wallTimeMs: 0, cpuTimeMs: 0, memoryUsedMb: 0 },
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
this.activeCount++
|
|
262
|
-
try {
|
|
263
|
-
const sandbox = new WorkerSandbox(this.sandboxOptions)
|
|
264
|
-
return await sandbox.execute(code, apiBindings, timeoutMs)
|
|
265
|
-
} finally {
|
|
266
|
-
this.activeCount--
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/** Get the current active execution count */
|
|
271
|
-
getActiveCount(): number {
|
|
272
|
-
return this.activeCount
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/** Unique pool identifier */
|
|
276
|
-
readonly poolId = crypto.randomUUID()
|
|
277
|
-
}
|