@skillsmith/core 0.9.0 → 0.11.0
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 +16 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts +23 -0
- package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts.map +1 -1
- package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js +137 -0
- package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js.map +1 -1
- package/dist/src/analysis/tree-sitter/pythonIncremental.js +83 -10
- package/dist/src/analysis/tree-sitter/pythonIncremental.js.map +1 -1
- package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js +6 -1
- package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js.map +1 -1
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +6 -0
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/client.test.d.ts +9 -0
- package/dist/src/api/client.test.d.ts.map +1 -0
- package/dist/src/api/client.test.js +81 -0
- package/dist/src/api/client.test.js.map +1 -0
- package/dist/src/config/audit-notify-state.d.ts +46 -0
- package/dist/src/config/audit-notify-state.d.ts.map +1 -0
- package/dist/src/config/audit-notify-state.js +55 -0
- package/dist/src/config/audit-notify-state.js.map +1 -0
- package/dist/src/config/audit-notify-state.test.d.ts +9 -0
- package/dist/src/config/audit-notify-state.test.d.ts.map +1 -0
- package/dist/src/config/audit-notify-state.test.js +63 -0
- package/dist/src/config/audit-notify-state.test.js.map +1 -0
- package/dist/src/config/index.d.ts +10 -0
- package/dist/src/config/index.d.ts.map +1 -1
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/exports/services.d.ts +3 -1
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.js +9 -1
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/index.d.ts +6 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/install/agent-config-merge.json-array.d.ts +29 -0
- package/dist/src/install/agent-config-merge.json-array.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.json-array.js +100 -0
- package/dist/src/install/agent-config-merge.json-array.js.map +1 -0
- package/dist/src/install/agent-config-merge.json.d.ts +37 -0
- package/dist/src/install/agent-config-merge.json.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.json.js +134 -0
- package/dist/src/install/agent-config-merge.json.js.map +1 -0
- package/dist/src/install/agent-config-merge.toml-block.d.ts +48 -0
- package/dist/src/install/agent-config-merge.toml-block.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.toml-block.js +107 -0
- package/dist/src/install/agent-config-merge.toml-block.js.map +1 -0
- package/dist/src/install/agent-config-merge.types.d.ts +87 -0
- package/dist/src/install/agent-config-merge.types.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.types.js +83 -0
- package/dist/src/install/agent-config-merge.types.js.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.d.ts +46 -0
- package/dist/src/install/agent-config-merge.yaml.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.js +133 -0
- package/dist/src/install/agent-config-merge.yaml.js.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.test.d.ts +2 -0
- package/dist/src/install/agent-config-merge.yaml.test.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.test.js +210 -0
- package/dist/src/install/agent-config-merge.yaml.test.js.map +1 -0
- package/dist/src/install/agent-harness-targets.d.ts +98 -0
- package/dist/src/install/agent-harness-targets.d.ts.map +1 -0
- package/dist/src/install/agent-harness-targets.js +154 -0
- package/dist/src/install/agent-harness-targets.js.map +1 -0
- package/dist/src/install/agent-home-relocate.d.ts +29 -0
- package/dist/src/install/agent-home-relocate.d.ts.map +1 -0
- package/dist/src/install/agent-home-relocate.js +38 -0
- package/dist/src/install/agent-home-relocate.js.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.d.ts +55 -0
- package/dist/src/install/agent-manifest-path-guard.d.ts.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.js +109 -0
- package/dist/src/install/agent-manifest-path-guard.js.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.test.d.ts +2 -0
- package/dist/src/install/agent-manifest-path-guard.test.d.ts.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.test.js +72 -0
- package/dist/src/install/agent-manifest-path-guard.test.js.map +1 -0
- package/dist/src/install/agent-manifest.d.ts +58 -0
- package/dist/src/install/agent-manifest.d.ts.map +1 -0
- package/dist/src/install/agent-manifest.js +103 -0
- package/dist/src/install/agent-manifest.js.map +1 -0
- package/dist/src/install/agent-pack-installer.d.ts +39 -0
- package/dist/src/install/agent-pack-installer.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.entry.d.ts +55 -0
- package/dist/src/install/agent-pack-installer.entry.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.entry.js +90 -0
- package/dist/src/install/agent-pack-installer.entry.js.map +1 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.d.ts +33 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.js +59 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.js.map +1 -0
- package/dist/src/install/agent-pack-installer.harness.d.ts +66 -0
- package/dist/src/install/agent-pack-installer.harness.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.harness.js +310 -0
- package/dist/src/install/agent-pack-installer.harness.js.map +1 -0
- package/dist/src/install/agent-pack-installer.js +221 -0
- package/dist/src/install/agent-pack-installer.js.map +1 -0
- package/dist/src/install/agent-pack-installer.preserve.test.d.ts +11 -0
- package/dist/src/install/agent-pack-installer.preserve.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.preserve.test.js +72 -0
- package/dist/src/install/agent-pack-installer.preserve.test.js.map +1 -0
- package/dist/src/install/agent-pack-installer.test.d.ts +2 -0
- package/dist/src/install/agent-pack-installer.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.test.js +350 -0
- package/dist/src/install/agent-pack-installer.test.js.map +1 -0
- package/dist/src/install/agent-pack-installer.types.d.ts +51 -0
- package/dist/src/install/agent-pack-installer.types.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.types.js +16 -0
- package/dist/src/install/agent-pack-installer.types.js.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.d.ts +43 -0
- package/dist/src/install/agent-pack-uninstaller.d.ts.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.js +113 -0
- package/dist/src/install/agent-pack-uninstaller.js.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.test.d.ts +2 -0
- package/dist/src/install/agent-pack-uninstaller.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.test.js +212 -0
- package/dist/src/install/agent-pack-uninstaller.test.js.map +1 -0
- package/dist/src/install/index.d.ts +7 -0
- package/dist/src/install/index.d.ts.map +1 -1
- package/dist/src/install/index.js +7 -0
- package/dist/src/install/index.js.map +1 -1
- package/dist/src/install/paths.d.ts +1 -1
- package/dist/src/install/paths.d.ts.map +1 -1
- package/dist/src/install/paths.js +4 -0
- package/dist/src/install/paths.js.map +1 -1
- package/dist/src/install/paths.test.js +15 -0
- package/dist/src/install/paths.test.js.map +1 -1
- package/dist/src/journal/hash.d.ts +13 -0
- package/dist/src/journal/hash.d.ts.map +1 -0
- package/dist/src/journal/hash.js +16 -0
- package/dist/src/journal/hash.js.map +1 -0
- package/dist/src/journal/index.d.ts +15 -0
- package/dist/src/journal/index.d.ts.map +1 -0
- package/dist/src/journal/index.js +15 -0
- package/dist/src/journal/index.js.map +1 -0
- package/dist/src/journal/journal.test.d.ts +16 -0
- package/dist/src/journal/journal.test.d.ts.map +1 -0
- package/dist/src/journal/journal.test.js +171 -0
- package/dist/src/journal/journal.test.js.map +1 -0
- package/dist/src/journal/path.d.ts +44 -0
- package/dist/src/journal/path.d.ts.map +1 -0
- package/dist/src/journal/path.js +61 -0
- package/dist/src/journal/path.js.map +1 -0
- package/dist/src/journal/reader.d.ts +38 -0
- package/dist/src/journal/reader.d.ts.map +1 -0
- package/dist/src/journal/reader.js +93 -0
- package/dist/src/journal/reader.js.map +1 -0
- package/dist/src/journal/types.d.ts +87 -0
- package/dist/src/journal/types.d.ts.map +1 -0
- package/dist/src/journal/types.js +21 -0
- package/dist/src/journal/types.js.map +1 -0
- package/dist/src/journal/writer.d.ts +52 -0
- package/dist/src/journal/writer.d.ts.map +1 -0
- package/dist/src/journal/writer.js +125 -0
- package/dist/src/journal/writer.js.map +1 -0
- package/dist/src/logging/context.d.ts +58 -0
- package/dist/src/logging/context.d.ts.map +1 -0
- package/dist/src/logging/context.js +62 -0
- package/dist/src/logging/context.js.map +1 -0
- package/dist/src/logging/context.test.d.ts +14 -0
- package/dist/src/logging/context.test.d.ts.map +1 -0
- package/dist/src/logging/context.test.js +88 -0
- package/dist/src/logging/context.test.js.map +1 -0
- package/dist/src/logging/index.d.ts +13 -0
- package/dist/src/logging/index.d.ts.map +1 -0
- package/dist/src/logging/index.js +12 -0
- package/dist/src/logging/index.js.map +1 -0
- package/dist/src/logging/logger.d.ts +71 -0
- package/dist/src/logging/logger.d.ts.map +1 -0
- package/dist/src/logging/logger.js +264 -0
- package/dist/src/logging/logger.js.map +1 -0
- package/dist/src/logging/logger.test.d.ts +9 -0
- package/dist/src/logging/logger.test.d.ts.map +1 -0
- package/dist/src/logging/logger.test.js +320 -0
- package/dist/src/logging/logger.test.js.map +1 -0
- package/dist/src/logging/redact.d.ts +35 -0
- package/dist/src/logging/redact.d.ts.map +1 -0
- package/dist/src/logging/redact.js +152 -0
- package/dist/src/logging/redact.js.map +1 -0
- package/dist/src/logging/redact.test.d.ts +8 -0
- package/dist/src/logging/redact.test.d.ts.map +1 -0
- package/dist/src/logging/redact.test.js +330 -0
- package/dist/src/logging/redact.test.js.map +1 -0
- package/dist/src/logging/rotation.d.ts +75 -0
- package/dist/src/logging/rotation.d.ts.map +1 -0
- package/dist/src/logging/rotation.js +284 -0
- package/dist/src/logging/rotation.js.map +1 -0
- package/dist/src/logging/rotation.test.d.ts +11 -0
- package/dist/src/logging/rotation.test.d.ts.map +1 -0
- package/dist/src/logging/rotation.test.js +132 -0
- package/dist/src/logging/rotation.test.js.map +1 -0
- package/dist/src/logging/types.d.ts +69 -0
- package/dist/src/logging/types.d.ts.map +1 -0
- package/dist/src/logging/types.js +9 -0
- package/dist/src/logging/types.js.map +1 -0
- package/dist/src/paywall-triggers/index.d.ts +13 -0
- package/dist/src/paywall-triggers/index.d.ts.map +1 -0
- package/dist/src/paywall-triggers/index.js +13 -0
- package/dist/src/paywall-triggers/index.js.map +1 -0
- package/dist/src/paywall-triggers/path.d.ts +47 -0
- package/dist/src/paywall-triggers/path.d.ts.map +1 -0
- package/dist/src/paywall-triggers/path.js +73 -0
- package/dist/src/paywall-triggers/path.js.map +1 -0
- package/dist/src/paywall-triggers/store.d.ts +75 -0
- package/dist/src/paywall-triggers/store.d.ts.map +1 -0
- package/dist/src/paywall-triggers/store.js +122 -0
- package/dist/src/paywall-triggers/store.js.map +1 -0
- package/dist/src/paywall-triggers/store.test.d.ts +2 -0
- package/dist/src/paywall-triggers/store.test.d.ts.map +1 -0
- package/dist/src/paywall-triggers/store.test.js +121 -0
- package/dist/src/paywall-triggers/store.test.js.map +1 -0
- package/dist/src/paywall-triggers/types.d.ts +24 -0
- package/dist/src/paywall-triggers/types.d.ts.map +1 -0
- package/dist/src/paywall-triggers/types.js +13 -0
- package/dist/src/paywall-triggers/types.js.map +1 -0
- package/dist/src/security/index.d.ts +2 -0
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +4 -0
- package/dist/src/security/index.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.compound.d.ts +13 -0
- package/dist/src/security/scanner/SecurityScanner.compound.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.compound.js +127 -0
- package/dist/src/security/scanner/SecurityScanner.compound.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.hostile-update.d.ts +46 -0
- package/dist/src/security/scanner/SecurityScanner.hostile-update.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.hostile-update.js +209 -0
- package/dist/src/security/scanner/SecurityScanner.hostile-update.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.js +10 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.pii.d.ts +23 -0
- package/dist/src/security/scanner/SecurityScanner.pii.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.pii.js +152 -0
- package/dist/src/security/scanner/SecurityScanner.pii.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts +5 -12
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.scanners.js +63 -137
- package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -1
- package/dist/src/security/scanner/index.d.ts +2 -1
- package/dist/src/security/scanner/index.d.ts.map +1 -1
- package/dist/src/security/scanner/index.js +2 -0
- package/dist/src/security/scanner/index.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +2 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +79 -11
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +23 -0
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/services/agent-pack/agent-pack.test.d.ts +18 -0
- package/dist/src/services/agent-pack/agent-pack.test.d.ts.map +1 -0
- package/dist/src/services/agent-pack/agent-pack.test.js +344 -0
- package/dist/src/services/agent-pack/agent-pack.test.js.map +1 -0
- package/dist/src/services/agent-pack/hooks.d.ts +29 -0
- package/dist/src/services/agent-pack/hooks.d.ts.map +1 -0
- package/dist/src/services/agent-pack/hooks.js +139 -0
- package/dist/src/services/agent-pack/hooks.js.map +1 -0
- package/dist/src/services/agent-pack/index.d.ts +26 -0
- package/dist/src/services/agent-pack/index.d.ts.map +1 -0
- package/dist/src/services/agent-pack/index.js +109 -0
- package/dist/src/services/agent-pack/index.js.map +1 -0
- package/dist/src/services/agent-pack/prompt-source.d.ts +47 -0
- package/dist/src/services/agent-pack/prompt-source.d.ts.map +1 -0
- package/dist/src/services/agent-pack/prompt-source.js +182 -0
- package/dist/src/services/agent-pack/prompt-source.js.map +1 -0
- package/dist/src/services/agent-pack/shims.d.ts +40 -0
- package/dist/src/services/agent-pack/shims.d.ts.map +1 -0
- package/dist/src/services/agent-pack/shims.js +96 -0
- package/dist/src/services/agent-pack/shims.js.map +1 -0
- package/dist/src/services/agent-pack/skill-md.d.ts +35 -0
- package/dist/src/services/agent-pack/skill-md.d.ts.map +1 -0
- package/dist/src/services/agent-pack/skill-md.js +89 -0
- package/dist/src/services/agent-pack/skill-md.js.map +1 -0
- package/dist/src/services/agent-pack/types.d.ts +118 -0
- package/dist/src/services/agent-pack/types.d.ts.map +1 -0
- package/dist/src/services/agent-pack/types.js +61 -0
- package/dist/src/services/agent-pack/types.js.map +1 -0
- package/dist/src/services/agent-tool-profile.d.ts +59 -0
- package/dist/src/services/agent-tool-profile.d.ts.map +1 -0
- package/dist/src/services/agent-tool-profile.js +76 -0
- package/dist/src/services/agent-tool-profile.js.map +1 -0
- package/dist/src/services/agent-tool-profile.test.d.ts +2 -0
- package/dist/src/services/agent-tool-profile.test.d.ts.map +1 -0
- package/dist/src/services/agent-tool-profile.test.js +28 -0
- package/dist/src/services/agent-tool-profile.test.js.map +1 -0
- package/dist/src/services/bundled-sibling-scan.d.ts +111 -0
- package/dist/src/services/bundled-sibling-scan.d.ts.map +1 -0
- package/dist/src/services/bundled-sibling-scan.js +170 -0
- package/dist/src/services/bundled-sibling-scan.js.map +1 -0
- package/dist/src/services/skill-installation.io.d.ts +16 -5
- package/dist/src/services/skill-installation.io.d.ts.map +1 -1
- package/dist/src/services/skill-installation.io.js +63 -22
- package/dist/src/services/skill-installation.io.js.map +1 -1
- package/dist/src/services/skill-installation.policy.d.ts +96 -0
- package/dist/src/services/skill-installation.policy.d.ts.map +1 -0
- package/dist/src/services/skill-installation.policy.js +144 -0
- package/dist/src/services/skill-installation.policy.js.map +1 -0
- package/dist/src/services/skill-installation.service.d.ts.map +1 -1
- package/dist/src/services/skill-installation.service.js +9 -3
- package/dist/src/services/skill-installation.service.js.map +1 -1
- package/dist/src/sources/index.d.ts +1 -0
- package/dist/src/sources/index.d.ts.map +1 -1
- package/dist/src/sources/index.js +4 -0
- package/dist/src/sources/index.js.map +1 -1
- package/dist/src/sync/access-token.d.ts +27 -0
- package/dist/src/sync/access-token.d.ts.map +1 -0
- package/dist/src/sync/access-token.js +40 -0
- package/dist/src/sync/access-token.js.map +1 -0
- package/dist/src/sync/audit-notify-client.d.ts +83 -0
- package/dist/src/sync/audit-notify-client.d.ts.map +1 -0
- package/dist/src/sync/audit-notify-client.js +126 -0
- package/dist/src/sync/audit-notify-client.js.map +1 -0
- package/dist/src/sync/audit-notify-client.test.d.ts +14 -0
- package/dist/src/sync/audit-notify-client.test.d.ts.map +1 -0
- package/dist/src/sync/audit-notify-client.test.js +133 -0
- package/dist/src/sync/audit-notify-client.test.js.map +1 -0
- package/dist/src/sync/index.d.ts +2 -1
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +3 -1
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/inventory-client.d.ts +16 -0
- package/dist/src/sync/inventory-client.d.ts.map +1 -1
- package/dist/src/sync/inventory-client.js +59 -16
- package/dist/src/sync/inventory-client.js.map +1 -1
- package/dist/src/sync/inventory-client.test.js +67 -1
- package/dist/src/sync/inventory-client.test.js.map +1 -1
- package/dist/src/sync/inventory-collector.d.ts.map +1 -1
- package/dist/src/sync/inventory-collector.js +32 -5
- package/dist/src/sync/inventory-collector.js.map +1 -1
- package/dist/src/sync/inventory-collector.test.js +50 -1
- package/dist/src/sync/inventory-collector.test.js.map +1 -1
- package/dist/src/sync/inventory-types.d.ts +9 -0
- package/dist/src/sync/inventory-types.d.ts.map +1 -1
- package/dist/src/sync/inventory-types.js +3 -0
- package/dist/src/sync/inventory-types.js.map +1 -1
- package/dist/src/telemetry/agent-marker.d.ts +137 -0
- package/dist/src/telemetry/agent-marker.d.ts.map +1 -0
- package/dist/src/telemetry/agent-marker.js +242 -0
- package/dist/src/telemetry/agent-marker.js.map +1 -0
- package/dist/src/telemetry/agent-marker.test.d.ts +13 -0
- package/dist/src/telemetry/agent-marker.test.d.ts.map +1 -0
- package/dist/src/telemetry/agent-marker.test.js +202 -0
- package/dist/src/telemetry/agent-marker.test.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +2 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +6 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +25 -0
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +10 -1
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/telemetry/wrap.bench.js +5 -0
- package/dist/src/telemetry/wrap.bench.js.map +1 -1
- package/dist/src/telemetry/wrap.correlation.test.d.ts +20 -0
- package/dist/src/telemetry/wrap.correlation.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.correlation.test.js +174 -0
- package/dist/src/telemetry/wrap.correlation.test.js.map +1 -0
- package/dist/src/telemetry/wrap.d.ts +28 -7
- package/dist/src/telemetry/wrap.d.ts.map +1 -1
- package/dist/src/telemetry/wrap.gate.test.d.ts +22 -0
- package/dist/src/telemetry/wrap.gate.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.gate.test.js +202 -0
- package/dist/src/telemetry/wrap.gate.test.js.map +1 -0
- package/dist/src/telemetry/wrap.js +196 -52
- package/dist/src/telemetry/wrap.js.map +1 -1
- package/dist/src/telemetry/wrap.marker.test.d.ts +16 -0
- package/dist/src/telemetry/wrap.marker.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.marker.test.js +190 -0
- package/dist/src/telemetry/wrap.marker.test.js.map +1 -0
- package/dist/src/telemetry/wrap.test.js +14 -0
- package/dist/src/telemetry/wrap.test.js.map +1 -1
- package/dist/src/types.d.ts +6 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tests/SecurityScanner.exec.test.js +60 -0
- package/dist/tests/SecurityScanner.exec.test.js.map +1 -1
- package/dist/tests/security/ContinuousSecurity.test.js +10 -4
- package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.d.ts +2 -0
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.d.ts.map +1 -0
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.js +126 -0
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.js.map +1 -0
- package/dist/tests/security/chmod-compound.test.d.ts +2 -0
- package/dist/tests/security/chmod-compound.test.d.ts.map +1 -0
- package/dist/tests/security/chmod-compound.test.js +188 -0
- package/dist/tests/security/chmod-compound.test.js.map +1 -0
- package/dist/tests/security/pii-detection.test.js +24 -0
- package/dist/tests/security/pii-detection.test.js.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.d.ts +23 -7
- package/dist/tests/security/scanner-regression-guard.test.d.ts.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.js +206 -12
- package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
- package/dist/tests/security/sensitive-path-fp.test.d.ts +2 -0
- package/dist/tests/security/sensitive-path-fp.test.d.ts.map +1 -0
- package/dist/tests/security/sensitive-path-fp.test.js +142 -0
- package/dist/tests/security/sensitive-path-fp.test.js.map +1 -0
- package/dist/tests/services/bundled-sibling-scan.test.d.ts +2 -0
- package/dist/tests/services/bundled-sibling-scan.test.d.ts.map +1 -0
- package/dist/tests/services/bundled-sibling-scan.test.js +139 -0
- package/dist/tests/services/bundled-sibling-scan.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.io.test.js +166 -0
- package/dist/tests/unit/services/skill-installation.io.test.js.map +1 -1
- package/dist/tests/unit/services/skill-installation.policy.test.d.ts +8 -0
- package/dist/tests/unit/services/skill-installation.policy.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.policy.test.js +151 -0
- package/dist/tests/unit/services/skill-installation.policy.test.js.map +1 -0
- package/package.json +28 -3
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Change-journal writer — single-writer, fsync'd, hash-chained
|
|
3
|
+
* append (SMI-5456 Wave 1 Step 3 / SMI-5470).
|
|
4
|
+
* @module @skillsmith/core/journal/writer
|
|
5
|
+
*
|
|
6
|
+
* P-5 single-writer invariant (docs/internal/implementation/smi-5456-skillsmith-agent-wave1.md
|
|
7
|
+
* "Shared-State / Coordination Audit"): the journal file is written by the
|
|
8
|
+
* apply-family MCP tools ONLY, and every writer in this process funnels
|
|
9
|
+
* through `appendJournalRecord`, which serializes behind ONE module-scoped
|
|
10
|
+
* promise queue. That queue — not any per-caller locking — is what makes
|
|
11
|
+
* concurrent `apply_namespace_rename` / `apply_recommended_edit` / `undo_apply`
|
|
12
|
+
* calls in the same server process produce well-formed, correctly-chained
|
|
13
|
+
* lines instead of interleaved/torn writes.
|
|
14
|
+
*
|
|
15
|
+
* Durability: each append opens the file, writes the line, calls
|
|
16
|
+
* `FileHandle.sync()` (fsync), then closes — so a record that returns
|
|
17
|
+
* successfully is durable on disk before the caller's apply/undo response
|
|
18
|
+
* goes out, matching the "fsync'd appends" requirement in the plan's P-5
|
|
19
|
+
* table.
|
|
20
|
+
*/
|
|
21
|
+
import { mkdir, open, readFile } from 'node:fs/promises';
|
|
22
|
+
import { dirname } from 'node:path';
|
|
23
|
+
import { JOURNAL_GENESIS_HASH, sha256Hex } from './hash.js';
|
|
24
|
+
import { getJournalFilePath } from './path.js';
|
|
25
|
+
/**
|
|
26
|
+
* Canonical (fixed-key-order) JSON of every hash-chain-relevant field,
|
|
27
|
+
* INCLUDING `prev_hash` but EXCLUDING `record_hash` itself. Plain
|
|
28
|
+
* `JSON.stringify` is sufficient canonicalization here because the object
|
|
29
|
+
* literal below is always constructed with the same key order — a full
|
|
30
|
+
* canonical-JSON library would be overkill for a single fixed shape.
|
|
31
|
+
*/
|
|
32
|
+
function canonicalFields(record) {
|
|
33
|
+
const ordered = {
|
|
34
|
+
schema: record.schema,
|
|
35
|
+
ts: record.ts,
|
|
36
|
+
session_id: record.session_id,
|
|
37
|
+
tool: record.tool,
|
|
38
|
+
action: record.action,
|
|
39
|
+
suggestion_id: record.suggestion_id,
|
|
40
|
+
target_path: record.target_path,
|
|
41
|
+
before_hash: record.before_hash,
|
|
42
|
+
after_hash: record.after_hash,
|
|
43
|
+
approval: record.approval,
|
|
44
|
+
backup_ref: record.backup_ref,
|
|
45
|
+
detail: record.detail,
|
|
46
|
+
prev_hash: record.prev_hash,
|
|
47
|
+
};
|
|
48
|
+
return JSON.stringify(ordered);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Recompute a record's `record_hash` from its other fields. Exported so the
|
|
52
|
+
* reader can independently verify each line without duplicating the
|
|
53
|
+
* canonicalization logic (drift between writer and reader would silently
|
|
54
|
+
* break every chain-verification call).
|
|
55
|
+
*/
|
|
56
|
+
export function computeRecordHash(record) {
|
|
57
|
+
return sha256Hex(canonicalFields(record));
|
|
58
|
+
}
|
|
59
|
+
export function isCorruptTailError(err) {
|
|
60
|
+
return (err instanceof Error &&
|
|
61
|
+
err.kind === 'journal.write.corrupt_tail');
|
|
62
|
+
}
|
|
63
|
+
async function getLastRecordHash(filePath) {
|
|
64
|
+
let raw;
|
|
65
|
+
try {
|
|
66
|
+
raw = await readFile(filePath, 'utf-8');
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return JOURNAL_GENESIS_HASH;
|
|
70
|
+
}
|
|
71
|
+
const lines = raw.split('\n').filter((line) => line.trim().length > 0);
|
|
72
|
+
if (lines.length === 0)
|
|
73
|
+
return JOURNAL_GENESIS_HASH;
|
|
74
|
+
const lastLine = lines[lines.length - 1];
|
|
75
|
+
try {
|
|
76
|
+
const parsed = JSON.parse(lastLine);
|
|
77
|
+
if (typeof parsed.record_hash === 'string' && parsed.record_hash.length > 0) {
|
|
78
|
+
return parsed.record_hash;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// fall through to the corrupt-tail error below
|
|
83
|
+
}
|
|
84
|
+
const err = new Error('journal tail is corrupt or unparseable; refusing to append past an unverifiable chain head');
|
|
85
|
+
err.kind = 'journal.write.corrupt_tail';
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
// P-5 single-writer invariant: every append in this process funnels through
|
|
89
|
+
// this one queue, regardless of which apply-family tool called it.
|
|
90
|
+
let writeQueue = Promise.resolve();
|
|
91
|
+
/**
|
|
92
|
+
* Append a record to the journal. Serialized behind the module-scoped
|
|
93
|
+
* write queue and fsync'd before the returned promise resolves.
|
|
94
|
+
*
|
|
95
|
+
* Callers (the apply-family tools) should treat a rejection as fail-soft —
|
|
96
|
+
* the journal is an evidence trail, not a gate on the user's mutation —
|
|
97
|
+
* and log rather than propagate. See `tools/apply-journal.helpers.ts` in
|
|
98
|
+
* `@skillsmith/mcp-server` for the call-site convention.
|
|
99
|
+
*/
|
|
100
|
+
export function appendJournalRecord(input) {
|
|
101
|
+
const task = writeQueue.then(() => doAppend(input));
|
|
102
|
+
// A rejected append must not wedge the queue for subsequent callers.
|
|
103
|
+
writeQueue = task.then(() => undefined, () => undefined);
|
|
104
|
+
return task;
|
|
105
|
+
}
|
|
106
|
+
async function doAppend(input) {
|
|
107
|
+
const filePath = getJournalFilePath();
|
|
108
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
109
|
+
// Propagates as-is (including `JournalCorruptTailError`) — callers use
|
|
110
|
+
// `isCorruptTailError` to distinguish it from a generic I/O failure.
|
|
111
|
+
const prevHash = await getLastRecordHash(filePath);
|
|
112
|
+
const withoutHash = { ...input, prev_hash: prevHash };
|
|
113
|
+
const record = { ...withoutHash, record_hash: computeRecordHash(withoutHash) };
|
|
114
|
+
const line = JSON.stringify(record) + '\n';
|
|
115
|
+
const handle = await open(filePath, 'a');
|
|
116
|
+
try {
|
|
117
|
+
await handle.appendFile(line, 'utf-8');
|
|
118
|
+
await handle.sync();
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
await handle.close();
|
|
122
|
+
}
|
|
123
|
+
return record;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/journal/writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5615: Correlation-ID context for the shared logging + telemetry pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Lives in `logging/` (not `telemetry/wrap.ts`) so both `telemetry/wrap.ts`
|
|
5
|
+
* and the future `logging/logger.ts` (Wave 2) can read/write it without a
|
|
6
|
+
* circular import between the `telemetry` and `logging` subtrees (F4). This
|
|
7
|
+
* module imports ONLY `node:async_hooks` — it must never import from
|
|
8
|
+
* `../telemetry/*`, or the one-directional `telemetry -> logging` boundary
|
|
9
|
+
* this split exists to guarantee breaks. An ESLint `no-restricted-imports`
|
|
10
|
+
* boundary guard (Wave 2, §1) enforces this mechanically; keep it true by
|
|
11
|
+
* construction here regardless.
|
|
12
|
+
*
|
|
13
|
+
* Mirrors the existing `markerStorage` / `runWithMarkerContext` pattern in
|
|
14
|
+
* `packages/core/src/telemetry/wrap.ts`: a module-scoped `AsyncLocalStorage`
|
|
15
|
+
* instance, installed per-call via a `runWith*` function, read live via
|
|
16
|
+
* `.getStore()` — never memoised. `AsyncLocalStorage` (not a module-scoped
|
|
17
|
+
* variable) because harnesses batch PARALLEL tool calls to one server
|
|
18
|
+
* process; a plain module slot would let call A's completion clear call B's
|
|
19
|
+
* still-in-flight correlation ID.
|
|
20
|
+
*
|
|
21
|
+
* Install-site correction (F1, see `docs/internal/implementation/production-error-logging.md`):
|
|
22
|
+
* the correlation ID is installed by `withTelemetry` around its *entire*
|
|
23
|
+
* `wrappedFn` body (try + finally), not just the inner `handler(...args)`
|
|
24
|
+
* call — otherwise the emit path's `getCorrelationId()` read happens after
|
|
25
|
+
* the scope has already unwound and always returns `undefined`.
|
|
26
|
+
*/
|
|
27
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
28
|
+
/**
|
|
29
|
+
* Per-call correlation ID, scoped via `runWithCorrelationId`. Read live via
|
|
30
|
+
* `getCorrelationId()` — never memoised — so every consumer (the
|
|
31
|
+
* `withTelemetry` emit path, and later `logging/logger.ts`) observes the ID
|
|
32
|
+
* for its OWN call's async continuation, never a sibling's.
|
|
33
|
+
*/
|
|
34
|
+
export declare const correlationIdStorage: AsyncLocalStorage<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Run `fn` with `id` installed as the correlation ID for every telemetry
|
|
37
|
+
* emit / log call inside its async continuation. Concurrency-safe: parallel
|
|
38
|
+
* invocations each see only their own ID; code outside any
|
|
39
|
+
* `runWithCorrelationId` scope sees no ID (`getCorrelationId()` returns
|
|
40
|
+
* `undefined`).
|
|
41
|
+
*
|
|
42
|
+
* Callers should mint-if-absent (`getCorrelationId() ?? randomUUID()`)
|
|
43
|
+
* before calling this, so a wrapped call nested inside another wrapped
|
|
44
|
+
* call's continuation inherits the outer ID instead of fragmenting one
|
|
45
|
+
* logical request's trace across multiple IDs.
|
|
46
|
+
*/
|
|
47
|
+
export declare function runWithCorrelationId<T>(id: string, fn: () => Promise<T>): Promise<T>;
|
|
48
|
+
/**
|
|
49
|
+
* Read the correlation ID installed for the current async continuation, or
|
|
50
|
+
* `undefined` if called outside any `runWithCorrelationId` scope (e.g.
|
|
51
|
+
* fire-and-forget work started before any tool call establishes a scope).
|
|
52
|
+
*
|
|
53
|
+
* Must be read synchronously at the log/emit call site — never deferred to
|
|
54
|
+
* an async flush/rotation callback, which could fire outside the
|
|
55
|
+
* originating call's scope (F3).
|
|
56
|
+
*/
|
|
57
|
+
export declare function getCorrelationId(): string | undefined;
|
|
58
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/logging/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,2BAAkC,CAAA;AAEnE;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEpF;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5615: Correlation-ID context for the shared logging + telemetry pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Lives in `logging/` (not `telemetry/wrap.ts`) so both `telemetry/wrap.ts`
|
|
5
|
+
* and the future `logging/logger.ts` (Wave 2) can read/write it without a
|
|
6
|
+
* circular import between the `telemetry` and `logging` subtrees (F4). This
|
|
7
|
+
* module imports ONLY `node:async_hooks` — it must never import from
|
|
8
|
+
* `../telemetry/*`, or the one-directional `telemetry -> logging` boundary
|
|
9
|
+
* this split exists to guarantee breaks. An ESLint `no-restricted-imports`
|
|
10
|
+
* boundary guard (Wave 2, §1) enforces this mechanically; keep it true by
|
|
11
|
+
* construction here regardless.
|
|
12
|
+
*
|
|
13
|
+
* Mirrors the existing `markerStorage` / `runWithMarkerContext` pattern in
|
|
14
|
+
* `packages/core/src/telemetry/wrap.ts`: a module-scoped `AsyncLocalStorage`
|
|
15
|
+
* instance, installed per-call via a `runWith*` function, read live via
|
|
16
|
+
* `.getStore()` — never memoised. `AsyncLocalStorage` (not a module-scoped
|
|
17
|
+
* variable) because harnesses batch PARALLEL tool calls to one server
|
|
18
|
+
* process; a plain module slot would let call A's completion clear call B's
|
|
19
|
+
* still-in-flight correlation ID.
|
|
20
|
+
*
|
|
21
|
+
* Install-site correction (F1, see `docs/internal/implementation/production-error-logging.md`):
|
|
22
|
+
* the correlation ID is installed by `withTelemetry` around its *entire*
|
|
23
|
+
* `wrappedFn` body (try + finally), not just the inner `handler(...args)`
|
|
24
|
+
* call — otherwise the emit path's `getCorrelationId()` read happens after
|
|
25
|
+
* the scope has already unwound and always returns `undefined`.
|
|
26
|
+
*/
|
|
27
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
28
|
+
/**
|
|
29
|
+
* Per-call correlation ID, scoped via `runWithCorrelationId`. Read live via
|
|
30
|
+
* `getCorrelationId()` — never memoised — so every consumer (the
|
|
31
|
+
* `withTelemetry` emit path, and later `logging/logger.ts`) observes the ID
|
|
32
|
+
* for its OWN call's async continuation, never a sibling's.
|
|
33
|
+
*/
|
|
34
|
+
export const correlationIdStorage = new AsyncLocalStorage();
|
|
35
|
+
/**
|
|
36
|
+
* Run `fn` with `id` installed as the correlation ID for every telemetry
|
|
37
|
+
* emit / log call inside its async continuation. Concurrency-safe: parallel
|
|
38
|
+
* invocations each see only their own ID; code outside any
|
|
39
|
+
* `runWithCorrelationId` scope sees no ID (`getCorrelationId()` returns
|
|
40
|
+
* `undefined`).
|
|
41
|
+
*
|
|
42
|
+
* Callers should mint-if-absent (`getCorrelationId() ?? randomUUID()`)
|
|
43
|
+
* before calling this, so a wrapped call nested inside another wrapped
|
|
44
|
+
* call's continuation inherits the outer ID instead of fragmenting one
|
|
45
|
+
* logical request's trace across multiple IDs.
|
|
46
|
+
*/
|
|
47
|
+
export function runWithCorrelationId(id, fn) {
|
|
48
|
+
return correlationIdStorage.run(id, fn);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Read the correlation ID installed for the current async continuation, or
|
|
52
|
+
* `undefined` if called outside any `runWithCorrelationId` scope (e.g.
|
|
53
|
+
* fire-and-forget work started before any tool call establishes a scope).
|
|
54
|
+
*
|
|
55
|
+
* Must be read synchronously at the log/emit call site — never deferred to
|
|
56
|
+
* an async flush/rotation callback, which could fire outside the
|
|
57
|
+
* originating call's scope (F3).
|
|
58
|
+
*/
|
|
59
|
+
export function getCorrelationId() {
|
|
60
|
+
return correlationIdStorage.getStore();
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/logging/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,iBAAiB,EAAU,CAAA;AAEnE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAI,EAAU,EAAE,EAAoB;IACtE,OAAO,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;AACzC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,oBAAoB,CAAC,QAAQ,EAAE,CAAA;AACxC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5615: Unit tests for `correlationIdStorage` / `runWithCorrelationId` /
|
|
3
|
+
* `getCorrelationId`. Mirrors the pattern of the `markerStorage` coverage in
|
|
4
|
+
* `packages/core/src/telemetry/wrap.marker.test.ts` — a module-scoped
|
|
5
|
+
* `AsyncLocalStorage` instance, installed per-call via a `runWith*` function,
|
|
6
|
+
* read live via `.getStore()`.
|
|
7
|
+
*
|
|
8
|
+
* These are direct, in-isolation tests of the primitive itself; the
|
|
9
|
+
* `withTelemetry` install-site contract (mint-if-absent, whole-`wrappedFn`-
|
|
10
|
+
* body scope) is covered separately in
|
|
11
|
+
* `packages/core/src/telemetry/wrap.correlation.test.ts`.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=context.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.test.d.ts","sourceRoot":"","sources":["../../../src/logging/context.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5615: Unit tests for `correlationIdStorage` / `runWithCorrelationId` /
|
|
3
|
+
* `getCorrelationId`. Mirrors the pattern of the `markerStorage` coverage in
|
|
4
|
+
* `packages/core/src/telemetry/wrap.marker.test.ts` — a module-scoped
|
|
5
|
+
* `AsyncLocalStorage` instance, installed per-call via a `runWith*` function,
|
|
6
|
+
* read live via `.getStore()`.
|
|
7
|
+
*
|
|
8
|
+
* These are direct, in-isolation tests of the primitive itself; the
|
|
9
|
+
* `withTelemetry` install-site contract (mint-if-absent, whole-`wrappedFn`-
|
|
10
|
+
* body scope) is covered separately in
|
|
11
|
+
* `packages/core/src/telemetry/wrap.correlation.test.ts`.
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect } from 'vitest';
|
|
14
|
+
import { correlationIdStorage, runWithCorrelationId, getCorrelationId } from './context.js';
|
|
15
|
+
describe('getCorrelationId', () => {
|
|
16
|
+
it('returns undefined outside any runWithCorrelationId scope', () => {
|
|
17
|
+
expect(getCorrelationId()).toBeUndefined();
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe('runWithCorrelationId', () => {
|
|
21
|
+
it('installs the ID for the duration of the callback', async () => {
|
|
22
|
+
let observed;
|
|
23
|
+
await runWithCorrelationId('id-1', async () => {
|
|
24
|
+
observed = getCorrelationId();
|
|
25
|
+
});
|
|
26
|
+
expect(observed).toBe('id-1');
|
|
27
|
+
});
|
|
28
|
+
it('auto-unwinds after the callback resolves', async () => {
|
|
29
|
+
await runWithCorrelationId('id-2', async () => {
|
|
30
|
+
// no-op
|
|
31
|
+
});
|
|
32
|
+
expect(getCorrelationId()).toBeUndefined();
|
|
33
|
+
});
|
|
34
|
+
it('auto-unwinds after the callback rejects', async () => {
|
|
35
|
+
await expect(runWithCorrelationId('id-3', async () => {
|
|
36
|
+
throw new Error('boom');
|
|
37
|
+
})).rejects.toThrow('boom');
|
|
38
|
+
expect(getCorrelationId()).toBeUndefined();
|
|
39
|
+
});
|
|
40
|
+
it('returns the callback resolved value', async () => {
|
|
41
|
+
const result = await runWithCorrelationId('id-4', async () => 42);
|
|
42
|
+
expect(result).toBe(42);
|
|
43
|
+
});
|
|
44
|
+
it('nested scopes — inner ID shadows the outer ID inside its own callback', async () => {
|
|
45
|
+
const seen = [];
|
|
46
|
+
await runWithCorrelationId('outer', async () => {
|
|
47
|
+
seen.push(getCorrelationId());
|
|
48
|
+
await runWithCorrelationId('inner', async () => {
|
|
49
|
+
seen.push(getCorrelationId()); // 'inner' — shadows the outer ID
|
|
50
|
+
});
|
|
51
|
+
// Outer scope resumes after the inner one unwinds — back to 'outer'.
|
|
52
|
+
seen.push(getCorrelationId());
|
|
53
|
+
});
|
|
54
|
+
expect(seen).toEqual(['outer', 'inner', 'outer']);
|
|
55
|
+
});
|
|
56
|
+
it('concurrent, overlapping scopes each observe only their own ID (P-5 invariant)', async () => {
|
|
57
|
+
let releaseA;
|
|
58
|
+
let releaseB;
|
|
59
|
+
const blockA = new Promise((r) => (releaseA = r));
|
|
60
|
+
const blockB = new Promise((r) => (releaseB = r));
|
|
61
|
+
const observedA = [];
|
|
62
|
+
const observedB = [];
|
|
63
|
+
const callA = runWithCorrelationId('id-a', async () => {
|
|
64
|
+
observedA.push(getCorrelationId());
|
|
65
|
+
await blockA;
|
|
66
|
+
observedA.push(getCorrelationId());
|
|
67
|
+
});
|
|
68
|
+
const callB = runWithCorrelationId('id-b', async () => {
|
|
69
|
+
observedB.push(getCorrelationId());
|
|
70
|
+
await blockB;
|
|
71
|
+
observedB.push(getCorrelationId());
|
|
72
|
+
});
|
|
73
|
+
// A completes first while B is still awaiting; B must never observe A's ID.
|
|
74
|
+
releaseA();
|
|
75
|
+
await callA;
|
|
76
|
+
releaseB();
|
|
77
|
+
await callB;
|
|
78
|
+
expect(observedA).toEqual(['id-a', 'id-a']);
|
|
79
|
+
expect(observedB).toEqual(['id-b', 'id-b']);
|
|
80
|
+
});
|
|
81
|
+
it('the exported correlationIdStorage is the same instance read.write path', async () => {
|
|
82
|
+
// Sanity: getCorrelationId is a thin wrapper over correlationIdStorage.getStore().
|
|
83
|
+
await correlationIdStorage.run('direct-id', async () => {
|
|
84
|
+
expect(getCorrelationId()).toBe('direct-id');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.test.js","sourceRoot":"","sources":["../../../src/logging/context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5615: Logging Module Exports
|
|
3
|
+
*
|
|
4
|
+
* Shared structured JSON-line error logging (`~/.skillsmith/logs/`) with
|
|
5
|
+
* SMI-883 redaction, per-surface write serialization, and correlation-ID
|
|
6
|
+
* threading with `@skillsmith/core/telemetry`'s `withTelemetry`. Consumed by
|
|
7
|
+
* the MCP server and CLI via the `"./logging"` package export.
|
|
8
|
+
*/
|
|
9
|
+
export { createLogger, getLogger, type CreateLoggerOptions, type Logger } from './logger.js';
|
|
10
|
+
export { runWithCorrelationId, getCorrelationId } from './context.js';
|
|
11
|
+
export { redactSensitiveData, redactSensitiveObject } from './redact.js';
|
|
12
|
+
export type { LogLevel, Surface, LogRecord, LogRecordError, LogDetails } from './types.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/logging/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,mBAAmB,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAA;AAE5F,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAErE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAExE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5615: Logging Module Exports
|
|
3
|
+
*
|
|
4
|
+
* Shared structured JSON-line error logging (`~/.skillsmith/logs/`) with
|
|
5
|
+
* SMI-883 redaction, per-surface write serialization, and correlation-ID
|
|
6
|
+
* threading with `@skillsmith/core/telemetry`'s `withTelemetry`. Consumed by
|
|
7
|
+
* the MCP server and CLI via the `"./logging"` package export.
|
|
8
|
+
*/
|
|
9
|
+
export { createLogger, getLogger } from './logger.js';
|
|
10
|
+
export { runWithCorrelationId, getCorrelationId } from './context.js';
|
|
11
|
+
export { redactSensitiveData, redactSensitiveObject } from './redact.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/logging/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAyC,MAAM,aAAa,CAAA;AAE5F,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAErE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5615: Shared structured JSON-line logger.
|
|
3
|
+
*
|
|
4
|
+
* Generalized from the dead `packages/mcp-server/src/logger.ts` (SMI-883
|
|
5
|
+
* redaction) into a surface-agnostic module usable by the MCP server, CLI,
|
|
6
|
+
* and VS Code extension independently — `createLogger(surface)` is a
|
|
7
|
+
* factory, not a singleton, so each host process can mint its own logger
|
|
8
|
+
* (optionally stamped with its own package version) while still writing to
|
|
9
|
+
* per-surface files that are safe to share across processes for the same
|
|
10
|
+
* surface (see `rotation.ts`).
|
|
11
|
+
*
|
|
12
|
+
* Call-site invariants (see
|
|
13
|
+
* docs/internal/implementation/production-error-logging.md §1 and the
|
|
14
|
+
* Shared-State / Coordination Audit table, F2/F3):
|
|
15
|
+
*
|
|
16
|
+
* - `getCorrelationId()` is read SYNCHRONOUSLY at the call site, inside
|
|
17
|
+
* `buildRecord`, never inside an async flush/rotation callback (F3) — a
|
|
18
|
+
* deferred read could observe a different call's (or no) correlation ID
|
|
19
|
+
* once the originating call's `AsyncLocalStorage` scope has unwound.
|
|
20
|
+
* - The full JSON-line record (including the synchronously-read
|
|
21
|
+
* correlation ID and synchronously-applied redaction) is built and
|
|
22
|
+
* `JSON.stringify`'d BEFORE handing the string off to `rotation.ts`'s
|
|
23
|
+
* serialized per-surface writer (F2) — only the actual disk write may
|
|
24
|
+
* complete asynchronously; by the time it starts, the record content is
|
|
25
|
+
* already frozen.
|
|
26
|
+
* - Logger calls never throw. Any failure while assembling or persisting a
|
|
27
|
+
* record falls back to `console.error`/`console.warn` (matching level,
|
|
28
|
+
* with `info`/`debug` also routed to `console.error`) rather than being
|
|
29
|
+
* fully silent — stderr remains the safety net of last resort. This
|
|
30
|
+
* differs from the old logger's "silently fail" comment intent, which is
|
|
31
|
+
* no longer acceptable once this is the only durable failure signal.
|
|
32
|
+
* - `warn`/`error` ALWAYS mirror to `console.warn`/`console.error`,
|
|
33
|
+
* synchronously, regardless of whether the disk write succeeds — this is
|
|
34
|
+
* NOT a failure-only fallback for those two levels (only `info`/`debug`
|
|
35
|
+
* use console purely as a write-failure fallback). This is what makes
|
|
36
|
+
* `logger.error`/`logger.warn` a safe drop-in replacement for existing
|
|
37
|
+
* `console.error`/`console.warn` call sites in the MCP server and CLI —
|
|
38
|
+
* the caller-visible terminal/stderr output stays identical to today,
|
|
39
|
+
* with redacted disk persistence added on top rather than instead of it.
|
|
40
|
+
*/
|
|
41
|
+
import type { LogDetails, Surface } from './types.js';
|
|
42
|
+
export interface CreateLoggerOptions {
|
|
43
|
+
/**
|
|
44
|
+
* Package/CLI version stamped on every record from this logger instance.
|
|
45
|
+
* Defaults to `'unknown'` — pass each host package's own `version` (e.g.
|
|
46
|
+
* from its own `package.json`) at its entrypoint for an accurate value.
|
|
47
|
+
*/
|
|
48
|
+
version?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface Logger {
|
|
51
|
+
info(message: string, details?: LogDetails): void;
|
|
52
|
+
warn(message: string, details?: LogDetails): void;
|
|
53
|
+
error(message: string, details?: LogDetails): void;
|
|
54
|
+
debug(message: string, details?: LogDetails): void;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Creates a logger bound to `surface`. Independent instances for different
|
|
58
|
+
* surfaces (or the same surface with different `version` stamps) are safe to
|
|
59
|
+
* create concurrently — they only share state at the `rotation.ts` layer,
|
|
60
|
+
* which is itself safe for concurrent writers to the same surface (F2).
|
|
61
|
+
*/
|
|
62
|
+
export declare function createLogger(surface: Surface, options?: CreateLoggerOptions): Logger;
|
|
63
|
+
/**
|
|
64
|
+
* Memoized per-surface logger created with default options
|
|
65
|
+
* (`version: 'unknown'`). Prefer calling `createLogger(surface, { version })`
|
|
66
|
+
* once at each package's entrypoint so records carry that package's real
|
|
67
|
+
* version; `getLogger` is a convenience for call sites that don't need a
|
|
68
|
+
* custom version stamp and want a single shared instance per surface.
|
|
69
|
+
*/
|
|
70
|
+
export declare function getLogger(surface: Surface): Logger;
|
|
71
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/logging/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAuB,OAAO,EAAE,MAAM,YAAY,CAAA;AA2L1E,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IACjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IACjD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IAClD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CACnD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM,CA0BxF;AAID;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAOlD"}
|