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
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* memory-journal-mcp - Sandbox Factory
|
|
3
|
-
*
|
|
4
|
-
* Mode selection factory for choosing between VM and Worker sandboxes.
|
|
5
|
-
* Allows runtime configuration of the sandbox mode.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { CodeModeSandbox, SandboxPool } from './sandbox.js'
|
|
9
|
-
import { WorkerSandbox, WorkerSandboxPool } from './worker-sandbox.js'
|
|
10
|
-
import type { SandboxOptions, PoolOptions, SandboxResult } from './types.js'
|
|
11
|
-
import { ConfigurationError } from '../types/errors.js'
|
|
12
|
-
|
|
13
|
-
// =============================================================================
|
|
14
|
-
// Types
|
|
15
|
-
// =============================================================================
|
|
16
|
-
|
|
17
|
-
/** Available sandbox modes */
|
|
18
|
-
export type SandboxMode = 'vm' | 'worker'
|
|
19
|
-
|
|
20
|
-
/** Common sandbox interface */
|
|
21
|
-
export interface ISandbox {
|
|
22
|
-
execute(
|
|
23
|
-
code: string,
|
|
24
|
-
bindings: Record<string, unknown>,
|
|
25
|
-
timeoutMs?: number
|
|
26
|
-
): Promise<SandboxResult>
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Common pool interface */
|
|
30
|
-
export interface ISandboxPool {
|
|
31
|
-
execute(
|
|
32
|
-
code: string,
|
|
33
|
-
bindings: Record<string, unknown>,
|
|
34
|
-
timeoutMs?: number
|
|
35
|
-
): Promise<SandboxResult>
|
|
36
|
-
getActiveCount(): number
|
|
37
|
-
readonly poolId: string
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** Information about a sandbox mode */
|
|
41
|
-
export interface SandboxModeInfo {
|
|
42
|
-
mode: SandboxMode
|
|
43
|
-
description: string
|
|
44
|
-
securityLevel: 'basic' | 'production'
|
|
45
|
-
isolation: string
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// =============================================================================
|
|
49
|
-
// Default Mode
|
|
50
|
-
// =============================================================================
|
|
51
|
-
|
|
52
|
-
let defaultMode: SandboxMode = 'worker'
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Set the default sandbox mode for new sandbox instances.
|
|
56
|
-
*/
|
|
57
|
-
export function setDefaultSandboxMode(mode: SandboxMode): void {
|
|
58
|
-
defaultMode = mode
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Get the current default sandbox mode.
|
|
63
|
-
*/
|
|
64
|
-
export function getDefaultSandboxMode(): SandboxMode {
|
|
65
|
-
return defaultMode
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Get all available sandbox modes.
|
|
70
|
-
*/
|
|
71
|
-
export function getAvailableSandboxModes(): SandboxMode[] {
|
|
72
|
-
return ['vm', 'worker']
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// =============================================================================
|
|
76
|
-
// Factory Functions
|
|
77
|
-
// =============================================================================
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Create a sandbox instance for the specified mode.
|
|
81
|
-
*/
|
|
82
|
-
export function createSandbox(mode?: SandboxMode, options?: SandboxOptions): ISandbox {
|
|
83
|
-
const resolvedMode = mode ?? defaultMode
|
|
84
|
-
|
|
85
|
-
switch (resolvedMode) {
|
|
86
|
-
case 'vm':
|
|
87
|
-
return new CodeModeSandbox(options)
|
|
88
|
-
case 'worker':
|
|
89
|
-
return new WorkerSandbox(options)
|
|
90
|
-
default:
|
|
91
|
-
throw new ConfigurationError(`Unknown sandbox mode: ${String(resolvedMode)}`)
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Create a sandbox pool for the specified mode.
|
|
97
|
-
*/
|
|
98
|
-
export function createSandboxPool(
|
|
99
|
-
mode?: SandboxMode,
|
|
100
|
-
sandboxOptions?: SandboxOptions,
|
|
101
|
-
poolOptions?: PoolOptions
|
|
102
|
-
): ISandboxPool {
|
|
103
|
-
const resolvedMode = mode ?? defaultMode
|
|
104
|
-
|
|
105
|
-
switch (resolvedMode) {
|
|
106
|
-
case 'vm':
|
|
107
|
-
return new SandboxPool(sandboxOptions, poolOptions)
|
|
108
|
-
case 'worker':
|
|
109
|
-
return new WorkerSandboxPool(sandboxOptions, poolOptions)
|
|
110
|
-
default:
|
|
111
|
-
throw new ConfigurationError(`Unknown sandbox mode: ${String(resolvedMode)}`)
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// =============================================================================
|
|
116
|
-
// Mode Info
|
|
117
|
-
// =============================================================================
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Get information about a sandbox mode.
|
|
121
|
-
*/
|
|
122
|
-
export function getSandboxModeInfo(mode?: SandboxMode): SandboxModeInfo {
|
|
123
|
-
const resolvedMode = mode ?? defaultMode
|
|
124
|
-
|
|
125
|
-
switch (resolvedMode) {
|
|
126
|
-
case 'vm':
|
|
127
|
-
return {
|
|
128
|
-
mode: 'vm',
|
|
129
|
-
description:
|
|
130
|
-
'VM-based sandbox using node:vm (lightweight, not a true security boundary)',
|
|
131
|
-
securityLevel: 'basic',
|
|
132
|
-
isolation: 'Script-level context isolation via vm.createContext',
|
|
133
|
-
}
|
|
134
|
-
case 'worker':
|
|
135
|
-
return {
|
|
136
|
-
mode: 'worker',
|
|
137
|
-
description: 'Worker-thread sandbox using node:worker_threads (true V8 isolate)',
|
|
138
|
-
securityLevel: 'production',
|
|
139
|
-
isolation: 'Process-level V8 isolate with resource limits and MessagePort RPC',
|
|
140
|
-
}
|
|
141
|
-
default:
|
|
142
|
-
throw new ConfigurationError(`Unknown sandbox mode: ${String(resolvedMode)}`)
|
|
143
|
-
}
|
|
144
|
-
}
|
package/src/codemode/sandbox.ts
DELETED
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* memory-journal-mcp - Code Mode Sandbox (VM-based)
|
|
3
|
-
*
|
|
4
|
-
* Provides script-level isolation using `node:vm`.
|
|
5
|
-
* This is the lightweight sandbox option — NOT a true security boundary.
|
|
6
|
-
* For production use, prefer WorkerSandbox (worker_threads).
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import * as vm from 'node:vm'
|
|
10
|
-
import {
|
|
11
|
-
DEFAULT_SANDBOX_OPTIONS,
|
|
12
|
-
DEFAULT_POOL_OPTIONS,
|
|
13
|
-
type SandboxOptions,
|
|
14
|
-
type PoolOptions,
|
|
15
|
-
type SandboxResult,
|
|
16
|
-
type ExecutionMetrics,
|
|
17
|
-
} from './types.js'
|
|
18
|
-
import { transformAutoReturn } from './auto-return.js'
|
|
19
|
-
|
|
20
|
-
// =============================================================================
|
|
21
|
-
// Compilation Cache (LRU)
|
|
22
|
-
// =============================================================================
|
|
23
|
-
|
|
24
|
-
const SCRIPT_CACHE_MAX = 50
|
|
25
|
-
|
|
26
|
-
class ScriptCache {
|
|
27
|
-
private readonly cache = new Map<string, vm.Script>()
|
|
28
|
-
|
|
29
|
-
get(code: string): vm.Script | undefined {
|
|
30
|
-
const script = this.cache.get(code)
|
|
31
|
-
if (script) {
|
|
32
|
-
// Move to end (most recently used)
|
|
33
|
-
this.cache.delete(code)
|
|
34
|
-
this.cache.set(code, script)
|
|
35
|
-
}
|
|
36
|
-
return script
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
set(code: string, script: vm.Script): void {
|
|
40
|
-
if (this.cache.size >= SCRIPT_CACHE_MAX) {
|
|
41
|
-
// Evict oldest entry
|
|
42
|
-
const firstKey = this.cache.keys().next().value
|
|
43
|
-
if (firstKey !== undefined) {
|
|
44
|
-
this.cache.delete(firstKey)
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
this.cache.set(code, script)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
clear(): void {
|
|
51
|
-
this.cache.clear()
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
get size(): number {
|
|
55
|
-
return this.cache.size
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// =============================================================================
|
|
60
|
-
// Sandbox (VM-based)
|
|
61
|
-
// =============================================================================
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* VM-based sandbox for executing user code in an isolated context.
|
|
65
|
-
* Uses `node:vm` with nulled dangerous globals.
|
|
66
|
-
*
|
|
67
|
-
* WARNING: `node:vm` is NOT a true security boundary.
|
|
68
|
-
* Use WorkerSandbox for production environments.
|
|
69
|
-
*/
|
|
70
|
-
export class CodeModeSandbox {
|
|
71
|
-
private readonly options: Required<SandboxOptions>
|
|
72
|
-
private readonly scriptCache = new ScriptCache()
|
|
73
|
-
|
|
74
|
-
constructor(options?: SandboxOptions) {
|
|
75
|
-
this.options = { ...DEFAULT_SANDBOX_OPTIONS, ...options }
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Execute code in a sandboxed VM context.
|
|
80
|
-
*/
|
|
81
|
-
async execute(
|
|
82
|
-
code: string,
|
|
83
|
-
bindings: Record<string, unknown>,
|
|
84
|
-
timeoutMs?: number
|
|
85
|
-
): Promise<SandboxResult> {
|
|
86
|
-
const effectiveTimeout = timeoutMs ?? this.options.timeoutMs
|
|
87
|
-
const startTime = performance.now()
|
|
88
|
-
const startRss = process.memoryUsage().rss
|
|
89
|
-
|
|
90
|
-
try {
|
|
91
|
-
// Build sandbox context with nulled dangerous globals
|
|
92
|
-
const sandbox: Record<string, unknown> = {
|
|
93
|
-
...bindings,
|
|
94
|
-
console: {
|
|
95
|
-
log: (...args: unknown[]) => args,
|
|
96
|
-
warn: (...args: unknown[]) => args,
|
|
97
|
-
error: (...args: unknown[]) => args,
|
|
98
|
-
},
|
|
99
|
-
// Nulled globals — prevent escape
|
|
100
|
-
process: undefined,
|
|
101
|
-
require: undefined,
|
|
102
|
-
global: undefined,
|
|
103
|
-
globalThis: undefined,
|
|
104
|
-
setTimeout: undefined,
|
|
105
|
-
setInterval: undefined,
|
|
106
|
-
setImmediate: undefined,
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const context = vm.createContext(sandbox, {
|
|
110
|
-
name: 'codemode-sandbox',
|
|
111
|
-
microtaskMode: 'afterEvaluate',
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
// Compile or retrieve from cache
|
|
115
|
-
let script = this.scriptCache.get(code)
|
|
116
|
-
if (!script) {
|
|
117
|
-
const wrappedCode = `(async () => { ${transformAutoReturn(code)} })()`
|
|
118
|
-
script = new vm.Script(wrappedCode, {
|
|
119
|
-
filename: 'codemode-execution.js',
|
|
120
|
-
})
|
|
121
|
-
this.scriptCache.set(code, script)
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Execute with timeout
|
|
125
|
-
const resultPromise = script.runInContext(context, {
|
|
126
|
-
timeout: effectiveTimeout,
|
|
127
|
-
}) as Promise<unknown>
|
|
128
|
-
|
|
129
|
-
const result = await resultPromise
|
|
130
|
-
|
|
131
|
-
const endTime = performance.now()
|
|
132
|
-
const endRss = process.memoryUsage().rss
|
|
133
|
-
const metrics: ExecutionMetrics = {
|
|
134
|
-
wallTimeMs: Math.round(endTime - startTime),
|
|
135
|
-
cpuTimeMs: Math.round(endTime - startTime),
|
|
136
|
-
memoryUsedMb: Math.round((endRss - startRss) / 1024 / 1024),
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return { success: true, result, metrics }
|
|
140
|
-
} catch (err) {
|
|
141
|
-
const endTime = performance.now()
|
|
142
|
-
const endRss = process.memoryUsage().rss
|
|
143
|
-
const metrics: ExecutionMetrics = {
|
|
144
|
-
wallTimeMs: Math.round(endTime - startTime),
|
|
145
|
-
cpuTimeMs: Math.round(endTime - startTime),
|
|
146
|
-
memoryUsedMb: Math.round((endRss - startRss) / 1024 / 1024),
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const error = err instanceof Error ? err : new Error(String(err))
|
|
150
|
-
return {
|
|
151
|
-
success: false,
|
|
152
|
-
error: error.message,
|
|
153
|
-
stack: error.stack,
|
|
154
|
-
metrics,
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/** Clear the compilation cache */
|
|
160
|
-
clearCache(): void {
|
|
161
|
-
this.scriptCache.clear()
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/** Get cache statistics */
|
|
165
|
-
getCacheSize(): number {
|
|
166
|
-
return this.scriptCache.size
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// =============================================================================
|
|
171
|
-
// Sandbox Pool (VM-based)
|
|
172
|
-
// =============================================================================
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* Pool of VM-based sandboxes for concurrent execution.
|
|
176
|
-
*/
|
|
177
|
-
export class SandboxPool {
|
|
178
|
-
private readonly options: Required<PoolOptions>
|
|
179
|
-
private readonly sandboxOptions: SandboxOptions
|
|
180
|
-
private activeCount = 0
|
|
181
|
-
|
|
182
|
-
constructor(sandboxOptions?: SandboxOptions, poolOptions?: PoolOptions) {
|
|
183
|
-
this.sandboxOptions = sandboxOptions ?? {}
|
|
184
|
-
this.options = { ...DEFAULT_POOL_OPTIONS, ...poolOptions }
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Execute code in a pooled sandbox.
|
|
189
|
-
* Creates a fresh sandbox per execution for clean state.
|
|
190
|
-
*/
|
|
191
|
-
async execute(
|
|
192
|
-
code: string,
|
|
193
|
-
bindings: Record<string, unknown>,
|
|
194
|
-
timeoutMs?: number
|
|
195
|
-
): Promise<SandboxResult> {
|
|
196
|
-
if (this.activeCount >= this.options.maxInstances) {
|
|
197
|
-
return {
|
|
198
|
-
success: false,
|
|
199
|
-
error: `Sandbox pool exhausted (max ${String(this.options.maxInstances)} concurrent executions)`,
|
|
200
|
-
metrics: { wallTimeMs: 0, cpuTimeMs: 0, memoryUsedMb: 0 },
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
this.activeCount++
|
|
205
|
-
try {
|
|
206
|
-
const sandbox = new CodeModeSandbox(this.sandboxOptions)
|
|
207
|
-
return await sandbox.execute(code, bindings, timeoutMs)
|
|
208
|
-
} finally {
|
|
209
|
-
this.activeCount--
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/** Get the current pool execution ID (for diagnostics) */
|
|
214
|
-
getActiveCount(): number {
|
|
215
|
-
return this.activeCount
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/** Unique pool identifier */
|
|
219
|
-
readonly poolId = crypto.randomUUID()
|
|
220
|
-
}
|
package/src/codemode/security.ts
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* memory-journal-mcp - Code Mode Security
|
|
3
|
-
*
|
|
4
|
-
* Security validation for sandboxed code execution.
|
|
5
|
-
* Enforces code length limits, blocked patterns, rate limiting,
|
|
6
|
-
* and result size caps.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { DEFAULT_SECURITY_CONFIG, type SecurityConfig, type ValidationResult } from './types.js'
|
|
10
|
-
|
|
11
|
-
// =============================================================================
|
|
12
|
-
// Rate Limiter
|
|
13
|
-
// =============================================================================
|
|
14
|
-
|
|
15
|
-
interface RateLimitEntry {
|
|
16
|
-
count: number
|
|
17
|
-
resetTime: number
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// =============================================================================
|
|
21
|
-
// Security Manager
|
|
22
|
-
// =============================================================================
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Validates user-submitted code against security policies before execution.
|
|
26
|
-
*/
|
|
27
|
-
export class CodeModeSecurityManager {
|
|
28
|
-
private readonly config: SecurityConfig
|
|
29
|
-
private readonly rateLimits = new Map<string, RateLimitEntry>()
|
|
30
|
-
|
|
31
|
-
constructor(config?: Partial<SecurityConfig>) {
|
|
32
|
-
this.config = { ...DEFAULT_SECURITY_CONFIG, ...config }
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// =========================================================================
|
|
36
|
-
// Code Validation
|
|
37
|
-
// =========================================================================
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Validate code against all security policies.
|
|
41
|
-
* Returns a ValidationResult with any violations found.
|
|
42
|
-
*/
|
|
43
|
-
validateCode(code: string): ValidationResult {
|
|
44
|
-
const errors: string[] = []
|
|
45
|
-
|
|
46
|
-
// Length check
|
|
47
|
-
if (Buffer.byteLength(code, 'utf-8') > this.config.maxCodeLength) {
|
|
48
|
-
errors.push(`Code exceeds maximum length of ${String(this.config.maxCodeLength)} bytes`)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Empty code check
|
|
52
|
-
if (code.trim().length === 0) {
|
|
53
|
-
errors.push('Code cannot be empty')
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Blocked pattern scan
|
|
57
|
-
for (const pattern of this.config.blockedPatterns) {
|
|
58
|
-
if (pattern.test(code)) {
|
|
59
|
-
errors.push(`Code contains blocked pattern: ${pattern.source}`)
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return {
|
|
64
|
-
valid: errors.length === 0,
|
|
65
|
-
errors,
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// =========================================================================
|
|
70
|
-
// Rate Limiting
|
|
71
|
-
// =========================================================================
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Check if a client has exceeded the rate limit.
|
|
75
|
-
* Returns true if the execution is allowed.
|
|
76
|
-
*/
|
|
77
|
-
checkRateLimit(clientId: string): boolean {
|
|
78
|
-
const now = Date.now()
|
|
79
|
-
const windowMs = 60_000 // 1 minute window
|
|
80
|
-
const entry = this.rateLimits.get(clientId)
|
|
81
|
-
|
|
82
|
-
if (!entry || now > entry.resetTime) {
|
|
83
|
-
this.rateLimits.set(clientId, {
|
|
84
|
-
count: 1,
|
|
85
|
-
resetTime: now + windowMs,
|
|
86
|
-
})
|
|
87
|
-
return true
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (entry.count >= this.config.maxExecutionsPerMinute) {
|
|
91
|
-
return false
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
entry.count++
|
|
95
|
-
return true
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Clean up expired rate limit entries.
|
|
100
|
-
* Should be called periodically to prevent memory leaks.
|
|
101
|
-
*/
|
|
102
|
-
cleanupRateLimits(): void {
|
|
103
|
-
const now = Date.now()
|
|
104
|
-
for (const [clientId, entry] of this.rateLimits) {
|
|
105
|
-
if (now > entry.resetTime) {
|
|
106
|
-
this.rateLimits.delete(clientId)
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// =========================================================================
|
|
112
|
-
// Result Validation
|
|
113
|
-
// =========================================================================
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Validate that a result does not exceed size limits.
|
|
117
|
-
*/
|
|
118
|
-
validateResultSize(result: unknown): ValidationResult {
|
|
119
|
-
const errors: string[] = []
|
|
120
|
-
try {
|
|
121
|
-
// Stringify and measure length iteratively or just check the resulting buffer bounds safely.
|
|
122
|
-
// In Node, creating a huge string can trigger V8 allocation limits (max ~1GB).
|
|
123
|
-
// A safer bounds check limits string allocation immediately.
|
|
124
|
-
const serialized = JSON.stringify(result)
|
|
125
|
-
|
|
126
|
-
// If stringification succeeded but the string itself is larger than the limit
|
|
127
|
-
if (Buffer.byteLength(serialized, 'utf-8') > this.config.maxResultSize) {
|
|
128
|
-
errors.push(
|
|
129
|
-
`Result exceeds maximum size of ${String(this.config.maxResultSize)} bytes`
|
|
130
|
-
)
|
|
131
|
-
}
|
|
132
|
-
} catch (error) {
|
|
133
|
-
if (error instanceof RangeError || String(error).includes('Invalid string length')) {
|
|
134
|
-
errors.push(
|
|
135
|
-
`Result exceeds V8 string length allocation limits (> ~${String(this.config.maxResultSize)} bytes)`
|
|
136
|
-
)
|
|
137
|
-
} else {
|
|
138
|
-
errors.push('Result could not be serialized to JSON')
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return {
|
|
142
|
-
valid: errors.length === 0,
|
|
143
|
-
errors,
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// =========================================================================
|
|
148
|
-
// Accessors
|
|
149
|
-
// =========================================================================
|
|
150
|
-
|
|
151
|
-
/** Get the current security configuration */
|
|
152
|
-
getConfig(): Readonly<SecurityConfig> {
|
|
153
|
-
return this.config
|
|
154
|
-
}
|
|
155
|
-
}
|