attention-manifest-protocol 0.4.2 → 0.4.3
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/CHANGELOG.md +341 -293
- package/CHANGELOG.zh-CN.md +41 -8
- package/README.md +250 -171
- package/README.zh-CN.md +251 -171
- package/lib/assignment/assign.d.ts +102 -0
- package/lib/assignment/assign.js +556 -0
- package/lib/assignment/binding.d.ts +103 -0
- package/lib/assignment/binding.js +575 -0
- package/lib/assignment/errors.d.ts +14 -0
- package/lib/assignment/errors.js +16 -0
- package/lib/assignment/guards.d.ts +18 -0
- package/lib/assignment/guards.js +28 -0
- package/lib/assignment/index.d.ts +10 -0
- package/lib/assignment/index.js +10 -0
- package/lib/assignment/types.d.ts +169 -0
- package/lib/assignment/types.js +1 -0
- package/lib/attention/budget.d.ts +1 -1
- package/lib/attention/budget.js +31 -9
- package/lib/bayes/engine.js +2 -1
- package/lib/bayes/reliability.js +25 -10
- package/lib/boundary/frame.d.ts +10 -4
- package/lib/boundary/frame.js +346 -109
- package/lib/boundary/kinds.d.ts +11 -0
- package/lib/boundary/kinds.js +33 -0
- package/lib/boundary/refTable.d.ts +19 -9
- package/lib/boundary/refTable.js +128 -30
- package/lib/boundary/toolCall.d.ts +22 -10
- package/lib/boundary/toolCall.js +798 -97
- package/lib/concept/conceptBudget.js +10 -1
- package/lib/concurrency/idempotency.d.ts +4 -3
- package/lib/concurrency/idempotency.js +57 -13
- package/lib/concurrency/retry.js +18 -3
- package/lib/context/agentContext.d.ts +13 -0
- package/lib/context/agentContext.js +14 -1
- package/lib/context/ast.d.ts +4 -1
- package/lib/context/ast.js +13 -3
- package/lib/context/contentStore.js +22 -9
- package/lib/context/contextBuilder.d.ts +457 -0
- package/lib/context/contextBuilder.js +1395 -0
- package/lib/context/contextPackage.d.ts +214 -0
- package/lib/context/contextPackage.js +191 -0
- package/lib/context/index.d.ts +14 -3
- package/lib/context/index.js +9 -1
- package/lib/context/relevance.d.ts +171 -0
- package/lib/context/relevance.js +250 -0
- package/lib/context/workspaceDiff.d.ts +105 -0
- package/lib/context/workspaceDiff.js +238 -0
- package/lib/context/workspaceService.d.ts +236 -1
- package/lib/context/workspaceService.js +1501 -73
- package/lib/cooperation/collaboration.d.ts +9 -0
- package/lib/cooperation/session.d.ts +4 -4
- package/lib/cooperation/session.js +3 -3
- package/lib/database/adapter/filesystemStore.d.ts +145 -0
- package/lib/database/adapter/filesystemStore.js +321 -0
- package/lib/database/adapter/index.d.ts +2 -0
- package/lib/database/adapter/index.js +2 -0
- package/lib/database/adapter/workspaceSessionStore.d.ts +118 -0
- package/lib/database/adapter/workspaceSessionStore.js +120 -0
- package/lib/database/entity/fileGraph.d.ts +53 -0
- package/lib/database/entity/fileGraph.js +15 -0
- package/lib/database/entity/fileTree.d.ts +76 -0
- package/lib/database/entity/fileTree.js +39 -0
- package/lib/database/entity/hook.d.ts +29 -0
- package/lib/database/entity/hook.js +18 -0
- package/lib/database/entity/index.d.ts +4 -0
- package/lib/database/entity/index.js +4 -0
- package/lib/database/entity/workspaceSession.d.ts +53 -0
- package/lib/database/entity/workspaceSession.js +28 -0
- package/lib/database/repository/fileAnnotationRepository.d.ts +75 -0
- package/lib/database/repository/fileAnnotationRepository.js +109 -0
- package/lib/database/repository/fileGraphRepository.d.ts +188 -0
- package/lib/database/repository/fileGraphRepository.js +648 -0
- package/lib/database/repository/fileNodeRepository.d.ts +116 -0
- package/lib/database/repository/fileNodeRepository.js +263 -0
- package/lib/database/repository/fileOutlineRepository.d.ts +40 -0
- package/lib/database/repository/fileOutlineRepository.js +104 -0
- package/lib/database/repository/fileWriteRepository.d.ts +41 -0
- package/lib/database/repository/fileWriteRepository.js +93 -0
- package/lib/database/repository/hookRepository.d.ts +67 -0
- package/lib/database/repository/hookRepository.js +150 -0
- package/lib/database/repository/index.d.ts +7 -0
- package/lib/database/repository/index.js +7 -0
- package/lib/database/repository/workspaceSessionRepository.d.ts +134 -0
- package/lib/database/repository/workspaceSessionRepository.js +327 -0
- package/lib/database/service/database.d.ts +14 -0
- package/lib/database/service/database.js +21 -0
- package/lib/database/sql/schema.js +187 -0
- package/lib/database/store/database.js +6 -1
- package/lib/delegate/team.d.ts +5 -0
- package/lib/delegate/team.js +83 -20
- package/lib/discover/classify.d.ts +20 -0
- package/lib/discover/classify.js +85 -0
- package/lib/discover/host.d.ts +20 -0
- package/lib/discover/host.js +89 -0
- package/lib/discover/index.d.ts +11 -0
- package/lib/discover/index.js +11 -0
- package/lib/discover/kinds.d.ts +14 -0
- package/lib/discover/kinds.js +23 -0
- package/lib/discover/tree.d.ts +7 -0
- package/lib/discover/tree.js +432 -0
- package/lib/discover/types.d.ts +115 -0
- package/lib/discover/types.js +1 -0
- package/lib/error/boundaryRejection.d.ts +1 -1
- package/lib/evaluation/agreement.js +2 -2
- package/lib/execution/handles.js +6 -0
- package/lib/execution/pin.js +2 -2
- package/lib/file/cfb.d.ts +56 -0
- package/lib/file/cfb.js +396 -0
- package/lib/file/dependency.d.ts +151 -0
- package/lib/file/dependency.js +568 -0
- package/lib/file/directory.d.ts +34 -0
- package/lib/file/directory.js +141 -0
- package/lib/file/errors.d.ts +20 -0
- package/lib/file/errors.js +18 -0
- package/lib/file/exportGraph.d.ts +31 -0
- package/lib/file/exportGraph.js +554 -0
- package/lib/file/file.d.ts +40 -0
- package/lib/file/file.js +339 -0
- package/lib/file/importGraph.d.ts +121 -0
- package/lib/file/importGraph.js +1022 -0
- package/lib/file/index.d.ts +45 -0
- package/lib/file/index.js +30 -0
- package/lib/file/metadata.d.ts +66 -0
- package/lib/file/metadata.js +470 -0
- package/lib/file/path.d.ts +60 -0
- package/lib/file/path.js +259 -0
- package/lib/file/read.d.ts +168 -0
- package/lib/file/read.js +541 -0
- package/lib/file/runtime.d.ts +95 -0
- package/lib/file/runtime.js +150 -0
- package/lib/file/service.d.ts +227 -0
- package/lib/file/service.js +663 -0
- package/lib/file/syntaxTree.d.ts +7 -0
- package/lib/file/syntaxTree.js +38 -0
- package/lib/file/time.d.ts +38 -0
- package/lib/file/time.js +44 -0
- package/lib/file/tree.d.ts +53 -0
- package/lib/file/tree.js +417 -0
- package/lib/file/types.d.ts +371 -0
- package/lib/file/types.js +1 -0
- package/lib/file/write.d.ts +159 -0
- package/lib/file/write.js +1028 -0
- package/lib/file/zip.d.ts +35 -0
- package/lib/file/zip.js +349 -0
- package/lib/fingerprint/algorithm.d.ts +97 -0
- package/lib/fingerprint/algorithm.js +271 -0
- package/lib/fingerprint/bytes.d.ts +18 -0
- package/lib/fingerprint/bytes.js +31 -0
- package/lib/fingerprint/error.d.ts +73 -0
- package/lib/fingerprint/error.js +86 -0
- package/lib/fingerprint/file.d.ts +71 -0
- package/lib/fingerprint/file.js +254 -0
- package/lib/fingerprint/index.d.ts +37 -0
- package/lib/fingerprint/index.js +12 -0
- package/lib/fingerprint/json.d.ts +41 -0
- package/lib/fingerprint/json.js +94 -0
- package/lib/fingerprint/number.d.ts +32 -0
- package/lib/fingerprint/number.js +95 -0
- package/lib/fingerprint/policy.d.ts +54 -0
- package/lib/fingerprint/policy.js +50 -0
- package/lib/fingerprint/preimage.d.ts +84 -0
- package/lib/fingerprint/preimage.js +133 -0
- package/lib/fingerprint/raw.d.ts +26 -0
- package/lib/fingerprint/raw.js +45 -0
- package/lib/fingerprint/ref.d.ts +39 -0
- package/lib/fingerprint/ref.js +178 -0
- package/lib/fingerprint/text.d.ts +42 -0
- package/lib/fingerprint/text.js +155 -0
- package/lib/fingerprint/tree.d.ts +56 -0
- package/lib/fingerprint/tree.js +288 -0
- package/lib/fingerprint/verify.d.ts +20 -0
- package/lib/fingerprint/verify.js +99 -0
- package/lib/global/filesystem.d.ts +43 -0
- package/lib/global/filesystem.js +75 -0
- package/lib/global/index.d.ts +8 -0
- package/lib/global/index.js +8 -0
- package/lib/global/service.d.ts +51 -0
- package/lib/global/service.js +98 -0
- package/lib/governance/transport.js +18 -6
- package/lib/hook/ast.d.ts +29 -0
- package/lib/hook/ast.js +22 -0
- package/lib/hook/code.d.ts +55 -0
- package/lib/hook/code.js +47 -0
- package/lib/hook/dependency.d.ts +45 -0
- package/lib/hook/dependency.js +28 -0
- package/lib/hook/diff.d.ts +114 -0
- package/lib/hook/diff.js +327 -0
- package/lib/hook/exportation.d.ts +31 -0
- package/lib/hook/exportation.js +24 -0
- package/lib/hook/file.d.ts +44 -0
- package/lib/hook/file.js +154 -0
- package/lib/hook/importation.d.ts +33 -0
- package/lib/hook/importation.js +22 -0
- package/lib/hook/index.d.ts +30 -0
- package/lib/hook/index.js +23 -0
- package/lib/hook/outline.d.ts +35 -0
- package/lib/hook/outline.js +27 -0
- package/lib/hook/project.d.ts +65 -0
- package/lib/hook/project.js +217 -0
- package/lib/hook/types.d.ts +114 -0
- package/lib/hook/types.js +407 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.js +9 -0
- package/lib/lock/lease.js +28 -3
- package/lib/manifest/cardSign.d.ts +1 -1
- package/lib/manifest/cardSign.js +37 -7
- package/lib/manifest/federation.js +13 -6
- package/lib/manifest/trust.d.ts +2 -0
- package/lib/manifest/trust.js +27 -6
- package/lib/module/index.d.ts +4 -0
- package/lib/module/index.js +4 -0
- package/lib/module/mcp/client.js +21 -2
- package/lib/module/mcp/filesystemServer.d.ts +24 -0
- package/lib/module/mcp/filesystemServer.js +102 -0
- package/lib/module/mcp/http.js +32 -19
- package/lib/module/mcp/workspaceServer.js +20 -3
- package/lib/module/tool/filesystemExecutor.d.ts +18 -0
- package/lib/module/tool/filesystemExecutor.js +49 -0
- package/lib/module/tool/globalExecutor.d.ts +17 -0
- package/lib/module/tool/globalExecutor.js +39 -0
- package/lib/module/tool/globalFilesystemExecutor.d.ts +18 -0
- package/lib/module/tool/globalFilesystemExecutor.js +49 -0
- package/lib/module/tool/workspaceExecutor.d.ts +9 -0
- package/lib/module/tool/workspaceExecutor.js +16 -3
- package/lib/naming/aliases.d.ts +48 -0
- package/lib/naming/aliases.js +79 -0
- package/lib/naming/catalog.d.ts +117 -0
- package/lib/naming/catalog.js +108 -0
- package/lib/naming/grammar.d.ts +67 -0
- package/lib/naming/grammar.js +212 -0
- package/lib/naming/ids.d.ts +157 -0
- package/lib/naming/ids.js +119 -0
- package/lib/naming/index.d.ts +13 -0
- package/lib/naming/index.js +13 -0
- package/lib/outline/index.d.ts +9 -0
- package/lib/outline/index.js +8 -0
- package/lib/outline/office.d.ts +160 -0
- package/lib/outline/office.js +2375 -0
- package/lib/outline/officeBridge.d.ts +32 -0
- package/lib/outline/officeBridge.js +27 -0
- package/lib/outline/outline.d.ts +159 -0
- package/lib/outline/outline.js +837 -0
- package/lib/outline/outlineIndex.d.ts +97 -0
- package/lib/outline/outlineIndex.js +325 -0
- package/lib/outline/outlineKeywords.d.ts +59 -0
- package/lib/outline/outlineKeywords.js +143 -0
- package/lib/outline/outlineStrategies.d.ts +414 -0
- package/lib/outline/outlineStrategies.js +8324 -0
- package/lib/outline/reactOutline.d.ts +37 -0
- package/lib/outline/reactOutline.js +1070 -0
- package/lib/outline/shellOutline.d.ts +65 -0
- package/lib/outline/shellOutline.js +873 -0
- package/lib/outline/sqlOutline.d.ts +170 -0
- package/lib/outline/sqlOutline.js +1536 -0
- package/lib/outline/strategy.d.ts +46 -0
- package/lib/outline/strategy.js +1 -0
- package/lib/outline/types.d.ts +95 -0
- package/lib/outline/types.js +1 -0
- package/lib/outline/visualBasicOutline.d.ts +27 -0
- package/lib/outline/visualBasicOutline.js +750 -0
- package/lib/protocol/filesystem.d.ts +55 -0
- package/lib/protocol/filesystem.js +105 -0
- package/lib/protocol/global.d.ts +42 -0
- package/lib/protocol/global.js +63 -0
- package/lib/protocol/globalFilesystem.d.ts +40 -0
- package/lib/protocol/globalFilesystem.js +59 -0
- package/lib/protocol/index.d.ts +4 -0
- package/lib/protocol/index.js +4 -0
- package/lib/protocol/protocol.d.ts +4 -0
- package/lib/protocol/wire.js +5 -2
- package/lib/protocol/workspace.d.ts +305 -0
- package/lib/protocol/workspace.js +258 -0
- package/lib/receipt/receipt.d.ts +8 -0
- package/lib/registry/content.js +9 -3
- package/lib/runtime/kernelRuntime.js +9 -1
- package/lib/scenario/scenario.js +5 -4
- package/lib/semantic/canonical.d.ts +61 -0
- package/lib/semantic/canonical.js +135 -8
- package/lib/semantic/jsonValue.d.ts +31 -0
- package/lib/semantic/jsonValue.js +122 -0
- package/lib/semantic/sha256.js +3 -0
- package/lib/semantic/time.d.ts +14 -0
- package/lib/semantic/time.js +56 -0
- package/lib/session/context.d.ts +76 -0
- package/lib/session/context.js +419 -0
- package/lib/session/errors.d.ts +24 -0
- package/lib/session/errors.js +22 -0
- package/lib/session/identity.d.ts +24 -0
- package/lib/session/identity.js +56 -0
- package/lib/session/index.d.ts +14 -0
- package/lib/session/index.js +12 -0
- package/lib/session/registry.d.ts +130 -0
- package/lib/session/registry.js +908 -0
- package/lib/session/types.d.ts +227 -0
- package/lib/session/types.js +14 -0
- package/lib/structure/index.d.ts +1 -0
- package/lib/structure/index.js +1 -0
- package/lib/structure/trie.d.ts +88 -0
- package/lib/structure/trie.js +183 -0
- package/lib/syntax/byteIndex.d.ts +44 -0
- package/lib/syntax/byteIndex.js +148 -0
- package/lib/syntax/charset.d.ts +88 -0
- package/lib/syntax/charset.js +276 -0
- package/lib/syntax/index.d.ts +6 -0
- package/lib/syntax/index.js +5 -0
- package/lib/syntax/syntaxRegistry.d.ts +150 -0
- package/lib/syntax/syntaxRegistry.js +314 -0
- package/lib/syntax/syntaxTree.d.ts +106 -0
- package/lib/syntax/syntaxTree.js +668 -0
- package/lib/syntax/types.d.ts +15 -0
- package/lib/syntax/types.js +1 -0
- package/lib/types/common.d.ts +1 -1
- package/package.json +72 -193
- package/.editorconfig +0 -12
- package/.prettierignore +0 -17
- package/MCP-Token/347/250/216/344/270/216/344/270/213/344/270/200/344/273/243/345/267/245/345/205/267/345/215/217/350/256/256.html +0 -1763
- package/docs/annotation-campaign-A.csv +0 -54
- package/docs/annotation-campaign-B.csv +0 -54
- package/docs/annotation-campaign.csv +0 -54
- package/docs/eval/annotations-A.jsonl +0 -16
- package/docs/eval/annotations.json +0 -122
- package/docs/eval/recorded-labels.json +0 -12
- package/docs/eval/replay-cases.json +0 -14
- package/docs/eval/replay-labels-b.json +0 -14
- package/docs/examples/attention-request.json +0 -16
- package/docs/examples/checkpoint.json +0 -15
- package/docs/examples/claim.json +0 -66
- package/docs/examples/collaboration.json +0 -66
- package/docs/examples/concept-checkpoint.json +0 -15
- package/docs/examples/concept-prune-plan.json +0 -45
- package/docs/examples/federation.json +0 -126
- package/docs/examples/frame-chain.json +0 -77
- package/docs/examples/ledger-snapshot.json +0 -108
- package/docs/examples/manifest.json +0 -77
- package/docs/examples/message.json +0 -19
- package/docs/examples/other-model.json +0 -45
- package/docs/examples/plan.json +0 -50
- package/docs/examples/prune-plan.json +0 -48
- package/docs/examples/receipt.json +0 -22
- package/docs/examples/runtime-run.json +0 -573
- package/docs/examples/team.json +0 -66
- package/docs/examples/verb-note.json +0 -11
- package/docs/probes/bayes-scores.json +0 -1452
- package/docs/probes/calibration-imported.json +0 -141
- package/docs/probes/context-ast-deepseek.json +0 -1577
- package/docs/probes/deepseek-probe.json +0 -917
- package/docs/probes/eval-recorded-replay.json +0 -597
- package/docs/probes/eval-replay.json +0 -124
- package/docs/probes/eval-summary.json +0 -42
- package/docs/probes/runtime-eval.json +0 -4230
- package/docs/schemas/collaboration.schema.json +0 -73
- package/docs/schemas/common.schema.json +0 -125
- package/docs/schemas/compaction.schema.json +0 -121
- package/docs/schemas/concept-compaction.schema.json +0 -73
- package/docs/schemas/concept.schema.json +0 -97
- package/docs/schemas/epistemic.schema.json +0 -178
- package/docs/schemas/federation.schema.json +0 -66
- package/docs/schemas/frame.schema.json +0 -86
- package/docs/schemas/ledger-snapshot.schema.json +0 -30
- package/docs/schemas/manifest.schema.json +0 -169
- package/docs/schemas/message.schema.json +0 -41
- package/docs/schemas/plan.schema.json +0 -189
- package/docs/schemas/receipt.schema.json +0 -45
- package/docs/schemas/social.schema.json +0 -153
- package/docs/schemas/team.schema.json +0 -56
- package/docs/schemas/verb.schema.json +0 -120
- package/eslint.config.mts +0 -96
- package/index.html +0 -13
- package/lib/context/workspaceProtocol.d.ts +0 -30
- package/lib/context/workspaceProtocol.js +0 -49
- package/prettier.config.mts +0 -37
- package/public/favicon.svg +0 -1
- package/public/icons.svg +0 -24
- package/src/attention/attention.ts +0 -347
- package/src/attention/budget.ts +0 -72
- package/src/attention/cognition.ts +0 -519
- package/src/attention/index.ts +0 -8
- package/src/attention/interrupts.ts +0 -228
- package/src/attention/resource.ts +0 -316
- package/src/attention/social.ts +0 -217
- package/src/attention/socialTypes.ts +0 -115
- package/src/authz/authz.ts +0 -305
- package/src/authz/index.ts +0 -1
- package/src/bayes/calibration.ts +0 -204
- package/src/bayes/calibrationRegistry.ts +0 -111
- package/src/bayes/calibrationSelection.ts +0 -154
- package/src/bayes/engine.ts +0 -532
- package/src/bayes/index.ts +0 -6
- package/src/bayes/reliability.ts +0 -62
- package/src/bayes/scopedPriors.ts +0 -88
- package/src/boundary/frame.ts +0 -322
- package/src/boundary/ids.ts +0 -14
- package/src/boundary/index.ts +0 -12
- package/src/boundary/refTable.ts +0 -125
- package/src/boundary/toolCall.ts +0 -212
- package/src/concept/concept.ts +0 -75
- package/src/concept/conceptBudget.ts +0 -346
- package/src/concept/conceptBudgetTypes.ts +0 -79
- package/src/concept/index.ts +0 -3
- package/src/concurrency/idempotency.ts +0 -41
- package/src/concurrency/index.ts +0 -5
- package/src/concurrency/mutex.ts +0 -26
- package/src/concurrency/namedLocks.ts +0 -35
- package/src/concurrency/retry.ts +0 -50
- package/src/concurrency/worker.ts +0 -128
- package/src/context/agentContext.ts +0 -308
- package/src/context/ast.ts +0 -499
- package/src/context/contentStore.ts +0 -75
- package/src/context/context.ts +0 -65
- package/src/context/contextIndex.ts +0 -85
- package/src/context/document.ts +0 -137
- package/src/context/fileStorePath.ts +0 -14
- package/src/context/index.ts +0 -43
- package/src/context/lifecycle.ts +0 -221
- package/src/context/projections.ts +0 -151
- package/src/context/workspace.ts +0 -422
- package/src/context/workspaceProtocol.ts +0 -112
- package/src/context/workspaceService.ts +0 -423
- package/src/cooperation/board.ts +0 -104
- package/src/cooperation/collaboration.ts +0 -60
- package/src/cooperation/index.ts +0 -6
- package/src/cooperation/merge.ts +0 -190
- package/src/cooperation/metrics.ts +0 -57
- package/src/cooperation/session.ts +0 -131
- package/src/cooperation/unified.ts +0 -56
- package/src/counter.ts +0 -9
- package/src/database/adapter/adapters.ts +0 -35
- package/src/database/adapter/index.ts +0 -4
- package/src/database/adapter/runtimeSink.ts +0 -74
- package/src/database/adapter/sessionStore.ts +0 -32
- package/src/database/adapter/turnStore.ts +0 -23
- package/src/database/entity/agent.ts +0 -199
- package/src/database/entity/entity.ts +0 -1046
- package/src/database/entity/handle.ts +0 -79
- package/src/database/entity/index.ts +0 -32
- package/src/database/entity/message.ts +0 -74
- package/src/database/entity/meta.ts +0 -11
- package/src/database/entity/object.ts +0 -42
- package/src/database/entity/outbox.ts +0 -15
- package/src/database/entity/process.ts +0 -65
- package/src/database/entity/registry.ts +0 -155
- package/src/database/entity/runtimeApproval.ts +0 -30
- package/src/database/entity/runtimeSession.ts +0 -13
- package/src/database/entity/runtimeTurn.ts +0 -15
- package/src/database/entity/thread.ts +0 -85
- package/src/database/entity/window.ts +0 -85
- package/src/database/entity/worker.ts +0 -90
- package/src/database/index.ts +0 -6
- package/src/database/repository/addressSpaceRepository.ts +0 -72
- package/src/database/repository/agentRepository.ts +0 -460
- package/src/database/repository/base.ts +0 -41
- package/src/database/repository/executionRepository.ts +0 -477
- package/src/database/repository/handleRepository.ts +0 -64
- package/src/database/repository/index.ts +0 -20
- package/src/database/repository/messageRepository.ts +0 -52
- package/src/database/repository/objectRepository.ts +0 -69
- package/src/database/repository/outboxRepository.ts +0 -63
- package/src/database/repository/processRepository.ts +0 -58
- package/src/database/repository/registryRepository.ts +0 -119
- package/src/database/repository/repository.ts +0 -491
- package/src/database/repository/runtimeApprovalRepository.ts +0 -44
- package/src/database/repository/runtimeSessionRepository.ts +0 -27
- package/src/database/repository/runtimeTurnRepository.ts +0 -39
- package/src/database/repository/socialRepository.ts +0 -185
- package/src/database/repository/threadRepository.ts +0 -57
- package/src/database/repository/windowRepository.ts +0 -88
- package/src/database/repository/workerRepository.ts +0 -69
- package/src/database/service/database.ts +0 -90
- package/src/database/service/handleService.ts +0 -48
- package/src/database/service/index.ts +0 -16
- package/src/database/service/messageService.ts +0 -61
- package/src/database/service/objectService.ts +0 -59
- package/src/database/service/processService.ts +0 -61
- package/src/database/service/registryServices.ts +0 -88
- package/src/database/service/service.ts +0 -183
- package/src/database/service/stepService.ts +0 -53
- package/src/database/service/threadService.ts +0 -65
- package/src/database/service/windowService.ts +0 -30
- package/src/database/service/workerService.ts +0 -57
- package/src/database/sql/index.ts +0 -3
- package/src/database/sql/schema.ts +0 -418
- package/src/database/sql/sql.ts +0 -543
- package/src/database/store/database.ts +0 -210
- package/src/database/store/index.ts +0 -3
- package/src/database/store/store.ts +0 -266
- package/src/delegate/index.ts +0 -2
- package/src/delegate/team.ts +0 -268
- package/src/delegate/teamTypes.ts +0 -47
- package/src/diagnosis/checklist.ts +0 -74
- package/src/diagnosis/context.ts +0 -93
- package/src/diagnosis/frame.ts +0 -256
- package/src/diagnosis/index.ts +0 -5
- package/src/diagnosis/router.ts +0 -72
- package/src/diagnosis/types.ts +0 -89
- package/src/error/agentError.ts +0 -16
- package/src/error/ampError.ts +0 -20
- package/src/error/authzError.ts +0 -14
- package/src/error/boundaryRejection.ts +0 -20
- package/src/error/index.ts +0 -7
- package/src/error/kernelError.ts +0 -27
- package/src/error/mailboxError.ts +0 -9
- package/src/error/windowError.ts +0 -12
- package/src/evaluation/agreement.ts +0 -96
- package/src/evaluation/index.ts +0 -2
- package/src/evaluation/labels.ts +0 -241
- package/src/evidence/evidenceGraph.ts +0 -205
- package/src/evidence/index.ts +0 -4
- package/src/evidence/revalidation.ts +0 -191
- package/src/execution/exec.ts +0 -408
- package/src/execution/handles.ts +0 -65
- package/src/execution/index.ts +0 -3
- package/src/execution/pin.ts +0 -154
- package/src/frame/frame.ts +0 -70
- package/src/frame/index.ts +0 -1
- package/src/goal/goal.ts +0 -43
- package/src/goal/index.ts +0 -2
- package/src/goal/plan.ts +0 -196
- package/src/governance/attentionManifest.ts +0 -802
- package/src/governance/audit.ts +0 -362
- package/src/governance/budget.ts +0 -628
- package/src/governance/context.ts +0 -356
- package/src/governance/control.ts +0 -159
- package/src/governance/cooperation.ts +0 -479
- package/src/governance/credential.ts +0 -359
- package/src/governance/httpServer.ts +0 -99
- package/src/governance/index.ts +0 -32
- package/src/governance/legal.ts +0 -574
- package/src/governance/matrix.ts +0 -460
- package/src/governance/perspectives.ts +0 -406
- package/src/governance/signing.ts +0 -407
- package/src/governance/store.ts +0 -125
- package/src/governance/switching.ts +0 -459
- package/src/governance/toolPolicy.ts +0 -80
- package/src/governance/transport.ts +0 -204
- package/src/governance/types.ts +0 -380
- package/src/governance/workflow.ts +0 -743
- package/src/index.ts +0 -11
- package/src/interaction/index.ts +0 -1
- package/src/interaction/interaction.ts +0 -391
- package/src/ipc/index.ts +0 -4
- package/src/ipc/mailbox.ts +0 -132
- package/src/ipc/memorySocialStore.ts +0 -93
- package/src/ipc/social.ts +0 -93
- package/src/kernel/index.ts +0 -14
- package/src/kernel/scheduler.ts +0 -498
- package/src/ledger/checkpoint.ts +0 -304
- package/src/ledger/index.ts +0 -4
- package/src/ledger/ledger.ts +0 -31
- package/src/ledger/persistence.ts +0 -159
- package/src/ledger/share.ts +0 -80
- package/src/lock/index.ts +0 -2
- package/src/lock/lease.ts +0 -74
- package/src/main.ts +0 -199
- package/src/manifest/agentCard.ts +0 -72
- package/src/manifest/cardSign.ts +0 -87
- package/src/manifest/federation.ts +0 -237
- package/src/manifest/federationTypes.ts +0 -55
- package/src/manifest/index.ts +0 -8
- package/src/manifest/keys.ts +0 -643
- package/src/manifest/manifest.ts +0 -114
- package/src/manifest/sign.ts +0 -134
- package/src/manifest/trust.ts +0 -146
- package/src/mission/index.ts +0 -2
- package/src/mission/missionQueue.ts +0 -75
- package/src/module/index.ts +0 -9
- package/src/module/llm/deepseek.ts +0 -214
- package/src/module/llm/llm.ts +0 -84
- package/src/module/mcp/client.ts +0 -110
- package/src/module/mcp/http.ts +0 -102
- package/src/module/mcp/protocol.ts +0 -77
- package/src/module/mcp/server.ts +0 -148
- package/src/module/mcp/transport.ts +0 -30
- package/src/module/mcp/workspaceServer.ts +0 -111
- package/src/module/sandbox/sandbox.ts +0 -29
- package/src/module/tool/mcpExecutor.ts +0 -54
- package/src/module/tool/policy.ts +0 -52
- package/src/module/tool/redact.ts +0 -29
- package/src/module/tool/tool.ts +0 -53
- package/src/module/tool/workspaceExecutor.ts +0 -35
- package/src/policy/guard.ts +0 -240
- package/src/policy/index.ts +0 -2
- package/src/policy/policy.ts +0 -561
- package/src/process/agent.ts +0 -341
- package/src/process/agentService.ts +0 -236
- package/src/process/agentStore.ts +0 -378
- package/src/process/executionStore.ts +0 -151
- package/src/process/index.ts +0 -5
- package/src/process/process.ts +0 -240
- package/src/process/transitions.ts +0 -19
- package/src/progress/index.ts +0 -2
- package/src/progress/progress.ts +0 -85
- package/src/protocol/a2a.ts +0 -120
- package/src/protocol/channel.ts +0 -44
- package/src/protocol/envelope.ts +0 -655
- package/src/protocol/httpChannel.ts +0 -87
- package/src/protocol/index.ts +0 -6
- package/src/protocol/protocol.ts +0 -138
- package/src/protocol/wire.ts +0 -60
- package/src/receipt/index.ts +0 -1
- package/src/receipt/receipt.ts +0 -47
- package/src/registry/content.ts +0 -69
- package/src/registry/index.ts +0 -23
- package/src/registry/registry.ts +0 -599
- package/src/runtime/action.ts +0 -87
- package/src/runtime/behavior.ts +0 -330
- package/src/runtime/behaviorTuning.ts +0 -163
- package/src/runtime/cognitiveRuntime.ts +0 -703
- package/src/runtime/escalation.ts +0 -35
- package/src/runtime/governedTask.ts +0 -233
- package/src/runtime/index.ts +0 -15
- package/src/runtime/kernelRuntime.ts +0 -144
- package/src/runtime/operation.ts +0 -35
- package/src/runtime/replay.ts +0 -71
- package/src/runtime/routing.ts +0 -58
- package/src/runtime/safety.ts +0 -48
- package/src/runtime/session.ts +0 -341
- package/src/runtime/sessionStore.ts +0 -43
- package/src/runtime/telemetry.ts +0 -55
- package/src/runtime/turnStore.ts +0 -30
- package/src/scenario/index.ts +0 -1
- package/src/scenario/scenario.ts +0 -299
- package/src/semantic/canonical.ts +0 -24
- package/src/semantic/index.ts +0 -2
- package/src/semantic/sha256.ts +0 -82
- package/src/storage/appendLog.ts +0 -372
- package/src/storage/fileAppendSink.ts +0 -40
- package/src/storage/index.ts +0 -2
- package/src/store/bindCache.ts +0 -22
- package/src/store/cache.ts +0 -191
- package/src/store/context.ts +0 -31
- package/src/store/handleStore.ts +0 -31
- package/src/store/index.ts +0 -9
- package/src/store/messageStore.ts +0 -31
- package/src/store/objectStore.ts +0 -31
- package/src/store/processStore.ts +0 -31
- package/src/store/threadStore.ts +0 -31
- package/src/store/windowStore.ts +0 -31
- package/src/structure/abstractSyntaxTree.ts +0 -493
- package/src/structure/avlTree.ts +0 -408
- package/src/structure/binarySearchTree.ts +0 -352
- package/src/structure/binaryTree.ts +0 -525
- package/src/structure/bloomFilter.ts +0 -231
- package/src/structure/compare.ts +0 -110
- package/src/structure/cuckooFilter.ts +0 -337
- package/src/structure/deque.ts +0 -223
- package/src/structure/filterKey.ts +0 -36
- package/src/structure/hash.ts +0 -279
- package/src/structure/heap.ts +0 -268
- package/src/structure/index.ts +0 -20
- package/src/structure/iterator.ts +0 -22
- package/src/structure/lru.ts +0 -619
- package/src/structure/ordered.ts +0 -399
- package/src/structure/priority.ts +0 -915
- package/src/structure/queue.ts +0 -168
- package/src/structure/redBlackTree.ts +0 -680
- package/src/structure/segmentTree.ts +0 -248
- package/src/structure/stack.ts +0 -118
- package/src/structure/unordered.ts +0 -407
- package/src/style.css +0 -278
- package/src/thread/index.ts +0 -2
- package/src/thread/thread.ts +0 -176
- package/src/thread/transitions.ts +0 -17
- package/src/types/common.ts +0 -119
- package/src/types/index.ts +0 -23
- package/src/warrant/epistemic.ts +0 -154
- package/src/warrant/index.ts +0 -3
- package/src/warrant/inquiry.ts +0 -166
- package/src/warrant/warrant.ts +0 -179
- package/src/window/compaction.ts +0 -403
- package/src/window/compactionTypes.ts +0 -119
- package/src/window/index.ts +0 -7
- package/src/window/page.ts +0 -18
- package/src/window/window.ts +0 -244
- package/tools/_helpers.ts +0 -34
- package/tools/a2a-check.ts +0 -110
- package/tools/a2a-flow-check.ts +0 -78
- package/tools/agent-card-check.ts +0 -76
- package/tools/agent-check.ts +0 -236
- package/tools/agent-store-check.ts +0 -153
- package/tools/agreement-check.ts +0 -27
- package/tools/annotation-server-check.ts +0 -48
- package/tools/annotation-server.ts +0 -230
- package/tools/annotation-status.ts +0 -65
- package/tools/approval-access-check.ts +0 -66
- package/tools/arch-check.ts +0 -72
- package/tools/attention-core-check.ts +0 -48
- package/tools/attention-resource-check.ts +0 -169
- package/tools/audit-check.ts +0 -207
- package/tools/authority-check.ts +0 -124
- package/tools/authz-check.ts +0 -138
- package/tools/bayes-check.ts +0 -162
- package/tools/bayes-probe.ts +0 -154
- package/tools/behavior-tuning-check.ts +0 -53
- package/tools/board-check.ts +0 -87
- package/tools/boundary-check.ts +0 -199
- package/tools/bundle-trust-check.ts +0 -96
- package/tools/calibrate-imported.ts +0 -108
- package/tools/calibration-check.ts +0 -44
- package/tools/calibration-registry-check.ts +0 -40
- package/tools/calibration-sim.ts +0 -40
- package/tools/card-sign-check.ts +0 -71
- package/tools/card-trust-check.ts +0 -78
- package/tools/channel-check.ts +0 -86
- package/tools/checkpoint-check.ts +0 -620
- package/tools/cleanup-style-configs.ts +0 -29
- package/tools/cognition-check.ts +0 -648
- package/tools/cognitive-runtime-check.ts +0 -609
- package/tools/collaboration-demo.ts +0 -78
- package/tools/compaction-check.ts +0 -266
- package/tools/concept-check.ts +0 -260
- package/tools/concurrency-check.ts +0 -242
- package/tools/conformance-runtime.ts +0 -389
- package/tools/conformance.ts +0 -651
- package/tools/context-ast-check.ts +0 -90
- package/tools/context-ast-deepseek.ts +0 -242
- package/tools/context-graph-bench.ts +0 -50
- package/tools/context-graph-check.ts +0 -229
- package/tools/context-index-check.ts +0 -48
- package/tools/context-lifecycle-check.ts +0 -69
- package/tools/context-projection-check.ts +0 -73
- package/tools/context-scope-check.ts +0 -134
- package/tools/context-storage-check.ts +0 -113
- package/tools/cooperation-check.ts +0 -517
- package/tools/cooperation-http-check.ts +0 -125
- package/tools/deepseek-llm-check.ts +0 -147
- package/tools/deepseek-probe.ts +0 -494
- package/tools/diagnosis-check.ts +0 -109
- package/tools/diagnosis-router-check.ts +0 -50
- package/tools/document-context-check.ts +0 -237
- package/tools/envelope-check.ts +0 -659
- package/tools/eslint-rules/index.ts +0 -26
- package/tools/eslint-rules/rules/jsdoc-comment-format.ts +0 -105
- package/tools/eslint-rules/rules/no-function-keyword.ts +0 -60
- package/tools/eslint-rules/rules/no-multiline-parameters.ts +0 -71
- package/tools/eslint-rules/rules/no-multiline-type-parameters.ts +0 -57
- package/tools/eslint-rules/rules/no-undefined-comparison.ts +0 -115
- package/tools/eslint-rules/rules/prefer-template-for-string-conversion.ts +0 -97
- package/tools/eslint-rules/rules/require-typeof-parentheses.ts +0 -49
- package/tools/eslint-rules/rules/require-variable-type.ts +0 -36
- package/tools/eslint-rules/rules/variable-naming.ts +0 -175
- package/tools/eval-recorded-replay.ts +0 -215
- package/tools/eval-replay.ts +0 -139
- package/tools/eval-summary.ts +0 -136
- package/tools/evidence-revalidation-check.ts +0 -235
- package/tools/exec-check.ts +0 -217
- package/tools/federation-check.ts +0 -166
- package/tools/federation-demo.ts +0 -45
- package/tools/filter-check.ts +0 -243
- package/tools/governance-check.ts +0 -680
- package/tools/governance-store-check.ts +0 -131
- package/tools/governed-task-check.ts +0 -227
- package/tools/guard-check.ts +0 -122
- package/tools/http-channel-check.ts +0 -125
- package/tools/import-campaign.ts +0 -28
- package/tools/inquiry-check.ts +0 -126
- package/tools/interaction-check.ts +0 -171
- package/tools/interrupts-check.ts +0 -173
- package/tools/ipc-check.ts +0 -170
- package/tools/kernel-async-check.ts +0 -136
- package/tools/kernel-check.ts +0 -369
- package/tools/kernel-runtime-check.ts +0 -276
- package/tools/keys-check.ts +0 -559
- package/tools/label-audit.ts +0 -70
- package/tools/labels-workflow-check.ts +0 -49
- package/tools/linear-structure-check.ts +0 -524
- package/tools/live-exec.ts +0 -62
- package/tools/live-governance-eval.ts +0 -813
- package/tools/live-legacy.ts +0 -50
- package/tools/lru-check.ts +0 -182
- package/tools/make-annotation-campaign.ts +0 -57
- package/tools/mcp-executor-check.ts +0 -33
- package/tools/merge-annotations.ts +0 -32
- package/tools/merge-check.ts +0 -98
- package/tools/metrics-check.ts +0 -84
- package/tools/net-probe.ts +0 -107
- package/tools/oauth-probe.ts +0 -117
- package/tools/outbox-check.ts +0 -50
- package/tools/persistence-check.ts +0 -144
- package/tools/pin-check.ts +0 -116
- package/tools/platform-check.ts +0 -281
- package/tools/policy-check.ts +0 -514
- package/tools/prettier-plugin/index.mts +0 -84
- package/tools/priority-check.ts +0 -627
- package/tools/probe-context7.ts +0 -63
- package/tools/registry-check.ts +0 -252
- package/tools/reliability-check.ts +0 -25
- package/tools/retry-check.ts +0 -85
- package/tools/rewrite-declaration-extensions.ts +0 -98
- package/tools/runtime-check.ts +0 -165
- package/tools/runtime-deepseek-check.ts +0 -85
- package/tools/runtime-eval.ts +0 -358
- package/tools/scenario-check.ts +0 -161
- package/tools/scenario-incident.ts +0 -162
- package/tools/scoped-priors-check.ts +0 -35
- package/tools/scoped-priors-pooling.ts +0 -34
- package/tools/segment-ast-check.ts +0 -649
- package/tools/session-check.ts +0 -196
- package/tools/session-store-check.ts +0 -73
- package/tools/share-check.ts +0 -88
- package/tools/sign-check.ts +0 -95
- package/tools/signing-check.ts +0 -275
- package/tools/snapshot-demo.ts +0 -65
- package/tools/social-check.ts +0 -146
- package/tools/structure-compare-check.ts +0 -95
- package/tools/support/documentScanner.ts +0 -577
- package/tools/support/texScanner.ts +0 -631
- package/tools/support/workspaceScanner.ts +0 -476
- package/tools/team-check.ts +0 -163
- package/tools/team-demo.ts +0 -36
- package/tools/telemetry-check.ts +0 -44
- package/tools/tex-context-check.ts +0 -263
- package/tools/tool-gate-check.ts +0 -98
- package/tools/tree-structure-check.ts +0 -786
- package/tools/trust-flow-check.ts +0 -158
- package/tools/turn-store-check.ts +0 -57
- package/tools/unified-check.ts +0 -83
- package/tools/validate.ts +0 -309
- package/tools/wire-check.ts +0 -96
- package/tools/workspace-agent-check.ts +0 -486
- package/tools/workspace-agent-demo.ts +0 -62
- package/tools/workspace-agent-server.ts +0 -101
- package/tools/workspace-context-check.ts +0 -331
- package/tools/workspace-context.ts +0 -131
- package/tsconfig.build.json +0 -14
- package/tsconfig.json +0 -24
- package/tsconfig.tools.json +0 -31
- package/viz/context-ast.json +0 -1577
|
@@ -0,0 +1,750 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Visual Basic (.NET) outline strategy.
|
|
3
|
+
*
|
|
4
|
+
* VB has no braces and no significant indentation: a block opens on a
|
|
5
|
+
* declaration line (`Namespace`, `Class`, `Module`, `Sub`, `Property`, ...) and
|
|
6
|
+
* closes on a matching `End <keyword>` line. The scanner is therefore a bounded
|
|
7
|
+
* line machine with an `End` stack. It never builds a grammar or a symbol table;
|
|
8
|
+
* it reports declarations and their line ranges, which is what an outline needs.
|
|
9
|
+
*
|
|
10
|
+
* The module is self-contained on purpose. `outlineStrategies.ts` is not edited
|
|
11
|
+
* here, so `parseVisualBasic` and `VisualBasicStrategy` are exported for the host
|
|
12
|
+
* to register when it adopts VB. `parseVisualBasic` is a pure function of the
|
|
13
|
+
* decoded text, so a test can call it with a synthetic `OutlineParseInput` and
|
|
14
|
+
* does not need the default registry.
|
|
15
|
+
*
|
|
16
|
+
* Boundary rules (each one is covered by `tools/visualBasicOutlineCheck.ts`):
|
|
17
|
+
*
|
|
18
|
+
* - `'` and `REM` comments and `"..."` literals are masked before detection, so
|
|
19
|
+
* a `Class`/`Sub` inside a comment or a string never produces a node, and an
|
|
20
|
+
* `End Class` inside a string never closes a block;
|
|
21
|
+
* - a `<Attribute>` line produces no node, and a leading attribute list on a
|
|
22
|
+
* declaration line is skipped;
|
|
23
|
+
* - a trailing `_` continuation joins physical lines into one logical line, so
|
|
24
|
+
* a signature or `As` clause split across lines still declares the node and
|
|
25
|
+
* reports the physical lines it occupies;
|
|
26
|
+
* - `Sub`/`Function` become `method`/`function`, `Property` and field
|
|
27
|
+
* declarations (`Dim`/`Const` plus `As`, or an access modifier plus `As`)
|
|
28
|
+
* become `property`, and enum members become `constant`; an enum body reports
|
|
29
|
+
* constants only, so a malformed declaration inside it cannot leak a node;
|
|
30
|
+
* - `Delegate Sub`/`Delegate Function` become `type`, a plain `Event` becomes a
|
|
31
|
+
* one-line `property`, `Custom Event` spans to `End Event`, and an `Operator`
|
|
32
|
+
* overload becomes a `method` spanning to `End Operator`;
|
|
33
|
+
* - `Dim a As Integer, b As String` reports one node per declarator, and a
|
|
34
|
+
* `.vbs` file (VBScript is untyped) also reports a bare `Private _value`
|
|
35
|
+
* class field;
|
|
36
|
+
* - `Shared` (VB's `static`) and every other recognized modifier are reported
|
|
37
|
+
* lowercase, in source order;
|
|
38
|
+
* - a multi-line lambda (`Dim f As Func(Of Integer, Integer) =
|
|
39
|
+
* Function(x As Integer)`, `AddHandler x, Sub()`, `Return Function()`) pushes
|
|
40
|
+
* an anonymous `End` frame, so its `End Function` cannot close the enclosing
|
|
41
|
+
* method, while a single-line lambda pushes nothing;
|
|
42
|
+
* - an auto-implemented property (`Public Property Name As String` with no
|
|
43
|
+
* accessor line) stays a one-line node instead of swallowing the next member,
|
|
44
|
+
* while a property whose body starts with `Get`/`Set` spans to `End Property`;
|
|
45
|
+
* - a keyword is matched case-insensitively, because VB source is not
|
|
46
|
+
* case-sensitive.
|
|
47
|
+
*
|
|
48
|
+
* The recognized modifier chain is the documented set
|
|
49
|
+
* (`Public`/`Private`/`Protected`/`Friend`/`Shared`/`Overrides`/`Overloads`/
|
|
50
|
+
* `MustOverride`/`NotOverridable`/`Async`/`Partial`/`ReadOnly`/`WriteOnly`/
|
|
51
|
+
* `Default`/`Shadows`) plus the VB modifiers that would otherwise hide the
|
|
52
|
+
* declaration behind them (`MustInherit`, `NotInheritable`, `Overridable`,
|
|
53
|
+
* `WithEvents`, `Iterator`, `Custom`). All of them are reported lowercase.
|
|
54
|
+
*
|
|
55
|
+
* Remaining limits, documented rather than silently guessed:
|
|
56
|
+
*
|
|
57
|
+
* - a continuation that ends inside an unterminated string literal is treated
|
|
58
|
+
* as code up to the end of its physical line, because a VB literal cannot
|
|
59
|
+
* span lines;
|
|
60
|
+
* - a field without `As` in a `.vb` file (`Dim x` with no type) is not a node;
|
|
61
|
+
* VBScript-style untyped fields are recognized only for `.vbs`;
|
|
62
|
+
* - `End` frames are matched by keyword and popped from the innermost frame, so
|
|
63
|
+
* a file with a missing `End Sub`/`End Class` closes at EOF instead of
|
|
64
|
+
* guessing where the block ended.
|
|
65
|
+
*/
|
|
66
|
+
import { OutlineKeywordRegistry } from "./outlineKeywords.js";
|
|
67
|
+
/**
|
|
68
|
+
* Modifier chain, lowercase so classification is case-insensitive. The first
|
|
69
|
+
* block is the documented VB set; the second block carries modifiers that are
|
|
70
|
+
* common in real source and would otherwise hide the declaration they precede
|
|
71
|
+
* (`Custom` also marks a `Custom Event` block).
|
|
72
|
+
*/
|
|
73
|
+
const VisualBasicModifierWords = [
|
|
74
|
+
"public",
|
|
75
|
+
"private",
|
|
76
|
+
"protected",
|
|
77
|
+
"friend",
|
|
78
|
+
"shared",
|
|
79
|
+
"overrides",
|
|
80
|
+
"overloads",
|
|
81
|
+
"mustoverride",
|
|
82
|
+
"notoverridable",
|
|
83
|
+
"async",
|
|
84
|
+
"partial",
|
|
85
|
+
"readonly",
|
|
86
|
+
"writeonly",
|
|
87
|
+
"default",
|
|
88
|
+
"shadows",
|
|
89
|
+
"mustinherit",
|
|
90
|
+
"notinheritable",
|
|
91
|
+
"overridable",
|
|
92
|
+
"withevents",
|
|
93
|
+
"iterator",
|
|
94
|
+
"custom",
|
|
95
|
+
];
|
|
96
|
+
/**
|
|
97
|
+
* Local keyword registry. It is a private instance, not `DefaultOutlineKeywords`,
|
|
98
|
+
* because VB words are matched case-insensitively and include words the shared
|
|
99
|
+
* registry does not carry. Creating a local registry leaves the shared one
|
|
100
|
+
* untouched, so C#/TypeScript outlines keep their current behavior.
|
|
101
|
+
*/
|
|
102
|
+
const VisualBasicKeywords = new OutlineKeywordRegistry();
|
|
103
|
+
VisualBasicModifierWords.forEach((word) => {
|
|
104
|
+
VisualBasicKeywords.register("modifier", word);
|
|
105
|
+
});
|
|
106
|
+
["dim", "const"].forEach((word) => {
|
|
107
|
+
VisualBasicKeywords.register("variable", word);
|
|
108
|
+
});
|
|
109
|
+
/**
|
|
110
|
+
* Outline kind of each block keyword. `Structure` maps to `struct`, the
|
|
111
|
+
* language-neutral value for a value type.
|
|
112
|
+
*/
|
|
113
|
+
const VisualBasicBlockKinds = new Map([
|
|
114
|
+
["class", "class"],
|
|
115
|
+
["module", "module"],
|
|
116
|
+
["structure", "struct"],
|
|
117
|
+
["interface", "interface"],
|
|
118
|
+
["enum", "enum"],
|
|
119
|
+
]);
|
|
120
|
+
/**
|
|
121
|
+
* Kinds that own members. A namespace contains types but no members, and an
|
|
122
|
+
* enum owns `constant` members only.
|
|
123
|
+
*/
|
|
124
|
+
const VisualBasicMemberOwners = new Set(["class", "module", "struct", "interface"]);
|
|
125
|
+
/**
|
|
126
|
+
* File extensions the strategy claims. `.vb` is VB.NET source; `.vbs` is
|
|
127
|
+
* VBScript, which uses the same block-keyword grammar.
|
|
128
|
+
*/
|
|
129
|
+
const VisualBasicExtensions = [".vb", ".vbs"];
|
|
130
|
+
/**
|
|
131
|
+
* One identifier: a plain word or a bracketed escape such as `[Class]`. VB.NET
|
|
132
|
+
* identifiers are Unicode, so the word classes are `\p{L}`/`\p{N}` rather than
|
|
133
|
+
* `\w`, which is ASCII-only in JavaScript.
|
|
134
|
+
*/
|
|
135
|
+
const IdentifierPattern = String.raw `\[[^\]\r\n]+\]|[\p{L}_][\p{L}\p{N}_]*`;
|
|
136
|
+
/**
|
|
137
|
+
* Block-closing line. Only the keywords this scanner opens are listed, so
|
|
138
|
+
* `End If`, `End While`, `End Using` and `End Try` inside a body are ignored
|
|
139
|
+
* instead of closing the enclosing method.
|
|
140
|
+
*/
|
|
141
|
+
const EndBlockPattern = new RegExp(`^end\\s+(namespace|class|module|structure|interface|enum|sub|function|property|event|operator)\\b`, "iu");
|
|
142
|
+
/**
|
|
143
|
+
* `Namespace Acme.Tools` (a dotted name is captured whole).
|
|
144
|
+
*/
|
|
145
|
+
const NamespacePattern = new RegExp(`^namespace\\s+([\\p{L}_][\\p{L}\\p{N}_.]*)\\s*$`, "iu");
|
|
146
|
+
/**
|
|
147
|
+
* `Class`, `Module`, `Structure`, `Interface` and `Enum` block headers.
|
|
148
|
+
*/
|
|
149
|
+
const BlockPattern = new RegExp(`^(class|module|structure|interface|enum)\\s+(${IdentifierPattern})`, "iu");
|
|
150
|
+
/**
|
|
151
|
+
* `Declare Sub`/`Declare Function` (a P/Invoke signature without a body). The
|
|
152
|
+
* optional `Auto`/`Ansi`/`Unicode` charset word comes between `Declare` and the
|
|
153
|
+
* member keyword.
|
|
154
|
+
*/
|
|
155
|
+
const DeclarePattern = new RegExp(`^declare\\s+(?:(?:auto|ansi|unicode)\\s+)*(sub|function)\\s+(${IdentifierPattern})`, "iu");
|
|
156
|
+
/**
|
|
157
|
+
* `Sub`/`Function` member headers.
|
|
158
|
+
*/
|
|
159
|
+
const MethodPattern = new RegExp(`^(sub|function)\\s+(${IdentifierPattern})`, "iu");
|
|
160
|
+
/**
|
|
161
|
+
* `Property` headers. The optional `Get`/`Let`/`Set` word is VB6/VBScript
|
|
162
|
+
* syntax (`Public Property Get Name()`); `.vbs` files use it, and the block
|
|
163
|
+
* still closes on `End Property`.
|
|
164
|
+
*/
|
|
165
|
+
const PropertyPattern = new RegExp(`^property\\s+(?:(get|let|set)\\s+)?(${IdentifierPattern})`, "iu");
|
|
166
|
+
/**
|
|
167
|
+
* `Delegate Sub`/`Delegate Function`: a delegate type declaration. It is a
|
|
168
|
+
* type, so it maps to the `type` kind instead of a method.
|
|
169
|
+
*/
|
|
170
|
+
const DelegatePattern = new RegExp(`^delegate\\s+(sub|function)\\s+(${IdentifierPattern})`, "iu");
|
|
171
|
+
/**
|
|
172
|
+
* `Event Name As Type`. A plain event is a member declaration (a `property`);
|
|
173
|
+
* a `Custom Event` is a block closed by `End Event`.
|
|
174
|
+
*/
|
|
175
|
+
const EventPattern = new RegExp(`^event\\s+(${IdentifierPattern})`, "iu");
|
|
176
|
+
/**
|
|
177
|
+
* `Operator +`, `Operator CType`, ...: VB declares an operator overload as a
|
|
178
|
+
* shared method with a body, closed by `End Operator`. The symbol is captured up
|
|
179
|
+
* to its parameter list.
|
|
180
|
+
*/
|
|
181
|
+
const OperatorPattern = new RegExp(`^operator\\s+([^\\s(]+)`, "iu");
|
|
182
|
+
/**
|
|
183
|
+
* Field declaration: a name (optionally followed by an array suffix) and an
|
|
184
|
+
* `As <type>` clause. The modifier chain and any `Dim`/`Const` word were removed
|
|
185
|
+
* before this pattern runs.
|
|
186
|
+
*/
|
|
187
|
+
const FieldPattern = new RegExp(`^(${IdentifierPattern})\\s*(?:\\([^)]*\\))?\\s+as\\s+\\S`, "iu");
|
|
188
|
+
/**
|
|
189
|
+
* Untyped VBScript field: a bare name with an optional initializer.
|
|
190
|
+
*/
|
|
191
|
+
const UntypedFieldPattern = new RegExp(`^(${IdentifierPattern})\\s*(?:=\\s*.*)?$`, "iu");
|
|
192
|
+
/**
|
|
193
|
+
* Enum member: a name with an optional initializer.
|
|
194
|
+
*/
|
|
195
|
+
const EnumMemberPattern = new RegExp(`^(${IdentifierPattern})\\s*(?:=\\s*(.*))?$`, "iu");
|
|
196
|
+
/**
|
|
197
|
+
* Accessor line that opens a full property body: `Get`, `Set`, or the
|
|
198
|
+
* parenthesized `Set(value As String)` form.
|
|
199
|
+
*/
|
|
200
|
+
const AccessorPattern = /^(?:get|set)\s*(?:\(.*\))?$/i;
|
|
201
|
+
/**
|
|
202
|
+
* A lambda keyword that starts a value or a statement: `= Sub()`, `, Function(x)`
|
|
203
|
+
* or `Return Function(x)`. A plain member declaration never matches, because its
|
|
204
|
+
* keyword is not preceded by `=`, `(`, `,` or `Return`.
|
|
205
|
+
*/
|
|
206
|
+
const LambdaOpenerPattern = /(?:^|[=(,]\s*|\breturn\s+)(?:async\s+)?(sub|function)\s*\(/iu;
|
|
207
|
+
/**
|
|
208
|
+
* One or more leading `<Attribute(...)>` groups.
|
|
209
|
+
*/
|
|
210
|
+
const AttributePrefixPattern = /^(?:<[^<>]*>\s*)+/u;
|
|
211
|
+
/**
|
|
212
|
+
* One leading word followed by whitespace.
|
|
213
|
+
*/
|
|
214
|
+
const WordPattern = /^([\p{L}_][\p{L}\p{N}_]*)\s+/u;
|
|
215
|
+
/**
|
|
216
|
+
* Last path segment, so a matcher also accepts a full path.
|
|
217
|
+
*/
|
|
218
|
+
const baseNameOf = (path) => {
|
|
219
|
+
const slash = path.lastIndexOf("/");
|
|
220
|
+
return slash === -1 ? path : path.slice(slash + 1);
|
|
221
|
+
};
|
|
222
|
+
/**
|
|
223
|
+
* Whether a base name carries one of the given extensions, case-insensitively.
|
|
224
|
+
*/
|
|
225
|
+
const hasExtension = (name, extensions) => {
|
|
226
|
+
const dot = name.lastIndexOf(".");
|
|
227
|
+
if (dot <= 0 || dot === name.length - 1) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
return extensions.includes(name.slice(dot).toLowerCase());
|
|
231
|
+
};
|
|
232
|
+
/**
|
|
233
|
+
* Split a decoded text into physical lines: `\n` separates, a trailing newline
|
|
234
|
+
* does not add a phantom line, and a `\r` before the `\n` is dropped so CRLF and
|
|
235
|
+
* LF files report the same line numbers.
|
|
236
|
+
*/
|
|
237
|
+
const splitSourceLines = (text) => {
|
|
238
|
+
if (text.length === 0) {
|
|
239
|
+
return [];
|
|
240
|
+
}
|
|
241
|
+
const lines = text.split("\n");
|
|
242
|
+
if (lines[lines.length - 1] === "") {
|
|
243
|
+
lines.pop();
|
|
244
|
+
}
|
|
245
|
+
return lines.map((line) => (line.endsWith("\r") ? line.slice(0, -1) : line));
|
|
246
|
+
};
|
|
247
|
+
/**
|
|
248
|
+
* Whether a code line ends with the VB line-continuation underscore. The
|
|
249
|
+
* underscore must follow whitespace, so an identifier such as `total_` is not a
|
|
250
|
+
* continuation.
|
|
251
|
+
*/
|
|
252
|
+
const isContinuation = (code) => /(?:^|[ \t])_$/u.test(code.trimEnd());
|
|
253
|
+
/**
|
|
254
|
+
* Remove the continuation underscore and the whitespace around it.
|
|
255
|
+
*/
|
|
256
|
+
const trimContinuation = (code) => code.trimEnd().slice(0, -1).trimEnd();
|
|
257
|
+
/**
|
|
258
|
+
* Whether the word at one offset starts a `REM` comment.
|
|
259
|
+
*
|
|
260
|
+
* `REM` is a comment only at the start of a statement, so `Remember` and
|
|
261
|
+
* `total = a + Rem` stay code. The caller has already handled string literals,
|
|
262
|
+
* so a quoted `"REM"` never reaches this function.
|
|
263
|
+
*/
|
|
264
|
+
const isRemComment = (line, index) => {
|
|
265
|
+
if (line.slice(index, index + 3).toLowerCase() !== "rem") {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
const after = line.slice(index + 3, index + 4);
|
|
269
|
+
if (after.length > 0 && !/[ \t:]/.test(after)) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
for (let cursor = index - 1; cursor >= 0; cursor -= 1) {
|
|
273
|
+
const previous = line[cursor];
|
|
274
|
+
if (previous === " " || previous === "\t") {
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
return previous === ":";
|
|
278
|
+
}
|
|
279
|
+
return true;
|
|
280
|
+
};
|
|
281
|
+
/**
|
|
282
|
+
* Build the code and detection views of one physical line.
|
|
283
|
+
*
|
|
284
|
+
* A doubled quote (`""`) is the VB escape inside a literal; an unterminated
|
|
285
|
+
* literal runs to the end of the line because a VB literal cannot span lines.
|
|
286
|
+
* The trailing comment is dropped from both views, which is what keeps a quoted
|
|
287
|
+
* or commented `End Class` out of the block stack.
|
|
288
|
+
*/
|
|
289
|
+
const maskLine = (raw) => {
|
|
290
|
+
const code = [];
|
|
291
|
+
const masked = [];
|
|
292
|
+
let inString = false;
|
|
293
|
+
let index = 0;
|
|
294
|
+
while (index < raw.length) {
|
|
295
|
+
const character = raw[index];
|
|
296
|
+
if (inString) {
|
|
297
|
+
if (character !== '"') {
|
|
298
|
+
code.push(character);
|
|
299
|
+
masked.push(" ");
|
|
300
|
+
index += 1;
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
if (raw[index + 1] === '"') {
|
|
304
|
+
code.push('""');
|
|
305
|
+
masked.push(" ");
|
|
306
|
+
index += 2;
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
inString = false;
|
|
310
|
+
code.push(character);
|
|
311
|
+
masked.push(character);
|
|
312
|
+
index += 1;
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
if (character === '"') {
|
|
316
|
+
inString = true;
|
|
317
|
+
code.push(character);
|
|
318
|
+
masked.push(character);
|
|
319
|
+
index += 1;
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
if (character === "'" || isRemComment(raw, index)) {
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
code.push(character);
|
|
326
|
+
masked.push(character);
|
|
327
|
+
index += 1;
|
|
328
|
+
}
|
|
329
|
+
return { code: code.join(""), masked: masked.join("") };
|
|
330
|
+
};
|
|
331
|
+
/**
|
|
332
|
+
* Merge physical lines joined by a trailing `_` into logical lines. A
|
|
333
|
+
* declaration continued over several lines therefore declares exactly once and
|
|
334
|
+
* still reports the physical span it occupies.
|
|
335
|
+
*/
|
|
336
|
+
const readLogicalLines = (rawLines) => {
|
|
337
|
+
const logical = [];
|
|
338
|
+
let index = 0;
|
|
339
|
+
while (index < rawLines.length) {
|
|
340
|
+
const startLine = index + 1;
|
|
341
|
+
const first = maskLine(rawLines[index]);
|
|
342
|
+
let code = first.code;
|
|
343
|
+
let masked = first.masked;
|
|
344
|
+
let endLine = startLine;
|
|
345
|
+
while (isContinuation(code)) {
|
|
346
|
+
index += 1;
|
|
347
|
+
if (index >= rawLines.length) {
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
const next = maskLine(rawLines[index]);
|
|
351
|
+
code = `${trimContinuation(code)} ${next.code}`;
|
|
352
|
+
masked = `${trimContinuation(masked)} ${next.masked}`;
|
|
353
|
+
endLine = index + 1;
|
|
354
|
+
}
|
|
355
|
+
logical.push({ code, masked, startLine, endLine });
|
|
356
|
+
index += 1;
|
|
357
|
+
}
|
|
358
|
+
return logical;
|
|
359
|
+
};
|
|
360
|
+
/**
|
|
361
|
+
* Whether a line carries code once leading attributes are removed. Attribute-only
|
|
362
|
+
* and comment-only lines are not significant: they neither declare a node nor
|
|
363
|
+
* count as the next line of a property body.
|
|
364
|
+
*/
|
|
365
|
+
const isSignificant = (masked) => masked.replace(AttributePrefixPattern, "").trim().length > 0;
|
|
366
|
+
/**
|
|
367
|
+
* Strip a leading attribute list, the modifier chain and at most one `Dim`/
|
|
368
|
+
* `Const` word from a masked line. Modifiers come back lowercase in source
|
|
369
|
+
* order; the remaining text starts at the declaration keyword.
|
|
370
|
+
*/
|
|
371
|
+
const readHeader = (masked) => {
|
|
372
|
+
let rest = masked.replace(AttributePrefixPattern, "").trim();
|
|
373
|
+
const modifiers = [];
|
|
374
|
+
for (;;) {
|
|
375
|
+
const match = WordPattern.exec(rest);
|
|
376
|
+
if (match === null) {
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
const word = match[1].toLowerCase();
|
|
380
|
+
if (!VisualBasicKeywords.isModifier(word)) {
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
modifiers.push(word);
|
|
384
|
+
rest = rest.slice(match[0].length).trim();
|
|
385
|
+
}
|
|
386
|
+
const keyword = WordPattern.exec(rest);
|
|
387
|
+
if (keyword !== null && VisualBasicKeywords.isVariableKeyword(keyword[1].toLowerCase())) {
|
|
388
|
+
rest = rest.slice(keyword[0].length).trim();
|
|
389
|
+
}
|
|
390
|
+
return { modifiers, rest };
|
|
391
|
+
};
|
|
392
|
+
/**
|
|
393
|
+
* Strip the brackets of an escaped identifier so the label reads as the name.
|
|
394
|
+
*/
|
|
395
|
+
const normalizeIdentifier = (raw) => raw.startsWith("[") && raw.endsWith("]") ? raw.slice(1, -1).trim() : raw;
|
|
396
|
+
/**
|
|
397
|
+
* Split a field declaration body on the commas that separate declarators.
|
|
398
|
+
* A comma inside parentheses (an initializer, `New List(Of String)`), braces (an
|
|
399
|
+
* array literal) or brackets does not separate declarators.
|
|
400
|
+
*/
|
|
401
|
+
const splitDeclarators = (body) => {
|
|
402
|
+
const parts = [];
|
|
403
|
+
let depth = 0;
|
|
404
|
+
let start = 0;
|
|
405
|
+
for (let index = 0; index < body.length; index += 1) {
|
|
406
|
+
const character = body[index];
|
|
407
|
+
if (character === "(" || character === "{" || character === "[") {
|
|
408
|
+
depth += 1;
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
if (character === ")" || character === "}" || character === "]") {
|
|
412
|
+
depth = Math.max(0, depth - 1);
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
if (character === "," && depth === 0) {
|
|
416
|
+
parts.push(body.slice(start, index));
|
|
417
|
+
start = index + 1;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
parts.push(body.slice(start));
|
|
421
|
+
return parts;
|
|
422
|
+
};
|
|
423
|
+
/**
|
|
424
|
+
* Whether the next significant line starts a property accessor. VB requires the
|
|
425
|
+
* accessor to be the first statement of a full property, so one line of
|
|
426
|
+
* lookahead separates it from an auto-implemented property.
|
|
427
|
+
*/
|
|
428
|
+
const startsAccessor = (lines, nextCode, index) => {
|
|
429
|
+
const next = nextCode[index];
|
|
430
|
+
if (next === -1) {
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
return AccessorPattern.test(readHeader(lines[next].masked).rest);
|
|
434
|
+
};
|
|
435
|
+
/**
|
|
436
|
+
* End keyword of an anonymous multi-line lambda opened on one line, or
|
|
437
|
+
* `undefined` when the line holds no lambda or closes it on the same line.
|
|
438
|
+
*
|
|
439
|
+
* The parameter list and an optional `As <type>` return clause are the whole
|
|
440
|
+
* tail of a multi-line lambda header; anything else means the body starts on
|
|
441
|
+
* the same line and no `End` frame is needed.
|
|
442
|
+
*/
|
|
443
|
+
const lambdaEndKeyword = (masked) => {
|
|
444
|
+
const open = LambdaOpenerPattern.exec(masked);
|
|
445
|
+
if (open === null) {
|
|
446
|
+
return undefined;
|
|
447
|
+
}
|
|
448
|
+
let depth = 0;
|
|
449
|
+
let close = -1;
|
|
450
|
+
for (let index = open.index + open[0].length - 1; index < masked.length; index += 1) {
|
|
451
|
+
const character = masked[index];
|
|
452
|
+
if (character === "(") {
|
|
453
|
+
depth += 1;
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
if (character === ")") {
|
|
457
|
+
depth -= 1;
|
|
458
|
+
if (depth === 0) {
|
|
459
|
+
close = index;
|
|
460
|
+
break;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
if (close === -1) {
|
|
465
|
+
return undefined;
|
|
466
|
+
}
|
|
467
|
+
const rest = masked.slice(close + 1).trim();
|
|
468
|
+
if (rest.length === 0 || /^as\s+/i.test(rest)) {
|
|
469
|
+
return open[1].toLowerCase();
|
|
470
|
+
}
|
|
471
|
+
return undefined;
|
|
472
|
+
};
|
|
473
|
+
/**
|
|
474
|
+
* Whether a `Sub`/`Function` line opens a body. An interface signature and a
|
|
475
|
+
* `MustOverride` declaration have no `End Sub`/`End Function` line; a `Declare`
|
|
476
|
+
* statement is handled by its own pattern.
|
|
477
|
+
*/
|
|
478
|
+
const declarationHasBody = (frames, modifiers) => {
|
|
479
|
+
if (frames.length > 0 && frames[frames.length - 1].node?.kind === "interface") {
|
|
480
|
+
return false;
|
|
481
|
+
}
|
|
482
|
+
return !modifiers.includes("mustoverride");
|
|
483
|
+
};
|
|
484
|
+
/**
|
|
485
|
+
* Nearest open block that owns members.
|
|
486
|
+
*/
|
|
487
|
+
const innermostContainer = (frames) => {
|
|
488
|
+
for (let index = frames.length - 1; index >= 0; index -= 1) {
|
|
489
|
+
const node = frames[index].node;
|
|
490
|
+
if (frames[index].container && node !== (void 0)) {
|
|
491
|
+
return node;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return undefined;
|
|
495
|
+
};
|
|
496
|
+
/**
|
|
497
|
+
* Number of open containers, which is exactly the depth a declaration reports.
|
|
498
|
+
*/
|
|
499
|
+
const containerDepth = (frames) => {
|
|
500
|
+
let count = 0;
|
|
501
|
+
for (let index = 0; index < frames.length; index += 1) {
|
|
502
|
+
if (frames[index].container) {
|
|
503
|
+
count += 1;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
return count;
|
|
507
|
+
};
|
|
508
|
+
/**
|
|
509
|
+
* Build one draft node; `endLine` is the last physical line of the declaration
|
|
510
|
+
* (a continued signature spans several) and is patched when a block closes.
|
|
511
|
+
*/
|
|
512
|
+
const createDraft = (label, kind, startLine, endLine, depth, detail, modifiers) => ({ label, kind, startLine, endLine, depth, detail, modifiers: [...modifiers], children: [] });
|
|
513
|
+
/**
|
|
514
|
+
* Attach one draft to its enclosing container, or to the file root.
|
|
515
|
+
*/
|
|
516
|
+
const attachDraft = (roots, parent, node) => {
|
|
517
|
+
if (parent === (void 0)) {
|
|
518
|
+
roots.push(node);
|
|
519
|
+
}
|
|
520
|
+
else {
|
|
521
|
+
parent.children.push(node);
|
|
522
|
+
}
|
|
523
|
+
};
|
|
524
|
+
/**
|
|
525
|
+
* Pop the innermost frame that an `End <keyword>` line closes. A frame still
|
|
526
|
+
* open above it ends on the previous line, so a malformed file still yields
|
|
527
|
+
* contained ranges. A keyword no frame carries (`End If`, `End While`, ...) is
|
|
528
|
+
* ignored, and a lambda frame carries no node to patch.
|
|
529
|
+
*/
|
|
530
|
+
const closeBlock = (frames, keyword, line) => {
|
|
531
|
+
for (let index = frames.length - 1; index >= 0; index -= 1) {
|
|
532
|
+
if (frames[index].end !== keyword) {
|
|
533
|
+
continue;
|
|
534
|
+
}
|
|
535
|
+
for (let above = frames.length - 1; above > index; above -= 1) {
|
|
536
|
+
const node = frames[above].node;
|
|
537
|
+
if (node !== (void 0)) {
|
|
538
|
+
node.endLine = Math.max(node.startLine, line - 1);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
const node = frames[index].node;
|
|
542
|
+
if (node !== (void 0)) {
|
|
543
|
+
node.endLine = Math.max(node.startLine, line);
|
|
544
|
+
}
|
|
545
|
+
frames.length = index;
|
|
546
|
+
return;
|
|
547
|
+
}
|
|
548
|
+
};
|
|
549
|
+
/**
|
|
550
|
+
* Convert a draft tree into the public node shape.
|
|
551
|
+
*
|
|
552
|
+
* Byte offsets stay at zero because a strategy only owns line numbers: the
|
|
553
|
+
* registry resolves the anchor and the authoritative UTF-8 byte range from
|
|
554
|
+
* `ByteLineIndex`. The empty `path` is likewise filled by the registry.
|
|
555
|
+
*/
|
|
556
|
+
const finalizeDraft = (draft) => {
|
|
557
|
+
const startLine = Math.max(1, draft.startLine);
|
|
558
|
+
const endLine = Math.max(startLine, draft.endLine);
|
|
559
|
+
return {
|
|
560
|
+
isFile: false,
|
|
561
|
+
isDirectory: false,
|
|
562
|
+
path: "",
|
|
563
|
+
type: draft.kind,
|
|
564
|
+
range: { startByte: 0n, endByte: 0n, startLine: BigInt(startLine), endLine: BigInt(endLine) },
|
|
565
|
+
label: draft.label,
|
|
566
|
+
depth: Math.max(0, draft.depth),
|
|
567
|
+
...(draft.modifiers.length === 0 ? {} : { modifiers: [...draft.modifiers] }),
|
|
568
|
+
...(draft.detail.length === 0 ? {} : { detail: draft.detail }),
|
|
569
|
+
children: draft.children.map(finalizeDraft),
|
|
570
|
+
};
|
|
571
|
+
};
|
|
572
|
+
/**
|
|
573
|
+
* Parse Visual Basic source text.
|
|
574
|
+
*
|
|
575
|
+
* The walk is single pass with an `End` stack. Blocks come from the source's own
|
|
576
|
+
* delimiters: `Namespace`, `Class`, `Module`, `Structure`, `Interface` and
|
|
577
|
+
* `Enum` open containers, `Sub`/`Function`/`Property` open bodies, and the
|
|
578
|
+
* matching `End` line gives the node's `endLine`. Members attach to the nearest
|
|
579
|
+
* open container, not to the nearest open body, so a property or method body
|
|
580
|
+
* never becomes a parent of the next member.
|
|
581
|
+
*
|
|
582
|
+
* @param input - Decoded VB text and its line index (the index is not needed by
|
|
583
|
+
* this line-based scanner, but the input contract requires it); `input.path`
|
|
584
|
+
* also decides whether untyped VBScript fields are accepted.
|
|
585
|
+
* @returns Namespace/type/member tree; an empty list for an empty file.
|
|
586
|
+
*/
|
|
587
|
+
export const parseVisualBasic = (input) => {
|
|
588
|
+
const text = input.text.charCodeAt(0) === 0xfeff ? input.text.slice(1) : input.text;
|
|
589
|
+
const rawLines = splitSourceLines(text);
|
|
590
|
+
const total = rawLines.length;
|
|
591
|
+
if (total === 0) {
|
|
592
|
+
return [];
|
|
593
|
+
}
|
|
594
|
+
const lines = readLogicalLines(rawLines);
|
|
595
|
+
const scriptMode = hasExtension(baseNameOf(input.path), [".vbs"]);
|
|
596
|
+
const nextCode = new Array(lines.length).fill(-1);
|
|
597
|
+
let upcoming = -1;
|
|
598
|
+
for (let index = lines.length - 1; index >= 0; index -= 1) {
|
|
599
|
+
nextCode[index] = upcoming;
|
|
600
|
+
if (isSignificant(lines[index].masked)) {
|
|
601
|
+
upcoming = index;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
const roots = [];
|
|
605
|
+
const frames = [];
|
|
606
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
607
|
+
const line = lines[index];
|
|
608
|
+
const startLine = line.startLine;
|
|
609
|
+
const stripped = line.masked.replace(AttributePrefixPattern, "").trim();
|
|
610
|
+
if (stripped.length === 0) {
|
|
611
|
+
continue;
|
|
612
|
+
}
|
|
613
|
+
const code = line.code.trim();
|
|
614
|
+
const endMatch = EndBlockPattern.exec(stripped);
|
|
615
|
+
if (endMatch !== null) {
|
|
616
|
+
closeBlock(frames, endMatch[1].toLowerCase(), startLine);
|
|
617
|
+
continue;
|
|
618
|
+
}
|
|
619
|
+
const header = readHeader(stripped);
|
|
620
|
+
if (header.rest.length === 0) {
|
|
621
|
+
continue;
|
|
622
|
+
}
|
|
623
|
+
const modifiers = header.modifiers;
|
|
624
|
+
const parent = innermostContainer(frames);
|
|
625
|
+
const depth = containerDepth(frames);
|
|
626
|
+
const namespaceMatch = NamespacePattern.exec(header.rest);
|
|
627
|
+
if (namespaceMatch !== null) {
|
|
628
|
+
const node = createDraft(namespaceMatch[1], "namespace", startLine, line.endLine, depth, code, modifiers);
|
|
629
|
+
attachDraft(roots, parent, node);
|
|
630
|
+
frames.push({ end: "namespace", container: true, node });
|
|
631
|
+
continue;
|
|
632
|
+
}
|
|
633
|
+
const blockMatch = BlockPattern.exec(header.rest);
|
|
634
|
+
if (blockMatch !== null) {
|
|
635
|
+
const keyword = blockMatch[1].toLowerCase();
|
|
636
|
+
const kind = VisualBasicBlockKinds.get(keyword) ?? "class";
|
|
637
|
+
const node = createDraft(normalizeIdentifier(blockMatch[2]), kind, startLine, line.endLine, depth, code, modifiers);
|
|
638
|
+
attachDraft(roots, parent, node);
|
|
639
|
+
frames.push({ end: keyword, container: true, node });
|
|
640
|
+
continue;
|
|
641
|
+
}
|
|
642
|
+
const insideEnum = frames.length > 0 && frames[frames.length - 1].node?.kind === "enum";
|
|
643
|
+
if (insideEnum) {
|
|
644
|
+
const memberMatch = EnumMemberPattern.exec(header.rest);
|
|
645
|
+
if (memberMatch !== null) {
|
|
646
|
+
const label = normalizeIdentifier(memberMatch[1]);
|
|
647
|
+
if (label.length > 0) {
|
|
648
|
+
attachDraft(roots, parent, createDraft(label, "constant", startLine, line.endLine, depth, code, modifiers));
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
continue;
|
|
652
|
+
}
|
|
653
|
+
const declareMatch = DeclarePattern.exec(header.rest);
|
|
654
|
+
if (declareMatch !== null) {
|
|
655
|
+
const kind = declareMatch[1].toLowerCase() === "sub" ? "method" : "function";
|
|
656
|
+
attachDraft(roots, parent, createDraft(normalizeIdentifier(declareMatch[2]), kind, startLine, line.endLine, depth, code, modifiers));
|
|
657
|
+
continue;
|
|
658
|
+
}
|
|
659
|
+
const methodMatch = MethodPattern.exec(header.rest);
|
|
660
|
+
if (methodMatch !== null) {
|
|
661
|
+
const keyword = methodMatch[1].toLowerCase();
|
|
662
|
+
const kind = keyword === "sub" ? "method" : "function";
|
|
663
|
+
const node = createDraft(normalizeIdentifier(methodMatch[2]), kind, startLine, line.endLine, depth, code, modifiers);
|
|
664
|
+
attachDraft(roots, parent, node);
|
|
665
|
+
if (declarationHasBody(frames, modifiers)) {
|
|
666
|
+
frames.push({ end: keyword, container: false, node });
|
|
667
|
+
}
|
|
668
|
+
continue;
|
|
669
|
+
}
|
|
670
|
+
const propertyMatch = PropertyPattern.exec(header.rest);
|
|
671
|
+
if (propertyMatch !== null) {
|
|
672
|
+
const accessor = (propertyMatch[1] ?? "").toLowerCase();
|
|
673
|
+
const node = createDraft(normalizeIdentifier(propertyMatch[2]), "property", startLine, line.endLine, depth, code, modifiers);
|
|
674
|
+
attachDraft(roots, parent, node);
|
|
675
|
+
if (accessor.length > 0 || startsAccessor(lines, nextCode, index)) {
|
|
676
|
+
frames.push({ end: "property", container: false, node });
|
|
677
|
+
}
|
|
678
|
+
continue;
|
|
679
|
+
}
|
|
680
|
+
const delegateMatch = DelegatePattern.exec(header.rest);
|
|
681
|
+
if (delegateMatch !== null) {
|
|
682
|
+
attachDraft(roots, parent, createDraft(normalizeIdentifier(delegateMatch[2]), "type", startLine, line.endLine, depth, code, modifiers));
|
|
683
|
+
continue;
|
|
684
|
+
}
|
|
685
|
+
const eventMatch = EventPattern.exec(header.rest);
|
|
686
|
+
if (eventMatch !== null) {
|
|
687
|
+
const node = createDraft(normalizeIdentifier(eventMatch[1]), "property", startLine, line.endLine, depth, code, modifiers);
|
|
688
|
+
attachDraft(roots, parent, node);
|
|
689
|
+
if (modifiers.includes("custom")) {
|
|
690
|
+
frames.push({ end: "event", container: false, node });
|
|
691
|
+
}
|
|
692
|
+
continue;
|
|
693
|
+
}
|
|
694
|
+
const operatorMatch = OperatorPattern.exec(header.rest);
|
|
695
|
+
if (operatorMatch !== null) {
|
|
696
|
+
const node = createDraft(`Operator ${operatorMatch[1]}`, "method", startLine, line.endLine, depth, code, modifiers);
|
|
697
|
+
attachDraft(roots, parent, node);
|
|
698
|
+
frames.push({ end: "operator", container: false, node });
|
|
699
|
+
continue;
|
|
700
|
+
}
|
|
701
|
+
const innermost = frames.length === 0 ? undefined : frames[frames.length - 1];
|
|
702
|
+
const owner = innermost !== (void 0) && innermost.container ? innermost.node : undefined;
|
|
703
|
+
if (owner !== (void 0) && VisualBasicMemberOwners.has(owner.kind)) {
|
|
704
|
+
const declarators = splitDeclarators(header.rest);
|
|
705
|
+
for (let declaratorIndex = 0; declaratorIndex < declarators.length; declaratorIndex += 1) {
|
|
706
|
+
const declarator = declarators[declaratorIndex].trim();
|
|
707
|
+
if (declarator.length === 0) {
|
|
708
|
+
continue;
|
|
709
|
+
}
|
|
710
|
+
const fieldMatch = FieldPattern.exec(declarator);
|
|
711
|
+
const untypedMatch = fieldMatch === null && scriptMode ? UntypedFieldPattern.exec(declarator) : null;
|
|
712
|
+
const matched = fieldMatch ?? untypedMatch;
|
|
713
|
+
if (matched === null) {
|
|
714
|
+
continue;
|
|
715
|
+
}
|
|
716
|
+
const label = normalizeIdentifier(matched[1]);
|
|
717
|
+
if (label.length === 0) {
|
|
718
|
+
continue;
|
|
719
|
+
}
|
|
720
|
+
owner.children.push(createDraft(label, "property", startLine, line.endLine, depth, code, modifiers));
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
const lambdaEnd = lambdaEndKeyword(stripped);
|
|
724
|
+
if (lambdaEnd !== (void 0)) {
|
|
725
|
+
frames.push({ end: lambdaEnd, container: false });
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
for (let index = frames.length - 1; index >= 0; index -= 1) {
|
|
729
|
+
const node = frames[index].node;
|
|
730
|
+
if (node !== (void 0)) {
|
|
731
|
+
node.endLine = Math.max(node.startLine, total);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
return roots.map(finalizeDraft);
|
|
735
|
+
};
|
|
736
|
+
/**
|
|
737
|
+
* Registry adapter for the VB parser.
|
|
738
|
+
*
|
|
739
|
+
* `id` is the stable strategy tag written to `OutlineResult.strategy` (camelCase
|
|
740
|
+
* like `plainText`); `language` is the stable lowercase tag written to
|
|
741
|
+
* `OutlineResult.language`. Both `.vb` and `.vbs` select this strategy, and
|
|
742
|
+
* `.vbproj` deliberately does not, so the XML project strategy keeps that file.
|
|
743
|
+
*/
|
|
744
|
+
export const VisualBasicStrategy = {
|
|
745
|
+
id: "visualBasic",
|
|
746
|
+
category: "code",
|
|
747
|
+
language: "visualbasic",
|
|
748
|
+
matches: (input) => hasExtension(baseNameOf(input.name), VisualBasicExtensions),
|
|
749
|
+
parse: parseVisualBasic,
|
|
750
|
+
};
|