@askdkc/kiokuko 0.1.17 → 0.1.20
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/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +560 -150
- 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 +71 -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 +37 -8
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +448 -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 +7 -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 +758 -28
- package/dist/db/upgrade-backup.js.map +1 -1
- package/dist/errors.d.ts +4 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +29 -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 +199 -115
- 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 +540 -36
- 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 +4 -1
- package/dist/setup/claude-config.d.ts.map +1 -1
- package/dist/setup/claude-config.js +62 -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 +4 -1
- package/dist/setup/hermes-config.d.ts.map +1 -1
- package/dist/setup/hermes-config.js +71 -17
- 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/mcp-conflict.d.ts +4 -0
- package/dist/setup/mcp-conflict.d.ts.map +1 -0
- package/dist/setup/mcp-conflict.js +15 -0
- package/dist/setup/mcp-conflict.js.map +1 -0
- package/dist/setup/opencode-config.d.ts +4 -1
- package/dist/setup/opencode-config.d.ts.map +1 -1
- package/dist/setup/opencode-config.js +65 -5
- package/dist/setup/opencode-config.js.map +1 -1
- package/dist/setup/render.d.ts +4 -1
- package/dist/setup/render.d.ts.map +1 -1
- package/dist/setup/render.js +168 -18
- 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 +18 -0
- package/dist/setup/strict-toml.d.ts.map +1 -0
- package/dist/setup/strict-toml.js +491 -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 +6 -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
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { SkillSourceError, skillSourceFailure } from './errors.js';
|
|
2
|
+
import { parseGitHubSource, validateSkillCandidate, validateSkillSnapshot, validateSourceCommit, MAX_FILE_BYTES, MAX_FILES_PER_SKILL, MAX_PRIMARY_SKILL_BYTES, MAX_TREE_ITEMS, MAX_TOTAL_SKILL_BYTES } from './snapshot-validator.js';
|
|
3
|
+
import { isBearerToken, parseRetryAfterSeconds } from '../config.js';
|
|
4
|
+
import { reviewedCatalogSkill } from '../official-catalog.js';
|
|
5
|
+
import { KiokukoError } from '../../errors.js';
|
|
6
|
+
import { parseStrictJson } from '../../setup/strict-json.js';
|
|
7
|
+
import { isExternalFetchFailure } from '../external-transport.js';
|
|
8
|
+
export { SkillSourceError } from './errors.js';
|
|
9
|
+
const MAX_API_RESPONSE_BYTES = 100_000;
|
|
10
|
+
const MAX_TREE_RESPONSE_BYTES = 3_000_000;
|
|
11
|
+
const INVALID_IDENTITY_CHARACTERS = /[\p{Cc}\p{Cf}\p{Cs}\uFFFD]/u;
|
|
12
|
+
const INVALID_UNICODE = /[\p{Cs}\uFFFD]/u;
|
|
13
|
+
function safeTreePath(value) {
|
|
14
|
+
return value.length > 0
|
|
15
|
+
&& value.length <= 2_000
|
|
16
|
+
&& !value.startsWith('/')
|
|
17
|
+
&& !value.includes('\\')
|
|
18
|
+
&& !INVALID_IDENTITY_CHARACTERS.test(value)
|
|
19
|
+
&& !value.split('/').some((part) => part === '' || part === '.' || part === '..');
|
|
20
|
+
}
|
|
21
|
+
function hasUnsafeMode(item) { return item.mode === '120000' || item.mode === '100755'; }
|
|
22
|
+
function isAllowedReferencePath(root, value) {
|
|
23
|
+
const prefix = root === '' ? '' : `${root.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&')}/`;
|
|
24
|
+
return new RegExp(`^${prefix}references/.+\\.(?:md|txt)$`, 'u').test(value)
|
|
25
|
+
|| new RegExp(`^${prefix}docs/.+\\.md$`, 'u').test(value);
|
|
26
|
+
}
|
|
27
|
+
function sourceParts(input) {
|
|
28
|
+
const candidate = validateSkillCandidate(input);
|
|
29
|
+
const { owner, repo } = parseGitHubSource(candidate.source);
|
|
30
|
+
return { candidate, owner, repo };
|
|
31
|
+
}
|
|
32
|
+
function sourceFetchRequest(value) {
|
|
33
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
34
|
+
skillSourceFailure('skill_validation_failed');
|
|
35
|
+
const request = value;
|
|
36
|
+
if (request.purpose === 'discovery' && Object.keys(request).length === 1)
|
|
37
|
+
return { purpose: 'discovery' };
|
|
38
|
+
if (request.purpose === 'refresh' && Object.keys(request).length === 2
|
|
39
|
+
&& typeof request.expectedPrimaryPath === 'string'
|
|
40
|
+
&& safeTreePath(request.expectedPrimaryPath)
|
|
41
|
+
&& (request.expectedPrimaryPath === 'SKILL.md' || request.expectedPrimaryPath.endsWith('/SKILL.md'))) {
|
|
42
|
+
return { purpose: 'refresh', expectedPrimaryPath: request.expectedPrimaryPath };
|
|
43
|
+
}
|
|
44
|
+
skillSourceFailure('skill_validation_failed');
|
|
45
|
+
}
|
|
46
|
+
function githubUrl(path) {
|
|
47
|
+
const url = new URL(path);
|
|
48
|
+
const allowedQuery = url.hostname === 'api.github.com' && url.search === '?recursive=1';
|
|
49
|
+
if (url.protocol !== 'https:' || !['api.github.com', 'raw.githubusercontent.com'].includes(url.hostname) || url.port || url.username || url.password || url.hash || url.search && !allowedQuery)
|
|
50
|
+
skillSourceFailure('skill_validation_failed');
|
|
51
|
+
return url;
|
|
52
|
+
}
|
|
53
|
+
function isRateLimited(response) {
|
|
54
|
+
if (response.status === 429)
|
|
55
|
+
return true;
|
|
56
|
+
if (response.status !== 403)
|
|
57
|
+
return false;
|
|
58
|
+
return response.headers.get('x-ratelimit-remaining') === '0'
|
|
59
|
+
|| parseRetryAfterSeconds(response.headers.get('retry-after')) !== null;
|
|
60
|
+
}
|
|
61
|
+
function hasAcceptedGitHubJsonContentType(response) {
|
|
62
|
+
const value = response.headers.get('content-type');
|
|
63
|
+
if (value === null)
|
|
64
|
+
return false;
|
|
65
|
+
const parts = value.split(';');
|
|
66
|
+
const mediaType = parts[0]?.trim().toLowerCase();
|
|
67
|
+
if (parts.length > 2 || mediaType !== 'application/json' && mediaType !== 'application/vnd.github+json')
|
|
68
|
+
return false;
|
|
69
|
+
return parts.length === 1 || /^charset\s*=\s*utf-8$/iu.test(parts[1]?.trim() ?? '');
|
|
70
|
+
}
|
|
71
|
+
function validDefaultBranch(value) {
|
|
72
|
+
return typeof value === 'string'
|
|
73
|
+
&& value.length >= 1
|
|
74
|
+
&& value.length <= 200
|
|
75
|
+
&& value === value.trim()
|
|
76
|
+
&& /^[A-Za-z0-9._/-]+$/u.test(value)
|
|
77
|
+
&& !value.startsWith('/')
|
|
78
|
+
&& !value.endsWith('/')
|
|
79
|
+
&& !value.endsWith('.')
|
|
80
|
+
&& !value.endsWith('.lock')
|
|
81
|
+
&& !value.includes('..')
|
|
82
|
+
&& !value.includes('//')
|
|
83
|
+
&& !value.includes('@{')
|
|
84
|
+
&& !value.split('/').some((part) => part === '.' || part === '..');
|
|
85
|
+
}
|
|
86
|
+
function treeItem(value) {
|
|
87
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
88
|
+
skillSourceFailure('skill_validation_failed');
|
|
89
|
+
const item = value;
|
|
90
|
+
if (typeof item.path !== 'string' || !safeTreePath(item.path)
|
|
91
|
+
|| (item.type !== 'blob' && item.type !== 'tree' && item.type !== 'commit')
|
|
92
|
+
|| typeof item.mode !== 'string')
|
|
93
|
+
skillSourceFailure('skill_validation_failed');
|
|
94
|
+
const validMode = item.type === 'blob'
|
|
95
|
+
? ['100644', '100755', '120000'].includes(item.mode)
|
|
96
|
+
: item.type === 'tree' ? item.mode === '040000' : item.mode === '160000';
|
|
97
|
+
if (!validMode)
|
|
98
|
+
skillSourceFailure('skill_validation_failed');
|
|
99
|
+
return { path: item.path, type: item.type, mode: item.mode };
|
|
100
|
+
}
|
|
101
|
+
export class GitHubSkillSourceFetcher {
|
|
102
|
+
fetchImpl;
|
|
103
|
+
#token;
|
|
104
|
+
timeoutMs;
|
|
105
|
+
constructor(options = {}) {
|
|
106
|
+
this.fetchImpl = options.fetchImpl ?? fetch;
|
|
107
|
+
this.#token = options.token ?? null;
|
|
108
|
+
this.timeoutMs = options.timeoutMs ?? 5_000;
|
|
109
|
+
if (!Number.isSafeInteger(this.timeoutMs) || this.timeoutMs < 1 || this.timeoutMs > 60_000)
|
|
110
|
+
throw new Error('GitHub timeout is invalid');
|
|
111
|
+
if (this.#token !== null && !isBearerToken(this.#token))
|
|
112
|
+
throw new Error('GitHub token is invalid');
|
|
113
|
+
}
|
|
114
|
+
async request(url, signal) {
|
|
115
|
+
try {
|
|
116
|
+
const safeUrl = githubUrl(url.toString());
|
|
117
|
+
const response = await this.fetchImpl(safeUrl, { redirect: 'manual', headers: { accept: 'application/vnd.github+json', 'user-agent': 'kiokuko-skill-discovery', ...(this.#token && safeUrl.hostname === 'api.github.com' ? { authorization: `Bearer ${this.#token}` } : {}) }, ...(signal === undefined ? {} : { signal }) });
|
|
118
|
+
if (response.status >= 300 && response.status < 400) {
|
|
119
|
+
throw new SkillSourceError('source_unavailable');
|
|
120
|
+
}
|
|
121
|
+
if (response.status === 404 || response.status === 410)
|
|
122
|
+
throw new SkillSourceError('source_missing');
|
|
123
|
+
if (isRateLimited(response))
|
|
124
|
+
throw new SkillSourceError('source_rate_limited', parseRetryAfterSeconds(response.headers.get('retry-after')));
|
|
125
|
+
if (response.status !== 200)
|
|
126
|
+
throw new SkillSourceError('source_unavailable');
|
|
127
|
+
return response;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (error instanceof SkillSourceError)
|
|
131
|
+
throw error;
|
|
132
|
+
if (isExternalFetchFailure(error))
|
|
133
|
+
throw new SkillSourceError('source_unavailable');
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async text(url, signal, limit) {
|
|
138
|
+
const response = await this.request(url, signal);
|
|
139
|
+
return this.responseText(response, limit, 'skill_too_large');
|
|
140
|
+
}
|
|
141
|
+
async responseText(response, limit, overflowCode) {
|
|
142
|
+
const contentLength = response.headers.get('content-length');
|
|
143
|
+
if (contentLength !== null && !/^\d+$/u.test(contentLength))
|
|
144
|
+
skillSourceFailure('skill_validation_failed');
|
|
145
|
+
const declared = contentLength === null ? null : Number(contentLength);
|
|
146
|
+
if (declared !== null && (!Number.isSafeInteger(declared) || declared > limit))
|
|
147
|
+
skillSourceFailure(overflowCode);
|
|
148
|
+
try {
|
|
149
|
+
const reader = response.body?.getReader();
|
|
150
|
+
if (!reader) {
|
|
151
|
+
return '';
|
|
152
|
+
}
|
|
153
|
+
const chunks = [];
|
|
154
|
+
let size = 0;
|
|
155
|
+
for (;;) {
|
|
156
|
+
const next = await reader.read();
|
|
157
|
+
if (next.done)
|
|
158
|
+
break;
|
|
159
|
+
const chunk = Buffer.from(next.value);
|
|
160
|
+
size += chunk.byteLength;
|
|
161
|
+
if (size > limit) {
|
|
162
|
+
await reader.cancel();
|
|
163
|
+
skillSourceFailure(overflowCode);
|
|
164
|
+
}
|
|
165
|
+
chunks.push(chunk);
|
|
166
|
+
}
|
|
167
|
+
let content;
|
|
168
|
+
try {
|
|
169
|
+
content = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(Buffer.concat(chunks));
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
skillSourceFailure('skill_validation_failed');
|
|
173
|
+
}
|
|
174
|
+
if (INVALID_UNICODE.test(content))
|
|
175
|
+
skillSourceFailure('skill_validation_failed');
|
|
176
|
+
return content;
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
if (isExternalFetchFailure(error))
|
|
180
|
+
throw new SkillSourceError('source_unavailable');
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async json(url, signal, limit = MAX_API_RESPONSE_BYTES, overflowCode = 'skill_validation_failed') {
|
|
185
|
+
const response = await this.request(url, signal);
|
|
186
|
+
if (!hasAcceptedGitHubJsonContentType(response))
|
|
187
|
+
skillSourceFailure('skill_validation_failed');
|
|
188
|
+
const body = await this.responseText(response, limit, overflowCode);
|
|
189
|
+
try {
|
|
190
|
+
return parseStrictJson(body, { allowTrailingComma: false, disallowComments: true, allowEmptyContent: false }, 'GitHub source response is not valid JSON with unique keys');
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
if (error instanceof KiokukoError && error.code === 'VALIDATION_ERROR')
|
|
194
|
+
skillSourceFailure('skill_validation_failed');
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
async fetch(input, request, signal) {
|
|
199
|
+
const { candidate, owner, repo } = sourceParts(input);
|
|
200
|
+
const fetchRequest = sourceFetchRequest(request);
|
|
201
|
+
const controller = new AbortController();
|
|
202
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
203
|
+
const onAbort = () => controller.abort();
|
|
204
|
+
if (signal?.aborted)
|
|
205
|
+
controller.abort();
|
|
206
|
+
else
|
|
207
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
208
|
+
try {
|
|
209
|
+
const apiBase = `https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`;
|
|
210
|
+
const repositoryJson = await this.json(new URL(apiBase), controller.signal);
|
|
211
|
+
if (typeof repositoryJson !== 'object' || repositoryJson === null || Array.isArray(repositoryJson))
|
|
212
|
+
skillSourceFailure('skill_validation_failed');
|
|
213
|
+
const defaultBranch = repositoryJson.default_branch;
|
|
214
|
+
if (!validDefaultBranch(defaultBranch))
|
|
215
|
+
skillSourceFailure('skill_validation_failed');
|
|
216
|
+
const commitJson = await this.json(new URL(`${apiBase}/commits/${encodeURIComponent(defaultBranch)}`), controller.signal);
|
|
217
|
+
if (typeof commitJson !== 'object' || commitJson === null || Array.isArray(commitJson))
|
|
218
|
+
skillSourceFailure('skill_validation_failed');
|
|
219
|
+
const sha = validateSourceCommit(commitJson.sha);
|
|
220
|
+
const treeJson = await this.json(new URL(`${apiBase}/git/trees/${encodeURIComponent(sha)}?recursive=1`), controller.signal, MAX_TREE_RESPONSE_BYTES, 'source_tree_truncated');
|
|
221
|
+
if (typeof treeJson !== 'object' || treeJson === null || Array.isArray(treeJson) || treeJson.truncated !== false || !Array.isArray(treeJson.tree))
|
|
222
|
+
skillSourceFailure('source_tree_truncated');
|
|
223
|
+
const rawTree = treeJson.tree;
|
|
224
|
+
if (rawTree.length > MAX_TREE_ITEMS)
|
|
225
|
+
skillSourceFailure('source_tree_truncated');
|
|
226
|
+
const tree = rawTree.map(treeItem);
|
|
227
|
+
const reviewedSkill = reviewedCatalogSkill(candidate);
|
|
228
|
+
let primary;
|
|
229
|
+
if (fetchRequest.purpose === 'refresh') {
|
|
230
|
+
const expectedMatches = tree.filter((item) => item.type === 'blob' && item.path === fetchRequest.expectedPrimaryPath);
|
|
231
|
+
if (expectedMatches.length > 1)
|
|
232
|
+
skillSourceFailure('skill_validation_failed');
|
|
233
|
+
primary = expectedMatches[0];
|
|
234
|
+
if (primary === undefined) {
|
|
235
|
+
const skillSuffix = `${candidate.slug}/SKILL.md`;
|
|
236
|
+
const movedIdentityMatches = tree.filter((item) => item.type === 'blob'
|
|
237
|
+
&& (reviewedSkill === undefined
|
|
238
|
+
? item.path === skillSuffix || item.path.endsWith(`/${skillSuffix}`)
|
|
239
|
+
: reviewedSkill.primaryPaths.includes(item.path)));
|
|
240
|
+
if (movedIdentityMatches.length > 1)
|
|
241
|
+
skillSourceFailure('skill_validation_failed');
|
|
242
|
+
primary = movedIdentityMatches[0];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
const skillSuffix = `${candidate.slug}/SKILL.md`;
|
|
247
|
+
const exactMatches = tree.filter((item) => item.type === 'blob'
|
|
248
|
+
&& (reviewedSkill === undefined
|
|
249
|
+
? item.path === skillSuffix || item.path.endsWith(`/${skillSuffix}`)
|
|
250
|
+
: reviewedSkill.primaryPaths.includes(item.path)));
|
|
251
|
+
if (exactMatches.length > 1)
|
|
252
|
+
skillSourceFailure('skill_validation_failed');
|
|
253
|
+
primary = exactMatches[0];
|
|
254
|
+
if (primary === undefined && reviewedSkill === undefined) {
|
|
255
|
+
const fuzzyMatches = tree.filter((item) => item.type === 'blob' && (item.path === 'SKILL.md' || item.path.endsWith('/SKILL.md')));
|
|
256
|
+
if (fuzzyMatches.length > 1)
|
|
257
|
+
skillSourceFailure('skill_validation_failed');
|
|
258
|
+
primary = fuzzyMatches[0];
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (!primary)
|
|
262
|
+
skillSourceFailure('candidate_not_found_at_source');
|
|
263
|
+
if (hasUnsafeMode(primary))
|
|
264
|
+
skillSourceFailure('skill_validation_failed');
|
|
265
|
+
const root = primary.path === 'SKILL.md' ? '' : primary.path.slice(0, -'/SKILL.md'.length);
|
|
266
|
+
const related = tree.filter((item) => safeTreePath(item.path) && (item.path === primary.path || isAllowedReferencePath(root, item.path)));
|
|
267
|
+
if (related.some(hasUnsafeMode))
|
|
268
|
+
skillSourceFailure('skill_validation_failed');
|
|
269
|
+
const paths = related.filter((item) => item.type === 'blob');
|
|
270
|
+
if (paths.length > MAX_FILES_PER_SKILL)
|
|
271
|
+
skillSourceFailure('skill_too_large');
|
|
272
|
+
const files = [];
|
|
273
|
+
let total = 0;
|
|
274
|
+
for (const item of paths) {
|
|
275
|
+
const isPrimary = item.path === primary.path;
|
|
276
|
+
const fileLimit = isPrimary ? MAX_PRIMARY_SKILL_BYTES : MAX_FILE_BYTES;
|
|
277
|
+
const remainingTotalBytes = MAX_TOTAL_SKILL_BYTES - total;
|
|
278
|
+
const content = await this.text(new URL(`https://raw.githubusercontent.com/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/${encodeURIComponent(sha)}/${item.path.split('/').map(encodeURIComponent).join('/')}`), controller.signal, Math.min(fileLimit, remainingTotalBytes));
|
|
279
|
+
total += Buffer.byteLength(content, 'utf8');
|
|
280
|
+
if (total > MAX_TOTAL_SKILL_BYTES)
|
|
281
|
+
skillSourceFailure('skill_too_large');
|
|
282
|
+
files.push({ path: item.path, content, primary: isPrimary });
|
|
283
|
+
}
|
|
284
|
+
return validateSkillSnapshot({ candidate, sourceCommit: sha, files });
|
|
285
|
+
}
|
|
286
|
+
finally {
|
|
287
|
+
clearTimeout(timer);
|
|
288
|
+
signal?.removeEventListener('abort', onAbort);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=github-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-fetcher.js","sourceRoot":"","sources":["../../../src/skills/source/github-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SkillCandidate, SkillSnapshot } from '../types.js';
|
|
2
|
+
export declare const MAX_TREE_ITEMS = 1000;
|
|
3
|
+
export declare const MAX_FILES_PER_SKILL = 20;
|
|
4
|
+
export declare const MAX_FILE_BYTES = 100000;
|
|
5
|
+
export declare const MAX_TOTAL_SKILL_BYTES = 300000;
|
|
6
|
+
export declare const MAX_PRIMARY_SKILL_BYTES = 150000;
|
|
7
|
+
export declare function parseGitHubSource(value: unknown): {
|
|
8
|
+
owner: string;
|
|
9
|
+
repo: string;
|
|
10
|
+
source: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function validateSourceCommit(value: unknown): string;
|
|
13
|
+
/** Validate and canonicalize a provider candidate before any source request. */
|
|
14
|
+
export declare function validateSkillCandidate(value: SkillCandidate): SkillCandidate;
|
|
15
|
+
/** Return the skill slug represented by a verified primary SKILL.md path. */
|
|
16
|
+
export declare function canonicalSkillSlugFromPrimaryPath(primaryPath: string): string;
|
|
17
|
+
export declare function validateSkillSnapshot(input: {
|
|
18
|
+
candidate: SkillCandidate;
|
|
19
|
+
sourceCommit: string;
|
|
20
|
+
files: Array<{
|
|
21
|
+
path: string;
|
|
22
|
+
content: string;
|
|
23
|
+
primary: boolean;
|
|
24
|
+
}>;
|
|
25
|
+
}): SkillSnapshot;
|
|
26
|
+
/** Recompute every derived field before a snapshot crosses the persistence boundary. */
|
|
27
|
+
export declare function revalidateSkillSnapshot(snapshot: SkillSnapshot): SkillSnapshot;
|
|
28
|
+
//# sourceMappingURL=snapshot-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-validator.d.ts","sourceRoot":"","sources":["../../../src/skills/source/snapshot-validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMjE,eAAO,MAAM,cAAc,OAAQ,CAAC;AACpC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,cAAc,SAAU,CAAC;AACtC,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAC7C,eAAO,MAAM,uBAAuB,SAAU,CAAC;AAsB/C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQjG;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG3D;AAED,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CA8B5E;AAED,6EAA6E;AAC7E,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAS7E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,aAAa,CAoDlL;AAED,wFAAwF;AACxF,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,CAsB9E"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { canonicalContentHash } from '../../serialization/validate.js';
|
|
3
|
+
import { skillSourceFailure } from './errors.js';
|
|
4
|
+
import { parseSkillFrontmatter } from './frontmatter.js';
|
|
5
|
+
import { findSecret } from '../../memory/secrets.js';
|
|
6
|
+
import { reviewedCatalogSkill } from '../official-catalog.js';
|
|
7
|
+
export const MAX_TREE_ITEMS = 1_000;
|
|
8
|
+
export const MAX_FILES_PER_SKILL = 20;
|
|
9
|
+
export const MAX_FILE_BYTES = 100_000;
|
|
10
|
+
export const MAX_TOTAL_SKILL_BYTES = 300_000;
|
|
11
|
+
export const MAX_PRIMARY_SKILL_BYTES = 150_000;
|
|
12
|
+
const OFFICIAL_STATUSES = new Set(['curated', 'catalog-verified', 'owner-verified', 'registry-only', 'unknown']);
|
|
13
|
+
const AUDIT_STATUSES = new Set(['not-required', 'passed', 'failed', 'unavailable']);
|
|
14
|
+
const FULL_COMMIT_PATTERN = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/u;
|
|
15
|
+
const INVALID_IDENTITY_CHARACTERS = /[\p{Cc}\p{Cf}\p{Cs}\uFFFD]/u;
|
|
16
|
+
const INVALID_UNICODE = /[\p{Cs}\uFFFD]/u;
|
|
17
|
+
const CANDIDATE_FIELDS = new Set([
|
|
18
|
+
'id', 'provider', 'name', 'slug', 'source', 'sourceType', 'installUrl',
|
|
19
|
+
'installs', 'duplicate', 'officialStatus', 'auditStatus',
|
|
20
|
+
]);
|
|
21
|
+
const REQUIRED_CANDIDATE_FIELDS = [...CANDIDATE_FIELDS].filter((field) => field !== 'auditStatus');
|
|
22
|
+
function validPath(value) {
|
|
23
|
+
return typeof value === 'string'
|
|
24
|
+
&& value.length > 0
|
|
25
|
+
&& value.length <= 2_000
|
|
26
|
+
&& /^[A-Za-z0-9_.\-/]+$/u.test(value)
|
|
27
|
+
&& !value.startsWith('/')
|
|
28
|
+
&& !value.split('/').some((part) => part === '' || part === '.' || part === '..');
|
|
29
|
+
}
|
|
30
|
+
export function parseGitHubSource(value) {
|
|
31
|
+
if (typeof value !== 'string' || value !== value.trim())
|
|
32
|
+
skillSourceFailure('skill_validation_failed');
|
|
33
|
+
const parts = value.split('/');
|
|
34
|
+
if (parts.length !== 2
|
|
35
|
+
|| parts.some((part) => part === '.' || part === '..' || !/^[A-Za-z0-9_.-]{1,100}$/u.test(part)))
|
|
36
|
+
skillSourceFailure('skill_validation_failed');
|
|
37
|
+
const owner = parts[0].toLowerCase();
|
|
38
|
+
const repo = parts[1].toLowerCase();
|
|
39
|
+
return { owner, repo, source: `${owner}/${repo}` };
|
|
40
|
+
}
|
|
41
|
+
export function validateSourceCommit(value) {
|
|
42
|
+
if (typeof value !== 'string' || !FULL_COMMIT_PATTERN.test(value))
|
|
43
|
+
skillSourceFailure('skill_validation_failed');
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
/** Validate and canonicalize a provider candidate before any source request. */
|
|
47
|
+
export function validateSkillCandidate(value) {
|
|
48
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)
|
|
49
|
+
|| REQUIRED_CANDIDATE_FIELDS.some((field) => !Object.prototype.hasOwnProperty.call(value, field))
|
|
50
|
+
|| Object.keys(value).some((field) => !CANDIDATE_FIELDS.has(field)))
|
|
51
|
+
skillSourceFailure('skill_validation_failed');
|
|
52
|
+
const source = parseGitHubSource(value.source).source;
|
|
53
|
+
const installUrl = `https://github.com/${source}`;
|
|
54
|
+
if (value.sourceType !== 'github'
|
|
55
|
+
|| typeof value.provider !== 'string' || !/^[A-Za-z0-9_.-]{1,50}$/u.test(value.provider) || value.provider === '.' || value.provider === '..'
|
|
56
|
+
|| typeof value.id !== 'string' || value.id !== value.id.trim() || value.id.length < 1 || value.id.length > 500 || INVALID_IDENTITY_CHARACTERS.test(value.id)
|
|
57
|
+
|| typeof value.name !== 'string' || value.name !== value.name.trim() || value.name.length < 1 || value.name.length > 500 || INVALID_IDENTITY_CHARACTERS.test(value.name) || findSecret(value.name) !== undefined
|
|
58
|
+
|| !/^[A-Za-z0-9_.\-/]{1,240}$/u.test(value.slug) || value.slug.split('/').some((part) => part === '' || part === '.' || part === '..')
|
|
59
|
+
|| findSecret(`${source}/${value.slug}`) !== undefined
|
|
60
|
+
|| (value.installUrl !== null && value.installUrl !== installUrl)
|
|
61
|
+
|| !Number.isSafeInteger(value.installs) || value.installs < 0
|
|
62
|
+
|| typeof value.duplicate !== 'boolean'
|
|
63
|
+
|| !OFFICIAL_STATUSES.has(value.officialStatus)
|
|
64
|
+
|| (value.auditStatus !== undefined && !AUDIT_STATUSES.has(value.auditStatus)))
|
|
65
|
+
skillSourceFailure('skill_validation_failed');
|
|
66
|
+
return {
|
|
67
|
+
id: value.id,
|
|
68
|
+
provider: value.provider,
|
|
69
|
+
name: value.name,
|
|
70
|
+
slug: value.slug,
|
|
71
|
+
source,
|
|
72
|
+
sourceType: 'github',
|
|
73
|
+
installUrl,
|
|
74
|
+
installs: value.installs,
|
|
75
|
+
duplicate: value.duplicate,
|
|
76
|
+
officialStatus: value.officialStatus,
|
|
77
|
+
...(value.auditStatus === undefined ? {} : { auditStatus: value.auditStatus }),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** Return the skill slug represented by a verified primary SKILL.md path. */
|
|
81
|
+
export function canonicalSkillSlugFromPrimaryPath(primaryPath) {
|
|
82
|
+
if (!validPath(primaryPath) || !primaryPath.endsWith('/SKILL.md'))
|
|
83
|
+
skillSourceFailure('skill_validation_failed');
|
|
84
|
+
const root = primaryPath.slice(0, -'/SKILL.md'.length);
|
|
85
|
+
// These are reviewed repository layouts, not aliases. Keep this list exact:
|
|
86
|
+
// an arbitrary parent directory must remain part of the canonical identity.
|
|
87
|
+
const reviewedPrefix = ['skills/', 'tools/skills/'].find((prefix) => root.startsWith(prefix));
|
|
88
|
+
const slug = reviewedPrefix === undefined ? root : root.slice(reviewedPrefix.length);
|
|
89
|
+
if (!/^[A-Za-z0-9_.\-/]{1,240}$/u.test(slug) || slug.split('/').some((part) => part === '' || part === '.' || part === '..'))
|
|
90
|
+
skillSourceFailure('skill_validation_failed');
|
|
91
|
+
return slug;
|
|
92
|
+
}
|
|
93
|
+
export function validateSkillSnapshot(input) {
|
|
94
|
+
const candidate = validateSkillCandidate(input.candidate);
|
|
95
|
+
const sourceCommit = validateSourceCommit(input.sourceCommit);
|
|
96
|
+
if (input.files.length === 0 || input.files.length > MAX_FILES_PER_SKILL)
|
|
97
|
+
skillSourceFailure('skill_validation_failed');
|
|
98
|
+
const primaryInputs = input.files.filter((file) => file.primary);
|
|
99
|
+
if (primaryInputs.length !== 1 || !validPath(primaryInputs[0].path)
|
|
100
|
+
|| primaryInputs[0].path !== 'SKILL.md' && !primaryInputs[0].path.endsWith('/SKILL.md'))
|
|
101
|
+
skillSourceFailure('skill_validation_failed');
|
|
102
|
+
const primaryPath = primaryInputs[0].path;
|
|
103
|
+
const reviewedSkill = reviewedCatalogSkill(candidate);
|
|
104
|
+
if (reviewedSkill !== undefined && !reviewedSkill.primaryPaths.includes(primaryPath))
|
|
105
|
+
skillSourceFailure('skill_validation_failed');
|
|
106
|
+
const canonicalSlug = reviewedSkill?.slug ?? (primaryPath === 'SKILL.md' ? candidate.slug : canonicalSkillSlugFromPrimaryPath(primaryPath));
|
|
107
|
+
const canonicalCandidate = {
|
|
108
|
+
...candidate,
|
|
109
|
+
slug: canonicalSlug,
|
|
110
|
+
id: `${candidate.provider}:${candidate.source}:${canonicalSlug}`,
|
|
111
|
+
};
|
|
112
|
+
const root = primaryPath === 'SKILL.md' ? '' : primaryPath.slice(0, -'/SKILL.md'.length);
|
|
113
|
+
let total = 0;
|
|
114
|
+
let primaryCount = 0;
|
|
115
|
+
const seenPaths = new Set();
|
|
116
|
+
const orderedFiles = [...input.files].sort((left, right) => left.path < right.path ? -1 : left.path > right.path ? 1 : 0);
|
|
117
|
+
const files = orderedFiles.map((file) => {
|
|
118
|
+
const allowedReference = (file.path.startsWith(root === '' ? 'references/' : `${root}/references/`) && /\.(?:md|txt)$/u.test(file.path))
|
|
119
|
+
|| (file.path.startsWith(root === '' ? 'docs/' : `${root}/docs/`) && /\.md$/u.test(file.path));
|
|
120
|
+
if (!validPath(file.path) || (file.path !== primaryPath && !allowedReference) || file.primary !== (file.path === primaryPath))
|
|
121
|
+
skillSourceFailure('skill_validation_failed');
|
|
122
|
+
if (seenPaths.has(file.path))
|
|
123
|
+
skillSourceFailure('skill_validation_failed');
|
|
124
|
+
seenPaths.add(file.path);
|
|
125
|
+
if (typeof file.content !== 'string' || INVALID_UNICODE.test(file.content))
|
|
126
|
+
skillSourceFailure('skill_validation_failed');
|
|
127
|
+
const bytes = Buffer.byteLength(file.content, 'utf8');
|
|
128
|
+
const fileLimit = file.primary ? MAX_PRIMARY_SKILL_BYTES : MAX_FILE_BYTES;
|
|
129
|
+
if (bytes > fileLimit)
|
|
130
|
+
skillSourceFailure('skill_too_large');
|
|
131
|
+
if (file.content.includes('\0'))
|
|
132
|
+
skillSourceFailure('skill_validation_failed');
|
|
133
|
+
if (findSecret(file.content))
|
|
134
|
+
skillSourceFailure('skill_secret_detected');
|
|
135
|
+
total += bytes;
|
|
136
|
+
if (total > MAX_TOTAL_SKILL_BYTES)
|
|
137
|
+
skillSourceFailure('skill_too_large');
|
|
138
|
+
if (file.primary)
|
|
139
|
+
primaryCount += 1;
|
|
140
|
+
const contentHash = createHash('sha256').update(file.content, 'utf8').digest('hex');
|
|
141
|
+
return { path: file.path, content: file.content, contentHash, primary: file.primary };
|
|
142
|
+
});
|
|
143
|
+
if (primaryCount !== 1)
|
|
144
|
+
skillSourceFailure('skill_validation_failed');
|
|
145
|
+
const primary = files.find((file) => file.primary);
|
|
146
|
+
const frontmatter = parseSkillFrontmatter(primary.content);
|
|
147
|
+
if (frontmatter.disableModelInvocation)
|
|
148
|
+
skillSourceFailure('skill_disabled_for_model_invocation');
|
|
149
|
+
if (primaryPath === 'SKILL.md' && (candidate.slug.includes('/') || candidate.slug !== frontmatter.name || candidate.name !== frontmatter.name)) {
|
|
150
|
+
skillSourceFailure('skill_validation_failed');
|
|
151
|
+
}
|
|
152
|
+
const persistedCandidate = { ...canonicalCandidate, name: frontmatter.name };
|
|
153
|
+
const sourceIdentity = {
|
|
154
|
+
sourceType: persistedCandidate.sourceType,
|
|
155
|
+
source: persistedCandidate.source,
|
|
156
|
+
slug: persistedCandidate.slug,
|
|
157
|
+
};
|
|
158
|
+
const snapshotHash = canonicalContentHash({ source: sourceIdentity, sourceCommit, files: files.map(({ path, contentHash, primary }) => ({ path, contentHash, primary })) });
|
|
159
|
+
return { candidate: persistedCandidate, sourceCommit, snapshotHash, files, frontmatter };
|
|
160
|
+
}
|
|
161
|
+
/** Recompute every derived field before a snapshot crosses the persistence boundary. */
|
|
162
|
+
export function revalidateSkillSnapshot(snapshot) {
|
|
163
|
+
const verified = validateSkillSnapshot({
|
|
164
|
+
candidate: snapshot.candidate,
|
|
165
|
+
sourceCommit: snapshot.sourceCommit,
|
|
166
|
+
files: snapshot.files.map(({ path, content, primary }) => ({ path, content, primary })),
|
|
167
|
+
});
|
|
168
|
+
const verifiedFiles = new Map(verified.files.map((file) => [file.path, file]));
|
|
169
|
+
const derivedFilesMatch = snapshot.files.length === verified.files.length && snapshot.files.every((file) => {
|
|
170
|
+
const verifiedFile = verifiedFiles.get(file.path);
|
|
171
|
+
return verifiedFile !== undefined && file.contentHash === verifiedFile.contentHash && file.primary === verifiedFile.primary;
|
|
172
|
+
});
|
|
173
|
+
const frontmatterMatches = snapshot.frontmatter.name === verified.frontmatter.name
|
|
174
|
+
&& snapshot.frontmatter.description === verified.frontmatter.description
|
|
175
|
+
&& snapshot.frontmatter.disableModelInvocation === verified.frontmatter.disableModelInvocation;
|
|
176
|
+
const identityMatches = snapshot.candidate.sourceType === verified.candidate.sourceType
|
|
177
|
+
&& snapshot.candidate.source === verified.candidate.source
|
|
178
|
+
&& snapshot.candidate.slug === verified.candidate.slug
|
|
179
|
+
&& snapshot.candidate.id === verified.candidate.id
|
|
180
|
+
&& snapshot.candidate.installUrl === verified.candidate.installUrl
|
|
181
|
+
&& snapshot.candidate.name === verified.candidate.name;
|
|
182
|
+
if (snapshot.snapshotHash !== verified.snapshotHash || !derivedFilesMatch || !frontmatterMatches || !identityMatches)
|
|
183
|
+
skillSourceFailure('skill_validation_failed');
|
|
184
|
+
return verified;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=snapshot-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-validator.js","sourceRoot":"","sources":["../../../src/skills/source/snapshot-validator.ts"],"names":[],"mappings":"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"}
|