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,167 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Code Mode auto-return transform
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { describe, it, expect } from 'vitest'
|
|
6
|
-
import { transformAutoReturn } from '../../src/codemode/auto-return.js'
|
|
7
|
-
|
|
8
|
-
describe('transformAutoReturn', () => {
|
|
9
|
-
describe('single expressions', () => {
|
|
10
|
-
it('should prepend return to a bare function call', () => {
|
|
11
|
-
expect(transformAutoReturn('mj.help()')).toBe('return mj.help()')
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
it('should prepend return to an await expression', () => {
|
|
15
|
-
expect(transformAutoReturn('await mj.core.recent()')).toBe(
|
|
16
|
-
'return await mj.core.recent()'
|
|
17
|
-
)
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
it('should prepend return to a variable reference', () => {
|
|
21
|
-
expect(transformAutoReturn('result')).toBe('return result')
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
it('should prepend return to a numeric literal', () => {
|
|
25
|
-
expect(transformAutoReturn('42')).toBe('return 42')
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
it('should prepend return to a string literal', () => {
|
|
29
|
-
expect(transformAutoReturn('"hello"')).toBe('return "hello"')
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
it('should prepend return to a method chain', () => {
|
|
33
|
-
expect(transformAutoReturn('mj.search.searchEntries({ query: "test" })')).toBe(
|
|
34
|
-
'return mj.search.searchEntries({ query: "test" })'
|
|
35
|
-
)
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
describe('multi-statement code', () => {
|
|
40
|
-
it('should only prepend return to the last statement (semicolon-separated)', () => {
|
|
41
|
-
const code = 'const r = await mj.core.recent(); r'
|
|
42
|
-
const result = transformAutoReturn(code)
|
|
43
|
-
expect(result).toBe('const r = await mj.core.recent();\nreturn r')
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('should only prepend return to the last statement (newline-separated)', () => {
|
|
47
|
-
const code = 'const r = await mj.core.recent()\nr'
|
|
48
|
-
const result = transformAutoReturn(code)
|
|
49
|
-
// Split preserves the newline separator, plus adds \n before return
|
|
50
|
-
expect(result).toBe('const r = await mj.core.recent()\n\nreturn r')
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('should handle multi-line workflow ending with expression', () => {
|
|
54
|
-
const code = [
|
|
55
|
-
'const search = await mj.search.searchEntries({ query: "test" })',
|
|
56
|
-
'const stats = await mj.analytics.getStatistics()',
|
|
57
|
-
'{ search, stats }',
|
|
58
|
-
].join('\n')
|
|
59
|
-
const result = transformAutoReturn(code)
|
|
60
|
-
// `{ search, stats }` starts with `{` — ambiguous (block vs object literal)
|
|
61
|
-
// so the heuristic correctly leaves it unreturned (safe default).
|
|
62
|
-
// Users should use `return { search, stats }` explicitly for object literals.
|
|
63
|
-
expect(result).toBe(code)
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
it('should return last expression when not ambiguous with a block', () => {
|
|
67
|
-
const code = [
|
|
68
|
-
'const search = await mj.search.searchEntries({ query: "test" })',
|
|
69
|
-
'const stats = await mj.analytics.getStatistics()',
|
|
70
|
-
'search.entries.length',
|
|
71
|
-
].join('\n')
|
|
72
|
-
const result = transformAutoReturn(code)
|
|
73
|
-
expect(result).toContain('return search.entries.length')
|
|
74
|
-
expect(result).toContain('const search = await mj.search.searchEntries')
|
|
75
|
-
})
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
describe('statements that must NOT be returned', () => {
|
|
79
|
-
it('should not modify explicit return', () => {
|
|
80
|
-
expect(transformAutoReturn('return 42')).toBe('return 42')
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
it('should not modify throw', () => {
|
|
84
|
-
expect(transformAutoReturn('throw new Error("fail")')).toBe('throw new Error("fail")')
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
it('should not modify const declaration', () => {
|
|
88
|
-
expect(transformAutoReturn('const x = 42')).toBe('const x = 42')
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
it('should not modify let declaration', () => {
|
|
92
|
-
expect(transformAutoReturn('let x = 42')).toBe('let x = 42')
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
it('should not modify var declaration', () => {
|
|
96
|
-
expect(transformAutoReturn('var x = 42')).toBe('var x = 42')
|
|
97
|
-
})
|
|
98
|
-
|
|
99
|
-
it('should not modify if statement', () => {
|
|
100
|
-
expect(transformAutoReturn('if (true) { foo() }')).toBe('if (true) { foo() }')
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
it('should not modify for loop', () => {
|
|
104
|
-
expect(transformAutoReturn('for (const x of xs) { foo(x) }')).toBe(
|
|
105
|
-
'for (const x of xs) { foo(x) }'
|
|
106
|
-
)
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
it('should not modify while loop', () => {
|
|
110
|
-
expect(transformAutoReturn('while (true) { break }')).toBe('while (true) { break }')
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
it('should not modify try/catch', () => {
|
|
114
|
-
expect(transformAutoReturn('try { foo() } catch (e) { bar() }')).toBe(
|
|
115
|
-
'try { foo() } catch (e) { bar() }'
|
|
116
|
-
)
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it('should not modify function declaration', () => {
|
|
120
|
-
expect(transformAutoReturn('function foo() { return 1 }')).toBe(
|
|
121
|
-
'function foo() { return 1 }'
|
|
122
|
-
)
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
it('should not modify class declaration', () => {
|
|
126
|
-
expect(transformAutoReturn('class Foo {}')).toBe('class Foo {}')
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
it('should not modify single-line comments', () => {
|
|
130
|
-
expect(transformAutoReturn('// comment')).toBe('// comment')
|
|
131
|
-
})
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
describe('edge cases', () => {
|
|
135
|
-
it('should return empty string unchanged', () => {
|
|
136
|
-
expect(transformAutoReturn('')).toBe('')
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
it('should return whitespace-only unchanged', () => {
|
|
140
|
-
expect(transformAutoReturn(' ')).toBe(' ')
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
it('should handle trailing whitespace', () => {
|
|
144
|
-
expect(transformAutoReturn('mj.help() ')).toBe('return mj.help()')
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
it('should handle trailing semicolon', () => {
|
|
148
|
-
// Last statement after the final semicolon is empty, so no transform
|
|
149
|
-
const code = 'mj.help();'
|
|
150
|
-
const result = transformAutoReturn(code)
|
|
151
|
-
// The semicolon makes the "last statement" empty, so it falls
|
|
152
|
-
// back to returning code unchanged
|
|
153
|
-
expect(result).toBe('mj.help();')
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
it('should not return closing brace of a block', () => {
|
|
157
|
-
const code = 'if (true) {\n foo()\n}'
|
|
158
|
-
expect(transformAutoReturn(code)).toBe(code)
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
it('should handle multi-statement ending with function call after semicolon', () => {
|
|
162
|
-
const code = 'const x = 1; mj.help()'
|
|
163
|
-
const result = transformAutoReturn(code)
|
|
164
|
-
expect(result).toBe('const x = 1;\nreturn mj.help()')
|
|
165
|
-
})
|
|
166
|
-
})
|
|
167
|
-
})
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Code Mode Tool Handler Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for the mj_execute_code tool handler focusing on:
|
|
5
|
-
* - Tool definition structure (name, schema, annotations)
|
|
6
|
-
* - Security validation rejection (blocked patterns, empty code)
|
|
7
|
-
* - Schema validation (missing params)
|
|
8
|
-
*
|
|
9
|
-
* Note: Actual sandbox code execution is tested via Playwright E2E tests.
|
|
10
|
-
* In the vitest unit test environment, worker_threads can't resolve the
|
|
11
|
-
* compiled worker-script.js (vitest runs TypeScript source directly), and
|
|
12
|
-
* the VM sandbox has async Promise interop issues with vitest's module system.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
|
16
|
-
import { getTools, callTool } from '../../src/handlers/tools/index.js'
|
|
17
|
-
import { DatabaseAdapter } from '../../src/database/sqlite-adapter/index.js'
|
|
18
|
-
|
|
19
|
-
describe('mj_execute_code Tool Handler', () => {
|
|
20
|
-
let db: DatabaseAdapter
|
|
21
|
-
const testDbPath = './test-codemode-handler.db'
|
|
22
|
-
|
|
23
|
-
beforeAll(async () => {
|
|
24
|
-
db = new DatabaseAdapter(testDbPath)
|
|
25
|
-
await db.initialize()
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
afterAll(() => {
|
|
29
|
-
db.close()
|
|
30
|
-
try {
|
|
31
|
-
const fs = require('node:fs')
|
|
32
|
-
if (fs.existsSync(testDbPath)) fs.unlinkSync(testDbPath)
|
|
33
|
-
} catch {
|
|
34
|
-
// Ignore cleanup errors
|
|
35
|
-
}
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
// =========================================================================
|
|
39
|
-
// Tool Definition
|
|
40
|
-
// =========================================================================
|
|
41
|
-
|
|
42
|
-
describe('tool definition', () => {
|
|
43
|
-
it('should be included in tool listing', () => {
|
|
44
|
-
const tools = getTools(db, null)
|
|
45
|
-
const names = tools.map((t) => (t as { name: string }).name)
|
|
46
|
-
expect(names).toContain('mj_execute_code')
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
it('should have inputSchema (no outputSchema — uses text response path)', () => {
|
|
50
|
-
const tools = getTools(db, null)
|
|
51
|
-
const codeTool = tools.find(
|
|
52
|
-
(t) => (t as { name: string }).name === 'mj_execute_code'
|
|
53
|
-
) as { inputSchema: object; outputSchema?: object } | undefined
|
|
54
|
-
expect(codeTool?.inputSchema).toBeDefined()
|
|
55
|
-
expect(codeTool?.outputSchema).toBeUndefined()
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
it('should have correct description mentioning sandbox and API', () => {
|
|
59
|
-
const tools = getTools(db, null)
|
|
60
|
-
const codeTool = tools.find(
|
|
61
|
-
(t) => (t as { name: string }).name === 'mj_execute_code'
|
|
62
|
-
) as { description: string } | undefined
|
|
63
|
-
expect(codeTool?.description).toContain('sandbox')
|
|
64
|
-
expect(codeTool?.description).toContain('mj.*')
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
it('should have annotations with readOnlyHint=false', () => {
|
|
68
|
-
const tools = getTools(db, null)
|
|
69
|
-
const codeTool = tools.find(
|
|
70
|
-
(t) => (t as { name: string }).name === 'mj_execute_code'
|
|
71
|
-
) as { annotations?: { readOnlyHint?: boolean } } | undefined
|
|
72
|
-
expect(codeTool?.annotations?.readOnlyHint).toBe(false)
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
it('should total 61 tools across all groups', () => {
|
|
76
|
-
const tools = getTools(db, null)
|
|
77
|
-
expect(tools.length).toBe(61)
|
|
78
|
-
})
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
// =========================================================================
|
|
82
|
-
// Security Validation (pre-sandbox, synchronous path)
|
|
83
|
-
// =========================================================================
|
|
84
|
-
|
|
85
|
-
describe('security validation', () => {
|
|
86
|
-
it('should reject code with require()', async () => {
|
|
87
|
-
const result = (await callTool(
|
|
88
|
-
'mj_execute_code',
|
|
89
|
-
{ code: 'const fs = require("fs")' },
|
|
90
|
-
db
|
|
91
|
-
)) as { success: boolean; error: string }
|
|
92
|
-
|
|
93
|
-
expect(result.success).toBe(false)
|
|
94
|
-
expect(result.error).toContain('Security validation failed')
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
it('should reject code with process access', async () => {
|
|
98
|
-
const result = (await callTool('mj_execute_code', { code: 'process.exit(1)' }, db)) as {
|
|
99
|
-
success: boolean
|
|
100
|
-
error: string
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
expect(result.success).toBe(false)
|
|
104
|
-
expect(result.error).toContain('Security validation failed')
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
it('should reject code with dynamic import', async () => {
|
|
108
|
-
const result = (await callTool(
|
|
109
|
-
'mj_execute_code',
|
|
110
|
-
{ code: 'await import("os")' },
|
|
111
|
-
db
|
|
112
|
-
)) as { success: boolean; error: string }
|
|
113
|
-
|
|
114
|
-
expect(result.success).toBe(false)
|
|
115
|
-
expect(result.error).toContain('Security validation failed')
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
it('should reject code with eval()', async () => {
|
|
119
|
-
const result = (await callTool(
|
|
120
|
-
'mj_execute_code',
|
|
121
|
-
{ code: 'eval("alert(1)")' },
|
|
122
|
-
db
|
|
123
|
-
)) as { success: boolean; error: string }
|
|
124
|
-
|
|
125
|
-
expect(result.success).toBe(false)
|
|
126
|
-
expect(result.error).toContain('Security validation failed')
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
it('should reject code with Function constructor', async () => {
|
|
130
|
-
const result = (await callTool(
|
|
131
|
-
'mj_execute_code',
|
|
132
|
-
{ code: 'new Function ("return 1")' },
|
|
133
|
-
db
|
|
134
|
-
)) as { success: boolean; error: string }
|
|
135
|
-
|
|
136
|
-
expect(result.success).toBe(false)
|
|
137
|
-
expect(result.error).toContain('Security validation failed')
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
it('should reject code with __proto__ access', async () => {
|
|
141
|
-
const result = (await callTool(
|
|
142
|
-
'mj_execute_code',
|
|
143
|
-
{ code: 'const x = {}.__proto__' },
|
|
144
|
-
db
|
|
145
|
-
)) as { success: boolean; error: string }
|
|
146
|
-
|
|
147
|
-
expect(result.success).toBe(false)
|
|
148
|
-
expect(result.error).toContain('Security validation failed')
|
|
149
|
-
})
|
|
150
|
-
|
|
151
|
-
it('should reject code with child_process', async () => {
|
|
152
|
-
const result = (await callTool(
|
|
153
|
-
'mj_execute_code',
|
|
154
|
-
{ code: 'child_process.exec("whoami")' },
|
|
155
|
-
db
|
|
156
|
-
)) as { success: boolean; error: string }
|
|
157
|
-
|
|
158
|
-
expect(result.success).toBe(false)
|
|
159
|
-
expect(result.error).toContain('Security validation failed')
|
|
160
|
-
})
|
|
161
|
-
|
|
162
|
-
it('should reject code with fs access', async () => {
|
|
163
|
-
const result = (await callTool(
|
|
164
|
-
'mj_execute_code',
|
|
165
|
-
{ code: 'fs.readFileSync("/etc/passwd")' },
|
|
166
|
-
db
|
|
167
|
-
)) as { success: boolean; error: string }
|
|
168
|
-
|
|
169
|
-
expect(result.success).toBe(false)
|
|
170
|
-
expect(result.error).toContain('Security validation failed')
|
|
171
|
-
})
|
|
172
|
-
})
|
|
173
|
-
|
|
174
|
-
// =========================================================================
|
|
175
|
-
// Schema Validation (pre-sandbox, Zod parse path)
|
|
176
|
-
// =========================================================================
|
|
177
|
-
|
|
178
|
-
describe('schema validation', () => {
|
|
179
|
-
it('should reject missing code parameter', async () => {
|
|
180
|
-
const result = (await callTool('mj_execute_code', {}, db)) as {
|
|
181
|
-
success: boolean
|
|
182
|
-
error?: string
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
expect(result.success).toBe(false)
|
|
186
|
-
})
|
|
187
|
-
|
|
188
|
-
it('should reject empty string code', async () => {
|
|
189
|
-
const result = (await callTool('mj_execute_code', { code: '' }, db)) as {
|
|
190
|
-
success: boolean
|
|
191
|
-
error?: string
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
expect(result.success).toBe(false)
|
|
195
|
-
})
|
|
196
|
-
})
|
|
197
|
-
})
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sandbox Factory Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for the sandbox mode selection factory:
|
|
5
|
-
* - Default mode management
|
|
6
|
-
* - VM and Worker sandbox creation
|
|
7
|
-
* - Pool creation
|
|
8
|
-
* - Mode info
|
|
9
|
-
* - Available modes listing
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { describe, it, expect, afterEach } from 'vitest'
|
|
13
|
-
import {
|
|
14
|
-
setDefaultSandboxMode,
|
|
15
|
-
getDefaultSandboxMode,
|
|
16
|
-
getAvailableSandboxModes,
|
|
17
|
-
createSandbox,
|
|
18
|
-
createSandboxPool,
|
|
19
|
-
getSandboxModeInfo,
|
|
20
|
-
} from '../../src/codemode/index.js'
|
|
21
|
-
|
|
22
|
-
describe('Sandbox Factory', () => {
|
|
23
|
-
// Reset to default after each test
|
|
24
|
-
afterEach(() => {
|
|
25
|
-
setDefaultSandboxMode('worker')
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
// =========================================================================
|
|
29
|
-
// Default Mode
|
|
30
|
-
// =========================================================================
|
|
31
|
-
|
|
32
|
-
describe('default mode', () => {
|
|
33
|
-
it('should default to worker mode', () => {
|
|
34
|
-
expect(getDefaultSandboxMode()).toBe('worker')
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
it('should allow setting to vm mode', () => {
|
|
38
|
-
setDefaultSandboxMode('vm')
|
|
39
|
-
expect(getDefaultSandboxMode()).toBe('vm')
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
it('should allow setting back to worker mode', () => {
|
|
43
|
-
setDefaultSandboxMode('vm')
|
|
44
|
-
setDefaultSandboxMode('worker')
|
|
45
|
-
expect(getDefaultSandboxMode()).toBe('worker')
|
|
46
|
-
})
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
// =========================================================================
|
|
50
|
-
// Available Modes
|
|
51
|
-
// =========================================================================
|
|
52
|
-
|
|
53
|
-
describe('getAvailableSandboxModes', () => {
|
|
54
|
-
it('should return both vm and worker modes', () => {
|
|
55
|
-
const modes = getAvailableSandboxModes()
|
|
56
|
-
expect(modes).toContain('vm')
|
|
57
|
-
expect(modes).toContain('worker')
|
|
58
|
-
expect(modes).toHaveLength(2)
|
|
59
|
-
})
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
// =========================================================================
|
|
63
|
-
// Sandbox Creation
|
|
64
|
-
// =========================================================================
|
|
65
|
-
|
|
66
|
-
describe('createSandbox', () => {
|
|
67
|
-
it('should create a VM sandbox when mode is vm', () => {
|
|
68
|
-
const sandbox = createSandbox('vm')
|
|
69
|
-
expect(sandbox).toBeDefined()
|
|
70
|
-
expect(typeof sandbox.execute).toBe('function')
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
it('should create a Worker sandbox when mode is worker', () => {
|
|
74
|
-
const sandbox = createSandbox('worker')
|
|
75
|
-
expect(sandbox).toBeDefined()
|
|
76
|
-
expect(typeof sandbox.execute).toBe('function')
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
it('should use default mode when not specified', () => {
|
|
80
|
-
setDefaultSandboxMode('vm')
|
|
81
|
-
const sandbox = createSandbox()
|
|
82
|
-
expect(sandbox).toBeDefined()
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
it('should throw for unknown mode', () => {
|
|
86
|
-
expect(() => createSandbox('unknown' as 'vm')).toThrow('Unknown sandbox mode')
|
|
87
|
-
})
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
// =========================================================================
|
|
91
|
-
// Pool Creation
|
|
92
|
-
// =========================================================================
|
|
93
|
-
|
|
94
|
-
describe('createSandboxPool', () => {
|
|
95
|
-
it('should create a VM pool when mode is vm', () => {
|
|
96
|
-
const pool = createSandboxPool('vm')
|
|
97
|
-
expect(pool).toBeDefined()
|
|
98
|
-
expect(typeof pool.execute).toBe('function')
|
|
99
|
-
expect(typeof pool.getActiveCount).toBe('function')
|
|
100
|
-
expect(pool.poolId).toBeDefined()
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
it('should create a Worker pool when mode is worker', () => {
|
|
104
|
-
const pool = createSandboxPool('worker')
|
|
105
|
-
expect(pool).toBeDefined()
|
|
106
|
-
expect(typeof pool.execute).toBe('function')
|
|
107
|
-
expect(pool.poolId).toBeDefined()
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
it('should use default mode when not specified', () => {
|
|
111
|
-
setDefaultSandboxMode('vm')
|
|
112
|
-
const pool = createSandboxPool()
|
|
113
|
-
expect(pool).toBeDefined()
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
it('should throw for unknown mode', () => {
|
|
117
|
-
expect(() => createSandboxPool('invalid' as 'vm')).toThrow('Unknown sandbox mode')
|
|
118
|
-
})
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
// =========================================================================
|
|
122
|
-
// Mode Info
|
|
123
|
-
// =========================================================================
|
|
124
|
-
|
|
125
|
-
describe('getSandboxModeInfo', () => {
|
|
126
|
-
it('should return VM info', () => {
|
|
127
|
-
const info = getSandboxModeInfo('vm')
|
|
128
|
-
expect(info.mode).toBe('vm')
|
|
129
|
-
expect(info.securityLevel).toBe('basic')
|
|
130
|
-
expect(info.description).toContain('VM-based')
|
|
131
|
-
expect(info.isolation).toContain('vm.createContext')
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
it('should return Worker info', () => {
|
|
135
|
-
const info = getSandboxModeInfo('worker')
|
|
136
|
-
expect(info.mode).toBe('worker')
|
|
137
|
-
expect(info.securityLevel).toBe('production')
|
|
138
|
-
expect(info.description).toContain('Worker-thread')
|
|
139
|
-
expect(info.isolation).toContain('V8 isolate')
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
it('should use default mode when not specified', () => {
|
|
143
|
-
setDefaultSandboxMode('vm')
|
|
144
|
-
const info = getSandboxModeInfo()
|
|
145
|
-
expect(info.mode).toBe('vm')
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
it('should throw for unknown mode', () => {
|
|
149
|
-
expect(() => getSandboxModeInfo('bad' as 'vm')).toThrow('Unknown sandbox mode')
|
|
150
|
-
})
|
|
151
|
-
})
|
|
152
|
-
})
|