akm-cli 0.9.0-rc.8 → 0.9.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 +1063 -44
- package/README.md +51 -25
- package/SECURITY.md +14 -1
- package/STABILITY.md +497 -0
- package/dist/akm +148 -35
- package/dist/{akm-migrate-storage → akm-migrate} +6 -9
- package/dist/assets/hints/cli-hints-full.md +223 -95
- package/dist/assets/hints/cli-hints-short.md +85 -22
- package/dist/assets/improve-strategies/default.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +1 -1
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/stash-skeleton/README.md +6 -5
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
- package/dist/assets/tasks/core/extract.yml +1 -1
- package/dist/assets/tasks/core/version-check.yml +1 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
- package/dist/assets/templates/html/health.html +1 -3
- package/dist/assets/workflows/workflow-template.md +32 -15
- package/dist/cli/invocation.js +40 -15
- package/dist/cli/parse-args.js +0 -22
- package/dist/cli/retired-commands.js +121 -0
- package/dist/cli/shared.js +154 -22
- package/dist/cli/unknown-flags.js +236 -0
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +696 -258
- package/dist/commands/agent/agent-dispatch.js +14 -3
- package/dist/commands/agent/contribute-cli.js +73 -88
- package/dist/commands/completions.js +79 -22
- package/dist/commands/config-cli.js +17 -150
- package/dist/commands/env/env-cli.js +59 -143
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +36 -66
- package/dist/commands/env/secret.js +24 -57
- package/dist/commands/feedback-cli.js +141 -87
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +3 -4
- package/dist/commands/health/checks.js +85 -23
- package/dist/commands/health/html-report.js +7 -10
- package/dist/commands/health/improve-metrics.js +25 -83
- package/dist/commands/health/md-report.js +5 -9
- package/dist/commands/health/metrics.js +62 -20
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +4 -5
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +3 -48
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/commands/health/types-improve.js +7 -0
- package/dist/commands/health.js +99 -28
- package/dist/commands/improve/anti-collapse.js +2 -2
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +41 -40
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +140 -1000
- package/dist/commands/improve/distill/promote-memory.js +12 -12
- package/dist/commands/improve/distill/quality-gate.js +6 -6
- package/dist/commands/improve/distill.js +58 -69
- package/dist/commands/improve/eligibility.js +105 -57
- package/dist/commands/improve/extract-cli.js +14 -133
- package/dist/commands/improve/improve-cli.js +98 -114
- package/dist/commands/improve/improve-result-file.js +1 -28
- package/dist/commands/improve/improve-strategies.js +8 -5
- package/dist/commands/improve/improve.js +128 -91
- package/dist/commands/improve/loop-stages.js +182 -20
- package/dist/commands/improve/memory/derived-ref.js +45 -43
- package/dist/commands/improve/memory/memory-belief.js +1 -1
- package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
- package/dist/commands/improve/memory/memory-improve.js +6 -5
- package/dist/commands/improve/outcome-loop.js +22 -65
- package/dist/commands/improve/preparation.js +114 -123
- package/dist/commands/improve/proactive-maintenance.js +2 -5
- package/dist/commands/improve/reflect.js +56 -160
- package/dist/commands/improve/salience.js +11 -122
- package/dist/commands/improve/source-identity.js +10 -38
- package/dist/commands/lint/base-linter.js +20 -124
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +249 -43
- package/dist/commands/{events.js → log.js} +33 -38
- package/dist/commands/migrate-cli.js +92 -12
- package/dist/commands/migration-tool.js +46 -0
- package/dist/commands/observability-cli.js +70 -209
- package/dist/commands/proposal/drain.js +101 -29
- package/dist/commands/proposal/proposal-cli.js +76 -48
- package/dist/commands/proposal/proposal.js +54 -18
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +23 -15
- package/dist/commands/proposal/repository.js +701 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
- package/dist/commands/proposal/validators/proposal-validators.js +55 -7
- package/dist/commands/proposal/validators/proposals.js +4 -7
- package/dist/commands/read/curate.js +34 -53
- package/dist/commands/read/knowledge.js +150 -95
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +42 -15
- package/dist/commands/read/search-cli.js +180 -78
- package/dist/commands/read/search.js +58 -43
- package/dist/commands/read/show.js +197 -141
- package/dist/commands/registry-cli.js +12 -51
- package/dist/commands/remember.js +14 -57
- package/dist/commands/sources/add-cli.js +100 -31
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +7 -2
- package/dist/commands/sources/info.js +18 -5
- package/dist/commands/sources/init.js +12 -12
- package/dist/commands/sources/installed-stashes.js +382 -98
- package/dist/commands/sources/schema-repair.js +3 -2
- package/dist/commands/sources/self-update.js +131 -38
- package/dist/commands/sources/source-add.js +72 -17
- package/dist/commands/sources/source-clone.js +129 -45
- package/dist/commands/sources/source-manage.js +43 -23
- package/dist/commands/sources/sources-cli.js +57 -208
- package/dist/commands/sources/stash-cli.js +46 -53
- package/dist/commands/tasks/tasks-cli.js +91 -97
- package/dist/commands/tasks/tasks.js +276 -421
- package/dist/commands/workflow-cli.js +175 -450
- package/dist/core/adapter/adapters/akm-adapter.js +47 -28
- package/dist/core/adapter/adapters/akm-lint.js +42 -27
- package/dist/core/adapter/adapters/akm-metadata.js +15 -44
- package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
- package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
- package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
- package/dist/core/adapter/adapters/index.js +6 -6
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
- package/dist/core/adapter/adapters/okf-adapter.js +187 -19
- package/dist/core/adapter/adapters/shared.js +3 -19
- package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +6 -4
- package/dist/core/adapter/validate-context.js +214 -0
- package/dist/core/asset/akm-markdown.js +63 -0
- package/dist/core/asset/asset-placement.js +20 -6
- package/dist/core/asset/asset-ref.js +11 -9
- package/dist/core/asset/frontmatter-lint.js +30 -0
- package/dist/core/asset/frontmatter.js +37 -9
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +89 -18
- package/dist/core/asset/stash-meta.js +1 -1
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +152 -38
- package/dist/core/config/config-io.js +12 -1
- package/dist/core/config/config-schema.js +35 -8
- package/dist/core/config/config-sources.js +55 -11
- package/dist/core/config/config-walker.js +25 -9
- package/dist/core/config/config.js +9 -48
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +5 -1
- package/dist/core/config/schema/experimental.js +30 -0
- package/dist/core/config/schema/improve-processes.js +0 -6
- package/dist/core/config/schema/improve.js +21 -3
- package/dist/core/config/schema/index-config.js +8 -15
- package/dist/core/config/schema/output.js +4 -1
- package/dist/core/config/schema/setup.js +9 -18
- package/dist/core/config/schema/sources-bundles.js +49 -33
- package/dist/core/config/schema/workflow.js +3 -3
- package/dist/core/env-secret-ref.js +76 -46
- package/dist/core/errors.js +18 -12
- package/dist/core/events.js +46 -128
- package/dist/core/file-change.js +6 -5
- package/dist/core/fs-txn.js +83 -7
- package/dist/core/git-message.js +2 -2
- package/dist/core/improve-result.js +1 -100
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +2 -1
- package/dist/core/migration-operation.js +16 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/parse.js +4 -1
- package/dist/core/paths.js +17 -20
- package/dist/core/recognition-util.js +12 -14
- package/dist/core/redaction.js +34 -0
- package/dist/core/standards/resolve-standards-context.js +2 -14
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +2 -2
- package/dist/core/state/migrations.js +41 -18
- package/dist/core/state-db.js +5 -14
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +6 -4
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/type-presentation.js +3 -3
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +771 -95
- package/dist/indexer/bundle-identity-guard.js +3 -2
- package/dist/indexer/db/graph-db.js +0 -24
- package/dist/indexer/ensure-index.js +1 -0
- package/dist/indexer/graph/graph-boost.js +9 -34
- package/dist/indexer/graph/graph-extraction.js +8 -5
- package/dist/indexer/index-writer-lock.js +53 -17
- package/dist/indexer/index-written-assets.js +16 -22
- package/dist/indexer/indexer.js +497 -239
- package/dist/indexer/installations.js +14 -96
- package/dist/indexer/passes/dir-staleness.js +16 -9
- package/dist/indexer/passes/memory-inference.js +11 -9
- package/dist/indexer/passes/metadata.js +113 -47
- package/dist/indexer/scan/doc-to-entry.js +38 -1
- package/dist/indexer/scan/drain-dir.js +13 -23
- package/dist/indexer/search/db-search.js +99 -54
- package/dist/indexer/search/fts-query.js +47 -24
- package/dist/indexer/search/ranking-contributors.js +42 -20
- package/dist/indexer/search/ranking.js +18 -99
- package/dist/indexer/search/search-fields.js +7 -2
- package/dist/indexer/search/search-source.js +82 -93
- package/dist/indexer/usage/usage-events.js +0 -89
- package/dist/indexer/walk/file-context.js +2 -1
- package/dist/indexer/walk/matchers.js +30 -43
- package/dist/indexer/walk/path-resolver.js +7 -2
- package/dist/indexer/walk/walker.js +38 -12
- package/dist/integrations/agent/builders.js +0 -6
- package/dist/integrations/agent/config.js +2 -2
- package/dist/integrations/agent/detect.js +49 -19
- package/dist/integrations/agent/engine-fallback.js +76 -0
- package/dist/integrations/agent/profiles.js +14 -0
- package/dist/integrations/agent/prompts.js +12 -8
- package/dist/integrations/agent/runner-dispatch.js +4 -2
- package/dist/integrations/agent/runner.js +0 -1
- package/dist/integrations/agent/spawn.js +5 -6
- package/dist/integrations/github.js +1 -1
- package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
- package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
- package/dist/integrations/harnesses/claude/session-log.js +0 -10
- package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
- package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
- package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
- package/dist/integrations/harnesses/index.js +3 -7
- package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
- package/dist/integrations/harnesses/opencode/session-log.js +0 -15
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
- package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
- package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
- package/dist/integrations/lockfile.js +101 -6
- package/dist/integrations/session-logs/index.js +3 -28
- package/dist/llm/client.js +136 -100
- package/dist/llm/embedders/remote.js +13 -5
- package/dist/llm/feature-gate.js +4 -12
- package/dist/llm/graph-extract.js +5 -11
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +5 -7
- package/dist/llm/structured-call.js +1 -1
- package/dist/llm/usage-persist.js +26 -5
- package/dist/llm/usage-telemetry.js +25 -2
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +259 -0
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -36
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +56 -83
- package/dist/output/shapes/migrate.js +8 -0
- package/dist/output/shapes/passthrough.js +7 -41
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes.js +2 -9
- package/dist/output/text/{init.js → bundle-create.js} +3 -1
- package/dist/output/text/bundle-show.js +7 -0
- package/dist/output/text/command-format.js +164 -96
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/health-format.js +103 -0
- package/dist/output/text/health.js +7 -0
- package/dist/output/text/helpers.js +10 -8
- package/dist/output/text/lint-format.js +43 -0
- package/dist/output/text/{save.js → lint.js} +2 -2
- package/dist/output/text/migrate.js +88 -0
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +44 -72
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +15 -7
- package/dist/output/text/status-list.js +32 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +24 -203
- package/dist/output/text/workflow.js +1 -7
- package/dist/output/text.js +16 -17
- package/dist/registry/factory.js +4 -6
- package/dist/registry/origin-resolve.js +16 -27
- package/dist/registry/providers/skills-sh.js +3 -3
- package/dist/registry/providers/static-index.js +13 -23
- package/dist/registry/resolve.js +42 -7
- package/dist/registry/semver.js +34 -84
- package/dist/runtime.js +2 -23
- package/dist/scripts/akm-migrate-node.js +60290 -0
- package/dist/scripts/akm-migrate.js +59628 -0
- package/dist/setup/detect.js +42 -15
- package/dist/setup/registry-stash-loader.js +2 -2
- package/dist/setup/setup.js +236 -136
- package/dist/setup/steps/connection.js +7 -9
- package/dist/setup/steps/platforms.js +9 -9
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +12 -13
- package/dist/setup/steps/stashdir.js +2 -3
- package/dist/setup/steps/tasks.js +237 -120
- package/dist/sources/freshness.js +1 -1
- package/dist/sources/provider-factory.js +11 -17
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +278 -34
- package/dist/sources/providers/git-provider.js +25 -23
- package/dist/sources/providers/git-stash.js +395 -106
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +7 -4
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +6 -1
- package/dist/sources/resolve.js +6 -5
- package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
- package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
- package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
- package/dist/sources/snapshot-fetchers/github.js +100 -0
- package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
- package/dist/sources/snapshot-fetchers/registry.js +17 -1
- package/dist/sources/snapshot-fetchers/robots.js +348 -0
- package/dist/sources/snapshot-fetchers/rss.js +282 -0
- package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
- package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
- package/dist/sources/snapshot-fetchers/x.js +910 -0
- package/dist/storage/database.js +7 -0
- package/dist/storage/engines/sqlite-migrations.js +23 -111
- package/dist/storage/managed-db.js +2 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +27 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -12
- package/dist/storage/repositories/index-connection.js +17 -6
- package/dist/storage/repositories/index-entries-repository.js +151 -240
- package/dist/storage/repositories/index-entry-mapper.js +15 -11
- package/dist/storage/repositories/index-fts-repository.js +5 -2
- package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
- package/dist/storage/repositories/index-meta-repository.js +2 -3
- package/dist/storage/repositories/index-schema.js +10 -25
- package/dist/storage/repositories/index-utility-repository.js +15 -28
- package/dist/storage/repositories/index-vec-repository.js +6 -1
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +296 -59
- package/dist/storage/repositories/registry-cache.js +19 -0
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +15 -13
- package/dist/storage/repositories/workflow-runs-repository.js +52 -40
- package/dist/tasks/backends/cron.js +105 -15
- package/dist/tasks/backends/index.js +1 -1
- package/dist/tasks/backends/launchd.js +85 -38
- package/dist/tasks/backends/schtasks.js +135 -15
- package/dist/tasks/embedded.js +56 -40
- package/dist/tasks/parser.js +7 -157
- package/dist/tasks/resolve-akm-bin.js +137 -59
- package/dist/tasks/runner.js +79 -42
- package/dist/tasks/scheduler-invocation.js +220 -10
- package/dist/tasks/schema.js +24 -1
- package/dist/tasks/task-id.js +1 -3
- package/dist/tasks/validator.js +20 -6
- package/dist/workflows/authoring/authoring.js +94 -143
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/exec/frozen-judge.js +28 -2
- package/dist/workflows/exec/native-executor.js +77 -57
- package/dist/workflows/exec/param-secrets.js +9 -9
- package/dist/workflows/exec/run-workflow.js +133 -79
- package/dist/workflows/exec/step-work.js +219 -346
- package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
- package/dist/workflows/ir/compile.js +141 -270
- package/dist/workflows/ir/freeze.js +40 -30
- package/dist/workflows/ir/params.js +135 -11
- package/dist/workflows/ir/plan-hash.js +1 -1
- package/dist/workflows/ir/schema.js +25 -26
- package/dist/workflows/parser.js +872 -307
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +7 -10
- package/dist/workflows/renderer.js +95 -68
- package/dist/workflows/resource-limits.js +2 -0
- package/dist/workflows/runtime/checkin.js +3 -3
- package/dist/workflows/runtime/plan-classifier.js +16 -75
- package/dist/workflows/runtime/runs.js +186 -127
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +2 -2
- package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +30 -36
- package/dist/workflows/validator.js +21 -62
- package/docs/README.md +68 -0
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.7.0.md +11 -11
- package/docs/migration/release-notes/0.9.0.md +208 -27
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +564 -208
- package/docs/migration/v0.9.0-troubleshooting.md +561 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/cli.md +2253 -0
- package/docs/reference/configuration.md +358 -0
- package/docs/reference/data-and-telemetry.md +105 -42
- package/docs/reference/workflows.md +647 -0
- package/package.json +22 -11
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +81 -128
- package/schemas/akm-workflow.json +74 -73
- package/dist/assets/tasks/core/backup.yml +0 -5
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/cli/config-migrate.js +0 -1806
- package/dist/cli/config-validate.js +0 -41
- package/dist/commands/backup-cli.js +0 -56
- package/dist/commands/bundle/bundle-cli.js +0 -68
- package/dist/commands/bundle/bundle.js +0 -219
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -489
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/mv-cli.js +0 -1221
- package/dist/commands/sources/history.js +0 -201
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/core/migration-backup.js +0 -1234
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/migrate/legacy/config-source-migration.js +0 -223
- package/dist/migrate/legacy/content-migration.js +0 -305
- package/dist/migrate/legacy/legacy-layout.js +0 -779
- package/dist/migrate/legacy/legacy-paths.js +0 -25
- package/dist/migrate/legacy/legacy-stash-json.js +0 -72
- package/dist/migrate/legacy/proposal-fs-import.js +0 -168
- package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
- package/dist/migrate/legacy/three-db-cutover.js +0 -841
- package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
- package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
- package/dist/migrate/legacy-ref-grammar.js +0 -214
- package/dist/output/shapes/distill.js +0 -14
- package/dist/output/shapes/history.js +0 -11
- package/dist/output/text/distill.js +0 -6
- package/dist/output/text/enable-disable.js +0 -8
- package/dist/output/text/history.js +0 -6
- package/dist/registry/build-index.js +0 -382
- package/dist/schemas/akm-config.json +0 -4704
- package/dist/schemas/akm-task.json +0 -87
- package/dist/schemas/akm-workflow.json +0 -372
- package/dist/scripts/migrate-storage.js +0 -3816
- package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/cli.js +0 -53
- package/dist/workflows/exec/brief.js +0 -481
- package/dist/workflows/exec/report.js +0 -1460
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -813
- package/dist/workflows/program/project.js +0 -104
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* `sync()` resolves the npm package tarball, downloads it, verifies its
|
|
8
8
|
* integrity, extracts it securely (via `extractTarGzSecure`), detects the
|
|
9
|
-
* stash root inside the package, and applies any nested
|
|
10
|
-
* configuration. Cache hits short-circuit the fetch.
|
|
9
|
+
* stash root inside the package, and applies any nested `akm.include`
|
|
10
|
+
* (package.json) configuration. Cache hits short-circuit the fetch.
|
|
11
11
|
*/
|
|
12
12
|
import fs from "node:fs";
|
|
13
13
|
import path from "node:path";
|
|
@@ -19,11 +19,10 @@ import { applyAkmIncludeConfig, buildInstallCacheDir, computeFileHash, detectSta
|
|
|
19
19
|
import { extractTarGzSecure, verifyArchiveIntegrity } from "./tar-utils.js";
|
|
20
20
|
/**
|
|
21
21
|
* NPM source provider — fetches a tarball from the npm registry and extracts
|
|
22
|
-
* it into a local cache. Implements the
|
|
23
|
-
* (spec §2.1): `{ name, kind, init, path, sync }`.
|
|
22
|
+
* it into a local cache. Implements the {@link SourceProvider} interface.
|
|
24
23
|
*
|
|
25
24
|
* The install-time pipeline (`syncNpmRef`) lives below as a standalone
|
|
26
|
-
* function used by `akm add` / `akm update
|
|
25
|
+
* function used by `akm add` / `akm update`; that path produces a
|
|
27
26
|
* {@link SourceLockData} record for lockfile bookkeeping. The provider's own
|
|
28
27
|
* `sync()` is a void refresh (delegates to the install pipeline but discards
|
|
29
28
|
* the lock data, which is owned by `lockfile.ts`).
|
|
@@ -39,7 +38,7 @@ class NpmSourceProvider {
|
|
|
39
38
|
path() {
|
|
40
39
|
if (this.#config.path)
|
|
41
40
|
return this.#config.path;
|
|
42
|
-
throw new ConfigError(`npm source "${this.name}" has no resolved content path — run \`akm update\` to sync it before indexing.`);
|
|
41
|
+
throw new ConfigError(`npm source "${this.name}" has no resolved content path — run \`akm bundle update\` to sync it before indexing.`);
|
|
43
42
|
}
|
|
44
43
|
async sync(options) {
|
|
45
44
|
const ref = npmRefFromConfig(this.#config);
|
|
@@ -48,22 +47,20 @@ class NpmSourceProvider {
|
|
|
48
47
|
}
|
|
49
48
|
registerSourceProvider("npm", (config) => new NpmSourceProvider(config));
|
|
50
49
|
function npmRefFromConfig(config) {
|
|
51
|
-
|
|
52
|
-
// to options or url so the provider stays usable from a hand-rolled config.
|
|
53
|
-
const candidate = config.options?.ref ?? config.url ?? config.options?.package ?? config.name;
|
|
50
|
+
const candidate = config.path;
|
|
54
51
|
if (typeof candidate !== "string" || !candidate) {
|
|
55
|
-
throw new UsageError('npm
|
|
52
|
+
throw new UsageError('npm source entry must include a package ref (e.g. "npm:my-pkg@1.2.3")');
|
|
56
53
|
}
|
|
57
54
|
return candidate.startsWith("npm:") ? candidate : `npm:${candidate}`;
|
|
58
55
|
}
|
|
59
56
|
/**
|
|
60
57
|
* Fetch and extract an npm tarball, returning a populated `SourceLockData`.
|
|
61
58
|
*
|
|
62
|
-
*
|
|
63
|
-
* -
|
|
59
|
+
* Materializes npm sources by:
|
|
60
|
+
* - resolving the artifact URL and integrity from the npm registry
|
|
64
61
|
* - reuse cached extraction when present
|
|
65
62
|
* - download, verify, extract securely, then detect the stash root
|
|
66
|
-
* - honour
|
|
63
|
+
* - honour `akm.include` (package.json) filters
|
|
67
64
|
*/
|
|
68
65
|
export async function syncNpmRef(ref, options) {
|
|
69
66
|
const parsed = parseRegistryRef(ref);
|
|
@@ -107,7 +104,7 @@ async function doSyncNpm(parsed, options) {
|
|
|
107
104
|
}
|
|
108
105
|
fs.mkdirSync(cacheDir, { recursive: true });
|
|
109
106
|
let integrity;
|
|
110
|
-
let
|
|
107
|
+
let provisionalBundleRoot;
|
|
111
108
|
let installRoot;
|
|
112
109
|
let stashRoot;
|
|
113
110
|
try {
|
|
@@ -115,15 +112,15 @@ async function doSyncNpm(parsed, options) {
|
|
|
115
112
|
verifyArchiveIntegrity(archivePath, resolved.resolvedRevision, resolved.source);
|
|
116
113
|
integrity = await computeFileHash(archivePath);
|
|
117
114
|
extractTarGzSecure(archivePath, extractedDir);
|
|
118
|
-
const
|
|
119
|
-
if (!
|
|
115
|
+
const detectedProvisionalBundleRoot = detectStashRoot(extractedDir);
|
|
116
|
+
if (!detectedProvisionalBundleRoot) {
|
|
120
117
|
throw new UsageError(`Unable to detect a stash root in extracted npm package: ${resolved.ref}`);
|
|
121
118
|
}
|
|
122
|
-
|
|
123
|
-
installRoot = applyAkmIncludeConfig(
|
|
119
|
+
provisionalBundleRoot = detectedProvisionalBundleRoot;
|
|
120
|
+
installRoot = applyAkmIncludeConfig(provisionalBundleRoot, cacheDir, extractedDir) ?? provisionalBundleRoot;
|
|
124
121
|
const detectedStashRoot = detectStashRoot(installRoot);
|
|
125
122
|
if (!detectedStashRoot) {
|
|
126
|
-
throw new UsageError(`Unable to detect a stash root after applying .
|
|
123
|
+
throw new UsageError(`Unable to detect a stash root after applying akm.include (package.json) configuration for npm package: ${resolved.ref}`);
|
|
127
124
|
}
|
|
128
125
|
stashRoot = detectedStashRoot;
|
|
129
126
|
}
|
|
@@ -76,14 +76,17 @@ function uniqueSlug() {
|
|
|
76
76
|
* `local` sources get a unique slug so each install is isolated.
|
|
77
77
|
*/
|
|
78
78
|
export function buildInstallCacheDir(cacheRootDir, source, id, version) {
|
|
79
|
-
const
|
|
79
|
+
const safeId = id.replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
80
|
+
const identitySuffix = version === "writable" ? `-${createHash("sha256").update(`${source}:${id}`).digest("hex").slice(0, 12)}` : "";
|
|
81
|
+
const slug = `${source}-${safeId}${identitySuffix}`;
|
|
80
82
|
const versionSlug = source === "local" ? uniqueSlug() : (version?.replace(/[^a-zA-Z0-9_.-]+/g, "-") ?? uniqueSlug());
|
|
81
83
|
return path.join(cacheRootDir, slug || source, versionSlug);
|
|
82
84
|
}
|
|
83
85
|
/**
|
|
84
|
-
* Apply an
|
|
85
|
-
*
|
|
86
|
-
*
|
|
86
|
+
* Apply an `akm.include` config (a `package.json` `akm.include` array — NOT
|
|
87
|
+
* a `.akm-include` dotfile) if any, by copying the selected paths into a
|
|
88
|
+
* sibling `selected/` directory and returning that path. Returns undefined
|
|
89
|
+
* when no include config is found.
|
|
87
90
|
*/
|
|
88
91
|
export function applyAkmIncludeConfig(sourceRoot, cacheDir, searchRoot = sourceRoot) {
|
|
89
92
|
const includeConfig = findNearestIncludeConfig(sourceRoot, searchRoot);
|
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Replaces the historical `installRegistryRef()` entry point. Given an
|
|
8
|
-
* unparsed install ref, this resolves the right syncable provider and
|
|
9
|
-
* invokes its `sync()` method.
|
|
5
|
+
* Materialize an install ref through the matching source implementation.
|
|
10
6
|
*/
|
|
11
7
|
import { UsageError } from "../../core/errors.js";
|
|
12
8
|
import { parseRegistryRef } from "../../registry/resolve.js";
|
|
@@ -21,11 +17,9 @@ export async function syncFromRef(ref, options) {
|
|
|
21
17
|
return syncNpmRef(ref, options);
|
|
22
18
|
}
|
|
23
19
|
if (parsed.source === "git" || parsed.source === "github") {
|
|
24
|
-
const {
|
|
25
|
-
return
|
|
20
|
+
const { syncGitRef } = await import("./git-install.js");
|
|
21
|
+
return syncGitRef(ref, options);
|
|
26
22
|
}
|
|
27
|
-
// Exhaustiveness — `parseRegistryRef` only emits the four sources above.
|
|
28
|
-
const _exhaustive = parsed;
|
|
29
23
|
throw new UsageError(`No syncable provider for ref: ${ref}`);
|
|
30
24
|
}
|
|
31
25
|
function syncLocalRef(parsed, options) {
|
|
@@ -14,12 +14,17 @@ registerSourceProvider("website", (config) => {
|
|
|
14
14
|
kind: "website",
|
|
15
15
|
name,
|
|
16
16
|
path() {
|
|
17
|
-
return getWebsiteCachePaths(url).
|
|
17
|
+
return getWebsiteCachePaths(url).rootDir;
|
|
18
18
|
},
|
|
19
19
|
async sync(options) {
|
|
20
20
|
await ensureWebsiteMirror(config, {
|
|
21
21
|
requireStashDir: true,
|
|
22
22
|
force: options?.force,
|
|
23
|
+
// Feed the resolver into the EXISTING website-ingest plumbing that
|
|
24
|
+
// already threads `resolveSecret` down to `FetcherContext`. This is the
|
|
25
|
+
// line that closes the bundle-update / sync() gap: previously the X
|
|
26
|
+
// fetcher on this path saw only `X_BEARER_TOKEN`, never the store.
|
|
27
|
+
...(options?.secrets ? { resolveSecret: options.secrets.resolveSecret } : {}),
|
|
23
28
|
...(allowPrivateHosts ? { allowPrivateHosts: true } : {}),
|
|
24
29
|
});
|
|
25
30
|
},
|
package/dist/sources/resolve.js
CHANGED
|
@@ -5,6 +5,7 @@ import fs from "node:fs";
|
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { recognizeMatch } from "../core/adapter/recognize-match.js";
|
|
7
7
|
import { assetPathForName, deriveCanonicalAssetNameFromStashRoot, isRelevantAssetFile, stashDirFor, } from "../core/asset/asset-placement.js";
|
|
8
|
+
import { conceptIdFromTypeName } from "../core/asset/resolve-ref.js";
|
|
8
9
|
import { hasErrnoCode, isWithin } from "../core/common.js";
|
|
9
10
|
import { NotFoundError, UsageError } from "../core/errors.js";
|
|
10
11
|
import { walkStashFlat } from "../indexer/walk/walker.js";
|
|
@@ -36,7 +37,7 @@ function resolveInTypeDir(stashDir, typeDir, type, name) {
|
|
|
36
37
|
throw new UsageError("Ref resolves outside the stash root.", "PATH_ESCAPE_VIOLATION");
|
|
37
38
|
}
|
|
38
39
|
if (!fs.existsSync(resolvedTarget) || !fs.statSync(resolvedTarget).isFile()) {
|
|
39
|
-
throw new NotFoundError(`Stash asset not found for ref: ${type
|
|
40
|
+
throw new NotFoundError(`Stash asset not found for ref: ${conceptIdFromTypeName(type, name)}`, "ASSET_NOT_FOUND");
|
|
40
41
|
}
|
|
41
42
|
const realTarget = fs.realpathSync(resolvedTarget);
|
|
42
43
|
if (!isWithin(realTarget, resolvedRoot)) {
|
|
@@ -46,15 +47,15 @@ function resolveInTypeDir(stashDir, typeDir, type, name) {
|
|
|
46
47
|
if (type === "script") {
|
|
47
48
|
throw new NotFoundError("Script ref must resolve to a file with a supported script extension. Refer to the akm documentation for the complete list of supported script extensions.");
|
|
48
49
|
}
|
|
49
|
-
throw new NotFoundError(`Stash asset not found for ref: ${type
|
|
50
|
+
throw new NotFoundError(`Stash asset not found for ref: ${conceptIdFromTypeName(type, name)}`, "ASSET_NOT_FOUND");
|
|
50
51
|
}
|
|
51
52
|
return realTarget;
|
|
52
53
|
}
|
|
53
54
|
function resolveAndValidateTypeRoot(root, type, name) {
|
|
54
55
|
const rootStat = readTypeRootStat(root, type, name);
|
|
55
56
|
if (!rootStat.isDirectory()) {
|
|
56
|
-
throw new NotFoundError(`Asset directory for ${type} assets is not accessible — got a file where a directory was expected for ref: ${type
|
|
57
|
-
"Run `akm index` to rebuild the index, or check your source configuration.", "ASSET_NOT_FOUND", "Run `akm list` to see your configured sources and verify the source path exists.");
|
|
57
|
+
throw new NotFoundError(`Asset directory for ${type} assets is not accessible — got a file where a directory was expected for ref: ${conceptIdFromTypeName(type, name)}. ` +
|
|
58
|
+
"Run `akm index` to rebuild the index, or check your source configuration.", "ASSET_NOT_FOUND", "Run `akm bundle list` to see your configured sources and verify the source path exists.");
|
|
58
59
|
}
|
|
59
60
|
return fs.realpathSync(root);
|
|
60
61
|
}
|
|
@@ -64,7 +65,7 @@ function readTypeRootStat(root, type, name) {
|
|
|
64
65
|
}
|
|
65
66
|
catch (error) {
|
|
66
67
|
if (hasErrnoCode(error, "ENOENT")) {
|
|
67
|
-
throw new NotFoundError(`Asset not found for ref: ${type
|
|
68
|
+
throw new NotFoundError(`Asset not found for ref: ${conceptIdFromTypeName(type, name)}. No ${type} assets are present in the configured source.`, "ASSET_NOT_FOUND", "Run `akm bundle list` to see your configured sources, or `akm index` to rebuild the search index.");
|
|
68
69
|
}
|
|
69
70
|
throw error;
|
|
70
71
|
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
import { isSafeLinkUrl } from "./content-extract.js";
|
|
5
|
+
import { coerceString, escapeMarkdownStructure } from "./fetcher-util.js";
|
|
6
|
+
import { fetchPinnedJson } from "./host-guard.js";
|
|
7
|
+
/**
|
|
8
|
+
* Bluesky profile fetcher, using the public AT Protocol XRPC endpoints.
|
|
9
|
+
*
|
|
10
|
+
* No authentication: `public.api.bsky.app` serves public profiles unauthed.
|
|
11
|
+
* The fetcher contract takes a URL, so bare-handle input (`@user.bsky.social`)
|
|
12
|
+
* is out of scope — that is `akm bundle add` sugar, not an addressable source.
|
|
13
|
+
*/
|
|
14
|
+
const BSKY_HOSTS = new Set(["bsky.app", "www.bsky.app"]);
|
|
15
|
+
const PUBLIC_API_BASE = "https://public.api.bsky.app";
|
|
16
|
+
/** The XRPC endpoint caps `limit` at 100; asking for more is an error. */
|
|
17
|
+
const MAX_FEED_LIMIT = 100;
|
|
18
|
+
const DEFAULT_FEED_LIMIT = 50;
|
|
19
|
+
/** Bound the JSON read: fetch timeouts cover only the header phase. */
|
|
20
|
+
const BSKY_BYTE_CAP = 4 * 1024 * 1024;
|
|
21
|
+
const BSKY_BODY_TIMEOUT_MS = 30_000;
|
|
22
|
+
/** Extract a handle from `https://bsky.app/profile/<handle>`. */
|
|
23
|
+
export function extractBlueskyHandle(url) {
|
|
24
|
+
if (!BSKY_HOSTS.has(url.hostname.toLowerCase()))
|
|
25
|
+
return null;
|
|
26
|
+
const segments = url.pathname.split("/").filter(Boolean);
|
|
27
|
+
if (segments.length < 2 || segments[0] !== "profile")
|
|
28
|
+
return null;
|
|
29
|
+
const handle = segments[1]?.trim();
|
|
30
|
+
if (!handle)
|
|
31
|
+
return null;
|
|
32
|
+
// Only the profile root is a snapshot target; /post/<id> and other
|
|
33
|
+
// sub-routes are individual records, not a profile feed.
|
|
34
|
+
if (segments.length > 2)
|
|
35
|
+
return null;
|
|
36
|
+
return handle.replace(/^@/, "");
|
|
37
|
+
}
|
|
38
|
+
/** Emit a link only when it is a safe absolute http(s) URL. */
|
|
39
|
+
function safeLink(value) {
|
|
40
|
+
if (!value)
|
|
41
|
+
return "";
|
|
42
|
+
try {
|
|
43
|
+
return isSafeLinkUrl(new URL(value)) ? value : "";
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return "";
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function num(value) {
|
|
50
|
+
return typeof value === "number" && Number.isFinite(value) ? value : 0;
|
|
51
|
+
}
|
|
52
|
+
function xrpcJson(url, timeoutMs, signal) {
|
|
53
|
+
return fetchPinnedJson(url, {
|
|
54
|
+
headers: { Accept: "application/json", "User-Agent": "akm-cli bluesky fetcher" },
|
|
55
|
+
byteCap: BSKY_BYTE_CAP,
|
|
56
|
+
bodyTimeoutMs: BSKY_BODY_TIMEOUT_MS,
|
|
57
|
+
timeoutMs,
|
|
58
|
+
signal,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/** Resolve a handle to its DID. Returns null when the handle does not exist. */
|
|
62
|
+
async function resolveHandle(handle, timeoutMs, signal) {
|
|
63
|
+
const url = `${PUBLIC_API_BASE}/xrpc/com.atproto.identity.resolveHandle?handle=${encodeURIComponent(handle)}`;
|
|
64
|
+
const json = (await xrpcJson(url, timeoutMs, signal));
|
|
65
|
+
const did = coerceString(json?.did);
|
|
66
|
+
return did || null;
|
|
67
|
+
}
|
|
68
|
+
function readPosts(feed, limit) {
|
|
69
|
+
if (!Array.isArray(feed))
|
|
70
|
+
return [];
|
|
71
|
+
const posts = [];
|
|
72
|
+
for (const entry of feed.slice(0, limit)) {
|
|
73
|
+
const post = entry?.post;
|
|
74
|
+
if (!post)
|
|
75
|
+
continue;
|
|
76
|
+
const record = (post.record ?? {});
|
|
77
|
+
const embed = (post.embed ?? {});
|
|
78
|
+
const external = (embed.external ?? {});
|
|
79
|
+
posts.push({
|
|
80
|
+
text: coerceString(record.text),
|
|
81
|
+
createdAt: coerceString(record.createdAt),
|
|
82
|
+
uri: coerceString(post.uri),
|
|
83
|
+
likeCount: num(post.likeCount),
|
|
84
|
+
repostCount: num(post.repostCount),
|
|
85
|
+
externalUri: safeLink(coerceString(external.uri)),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return posts;
|
|
89
|
+
}
|
|
90
|
+
/** Convert an `at://did/app.bsky.feed.post/<rkey>` URI to a bsky.app permalink. */
|
|
91
|
+
function permalink(handle, uri) {
|
|
92
|
+
const rkey = uri.split("/").pop();
|
|
93
|
+
return rkey ? `https://bsky.app/profile/${handle}/post/${rkey}` : "";
|
|
94
|
+
}
|
|
95
|
+
function renderMarkdown(handle, posts) {
|
|
96
|
+
const sections = [];
|
|
97
|
+
for (const post of posts) {
|
|
98
|
+
if (!post.text && !post.externalUri)
|
|
99
|
+
continue;
|
|
100
|
+
const when = post.createdAt ? new Date(post.createdAt) : null;
|
|
101
|
+
const iso = when && !Number.isNaN(when.getTime()) ? when.toISOString() : "";
|
|
102
|
+
sections.push(`## ${iso || "(undated)"}`, "");
|
|
103
|
+
if (post.text)
|
|
104
|
+
sections.push(escapeMarkdownStructure(post.text), "");
|
|
105
|
+
const meta = [];
|
|
106
|
+
const link = permalink(handle, post.uri);
|
|
107
|
+
if (link)
|
|
108
|
+
meta.push(link);
|
|
109
|
+
if (post.externalUri)
|
|
110
|
+
meta.push(`link: ${post.externalUri}`);
|
|
111
|
+
meta.push(`${post.likeCount} likes, ${post.repostCount} reposts`);
|
|
112
|
+
sections.push(meta.join(" — "), "");
|
|
113
|
+
}
|
|
114
|
+
return sections.join("\n").trimEnd();
|
|
115
|
+
}
|
|
116
|
+
const blueskyFetcher = {
|
|
117
|
+
name: "bluesky-profile",
|
|
118
|
+
matches(url) {
|
|
119
|
+
return extractBlueskyHandle(url) !== null;
|
|
120
|
+
},
|
|
121
|
+
async fetch(url, context) {
|
|
122
|
+
const handle = extractBlueskyHandle(url);
|
|
123
|
+
if (!handle)
|
|
124
|
+
return null;
|
|
125
|
+
const did = await resolveHandle(handle, context.timeoutMs, context.signal);
|
|
126
|
+
if (!did)
|
|
127
|
+
return null;
|
|
128
|
+
const feedUrl = `${PUBLIC_API_BASE}/xrpc/app.bsky.feed.getAuthorFeed` +
|
|
129
|
+
`?actor=${encodeURIComponent(did)}&limit=${Math.min(DEFAULT_FEED_LIMIT, MAX_FEED_LIMIT)}`;
|
|
130
|
+
const json = (await xrpcJson(feedUrl, context.timeoutMs, context.signal));
|
|
131
|
+
if (!json)
|
|
132
|
+
return null;
|
|
133
|
+
const posts = readPosts(json.feed, DEFAULT_FEED_LIMIT);
|
|
134
|
+
const markdown = renderMarkdown(handle, posts);
|
|
135
|
+
if (!markdown)
|
|
136
|
+
return null;
|
|
137
|
+
return {
|
|
138
|
+
url: `https://bsky.app/profile/${handle}`,
|
|
139
|
+
title: `Bluesky — @${handle}`,
|
|
140
|
+
markdown,
|
|
141
|
+
preferredName: `bluesky/${handle}`,
|
|
142
|
+
tags: ["bluesky", "social"],
|
|
143
|
+
};
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
export default blueskyFetcher;
|