@askdkc/kiokuko 0.1.17 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +91 -112
- package/README.ko.md +90 -102
- package/README.md +103 -262
- package/README.zh-CN.md +88 -102
- package/dist/agent-file/atomic-write.d.ts +90 -3
- package/dist/agent-file/atomic-write.d.ts.map +1 -1
- package/dist/agent-file/atomic-write.js +990 -14
- package/dist/agent-file/atomic-write.js.map +1 -1
- package/dist/agent-file/managed-block.d.ts +12 -1
- package/dist/agent-file/managed-block.d.ts.map +1 -1
- package/dist/agent-file/managed-block.js +49 -4
- package/dist/agent-file/managed-block.js.map +1 -1
- package/dist/agent-file/render.d.ts +1 -1
- package/dist/agent-file/render.d.ts.map +1 -1
- package/dist/agent-file/render.js +10 -7
- package/dist/agent-file/render.js.map +1 -1
- package/dist/akinator/agent-task.d.ts +11 -22
- package/dist/akinator/agent-task.d.ts.map +1 -1
- package/dist/akinator/agent-task.js +454 -99
- package/dist/akinator/agent-task.js.map +1 -1
- package/dist/akinator/capabilities.d.ts +18 -6
- package/dist/akinator/capabilities.d.ts.map +1 -1
- package/dist/akinator/capabilities.js +72 -35
- package/dist/akinator/capabilities.js.map +1 -1
- package/dist/akinator/capability-binding.d.ts +11 -0
- package/dist/akinator/capability-binding.d.ts.map +1 -0
- package/dist/akinator/capability-binding.js +56 -0
- package/dist/akinator/capability-binding.js.map +1 -0
- package/dist/akinator/domain.js +2 -2
- package/dist/akinator/domain.js.map +1 -1
- package/dist/akinator/knowledge-path.d.ts.map +1 -1
- package/dist/akinator/knowledge-path.js +409 -39
- package/dist/akinator/knowledge-path.js.map +1 -1
- package/dist/akinator/orchestrator.d.ts +3 -4
- package/dist/akinator/orchestrator.d.ts.map +1 -1
- package/dist/akinator/orchestrator.js +1 -4
- package/dist/akinator/orchestrator.js.map +1 -1
- package/dist/akinator/service.d.ts +0 -4
- package/dist/akinator/service.d.ts.map +1 -1
- package/dist/akinator/service.js +19 -35
- package/dist/akinator/service.js.map +1 -1
- package/dist/akinator/skill-discovery-attempt.d.ts +20 -0
- package/dist/akinator/skill-discovery-attempt.d.ts.map +1 -0
- package/dist/akinator/skill-discovery-attempt.js +390 -0
- package/dist/akinator/skill-discovery-attempt.js.map +1 -0
- package/dist/akinator/store.d.ts.map +1 -1
- package/dist/akinator/store.js +107 -52
- package/dist/akinator/store.js.map +1 -1
- package/dist/akinator/types.d.ts +0 -12
- package/dist/akinator/types.d.ts.map +1 -1
- package/dist/bin/kiokuko.js +0 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +534 -148
- package/dist/cli.js.map +1 -1
- package/dist/client/server-client.d.ts +5 -3
- package/dist/client/server-client.d.ts.map +1 -1
- package/dist/client/server-client.js +486 -181
- package/dist/client/server-client.js.map +1 -1
- package/dist/commands/agent.d.ts +2 -0
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +861 -86
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/backup.d.ts +2 -1
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +64 -8
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/doctor.d.ts +5 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +70 -26
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/export.d.ts +0 -4
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +191 -32
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/import.d.ts +10 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +592 -113
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts +19 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +569 -22
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/purge.d.ts.map +1 -1
- package/dist/commands/purge.js +3 -0
- package/dist/commands/purge.js.map +1 -1
- package/dist/commands/setup.d.ts +34 -8
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +418 -86
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/skills.d.ts +9 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +317 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/use.d.ts +10 -2
- package/dist/commands/use.d.ts.map +1 -1
- package/dist/commands/use.js +851 -73
- package/dist/commands/use.js.map +1 -1
- package/dist/config/paths.d.ts +11 -1
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +64 -29
- package/dist/config/paths.js.map +1 -1
- package/dist/config/project-config.d.ts +1 -0
- package/dist/config/project-config.d.ts.map +1 -1
- package/dist/config/project-config.js +70 -32
- package/dist/config/project-config.js.map +1 -1
- package/dist/context/broker.d.ts +28 -14
- package/dist/context/broker.d.ts.map +1 -1
- package/dist/context/broker.js +604 -145
- package/dist/context/broker.js.map +1 -1
- package/dist/context/delivery.d.ts +6 -21
- package/dist/context/delivery.d.ts.map +1 -1
- package/dist/context/delivery.js +196 -147
- package/dist/context/delivery.js.map +1 -1
- package/dist/context/feedback.d.ts +11 -12
- package/dist/context/feedback.d.ts.map +1 -1
- package/dist/context/feedback.js +229 -261
- package/dist/context/feedback.js.map +1 -1
- package/dist/context/ranking.d.ts +1 -12
- package/dist/context/ranking.d.ts.map +1 -1
- package/dist/context/ranking.js +13 -4
- package/dist/context/ranking.js.map +1 -1
- package/dist/context/recommendations.d.ts +0 -5
- package/dist/context/recommendations.d.ts.map +1 -1
- package/dist/context/recommendations.js +0 -1
- package/dist/context/recommendations.js.map +1 -1
- package/dist/context/run-state.d.ts +26 -0
- package/dist/context/run-state.d.ts.map +1 -0
- package/dist/context/run-state.js +399 -0
- package/dist/context/run-state.js.map +1 -0
- package/dist/context/scoped-broker.d.ts +17 -5
- package/dist/context/scoped-broker.d.ts.map +1 -1
- package/dist/context/scoped-broker.js +512 -106
- package/dist/context/scoped-broker.js.map +1 -1
- package/dist/context/selection-state.d.ts +19 -0
- package/dist/context/selection-state.d.ts.map +1 -0
- package/dist/context/selection-state.js +250 -0
- package/dist/context/selection-state.js.map +1 -0
- package/dist/db/adapter.d.ts +5 -3
- package/dist/db/adapter.d.ts.map +1 -1
- package/dist/db/adapter.js +6 -3
- package/dist/db/adapter.js.map +1 -1
- package/dist/db/capabilities.d.ts.map +1 -1
- package/dist/db/capabilities.js +34 -16
- package/dist/db/capabilities.js.map +1 -1
- package/dist/db/connection.d.ts +8 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +55 -26
- package/dist/db/connection.js.map +1 -1
- package/dist/db/migrate.d.ts +28 -7
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +106 -78
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/sqlite-retry.d.ts +11 -0
- package/dist/db/sqlite-retry.d.ts.map +1 -0
- package/dist/db/sqlite-retry.js +66 -0
- package/dist/db/sqlite-retry.js.map +1 -0
- package/dist/db/transaction.d.ts +13 -0
- package/dist/db/transaction.d.ts.map +1 -1
- package/dist/db/transaction.js +53 -24
- package/dist/db/transaction.js.map +1 -1
- package/dist/db/upgrade-backup.d.ts +58 -2
- package/dist/db/upgrade-backup.d.ts.map +1 -1
- package/dist/db/upgrade-backup.js +757 -28
- package/dist/db/upgrade-backup.js.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/gateway/agent-service.d.ts +4 -1
- package/dist/gateway/agent-service.d.ts.map +1 -1
- package/dist/gateway/agent-service.js +71 -58
- package/dist/gateway/agent-service.js.map +1 -1
- package/dist/gateway/checkpoint-service.d.ts +1 -0
- package/dist/gateway/checkpoint-service.d.ts.map +1 -1
- package/dist/gateway/checkpoint-service.js +47 -24
- package/dist/gateway/checkpoint-service.js.map +1 -1
- package/dist/ledger/archive.d.ts +1 -4
- package/dist/ledger/archive.d.ts.map +1 -1
- package/dist/ledger/archive.js +77 -39
- package/dist/ledger/archive.js.map +1 -1
- package/dist/ledger/maintenance.d.ts +0 -11
- package/dist/ledger/maintenance.d.ts.map +1 -1
- package/dist/ledger/maintenance.js +24 -40
- package/dist/ledger/maintenance.js.map +1 -1
- package/dist/ledger/projection.d.ts +0 -1
- package/dist/ledger/projection.d.ts.map +1 -1
- package/dist/ledger/projection.js.map +1 -1
- package/dist/ledger/promotion.d.ts +0 -9
- package/dist/ledger/promotion.d.ts.map +1 -1
- package/dist/ledger/promotion.js.map +1 -1
- package/dist/ledger/query.d.ts +1 -15
- package/dist/ledger/query.d.ts.map +1 -1
- package/dist/ledger/query.js.map +1 -1
- package/dist/ledger/store.d.ts +0 -1
- package/dist/ledger/store.d.ts.map +1 -1
- package/dist/ledger/store.js +11 -8
- package/dist/ledger/store.js.map +1 -1
- package/dist/ledger/types.d.ts +0 -4
- package/dist/ledger/types.d.ts.map +1 -1
- package/dist/ledger/types.js.map +1 -1
- package/dist/ledger/validate.d.ts.map +1 -1
- package/dist/ledger/validate.js +0 -5
- package/dist/ledger/validate.js.map +1 -1
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +105 -54
- package/dist/mcp/server.js.map +1 -1
- package/dist/memory/audit.d.ts +0 -1
- package/dist/memory/audit.d.ts.map +1 -1
- package/dist/memory/audit.js +0 -1
- package/dist/memory/audit.js.map +1 -1
- package/dist/memory/curator.d.ts.map +1 -1
- package/dist/memory/curator.js +172 -96
- package/dist/memory/curator.js.map +1 -1
- package/dist/memory/entries.d.ts +12 -2
- package/dist/memory/entries.d.ts.map +1 -1
- package/dist/memory/entries.js +198 -114
- package/dist/memory/entries.js.map +1 -1
- package/dist/memory/federated-retrieval.d.ts +12 -1
- package/dist/memory/federated-retrieval.d.ts.map +1 -1
- package/dist/memory/federated-retrieval.js +183 -70
- package/dist/memory/federated-retrieval.js.map +1 -1
- package/dist/memory/hybrid-retrieval.d.ts +5 -11
- package/dist/memory/hybrid-retrieval.d.ts.map +1 -1
- package/dist/memory/hybrid-retrieval.js +78 -58
- package/dist/memory/hybrid-retrieval.js.map +1 -1
- package/dist/memory/lifecycle.d.ts.map +1 -1
- package/dist/memory/lifecycle.js +17 -13
- package/dist/memory/lifecycle.js.map +1 -1
- package/dist/memory/rebuild-search.d.ts +5 -0
- package/dist/memory/rebuild-search.d.ts.map +1 -1
- package/dist/memory/rebuild-search.js +101 -76
- package/dist/memory/rebuild-search.js.map +1 -1
- package/dist/memory/retrieval-query.d.ts +0 -5
- package/dist/memory/retrieval-query.d.ts.map +1 -1
- package/dist/memory/retrieval-query.js +0 -5
- package/dist/memory/retrieval-query.js.map +1 -1
- package/dist/memory/retrieval.d.ts.map +1 -1
- package/dist/memory/retrieval.js +25 -131
- package/dist/memory/retrieval.js.map +1 -1
- package/dist/memory/revisions.d.ts +76 -1
- package/dist/memory/revisions.d.ts.map +1 -1
- package/dist/memory/revisions.js +539 -35
- package/dist/memory/revisions.js.map +1 -1
- package/dist/memory/scoped-memory.d.ts +16 -1
- package/dist/memory/scoped-memory.d.ts.map +1 -1
- package/dist/memory/scoped-memory.js +240 -107
- package/dist/memory/scoped-memory.js.map +1 -1
- package/dist/memory/secrets.d.ts +2 -0
- package/dist/memory/secrets.d.ts.map +1 -1
- package/dist/memory/secrets.js +36 -0
- package/dist/memory/secrets.js.map +1 -1
- package/dist/memory/structured-memory.d.ts +3 -2
- package/dist/memory/structured-memory.d.ts.map +1 -1
- package/dist/memory/structured-memory.js +54 -22
- package/dist/memory/structured-memory.js.map +1 -1
- package/dist/memory/workspaces.d.ts +9 -0
- package/dist/memory/workspaces.d.ts.map +1 -1
- package/dist/memory/workspaces.js +67 -0
- package/dist/memory/workspaces.js.map +1 -1
- package/dist/package-version.d.ts +2 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +7 -0
- package/dist/package-version.js.map +1 -0
- package/dist/repository/binding.d.ts +5 -0
- package/dist/repository/binding.d.ts.map +1 -1
- package/dist/repository/binding.js +117 -17
- package/dist/repository/binding.js.map +1 -1
- package/dist/repository/framework-version.d.ts +8 -0
- package/dist/repository/framework-version.d.ts.map +1 -0
- package/dist/repository/framework-version.js +29 -0
- package/dist/repository/framework-version.js.map +1 -0
- package/dist/repository/identity-value.d.ts +4 -0
- package/dist/repository/identity-value.d.ts.map +1 -0
- package/dist/repository/identity-value.js +24 -0
- package/dist/repository/identity-value.js.map +1 -0
- package/dist/repository/identity.d.ts.map +1 -1
- package/dist/repository/identity.js +2 -0
- package/dist/repository/identity.js.map +1 -1
- package/dist/repository/project-fingerprint.d.ts +14 -2
- package/dist/repository/project-fingerprint.d.ts.map +1 -1
- package/dist/repository/project-fingerprint.js +312 -33
- package/dist/repository/project-fingerprint.js.map +1 -1
- package/dist/repository/remote-url.d.ts +0 -1
- package/dist/repository/remote-url.d.ts.map +1 -1
- package/dist/repository/remote-url.js +0 -1
- package/dist/repository/remote-url.js.map +1 -1
- package/dist/runtime-version.d.ts +2 -1
- package/dist/runtime-version.d.ts.map +1 -1
- package/dist/runtime-version.js +21 -4
- package/dist/runtime-version.js.map +1 -1
- package/dist/serialization/boundary-json.d.ts +20 -0
- package/dist/serialization/boundary-json.d.ts.map +1 -0
- package/dist/serialization/boundary-json.js +129 -0
- package/dist/serialization/boundary-json.js.map +1 -0
- package/dist/serialization/envelope.js +1 -1
- package/dist/serialization/envelope.js.map +1 -1
- package/dist/serialization/validate.d.ts +7 -0
- package/dist/serialization/validate.d.ts.map +1 -1
- package/dist/serialization/validate.js +53 -13
- package/dist/serialization/validate.js.map +1 -1
- package/dist/server/app.js +1 -1
- package/dist/server/app.js.map +1 -1
- package/dist/server/http.d.ts +4 -3
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +90 -50
- package/dist/server/http.js.map +1 -1
- package/dist/server/idempotency.d.ts +0 -6
- package/dist/server/idempotency.d.ts.map +1 -1
- package/dist/server/idempotency.js.map +1 -1
- package/dist/server/router.d.ts.map +1 -1
- package/dist/server/router.js +21 -4
- package/dist/server/router.js.map +1 -1
- package/dist/server/routes/agent-capability-gate.d.ts +40 -0
- package/dist/server/routes/agent-capability-gate.d.ts.map +1 -0
- package/dist/server/routes/agent-capability-gate.js +182 -0
- package/dist/server/routes/agent-capability-gate.js.map +1 -0
- package/dist/server/routes/agent-events.d.ts.map +1 -1
- package/dist/server/routes/agent-events.js +8 -1
- package/dist/server/routes/agent-events.js.map +1 -1
- package/dist/server/routes/agent-intake.d.ts.map +1 -1
- package/dist/server/routes/agent-intake.js +10 -2
- package/dist/server/routes/agent-intake.js.map +1 -1
- package/dist/server/routes/agent-promotions.d.ts.map +1 -1
- package/dist/server/routes/agent-promotions.js +5 -2
- package/dist/server/routes/agent-promotions.js.map +1 -1
- package/dist/server/routes/agent-runs.d.ts.map +1 -1
- package/dist/server/routes/agent-runs.js +18 -4
- package/dist/server/routes/agent-runs.js.map +1 -1
- package/dist/server/routes/request-binding.d.ts +5 -0
- package/dist/server/routes/request-binding.d.ts.map +1 -0
- package/dist/server/routes/request-binding.js +49 -0
- package/dist/server/routes/request-binding.js.map +1 -0
- package/dist/server/routes/task5-support.d.ts +1 -8
- package/dist/server/routes/task5-support.d.ts.map +1 -1
- package/dist/server/routes/task5-support.js +1 -17
- package/dist/server/routes/task5-support.js.map +1 -1
- package/dist/server/routes/task5.d.ts.map +1 -1
- package/dist/server/routes/task5.js +106 -36
- package/dist/server/routes/task5.js.map +1 -1
- package/dist/server/write-queue.js +2 -2
- package/dist/server/write-queue.js.map +1 -1
- package/dist/setup/claude-config.d.ts +2 -1
- package/dist/setup/claude-config.d.ts.map +1 -1
- package/dist/setup/claude-config.js +54 -4
- package/dist/setup/claude-config.js.map +1 -1
- package/dist/setup/client-detection.d.ts +7 -2
- package/dist/setup/client-detection.d.ts.map +1 -1
- package/dist/setup/client-detection.js +27 -9
- package/dist/setup/client-detection.js.map +1 -1
- package/dist/setup/hermes-config.d.ts +2 -1
- package/dist/setup/hermes-config.d.ts.map +1 -1
- package/dist/setup/hermes-config.js +53 -12
- package/dist/setup/hermes-config.js.map +1 -1
- package/dist/setup/legacy-client-cleanup.d.ts +6 -0
- package/dist/setup/legacy-client-cleanup.d.ts.map +1 -0
- package/dist/setup/legacy-client-cleanup.js +152 -0
- package/dist/setup/legacy-client-cleanup.js.map +1 -0
- package/dist/setup/managed-text.d.ts.map +1 -1
- package/dist/setup/managed-text.js +11 -1
- package/dist/setup/managed-text.js.map +1 -1
- package/dist/setup/opencode-config.d.ts +2 -1
- package/dist/setup/opencode-config.d.ts.map +1 -1
- package/dist/setup/opencode-config.js +57 -5
- package/dist/setup/opencode-config.js.map +1 -1
- package/dist/setup/render.d.ts +2 -1
- package/dist/setup/render.d.ts.map +1 -1
- package/dist/setup/render.js +91 -17
- package/dist/setup/render.js.map +1 -1
- package/dist/setup/standard-skills.d.ts +16 -2
- package/dist/setup/standard-skills.d.ts.map +1 -1
- package/dist/setup/standard-skills.js +37 -13
- package/dist/setup/standard-skills.js.map +1 -1
- package/dist/setup/strict-json.d.ts +7 -0
- package/dist/setup/strict-json.d.ts.map +1 -0
- package/dist/setup/strict-json.js +98 -0
- package/dist/setup/strict-json.js.map +1 -0
- package/dist/setup/strict-toml.d.ts +7 -0
- package/dist/setup/strict-toml.d.ts.map +1 -0
- package/dist/setup/strict-toml.js +470 -0
- package/dist/setup/strict-toml.js.map +1 -0
- package/dist/skills/cache.d.ts +15 -0
- package/dist/skills/cache.d.ts.map +1 -0
- package/dist/skills/cache.js +19 -0
- package/dist/skills/cache.js.map +1 -0
- package/dist/skills/candidate-ranking.d.ts +15 -0
- package/dist/skills/candidate-ranking.d.ts.map +1 -0
- package/dist/skills/candidate-ranking.js +52 -0
- package/dist/skills/candidate-ranking.js.map +1 -0
- package/dist/skills/chunking.d.ts +11 -0
- package/dist/skills/chunking.d.ts.map +1 -0
- package/dist/skills/chunking.js +291 -0
- package/dist/skills/chunking.js.map +1 -0
- package/dist/skills/config.d.ts +19 -0
- package/dist/skills/config.d.ts.map +1 -0
- package/dist/skills/config.js +103 -0
- package/dist/skills/config.js.map +1 -0
- package/dist/skills/discovery-service.d.ts +26 -0
- package/dist/skills/discovery-service.d.ts.map +1 -0
- package/dist/skills/discovery-service.js +921 -0
- package/dist/skills/discovery-service.js.map +1 -0
- package/dist/skills/external-transport.d.ts +2 -0
- package/dist/skills/external-transport.d.ts.map +1 -0
- package/dist/skills/external-transport.js +30 -0
- package/dist/skills/external-transport.js.map +1 -0
- package/dist/skills/find.d.ts +16 -0
- package/dist/skills/find.d.ts.map +1 -0
- package/dist/skills/find.js +58 -0
- package/dist/skills/find.js.map +1 -0
- package/dist/skills/gap-detection.d.ts +23 -0
- package/dist/skills/gap-detection.d.ts.map +1 -0
- package/dist/skills/gap-detection.js +62 -0
- package/dist/skills/gap-detection.js.map +1 -0
- package/dist/skills/import-preparation.d.ts +4 -0
- package/dist/skills/import-preparation.d.ts.map +1 -0
- package/dist/skills/import-preparation.js +20 -0
- package/dist/skills/import-preparation.js.map +1 -0
- package/dist/skills/materialization-authority.d.ts +11 -0
- package/dist/skills/materialization-authority.d.ts.map +1 -0
- package/dist/skills/materialization-authority.js +92 -0
- package/dist/skills/materialization-authority.js.map +1 -0
- package/dist/skills/materialization-service.d.ts +22 -0
- package/dist/skills/materialization-service.d.ts.map +1 -0
- package/dist/skills/materialization-service.js +101 -0
- package/dist/skills/materialization-service.js.map +1 -0
- package/dist/skills/official-catalog.d.ts +31 -0
- package/dist/skills/official-catalog.d.ts.map +1 -0
- package/dist/skills/official-catalog.js +110 -0
- package/dist/skills/official-catalog.js.map +1 -0
- package/dist/skills/providers/schema.d.ts +30 -0
- package/dist/skills/providers/schema.d.ts.map +1 -0
- package/dist/skills/providers/schema.js +354 -0
- package/dist/skills/providers/schema.js.map +1 -0
- package/dist/skills/providers/skills-sh-compat.d.ts +17 -0
- package/dist/skills/providers/skills-sh-compat.d.ts.map +1 -0
- package/dist/skills/providers/skills-sh-compat.js +71 -0
- package/dist/skills/providers/skills-sh-compat.js.map +1 -0
- package/dist/skills/providers/skills-sh-v1.d.ts +23 -0
- package/dist/skills/providers/skills-sh-v1.d.ts.map +1 -0
- package/dist/skills/providers/skills-sh-v1.js +134 -0
- package/dist/skills/providers/skills-sh-v1.js.map +1 -0
- package/dist/skills/query-builder.d.ts +18 -0
- package/dist/skills/query-builder.d.ts.map +1 -0
- package/dist/skills/query-builder.js +93 -0
- package/dist/skills/query-builder.js.map +1 -0
- package/dist/skills/source/errors.d.ts +9 -0
- package/dist/skills/source/errors.d.ts.map +1 -0
- package/dist/skills/source/errors.js +15 -0
- package/dist/skills/source/errors.js.map +1 -0
- package/dist/skills/source/frontmatter.d.ts +9 -0
- package/dist/skills/source/frontmatter.d.ts.map +1 -0
- package/dist/skills/source/frontmatter.js +77 -0
- package/dist/skills/source/frontmatter.js.map +1 -0
- package/dist/skills/source/github-fetcher.d.ts +20 -0
- package/dist/skills/source/github-fetcher.d.ts.map +1 -0
- package/dist/skills/source/github-fetcher.js +292 -0
- package/dist/skills/source/github-fetcher.js.map +1 -0
- package/dist/skills/source/snapshot-validator.d.ts +28 -0
- package/dist/skills/source/snapshot-validator.d.ts.map +1 -0
- package/dist/skills/source/snapshot-validator.js +186 -0
- package/dist/skills/source/snapshot-validator.js.map +1 -0
- package/dist/skills/store.d.ts +181 -0
- package/dist/skills/store.d.ts.map +1 -0
- package/dist/skills/store.js +1710 -0
- package/dist/skills/store.js.map +1 -0
- package/dist/skills/types.d.ts +169 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/web/i18n.d.ts +32 -0
- package/dist/web/i18n.d.ts.map +1 -1
- package/dist/web/i18n.js +128 -0
- package/dist/web/i18n.js.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +386 -38
- package/dist/web/server.js.map +1 -1
- package/dist/web/ui.d.ts +4 -0
- package/dist/web/ui.d.ts.map +1 -1
- package/dist/web/ui.js +382 -6
- package/dist/web/ui.js.map +1 -1
- package/migrations/009_external_skill_discovery.sql +126 -0
- package/package.json +4 -3
- package/skills/kiokuko-single-purpose-functions/SKILL.md +288 -0
- package/skills/kiokuko-single-purpose-functions/references/kiokuko-patterns.md +344 -0
- package/skills/kiokuko-single-purpose-functions/references/review-checklist.md +97 -0
- package/skills/kiokuko-ui-design-soul/SKILL.md +1186 -28
- package/templates/AGENTS.md +8 -7
- package/dist/client/runtime-discovery.d.ts +0 -15
- package/dist/client/runtime-discovery.d.ts.map +0 -1
- package/dist/client/runtime-discovery.js +0 -45
- package/dist/client/runtime-discovery.js.map +0 -1
- package/dist/commands/call.d.ts +0 -7
- package/dist/commands/call.d.ts.map +0 -1
- package/dist/commands/call.js +0 -10
- package/dist/commands/call.js.map +0 -1
- package/dist/commands/link.d.ts +0 -6
- package/dist/commands/link.d.ts.map +0 -1
- package/dist/commands/link.js +0 -6
- package/dist/commands/link.js.map +0 -1
- package/dist/commands/promote.d.ts +0 -6
- package/dist/commands/promote.d.ts.map +0 -1
- package/dist/commands/promote.js +0 -6
- package/dist/commands/promote.js.map +0 -1
- package/dist/commands/read.d.ts +0 -6
- package/dist/commands/read.d.ts.map +0 -1
- package/dist/commands/read.js +0 -4
- package/dist/commands/read.js.map +0 -1
- package/dist/commands/recall.d.ts +0 -6
- package/dist/commands/recall.d.ts.map +0 -1
- package/dist/commands/recall.js +0 -4
- package/dist/commands/recall.js.map +0 -1
- package/dist/commands/record.d.ts +0 -6
- package/dist/commands/record.d.ts.map +0 -1
- package/dist/commands/record.js +0 -4
- package/dist/commands/record.js.map +0 -1
- package/dist/commands/search.d.ts +0 -6
- package/dist/commands/search.d.ts.map +0 -1
- package/dist/commands/search.js +0 -4
- package/dist/commands/search.js.map +0 -1
- package/dist/commands/supersede.d.ts +0 -6
- package/dist/commands/supersede.d.ts.map +0 -1
- package/dist/commands/supersede.js +0 -6
- package/dist/commands/supersede.js.map +0 -1
- package/dist/knowledge/sources.d.ts +0 -72
- package/dist/knowledge/sources.d.ts.map +0 -1
- package/dist/knowledge/sources.js +0 -388
- package/dist/knowledge/sources.js.map +0 -1
- package/dist/setup/opencode-evidence.d.ts +0 -37
- package/dist/setup/opencode-evidence.d.ts.map +0 -1
- package/dist/setup/opencode-evidence.js +0 -58
- package/dist/setup/opencode-evidence.js.map +0 -1
- package/dist/setup/opencode-loop-guard.d.ts +0 -9
- package/dist/setup/opencode-loop-guard.d.ts.map +0 -1
- package/dist/setup/opencode-loop-guard.js +0 -248
- package/dist/setup/opencode-loop-guard.js.map +0 -1
package/dist/db/connection.js
CHANGED
|
@@ -1,25 +1,36 @@
|
|
|
1
1
|
import { DatabaseSync } from 'node:sqlite';
|
|
2
2
|
import { dirname } from 'node:path';
|
|
3
|
-
import { chmodSync, mkdirSync } from 'node:fs';
|
|
3
|
+
import { chmodSync, lstatSync, mkdirSync } from 'node:fs';
|
|
4
4
|
import { NodeSqliteAdapter } from './adapter.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import { withSqliteLockRetry } from './sqlite-retry.js';
|
|
6
|
+
import { KiokukoError } from '../errors.js';
|
|
7
|
+
export function databaseFileIdentity(filePath) {
|
|
8
|
+
const status = lstatSync(filePath, { bigint: true });
|
|
9
|
+
if (!status.isFile()) {
|
|
10
|
+
throw new KiokukoError('INTEGRITY_ERROR', 'SQLite database path is not a regular non-symbolic-link file');
|
|
11
|
+
}
|
|
12
|
+
return Object.freeze({ device: status.dev, inode: status.ino });
|
|
8
13
|
}
|
|
9
|
-
function
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
export function sameDatabaseFileIdentity(left, right) {
|
|
15
|
+
return left.device === right.device && left.inode === right.inode;
|
|
16
|
+
}
|
|
17
|
+
export function requireDatabaseFileIdentity(filePath, expected) {
|
|
18
|
+
let actual;
|
|
19
|
+
try {
|
|
20
|
+
actual = databaseFileIdentity(filePath);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
const failure = new KiokukoError('CONFLICT', 'SQLite database file identity changed during initialization');
|
|
24
|
+
Object.defineProperty(failure, 'cause', { value: error });
|
|
25
|
+
throw failure;
|
|
26
|
+
}
|
|
27
|
+
if (!sameDatabaseFileIdentity(actual, expected)) {
|
|
28
|
+
throw new KiokukoError('CONFLICT', 'SQLite database file identity changed during initialization');
|
|
21
29
|
}
|
|
22
30
|
}
|
|
31
|
+
function configureJournalMode(database) {
|
|
32
|
+
withSqliteLockRetry(() => database.exec('PRAGMA journal_mode = WAL;'));
|
|
33
|
+
}
|
|
23
34
|
export function openConnection(filePath, options = {}) {
|
|
24
35
|
if (filePath !== ':memory:') {
|
|
25
36
|
mkdirSync(dirname(filePath), { recursive: true, mode: 0o700 });
|
|
@@ -29,16 +40,34 @@ export function openConnection(filePath, options = {}) {
|
|
|
29
40
|
timeout: 5000,
|
|
30
41
|
...(options.readOnly === undefined ? {} : { readOnly: options.readOnly }),
|
|
31
42
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
try {
|
|
44
|
+
if (options.expectedFileIdentity !== undefined) {
|
|
45
|
+
if (filePath === ':memory:') {
|
|
46
|
+
throw new KiokukoError('VALIDATION_ERROR', 'An in-memory database cannot have a file identity');
|
|
47
|
+
}
|
|
48
|
+
// This check deliberately precedes chmod and every writable PRAGMA.
|
|
49
|
+
requireDatabaseFileIdentity(filePath, options.expectedFileIdentity);
|
|
50
|
+
}
|
|
51
|
+
if (filePath !== ':memory:' && !options.readOnly)
|
|
52
|
+
chmodSync(filePath, 0o600);
|
|
53
|
+
database.exec(`
|
|
54
|
+
PRAGMA foreign_keys = ON;
|
|
55
|
+
PRAGMA busy_timeout = 5000;
|
|
56
|
+
`);
|
|
57
|
+
if (!options.readOnly) {
|
|
58
|
+
configureJournalMode(database);
|
|
59
|
+
database.exec('PRAGMA synchronous = NORMAL;');
|
|
60
|
+
}
|
|
61
|
+
return new NodeSqliteAdapter(filePath, database);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
try {
|
|
65
|
+
database.close();
|
|
66
|
+
}
|
|
67
|
+
catch (closeError) {
|
|
68
|
+
throw new AggregateError([error, closeError], 'SQLite connection initialization failed and closing it also failed');
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
41
71
|
}
|
|
42
|
-
return new NodeSqliteAdapter(filePath, database);
|
|
43
72
|
}
|
|
44
73
|
//# sourceMappingURL=connection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"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"}
|
package/dist/db/migrate.d.ts
CHANGED
|
@@ -4,13 +4,34 @@ export interface MigrationResult {
|
|
|
4
4
|
currentVersion: number;
|
|
5
5
|
}
|
|
6
6
|
export interface MigrationPlan {
|
|
7
|
-
applied: number[];
|
|
8
|
-
pending: number[];
|
|
9
|
-
databaseVersion: number;
|
|
10
|
-
currentVersion: number;
|
|
7
|
+
readonly applied: readonly number[];
|
|
8
|
+
readonly pending: readonly number[];
|
|
9
|
+
readonly databaseVersion: number;
|
|
10
|
+
readonly currentVersion: number;
|
|
11
|
+
readonly migrations: readonly MigrationSource[];
|
|
12
|
+
}
|
|
13
|
+
export interface MigrationIdentity {
|
|
14
|
+
readonly version: number;
|
|
15
|
+
readonly name: string;
|
|
16
|
+
}
|
|
17
|
+
export interface MigrationSource extends MigrationIdentity {
|
|
18
|
+
readonly checksum: string;
|
|
19
|
+
readonly sql: string;
|
|
20
|
+
}
|
|
21
|
+
export interface MigrationSnapshot {
|
|
22
|
+
readonly migrations: readonly MigrationSource[];
|
|
23
|
+
}
|
|
24
|
+
export interface MigrationHooks {
|
|
25
|
+
/**
|
|
26
|
+
* Runs after a pending migration's SQL and before its schema marker is
|
|
27
|
+
* written. The hook is inside the same SQLite transaction as both steps.
|
|
28
|
+
*/
|
|
29
|
+
readonly beforeMarkApplied?: (database: SqliteDatabase, migration: MigrationIdentity) => void;
|
|
11
30
|
}
|
|
12
31
|
export declare function defaultMigrationsDirectory(): string;
|
|
13
|
-
export declare function
|
|
14
|
-
export declare function
|
|
15
|
-
|
|
32
|
+
export declare function loadMigrationSnapshot(directory?: string): MigrationSnapshot;
|
|
33
|
+
export declare function inspectMigrationSnapshot(database: SqliteDatabase, snapshot: MigrationSnapshot): MigrationPlan;
|
|
34
|
+
/** Apply an already-loaded migration snapshot inside a transaction owned by the caller. */
|
|
35
|
+
export declare function migrateDatabaseSnapshotInTransaction(database: SqliteDatabase, snapshot: MigrationSnapshot, hooks?: MigrationHooks): MigrationResult;
|
|
36
|
+
export declare function migrateDatabase(database: SqliteDatabase, directory?: string, hooks?: MigrationHooks): MigrationResult;
|
|
16
37
|
//# sourceMappingURL=migrate.d.ts.map
|
package/dist/db/migrate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,cAAc,CAAC;AAG9D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC/F;AAkBD,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,SAA+B,GAAG,iBAAiB,CAsEjG;AAiGD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,GAAG,aAAa,CAE7G;AA2DD,2FAA2F;AAC3F,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,GAAE,cAAmB,GACzB,eAAe,CAEjB;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,cAAc,EACxB,SAAS,SAA+B,EACxC,KAAK,GAAE,cAAmB,GACzB,eAAe,CASjB"}
|
package/dist/db/migrate.js
CHANGED
|
@@ -2,29 +2,57 @@ import { createHash } from 'node:crypto';
|
|
|
2
2
|
import { readFileSync, readdirSync } from 'node:fs';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import path from 'node:path';
|
|
5
|
+
import { TextDecoder } from 'node:util';
|
|
5
6
|
import { KiokukoError } from '../errors.js';
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
import { canonicalizeEntryRevisionHashesInMigration } from '../memory/revisions.js';
|
|
8
|
+
import { withImmediateTransaction } from './transaction.js';
|
|
9
|
+
function applyBuiltInMigrationOperation(database, migration) {
|
|
10
|
+
if (migration.version === 9 && migration.name === '009_external_skill_discovery.sql') {
|
|
11
|
+
canonicalizeEntryRevisionHashesInMigration(database);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const MIGRATION_FILE = /^([0-9]{3})_([a-z0-9_-]+)\.sql$/;
|
|
15
|
+
const loadedMigrationSnapshots = new WeakSet();
|
|
16
|
+
const fatalUtf8Decoder = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });
|
|
8
17
|
export function defaultMigrationsDirectory() {
|
|
9
18
|
return fileURLToPath(new URL('../../migrations/', import.meta.url));
|
|
10
19
|
}
|
|
11
|
-
function
|
|
20
|
+
export function loadMigrationSnapshot(directory = defaultMigrationsDirectory()) {
|
|
12
21
|
const migrations = readdirSync(directory)
|
|
13
22
|
.map((name) => {
|
|
14
23
|
const match = MIGRATION_FILE.exec(name);
|
|
15
|
-
if (!match)
|
|
24
|
+
if (!match) {
|
|
25
|
+
if (/\.sql$/iu.test(name)) {
|
|
26
|
+
throw new KiokukoError('INTEGRITY_ERROR', `Migration filename is not canonical: ${name}`, { name });
|
|
27
|
+
}
|
|
16
28
|
return undefined;
|
|
29
|
+
}
|
|
17
30
|
const version = Number(match[1]);
|
|
18
|
-
const
|
|
31
|
+
const bytes = readFileSync(path.join(directory, name));
|
|
32
|
+
if (bytes.subarray(0, 3).equals(Buffer.from([0xEF, 0xBB, 0xBF]))) {
|
|
33
|
+
throw new KiokukoError('INTEGRITY_ERROR', `Migration file ${name} has a non-canonical UTF-8 BOM`);
|
|
34
|
+
}
|
|
35
|
+
let sql;
|
|
36
|
+
try {
|
|
37
|
+
sql = fatalUtf8Decoder.decode(bytes);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const failure = new KiokukoError('INTEGRITY_ERROR', `Migration file ${name} is not valid UTF-8`);
|
|
41
|
+
Object.defineProperty(failure, 'cause', { value: error });
|
|
42
|
+
throw failure;
|
|
43
|
+
}
|
|
19
44
|
return {
|
|
20
45
|
version,
|
|
21
46
|
name,
|
|
22
47
|
sql,
|
|
23
|
-
checksum: createHash('sha256').update(
|
|
48
|
+
checksum: createHash('sha256').update(bytes).digest('hex'),
|
|
24
49
|
};
|
|
25
50
|
})
|
|
26
51
|
.filter((migration) => migration !== undefined)
|
|
27
52
|
.sort((left, right) => left.version - right.version);
|
|
53
|
+
if (migrations.length === 0) {
|
|
54
|
+
throw new KiokukoError('INTEGRITY_ERROR', 'Migration directory contains no versioned migration files');
|
|
55
|
+
}
|
|
28
56
|
const versions = new Set();
|
|
29
57
|
for (const migration of migrations) {
|
|
30
58
|
if (!Number.isSafeInteger(migration.version) || migration.version < 1) {
|
|
@@ -35,7 +63,23 @@ function listMigrations(directory) {
|
|
|
35
63
|
}
|
|
36
64
|
versions.add(migration.version);
|
|
37
65
|
}
|
|
38
|
-
|
|
66
|
+
for (const [index, migration] of migrations.entries()) {
|
|
67
|
+
const expectedVersion = index + 1;
|
|
68
|
+
if (migration.version !== expectedVersion) {
|
|
69
|
+
throw new KiokukoError('INTEGRITY_ERROR', `Migration files must form an exact contiguous sequence starting at version 1; expected ${expectedVersion} but found ${migration.version}`, { expectedVersion, actualVersion: migration.version, name: migration.name });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const snapshot = Object.freeze({
|
|
73
|
+
migrations: Object.freeze(migrations.map((migration) => Object.freeze(migration))),
|
|
74
|
+
});
|
|
75
|
+
loadedMigrationSnapshots.add(snapshot);
|
|
76
|
+
return snapshot;
|
|
77
|
+
}
|
|
78
|
+
function requireLoadedMigrationSnapshot(snapshot) {
|
|
79
|
+
if (!loadedMigrationSnapshots.has(snapshot)) {
|
|
80
|
+
throw new KiokukoError('INTEGRITY_ERROR', 'Migration snapshot was not produced by the validated snapshot loader');
|
|
81
|
+
}
|
|
82
|
+
return snapshot.migrations;
|
|
39
83
|
}
|
|
40
84
|
function hasMigrationTable(database) {
|
|
41
85
|
return Boolean(database.prepare(`
|
|
@@ -53,16 +97,23 @@ function appliedMigrationRows(database) {
|
|
|
53
97
|
ORDER BY version
|
|
54
98
|
`).all();
|
|
55
99
|
}
|
|
100
|
+
function appliedMigrationVersion(value) {
|
|
101
|
+
if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 1)
|
|
102
|
+
return value;
|
|
103
|
+
throw new KiokukoError('INTEGRITY_ERROR', 'Database migration history contains an invalid version');
|
|
104
|
+
}
|
|
56
105
|
function migrationPlan(database, migrations) {
|
|
57
106
|
const currentVersion = migrations.at(-1)?.version ?? 0;
|
|
58
107
|
const byVersion = new Map(migrations.map((migration) => [migration.version, migration]));
|
|
59
108
|
const rows = appliedMigrationRows(database);
|
|
60
109
|
const applied = [];
|
|
110
|
+
const seenVersions = new Set();
|
|
61
111
|
for (const row of rows) {
|
|
62
|
-
const version =
|
|
63
|
-
if (
|
|
64
|
-
throw new KiokukoError('INTEGRITY_ERROR',
|
|
112
|
+
const version = appliedMigrationVersion(row.version);
|
|
113
|
+
if (seenVersions.has(version)) {
|
|
114
|
+
throw new KiokukoError('INTEGRITY_ERROR', `Database migration history contains duplicate version ${version}`, { version });
|
|
65
115
|
}
|
|
116
|
+
seenVersions.add(version);
|
|
66
117
|
const migration = byVersion.get(version);
|
|
67
118
|
if (!migration) {
|
|
68
119
|
if (version > currentVersion) {
|
|
@@ -70,89 +121,56 @@ function migrationPlan(database, migrations) {
|
|
|
70
121
|
}
|
|
71
122
|
throw new KiokukoError('INTEGRITY_ERROR', `Database migration version ${version} is not supported by this Kiokuko binary`);
|
|
72
123
|
}
|
|
124
|
+
if (typeof row.name !== 'string' || typeof row.checksum !== 'string') {
|
|
125
|
+
throw new KiokukoError('INTEGRITY_ERROR', `Database migration history contains invalid metadata for version ${version}`, { version });
|
|
126
|
+
}
|
|
73
127
|
if (row.name !== migration.name || row.checksum !== migration.checksum) {
|
|
74
128
|
throw new KiokukoError('INTEGRITY_ERROR', `Migration checksum mismatch for ${migration.name}`, { version: migration.version, name: migration.name });
|
|
75
129
|
}
|
|
76
130
|
applied.push(version);
|
|
77
131
|
}
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (!appliedSet.has(migration.version))
|
|
82
|
-
foundPending = true;
|
|
83
|
-
else if (foundPending) {
|
|
132
|
+
for (const [index, version] of applied.entries()) {
|
|
133
|
+
const expectedVersion = index + 1;
|
|
134
|
+
if (version !== expectedVersion) {
|
|
84
135
|
throw new KiokukoError('INTEGRITY_ERROR', 'Database migration history is not a contiguous prefix');
|
|
85
136
|
}
|
|
86
137
|
}
|
|
138
|
+
const appliedSet = new Set(applied);
|
|
87
139
|
return {
|
|
88
|
-
applied,
|
|
89
|
-
pending: migrations.filter((migration) => !appliedSet.has(migration.version)).map((migration) => migration.version),
|
|
140
|
+
applied: Object.freeze(applied),
|
|
141
|
+
pending: Object.freeze(migrations.filter((migration) => !appliedSet.has(migration.version)).map((migration) => migration.version)),
|
|
90
142
|
databaseVersion: applied.at(-1) ?? 0,
|
|
91
143
|
currentVersion,
|
|
144
|
+
migrations,
|
|
92
145
|
};
|
|
93
146
|
}
|
|
94
|
-
export function
|
|
95
|
-
return migrationPlan(database,
|
|
147
|
+
export function inspectMigrationSnapshot(database, snapshot) {
|
|
148
|
+
return migrationPlan(database, requireLoadedMigrationSnapshot(snapshot));
|
|
96
149
|
}
|
|
97
|
-
function
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
catch (error) {
|
|
110
|
-
if (!isLockError(error) || attempt >= LOCK_RETRY_LIMIT)
|
|
111
|
-
throw error;
|
|
112
|
-
waitForRetry(attempt);
|
|
150
|
+
function applyOneInTransaction(database, migration, migrations, hooks) {
|
|
151
|
+
// Revalidate while the caller's write lock is held. No other migrator can
|
|
152
|
+
// advance the history between this check, the SQL, the application hook,
|
|
153
|
+
// and the marker write.
|
|
154
|
+
migrationPlan(database, migrations);
|
|
155
|
+
const existing = database
|
|
156
|
+
.prepare('SELECT checksum FROM schema_migrations WHERE version = ?')
|
|
157
|
+
.get(migration.version);
|
|
158
|
+
if (existing) {
|
|
159
|
+
if (typeof existing.checksum !== 'string' || existing.checksum !== migration.checksum) {
|
|
160
|
+
throw new KiokukoError('INTEGRITY_ERROR', `Migration checksum mismatch for ${migration.name}`, { version: migration.version, name: migration.name });
|
|
113
161
|
}
|
|
162
|
+
return false;
|
|
114
163
|
}
|
|
164
|
+
database.exec(migration.sql);
|
|
165
|
+
applyBuiltInMigrationOperation(database, migration);
|
|
166
|
+
hooks.beforeMarkApplied?.(database, { version: migration.version, name: migration.name });
|
|
167
|
+
database
|
|
168
|
+
.prepare('INSERT INTO schema_migrations (version, name, checksum, applied_at) VALUES (?, ?, ?, ?)')
|
|
169
|
+
.run(migration.version, migration.name, migration.checksum, new Date().toISOString());
|
|
170
|
+
return true;
|
|
115
171
|
}
|
|
116
|
-
function
|
|
117
|
-
|
|
118
|
-
database.exec('ROLLBACK');
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
// Preserve the original migration error.
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
function applyOne(database, migration, migrations) {
|
|
125
|
-
return withLockRetry(() => {
|
|
126
|
-
database.exec('BEGIN IMMEDIATE');
|
|
127
|
-
try {
|
|
128
|
-
// Revalidate under the write lock so a newer binary cannot advance the
|
|
129
|
-
// database between the read-only upgrade inspection and this write.
|
|
130
|
-
migrationPlan(database, migrations);
|
|
131
|
-
const existing = database
|
|
132
|
-
.prepare('SELECT checksum FROM schema_migrations WHERE version = ?')
|
|
133
|
-
.get(migration.version);
|
|
134
|
-
if (existing) {
|
|
135
|
-
if (existing.checksum !== migration.checksum) {
|
|
136
|
-
throw new KiokukoError('INTEGRITY_ERROR', `Migration checksum mismatch for ${migration.name}`, { version: migration.version, name: migration.name });
|
|
137
|
-
}
|
|
138
|
-
database.exec('COMMIT');
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
141
|
-
database.exec(migration.sql);
|
|
142
|
-
database
|
|
143
|
-
.prepare('INSERT INTO schema_migrations (version, name, checksum, applied_at) VALUES (?, ?, ?, ?)')
|
|
144
|
-
.run(migration.version, migration.name, migration.checksum, new Date().toISOString());
|
|
145
|
-
database.exec('COMMIT');
|
|
146
|
-
return true;
|
|
147
|
-
}
|
|
148
|
-
catch (error) {
|
|
149
|
-
rollback(database);
|
|
150
|
-
throw error;
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
export function migrateDatabase(database, directory = defaultMigrationsDirectory()) {
|
|
155
|
-
const migrations = listMigrations(directory);
|
|
172
|
+
function applyMigrationSetInTransaction(database, migrations, hooks) {
|
|
173
|
+
// Revalidate the database state after the writer transaction begins.
|
|
156
174
|
migrationPlan(database, migrations);
|
|
157
175
|
database.exec(`
|
|
158
176
|
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
@@ -164,11 +182,21 @@ export function migrateDatabase(database, directory = defaultMigrationsDirectory
|
|
|
164
182
|
`);
|
|
165
183
|
const applied = [];
|
|
166
184
|
for (const migration of migrations) {
|
|
167
|
-
if (
|
|
185
|
+
if (applyOneInTransaction(database, migration, migrations, hooks))
|
|
168
186
|
applied.push(migration.version);
|
|
169
187
|
}
|
|
170
188
|
const currentVersion = migrations.at(-1)?.version ?? 0;
|
|
171
189
|
return { applied, currentVersion };
|
|
172
190
|
}
|
|
173
|
-
|
|
191
|
+
/** Apply an already-loaded migration snapshot inside a transaction owned by the caller. */
|
|
192
|
+
export function migrateDatabaseSnapshotInTransaction(database, snapshot, hooks = {}) {
|
|
193
|
+
return applyMigrationSetInTransaction(database, requireLoadedMigrationSnapshot(snapshot), hooks);
|
|
194
|
+
}
|
|
195
|
+
export function migrateDatabase(database, directory = defaultMigrationsDirectory(), hooks = {}) {
|
|
196
|
+
const migrations = loadMigrationSnapshot(directory).migrations;
|
|
197
|
+
// Fail on unsupported history before beginning a write transaction, then
|
|
198
|
+
// repeat the check under the lock in applyMigrationSetInTransaction.
|
|
199
|
+
migrationPlan(database, migrations);
|
|
200
|
+
return withImmediateTransaction(database, () => applyMigrationSetInTransaction(database, migrations, hooks));
|
|
201
|
+
}
|
|
174
202
|
//# sourceMappingURL=migrate.js.map
|
package/dist/db/migrate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Match only node:sqlite errors whose SQLite primary result code is BUSY or LOCKED. */
|
|
2
|
+
export declare function isSqliteLockError(error: unknown): boolean;
|
|
3
|
+
/** Match only native node:sqlite operational failures discovery may safely report as bounded degradation. */
|
|
4
|
+
export declare function isSqliteOperationalError(error: unknown): boolean;
|
|
5
|
+
/** Match database bytes that SQLite itself reports as corrupt or not a database. */
|
|
6
|
+
export declare function isSqliteCorruptionError(error: unknown): boolean;
|
|
7
|
+
/** Match one exact PRIMARY KEY/UNIQUE target; trigger text cannot spoof this check. */
|
|
8
|
+
export declare function isSqliteUniqueConstraintError(error: unknown, targets: readonly string[]): boolean;
|
|
9
|
+
/** Retry a synchronous operation at most five total attempts, and only for SQLite BUSY/LOCKED. */
|
|
10
|
+
export declare function withSqliteLockRetry<T>(operation: () => T): T;
|
|
11
|
+
//# sourceMappingURL=sqlite-retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-retry.d.ts","sourceRoot":"","sources":["../../src/db/sqlite-retry.ts"],"names":[],"mappings":"AAuBA,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKzD;AAED,6GAA6G;AAC7G,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGhE;AAED,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAK/D;AAED,uFAAuF;AACvF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAIjG;AAOD,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAS5D"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const LOCK_ATTEMPT_LIMIT = 5;
|
|
2
|
+
const SQLITE_BUSY = 5;
|
|
3
|
+
const SQLITE_LOCKED = 6;
|
|
4
|
+
const SQLITE_CORRUPT = 11;
|
|
5
|
+
const SQLITE_NOTADB = 26;
|
|
6
|
+
const SQLITE_CONSTRAINT_PRIMARYKEY = 1555;
|
|
7
|
+
const SQLITE_CONSTRAINT_UNIQUE = 2067;
|
|
8
|
+
const SQLITE_OPERATIONAL_CODES = new Set([SQLITE_BUSY, SQLITE_LOCKED, 8, 10, 13, 14]);
|
|
9
|
+
function sqliteErrorCode(error) {
|
|
10
|
+
if (!(error instanceof Error))
|
|
11
|
+
return undefined;
|
|
12
|
+
const sqliteError = error;
|
|
13
|
+
if (sqliteError.code !== 'ERR_SQLITE_ERROR'
|
|
14
|
+
|| typeof sqliteError.errcode !== 'number'
|
|
15
|
+
|| !Number.isSafeInteger(sqliteError.errcode)
|
|
16
|
+
|| sqliteError.errcode < 0) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return sqliteError.errcode;
|
|
20
|
+
}
|
|
21
|
+
/** Match only node:sqlite errors whose SQLite primary result code is BUSY or LOCKED. */
|
|
22
|
+
export function isSqliteLockError(error) {
|
|
23
|
+
const code = sqliteErrorCode(error);
|
|
24
|
+
if (code === undefined)
|
|
25
|
+
return false;
|
|
26
|
+
const primaryResultCode = code & 0xff;
|
|
27
|
+
return primaryResultCode === SQLITE_BUSY || primaryResultCode === SQLITE_LOCKED;
|
|
28
|
+
}
|
|
29
|
+
/** Match only native node:sqlite operational failures discovery may safely report as bounded degradation. */
|
|
30
|
+
export function isSqliteOperationalError(error) {
|
|
31
|
+
const code = sqliteErrorCode(error);
|
|
32
|
+
return code !== undefined && SQLITE_OPERATIONAL_CODES.has(code & 0xff);
|
|
33
|
+
}
|
|
34
|
+
/** Match database bytes that SQLite itself reports as corrupt or not a database. */
|
|
35
|
+
export function isSqliteCorruptionError(error) {
|
|
36
|
+
const code = sqliteErrorCode(error);
|
|
37
|
+
if (code === undefined)
|
|
38
|
+
return false;
|
|
39
|
+
const primaryResultCode = code & 0xff;
|
|
40
|
+
return primaryResultCode === SQLITE_CORRUPT || primaryResultCode === SQLITE_NOTADB;
|
|
41
|
+
}
|
|
42
|
+
/** Match one exact PRIMARY KEY/UNIQUE target; trigger text cannot spoof this check. */
|
|
43
|
+
export function isSqliteUniqueConstraintError(error, targets) {
|
|
44
|
+
const code = sqliteErrorCode(error);
|
|
45
|
+
if (code !== SQLITE_CONSTRAINT_PRIMARYKEY && code !== SQLITE_CONSTRAINT_UNIQUE)
|
|
46
|
+
return false;
|
|
47
|
+
return error instanceof Error && targets.some((target) => error.message === `UNIQUE constraint failed: ${target}`);
|
|
48
|
+
}
|
|
49
|
+
function waitForRetry(attempt) {
|
|
50
|
+
const buffer = new Int32Array(new SharedArrayBuffer(4));
|
|
51
|
+
Atomics.wait(buffer, 0, 0, attempt * 25);
|
|
52
|
+
}
|
|
53
|
+
/** Retry a synchronous operation at most five total attempts, and only for SQLite BUSY/LOCKED. */
|
|
54
|
+
export function withSqliteLockRetry(operation) {
|
|
55
|
+
for (let attempt = 1;; attempt += 1) {
|
|
56
|
+
try {
|
|
57
|
+
return operation();
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
if (!isSqliteLockError(error) || attempt >= LOCK_ATTEMPT_LIMIT)
|
|
61
|
+
throw error;
|
|
62
|
+
waitForRetry(attempt);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=sqlite-retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-retry.js","sourceRoot":"","sources":["../../src/db/sqlite-retry.ts"],"names":[],"mappings":"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"}
|
package/dist/db/transaction.d.ts
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import type { SqliteDatabase } from './adapter.js';
|
|
2
|
+
/**
|
|
3
|
+
* COMMIT threw and the subsequent ROLLBACK also threw. The caller must treat
|
|
4
|
+
* the transaction as possibly committed: compensating durable side effects
|
|
5
|
+
* could otherwise turn an uncertain outcome into split-brain state.
|
|
6
|
+
*/
|
|
7
|
+
export declare class TransactionCommitUncertainError extends AggregateError {
|
|
8
|
+
readonly commitError: unknown;
|
|
9
|
+
readonly rollbackError: unknown;
|
|
10
|
+
constructor(commitError: unknown, rollbackError: unknown);
|
|
11
|
+
}
|
|
12
|
+
export declare function rollbackFailedTransaction(database: SqliteDatabase, operationError: unknown): never;
|
|
2
13
|
/** Run a synchronous write transaction with bounded retry for SQLite lock errors only. */
|
|
3
14
|
export declare function withImmediateTransaction<T>(database: SqliteDatabase, operation: () => T): T;
|
|
15
|
+
/** Run synchronous reads against one SQLite snapshot without reserving a writer lock. */
|
|
16
|
+
export declare function withDeferredReadTransaction<T>(database: SqliteDatabase, operation: () => T): T;
|
|
4
17
|
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/db/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/db/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD;;;;GAIG;AACH,qBAAa,+BAAgC,SAAQ,cAAc;IACjE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;gBAEpB,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO;CASzD;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,OAAO,GAAG,KAAK,CAUlG;AAeD,0FAA0F;AAC1F,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAY3F;AAED,yFAAyF;AACzF,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAU9F"}
|