@warlock.js/core 4.4.0 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -5
- package/README.md +47 -11
- package/esm/ai/src/agent/agent-input-builder.mjs +132 -0
- package/esm/ai/src/agent/agent-input-builder.mjs.map +1 -0
- package/esm/ai/src/agent/agent-log-event.mjs +101 -0
- package/esm/ai/src/agent/agent-log-event.mjs.map +1 -0
- package/esm/ai/src/agent/agent-stream.mjs +82 -0
- package/esm/ai/src/agent/agent-stream.mjs.map +1 -0
- package/esm/ai/src/agent/agent-to-stream-event.mjs +86 -0
- package/esm/ai/src/agent/agent-to-stream-event.mjs.map +1 -0
- package/esm/ai/src/agent/agent.mjs +1157 -0
- package/esm/ai/src/agent/agent.mjs.map +1 -0
- package/esm/ai/src/agent/index.mjs +5 -0
- package/esm/ai/src/agent/json-stream-guard.mjs +400 -0
- package/esm/ai/src/agent/json-stream-guard.mjs.map +1 -0
- package/esm/ai/src/agent/spawn-sub-agent.mjs +68 -0
- package/esm/ai/src/agent/spawn-sub-agent.mjs.map +1 -0
- package/esm/ai/src/ai.mjs +155 -0
- package/esm/ai/src/ai.mjs.map +1 -0
- package/esm/ai/src/batch/batch.mjs +198 -0
- package/esm/ai/src/batch/batch.mjs.map +1 -0
- package/esm/ai/src/batch/index.mjs +3 -0
- package/esm/ai/src/batch/run-batch-item.mjs +100 -0
- package/esm/ai/src/batch/run-batch-item.mjs.map +1 -0
- package/esm/ai/src/batch/run-with-concurrency.mjs +39 -0
- package/esm/ai/src/batch/run-with-concurrency.mjs.map +1 -0
- package/esm/ai/src/checkpoint/memory.mjs +0 -0
- package/esm/ai/src/checkpoint/memory.mjs.map +1 -0
- package/esm/ai/src/checkpoint/pg.mjs +265 -0
- package/esm/ai/src/checkpoint/pg.mjs.map +1 -0
- package/esm/ai/src/checkpoint/redis.mjs +200 -0
- package/esm/ai/src/checkpoint/redis.mjs.map +1 -0
- package/esm/ai/src/config.mjs +59 -0
- package/esm/ai/src/config.mjs.map +1 -0
- package/esm/ai/src/contracts/end.type.mjs +47 -0
- package/esm/ai/src/contracts/end.type.mjs.map +1 -0
- package/esm/ai/src/errors/agent-cancelled-error.mjs +43 -0
- package/esm/ai/src/errors/agent-cancelled-error.mjs.map +1 -0
- package/esm/ai/src/errors/agent-execution-error.mjs +35 -0
- package/esm/ai/src/errors/agent-execution-error.mjs.map +1 -0
- package/esm/ai/src/errors/agent-max-trips-error.mjs +41 -0
- package/esm/ai/src/errors/agent-max-trips-error.mjs.map +1 -0
- package/esm/ai/src/errors/ai-error.mjs +68 -0
- package/esm/ai/src/errors/ai-error.mjs.map +1 -0
- package/esm/ai/src/errors/budget-exceeded-error.mjs +31 -0
- package/esm/ai/src/errors/budget-exceeded-error.mjs.map +1 -0
- package/esm/ai/src/errors/content-filter-error.mjs +28 -0
- package/esm/ai/src/errors/content-filter-error.mjs.map +1 -0
- package/esm/ai/src/errors/context-length-exceeded-error.mjs +31 -0
- package/esm/ai/src/errors/context-length-exceeded-error.mjs.map +1 -0
- package/esm/ai/src/errors/guardrail-violation-error.mjs +41 -0
- package/esm/ai/src/errors/guardrail-violation-error.mjs.map +1 -0
- package/esm/ai/src/errors/index.mjs +37 -0
- package/esm/ai/src/errors/invalid-request-error.mjs +31 -0
- package/esm/ai/src/errors/invalid-request-error.mjs.map +1 -0
- package/esm/ai/src/errors/max-iterations-error.mjs +32 -0
- package/esm/ai/src/errors/max-iterations-error.mjs.map +1 -0
- package/esm/ai/src/errors/max-steps-exceeded-error.mjs +21 -0
- package/esm/ai/src/errors/max-steps-exceeded-error.mjs.map +1 -0
- package/esm/ai/src/errors/orchestrator-cancelled-error.mjs +31 -0
- package/esm/ai/src/errors/orchestrator-cancelled-error.mjs.map +1 -0
- package/esm/ai/src/errors/orchestrator-config-error.mjs +30 -0
- package/esm/ai/src/errors/orchestrator-config-error.mjs.map +1 -0
- package/esm/ai/src/errors/orchestrator-drift-error.mjs +37 -0
- package/esm/ai/src/errors/orchestrator-drift-error.mjs.map +1 -0
- package/esm/ai/src/errors/orchestrator-failed-error.mjs +36 -0
- package/esm/ai/src/errors/orchestrator-failed-error.mjs.map +1 -0
- package/esm/ai/src/errors/outbound-policy-error.mjs +32 -0
- package/esm/ai/src/errors/outbound-policy-error.mjs.map +1 -0
- package/esm/ai/src/errors/planner-cancelled-error.mjs +29 -0
- package/esm/ai/src/errors/planner-cancelled-error.mjs.map +1 -0
- package/esm/ai/src/errors/planner-failed-error.mjs +37 -0
- package/esm/ai/src/errors/planner-failed-error.mjs.map +1 -0
- package/esm/ai/src/errors/planner-plan-invalid-error.mjs +25 -0
- package/esm/ai/src/errors/planner-plan-invalid-error.mjs.map +1 -0
- package/esm/ai/src/errors/provider-auth-error.mjs +26 -0
- package/esm/ai/src/errors/provider-auth-error.mjs.map +1 -0
- package/esm/ai/src/errors/provider-error.mjs +42 -0
- package/esm/ai/src/errors/provider-error.mjs.map +1 -0
- package/esm/ai/src/errors/provider-rate-limit-error.mjs +31 -0
- package/esm/ai/src/errors/provider-rate-limit-error.mjs.map +1 -0
- package/esm/ai/src/errors/provider-timeout-error.mjs +26 -0
- package/esm/ai/src/errors/provider-timeout-error.mjs.map +1 -0
- package/esm/ai/src/errors/quota-exceeded-error.mjs +40 -0
- package/esm/ai/src/errors/quota-exceeded-error.mjs.map +1 -0
- package/esm/ai/src/errors/routing-error.mjs +23 -0
- package/esm/ai/src/errors/routing-error.mjs.map +1 -0
- package/esm/ai/src/errors/schema-validation-error.mjs +37 -0
- package/esm/ai/src/errors/schema-validation-error.mjs.map +1 -0
- package/esm/ai/src/errors/step-failed-error.mjs +19 -0
- package/esm/ai/src/errors/step-failed-error.mjs.map +1 -0
- package/esm/ai/src/errors/supervisor-cancelled-error.mjs +29 -0
- package/esm/ai/src/errors/supervisor-cancelled-error.mjs.map +1 -0
- package/esm/ai/src/errors/supervisor-drift-error.mjs +30 -0
- package/esm/ai/src/errors/supervisor-drift-error.mjs.map +1 -0
- package/esm/ai/src/errors/supervisor-failed-error.mjs +43 -0
- package/esm/ai/src/errors/supervisor-failed-error.mjs.map +1 -0
- package/esm/ai/src/errors/supervisor-routing-error.mjs +39 -0
- package/esm/ai/src/errors/supervisor-routing-error.mjs.map +1 -0
- package/esm/ai/src/errors/tool-execution-error.mjs +32 -0
- package/esm/ai/src/errors/tool-execution-error.mjs.map +1 -0
- package/esm/ai/src/errors/workflow-cancelled-error.mjs +23 -0
- package/esm/ai/src/errors/workflow-cancelled-error.mjs.map +1 -0
- package/esm/ai/src/errors/workflow-drift-error.mjs +24 -0
- package/esm/ai/src/errors/workflow-drift-error.mjs.map +1 -0
- package/esm/ai/src/errors/workflow-error.mjs +18 -0
- package/esm/ai/src/errors/workflow-error.mjs.map +1 -0
- package/esm/ai/src/eval/dataset.mjs +112 -0
- package/esm/ai/src/eval/dataset.mjs.map +1 -0
- package/esm/ai/src/eval/eval-runner.mjs +135 -0
- package/esm/ai/src/eval/eval-runner.mjs.map +1 -0
- package/esm/ai/src/eval/index.mjs +48 -0
- package/esm/ai/src/eval/index.mjs.map +1 -0
- package/esm/ai/src/eval/judge-scorer.mjs +87 -0
- package/esm/ai/src/eval/judge-scorer.mjs.map +1 -0
- package/esm/ai/src/eval/regression.mjs +51 -0
- package/esm/ai/src/eval/regression.mjs.map +1 -0
- package/esm/ai/src/eval/report-json.mjs +33 -0
- package/esm/ai/src/eval/report-json.mjs.map +1 -0
- package/esm/ai/src/eval/report-junit.mjs +60 -0
- package/esm/ai/src/eval/report-junit.mjs.map +1 -0
- package/esm/ai/src/eval/scorers.mjs +101 -0
- package/esm/ai/src/eval/scorers.mjs.map +1 -0
- package/esm/ai/src/guard/detectors/index.mjs +6 -0
- package/esm/ai/src/guard/detectors/injection.mjs +254 -0
- package/esm/ai/src/guard/detectors/injection.mjs.map +1 -0
- package/esm/ai/src/guard/detectors/moderation.mjs +134 -0
- package/esm/ai/src/guard/detectors/moderation.mjs.map +1 -0
- package/esm/ai/src/guard/detectors/pii.mjs +199 -0
- package/esm/ai/src/guard/detectors/pii.mjs.map +1 -0
- package/esm/ai/src/guard/detectors/topic.mjs +99 -0
- package/esm/ai/src/guard/detectors/topic.mjs.map +1 -0
- package/esm/ai/src/guard/errors.mjs +18 -0
- package/esm/ai/src/guard/errors.mjs.map +1 -0
- package/esm/ai/src/guard/guard.mjs +209 -0
- package/esm/ai/src/guard/guard.mjs.map +1 -0
- package/esm/ai/src/guard/guardrail.mjs +22 -0
- package/esm/ai/src/guard/guardrail.mjs.map +1 -0
- package/esm/ai/src/human/errors.mjs +60 -0
- package/esm/ai/src/human/errors.mjs.map +1 -0
- package/esm/ai/src/human/human-approval.mjs +170 -0
- package/esm/ai/src/human/human-approval.mjs.map +1 -0
- package/esm/ai/src/human/policy.mjs +67 -0
- package/esm/ai/src/human/policy.mjs.map +1 -0
- package/esm/ai/src/human/register.mjs +37 -0
- package/esm/ai/src/human/register.mjs.map +1 -0
- package/esm/ai/src/human/resume-seed.mjs +53 -0
- package/esm/ai/src/human/resume-seed.mjs.map +1 -0
- package/esm/ai/src/human/resume.mjs +121 -0
- package/esm/ai/src/human/resume.mjs.map +1 -0
- package/esm/ai/src/human/stores/index.mjs +5 -0
- package/esm/ai/src/human/stores/memory.mjs +91 -0
- package/esm/ai/src/human/stores/memory.mjs.map +1 -0
- package/esm/ai/src/human/stores/pg.mjs +220 -0
- package/esm/ai/src/human/stores/pg.mjs.map +1 -0
- package/esm/ai/src/human/stores/redis.mjs +201 -0
- package/esm/ai/src/human/stores/redis.mjs.map +1 -0
- package/esm/ai/src/index.mjs +174 -0
- package/esm/ai/src/memory/derive-id.mjs +24 -0
- package/esm/ai/src/memory/derive-id.mjs.map +1 -0
- package/esm/ai/src/memory/episodic-memory.mjs +106 -0
- package/esm/ai/src/memory/episodic-memory.mjs.map +1 -0
- package/esm/ai/src/memory/memory.mjs +166 -0
- package/esm/ai/src/memory/memory.mjs.map +1 -0
- package/esm/ai/src/memory/procedural-memory.mjs +103 -0
- package/esm/ai/src/memory/procedural-memory.mjs.map +1 -0
- package/esm/ai/src/memory/semantic-memory.mjs +80 -0
- package/esm/ai/src/memory/semantic-memory.mjs.map +1 -0
- package/esm/ai/src/memory/working-memory.mjs +62 -0
- package/esm/ai/src/memory/working-memory.mjs.map +1 -0
- package/esm/ai/src/middleware/builtins/budget.mjs +219 -0
- package/esm/ai/src/middleware/builtins/budget.mjs.map +1 -0
- package/esm/ai/src/middleware/builtins/guardrail.mjs +76 -0
- package/esm/ai/src/middleware/builtins/guardrail.mjs.map +1 -0
- package/esm/ai/src/middleware/builtins/semantic-cache.mjs +149 -0
- package/esm/ai/src/middleware/builtins/semantic-cache.mjs.map +1 -0
- package/esm/ai/src/middleware/helpers/compose.mjs +52 -0
- package/esm/ai/src/middleware/helpers/compose.mjs.map +1 -0
- package/esm/ai/src/middleware/helpers/for-tool.mjs +80 -0
- package/esm/ai/src/middleware/helpers/for-tool.mjs.map +1 -0
- package/esm/ai/src/middleware/index.mjs +10 -0
- package/esm/ai/src/middleware/pipeline.mjs +100 -0
- package/esm/ai/src/middleware/pipeline.mjs.map +1 -0
- package/esm/ai/src/middleware/utils/extract-user-text.mjs +47 -0
- package/esm/ai/src/middleware/utils/extract-user-text.mjs.map +1 -0
- package/esm/ai/src/middleware/utils/namespaced-state.mjs +60 -0
- package/esm/ai/src/middleware/utils/namespaced-state.mjs.map +1 -0
- package/esm/ai/src/mock/index.mjs +4 -0
- package/esm/ai/src/mock/mock-agent.mjs +3 -0
- package/esm/ai/src/mock/mock-router.mjs +58 -0
- package/esm/ai/src/mock/mock-router.mjs.map +1 -0
- package/esm/ai/src/model/fallback-model.mjs +218 -0
- package/esm/ai/src/model/fallback-model.mjs.map +1 -0
- package/esm/ai/src/model/index.mjs +3 -0
- package/esm/ai/src/object-stream/index.mjs +4 -0
- package/esm/ai/src/object-stream/parse-partial-json.mjs +78 -0
- package/esm/ai/src/object-stream/parse-partial-json.mjs.map +1 -0
- package/esm/ai/src/object-stream/stream-object.mjs +97 -0
- package/esm/ai/src/object-stream/stream-object.mjs.map +1 -0
- package/esm/ai/src/observe/index.mjs +4 -0
- package/esm/ai/src/observe/observer-registry.mjs +35 -0
- package/esm/ai/src/observe/observer-registry.mjs.map +1 -0
- package/esm/ai/src/observe/resolve-observers.mjs +73 -0
- package/esm/ai/src/observe/resolve-observers.mjs.map +1 -0
- package/esm/ai/src/orchestrator/as-tool.mjs +98 -0
- package/esm/ai/src/orchestrator/as-tool.mjs.map +1 -0
- package/esm/ai/src/orchestrator/checkpoint.mjs +75 -0
- package/esm/ai/src/orchestrator/checkpoint.mjs.map +1 -0
- package/esm/ai/src/orchestrator/commands.mjs +34 -0
- package/esm/ai/src/orchestrator/commands.mjs.map +1 -0
- package/esm/ai/src/orchestrator/compaction.mjs +206 -0
- package/esm/ai/src/orchestrator/compaction.mjs.map +1 -0
- package/esm/ai/src/orchestrator/dispatch.mjs +171 -0
- package/esm/ai/src/orchestrator/dispatch.mjs.map +1 -0
- package/esm/ai/src/orchestrator/emitter.mjs +85 -0
- package/esm/ai/src/orchestrator/emitter.mjs.map +1 -0
- package/esm/ai/src/orchestrator/execution.mjs +395 -0
- package/esm/ai/src/orchestrator/execution.mjs.map +1 -0
- package/esm/ai/src/orchestrator/index.mjs +11 -0
- package/esm/ai/src/orchestrator/load.mjs +49 -0
- package/esm/ai/src/orchestrator/load.mjs.map +1 -0
- package/esm/ai/src/orchestrator/lock.mjs +75 -0
- package/esm/ai/src/orchestrator/lock.mjs.map +1 -0
- package/esm/ai/src/orchestrator/memory.mjs +141 -0
- package/esm/ai/src/orchestrator/memory.mjs.map +1 -0
- package/esm/ai/src/orchestrator/orchestrator-stream.mjs +98 -0
- package/esm/ai/src/orchestrator/orchestrator-stream.mjs.map +1 -0
- package/esm/ai/src/orchestrator/orchestrator.mjs +206 -0
- package/esm/ai/src/orchestrator/orchestrator.mjs.map +1 -0
- package/esm/ai/src/orchestrator/resume.mjs +74 -0
- package/esm/ai/src/orchestrator/resume.mjs.map +1 -0
- package/esm/ai/src/orchestrator/session-lock.mjs +83 -0
- package/esm/ai/src/orchestrator/session-lock.mjs.map +1 -0
- package/esm/ai/src/orchestrator/signature.mjs +120 -0
- package/esm/ai/src/orchestrator/signature.mjs.map +1 -0
- package/esm/ai/src/orchestrator/window.mjs +56 -0
- package/esm/ai/src/orchestrator/window.mjs.map +1 -0
- package/esm/ai/src/planner/dag-scheduler.mjs +97 -0
- package/esm/ai/src/planner/dag-scheduler.mjs.map +1 -0
- package/esm/ai/src/planner/index.mjs +6 -0
- package/esm/ai/src/planner/plan-prompt.mjs +31 -0
- package/esm/ai/src/planner/plan-prompt.mjs.map +1 -0
- package/esm/ai/src/planner/plan-schema.mjs +120 -0
- package/esm/ai/src/planner/plan-schema.mjs.map +1 -0
- package/esm/ai/src/planner/planner-run.mjs +614 -0
- package/esm/ai/src/planner/planner-run.mjs.map +1 -0
- package/esm/ai/src/planner/planner.mjs +120 -0
- package/esm/ai/src/planner/planner.mjs.map +1 -0
- package/esm/ai/src/planner/signature.mjs +27 -0
- package/esm/ai/src/planner/signature.mjs.map +1 -0
- package/esm/ai/src/prompt/errors.mjs +73 -0
- package/esm/ai/src/prompt/errors.mjs.map +1 -0
- package/esm/ai/src/prompt/index.mjs +4 -0
- package/esm/ai/src/prompt/prompt-langfuse-sync.mjs +104 -0
- package/esm/ai/src/prompt/prompt-langfuse-sync.mjs.map +1 -0
- package/esm/ai/src/prompt/prompt-validate.mjs +170 -0
- package/esm/ai/src/prompt/prompt-validate.mjs.map +1 -0
- package/esm/ai/src/prompt/prompt.mjs +218 -0
- package/esm/ai/src/prompt/prompt.mjs.map +1 -0
- package/esm/ai/src/prompts/index.mjs +3 -0
- package/esm/ai/src/prompts/prompts-manager.mjs +410 -0
- package/esm/ai/src/prompts/prompts-manager.mjs.map +1 -0
- package/esm/ai/src/prompts/prompts-validate.mjs +200 -0
- package/esm/ai/src/prompts/prompts-validate.mjs.map +1 -0
- package/esm/ai/src/rag/as-tool.mjs +48 -0
- package/esm/ai/src/rag/as-tool.mjs.map +1 -0
- package/esm/ai/src/rag/chunk/chunk.mjs +44 -0
- package/esm/ai/src/rag/chunk/chunk.mjs.map +1 -0
- package/esm/ai/src/rag/chunk/fixed.mjs +32 -0
- package/esm/ai/src/rag/chunk/fixed.mjs.map +1 -0
- package/esm/ai/src/rag/chunk/markdown.mjs +75 -0
- package/esm/ai/src/rag/chunk/markdown.mjs.map +1 -0
- package/esm/ai/src/rag/chunk/recursive.mjs +132 -0
- package/esm/ai/src/rag/chunk/recursive.mjs.map +1 -0
- package/esm/ai/src/rag/chunk/sentence.mjs +73 -0
- package/esm/ai/src/rag/chunk/sentence.mjs.map +1 -0
- package/esm/ai/src/rag/index.mjs +7 -0
- package/esm/ai/src/rag/rag.mjs +126 -0
- package/esm/ai/src/rag/rag.mjs.map +1 -0
- package/esm/ai/src/rag/rerank/keyword-reranker.mjs +58 -0
- package/esm/ai/src/rag/rerank/keyword-reranker.mjs.map +1 -0
- package/esm/ai/src/rag/rerank/llm-reranker.mjs +85 -0
- package/esm/ai/src/rag/rerank/llm-reranker.mjs.map +1 -0
- package/esm/ai/src/rag/retrieve.mjs +68 -0
- package/esm/ai/src/rag/retrieve.mjs.map +1 -0
- package/esm/ai/src/rag/store/cache-vector-store.mjs +48 -0
- package/esm/ai/src/rag/store/cache-vector-store.mjs.map +1 -0
- package/esm/ai/src/security/index.mjs +5 -0
- package/esm/ai/src/security/outbound-policy.mjs +187 -0
- package/esm/ai/src/security/outbound-policy.mjs.map +1 -0
- package/esm/ai/src/security/private-ip.mjs +48 -0
- package/esm/ai/src/security/private-ip.mjs.map +1 -0
- package/esm/ai/src/security/redact.mjs +60 -0
- package/esm/ai/src/security/redact.mjs.map +1 -0
- package/esm/ai/src/serve/serve.mjs +90 -0
- package/esm/ai/src/serve/serve.mjs.map +1 -0
- package/esm/ai/src/serve/sse.mjs +25 -0
- package/esm/ai/src/serve/sse.mjs.map +1 -0
- package/esm/ai/src/serve/stream-to-sse.mjs +37 -0
- package/esm/ai/src/serve/stream-to-sse.mjs.map +1 -0
- package/esm/ai/src/skills/catalog.mjs +140 -0
- package/esm/ai/src/skills/catalog.mjs.map +1 -0
- package/esm/ai/src/skills/index.mjs +11 -0
- package/esm/ai/src/skills/load-skill-tool.mjs +65 -0
- package/esm/ai/src/skills/load-skill-tool.mjs.map +1 -0
- package/esm/ai/src/skills/save-skill-tool.mjs +65 -0
- package/esm/ai/src/skills/save-skill-tool.mjs.map +1 -0
- package/esm/ai/src/skills/skills.mjs +109 -0
- package/esm/ai/src/skills/skills.mjs.map +1 -0
- package/esm/ai/src/skills/sources/directory-source.mjs +108 -0
- package/esm/ai/src/skills/sources/directory-source.mjs.map +1 -0
- package/esm/ai/src/skills/sources/index.mjs +27 -0
- package/esm/ai/src/skills/sources/index.mjs.map +1 -0
- package/esm/ai/src/skills/sources/parse-frontmatter.mjs +46 -0
- package/esm/ai/src/skills/sources/parse-frontmatter.mjs.map +1 -0
- package/esm/ai/src/skills/sources/store-source.mjs +15 -0
- package/esm/ai/src/skills/sources/store-source.mjs.map +1 -0
- package/esm/ai/src/skills/sources/url-source.mjs +117 -0
- package/esm/ai/src/skills/sources/url-source.mjs.map +1 -0
- package/esm/ai/src/snapshot/memory.mjs +81 -0
- package/esm/ai/src/snapshot/memory.mjs.map +1 -0
- package/esm/ai/src/snapshot/pg.mjs +146 -0
- package/esm/ai/src/snapshot/pg.mjs.map +1 -0
- package/esm/ai/src/snapshot/redis.mjs +101 -0
- package/esm/ai/src/snapshot/redis.mjs.map +1 -0
- package/esm/ai/src/supervisor/as-tool.mjs +74 -0
- package/esm/ai/src/supervisor/as-tool.mjs.map +1 -0
- package/esm/ai/src/supervisor/cancellation.mjs +22 -0
- package/esm/ai/src/supervisor/cancellation.mjs.map +1 -0
- package/esm/ai/src/supervisor/decide.mjs +272 -0
- package/esm/ai/src/supervisor/decide.mjs.map +1 -0
- package/esm/ai/src/supervisor/emitter.mjs +47 -0
- package/esm/ai/src/supervisor/emitter.mjs.map +1 -0
- package/esm/ai/src/supervisor/entries.mjs +206 -0
- package/esm/ai/src/supervisor/entries.mjs.map +1 -0
- package/esm/ai/src/supervisor/execution.mjs +1921 -0
- package/esm/ai/src/supervisor/execution.mjs.map +1 -0
- package/esm/ai/src/supervisor/fan-out.mjs +65 -0
- package/esm/ai/src/supervisor/fan-out.mjs.map +1 -0
- package/esm/ai/src/supervisor/index.mjs +14 -0
- package/esm/ai/src/supervisor/router-factory.mjs +141 -0
- package/esm/ai/src/supervisor/router-factory.mjs.map +1 -0
- package/esm/ai/src/supervisor/router-prompt.mjs +52 -0
- package/esm/ai/src/supervisor/router-prompt.mjs.map +1 -0
- package/esm/ai/src/supervisor/signature.mjs +89 -0
- package/esm/ai/src/supervisor/signature.mjs.map +1 -0
- package/esm/ai/src/supervisor/snapshot.mjs +69 -0
- package/esm/ai/src/supervisor/snapshot.mjs.map +1 -0
- package/esm/ai/src/supervisor/supervisor-stream.mjs +89 -0
- package/esm/ai/src/supervisor/supervisor-stream.mjs.map +1 -0
- package/esm/ai/src/supervisor/supervisor.mjs +144 -0
- package/esm/ai/src/supervisor/supervisor.mjs.map +1 -0
- package/esm/ai/src/system-prompt/index.mjs +6 -0
- package/esm/ai/src/system-prompt/instruction.mjs +57 -0
- package/esm/ai/src/system-prompt/instruction.mjs.map +1 -0
- package/esm/ai/src/system-prompt/persona.mjs +57 -0
- package/esm/ai/src/system-prompt/persona.mjs.map +1 -0
- package/esm/ai/src/system-prompt/render-placeholders.mjs +58 -0
- package/esm/ai/src/system-prompt/render-placeholders.mjs.map +1 -0
- package/esm/ai/src/system-prompt/system-prompt.mjs +267 -0
- package/esm/ai/src/system-prompt/system-prompt.mjs.map +1 -0
- package/esm/ai/src/team/gates.mjs +48 -0
- package/esm/ai/src/team/gates.mjs.map +1 -0
- package/esm/ai/src/team/index.mjs +3 -0
- package/esm/ai/src/team/team.mjs +94 -0
- package/esm/ai/src/team/team.mjs.map +1 -0
- package/esm/ai/src/tool/executable-as-tool.mjs +81 -0
- package/esm/ai/src/tool/executable-as-tool.mjs.map +1 -0
- package/esm/ai/src/tool/index.mjs +4 -0
- package/esm/ai/src/tool/tool.mjs +185 -0
- package/esm/ai/src/tool/tool.mjs.map +1 -0
- package/esm/ai/src/utils/compute-cost.mjs +112 -0
- package/esm/ai/src/utils/compute-cost.mjs.map +1 -0
- package/esm/ai/src/utils/extract-json-lenient.mjs +97 -0
- package/esm/ai/src/utils/extract-json-lenient.mjs.map +1 -0
- package/esm/ai/src/utils/extract-json-payload.mjs +39 -0
- package/esm/ai/src/utils/extract-json-payload.mjs.map +1 -0
- package/esm/ai/src/utils/generate-run-id.mjs +23 -0
- package/esm/ai/src/utils/generate-run-id.mjs.map +1 -0
- package/esm/ai/src/utils/index.mjs +12 -0
- package/esm/ai/src/utils/json-schema.mjs +89 -0
- package/esm/ai/src/utils/json-schema.mjs.map +1 -0
- package/esm/ai/src/utils/prepare-attachment-part.mjs +232 -0
- package/esm/ai/src/utils/prepare-attachment-part.mjs.map +1 -0
- package/esm/ai/src/utils/resolve-attachment.mjs +74 -0
- package/esm/ai/src/utils/resolve-attachment.mjs.map +1 -0
- package/esm/ai/src/utils/run-context.mjs +89 -0
- package/esm/ai/src/utils/run-context.mjs.map +1 -0
- package/esm/ai/src/utils/safe-json-parse.mjs +22 -0
- package/esm/ai/src/utils/safe-json-parse.mjs.map +1 -0
- package/esm/ai/src/utils/stamp-report-lineage.mjs +45 -0
- package/esm/ai/src/utils/stamp-report-lineage.mjs.map +1 -0
- package/esm/ai/src/vcr/cassette-io.mjs +57 -0
- package/esm/ai/src/vcr/cassette-io.mjs.map +1 -0
- package/esm/ai/src/vcr/errors.mjs +37 -0
- package/esm/ai/src/vcr/errors.mjs.map +1 -0
- package/esm/ai/src/vcr/hash-request.mjs +118 -0
- package/esm/ai/src/vcr/hash-request.mjs.map +1 -0
- package/esm/ai/src/vcr/index.mjs +5 -0
- package/esm/ai/src/vcr/vcr.mjs +248 -0
- package/esm/ai/src/vcr/vcr.mjs.map +1 -0
- package/esm/ai/src/workflow/as-tool.mjs +49 -0
- package/esm/ai/src/workflow/as-tool.mjs.map +1 -0
- package/esm/ai/src/workflow/cancellation.mjs +44 -0
- package/esm/ai/src/workflow/cancellation.mjs.map +1 -0
- package/esm/ai/src/workflow/emitter.mjs +40 -0
- package/esm/ai/src/workflow/emitter.mjs.map +1 -0
- package/esm/ai/src/workflow/engine.mjs +363 -0
- package/esm/ai/src/workflow/engine.mjs.map +1 -0
- package/esm/ai/src/workflow/index.mjs +5 -0
- package/esm/ai/src/workflow/retry.mjs +32 -0
- package/esm/ai/src/workflow/retry.mjs.map +1 -0
- package/esm/ai/src/workflow/router.mjs +56 -0
- package/esm/ai/src/workflow/router.mjs.map +1 -0
- package/esm/ai/src/workflow/run-scoped-emitter.mjs +32 -0
- package/esm/ai/src/workflow/run-scoped-emitter.mjs.map +1 -0
- package/esm/ai/src/workflow/signature.mjs +34 -0
- package/esm/ai/src/workflow/signature.mjs.map +1 -0
- package/esm/ai/src/workflow/snapshot.mjs +77 -0
- package/esm/ai/src/workflow/snapshot.mjs.map +1 -0
- package/esm/ai/src/workflow/state.mjs +37 -0
- package/esm/ai/src/workflow/state.mjs.map +1 -0
- package/esm/ai/src/workflow/step-runner.mjs +370 -0
- package/esm/ai/src/workflow/step-runner.mjs.map +1 -0
- package/esm/ai/src/workflow/step.mjs +37 -0
- package/esm/ai/src/workflow/step.mjs.map +1 -0
- package/esm/ai/src/workflow/workflow.mjs +122 -0
- package/esm/ai/src/workflow/workflow.mjs.map +1 -0
- package/esm/ai-openai/src/embedder.mjs +4 -0
- package/esm/ai-openai/src/index.mjs +4 -0
- package/esm/ai-openai/src/model.mjs +5 -0
- package/esm/ai-openai/src/sdk.mjs +6 -0
- package/esm/ai-openai/src/utils/index.mjs +4 -0
- package/esm/ai-openai/src/utils/to-openai-tools.mjs +3 -0
- package/esm/ai-openai/src/utils/wrap-openai-error.mjs +4 -0
- package/esm/cli/commands/dev-server.command.mjs +1 -1
- package/esm/cli/commands/dev-server.command.mjs.map +1 -1
- package/esm/cli/commands/generate/templates/stubs.mjs +3 -4
- package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
- package/esm/connectors/ai-connector.d.mts +43 -0
- package/esm/connectors/ai-connector.d.mts.map +1 -0
- package/esm/connectors/ai-connector.mjs +56 -0
- package/esm/connectors/ai-connector.mjs.map +1 -0
- package/esm/connectors/cache-connector.d.mts +5 -0
- package/esm/connectors/cache-connector.d.mts.map +1 -1
- package/esm/connectors/cache-connector.mjs +7 -0
- package/esm/connectors/cache-connector.mjs.map +1 -1
- package/esm/connectors/connectors-manager.d.mts +6 -2
- package/esm/connectors/connectors-manager.d.mts.map +1 -1
- package/esm/connectors/connectors-manager.mjs +8 -2
- package/esm/connectors/connectors-manager.mjs.map +1 -1
- package/esm/connectors/http-connector.mjs.map +1 -1
- package/esm/connectors/index.d.mts +1 -0
- package/esm/connectors/index.mjs +1 -0
- package/esm/connectors/socket-connector.d.mts +16 -1
- package/esm/connectors/socket-connector.d.mts.map +1 -1
- package/esm/connectors/socket-connector.mjs +28 -5
- package/esm/connectors/socket-connector.mjs.map +1 -1
- package/esm/connectors/storage.connector.d.mts +7 -0
- package/esm/connectors/storage.connector.d.mts.map +1 -1
- package/esm/connectors/storage.connector.mjs +7 -0
- package/esm/connectors/storage.connector.mjs.map +1 -1
- package/esm/connectors/types.d.mts +3 -2
- package/esm/connectors/types.d.mts.map +1 -1
- package/esm/connectors/types.mjs +1 -0
- package/esm/connectors/types.mjs.map +1 -1
- package/esm/dev-server/development-server.mjs +2 -14
- package/esm/dev-server/development-server.mjs.map +1 -1
- package/esm/dev-server/file-event-handler.mjs +15 -3
- package/esm/dev-server/file-event-handler.mjs.map +1 -1
- package/esm/generations/add-command.action.mjs +61 -12
- package/esm/generations/add-command.action.mjs.map +1 -1
- package/esm/generations/stubs.mjs +31 -1
- package/esm/generations/stubs.mjs.map +1 -1
- package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
- package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
- package/esm/http/middleware/cache-response-middleware.mjs +15 -6
- package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
- package/esm/http/middleware/concurrency-limit.middleware.mjs +2 -0
- package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
- package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
- package/esm/http/middleware/idempotency.middleware.mjs +4 -1
- package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
- package/esm/http/middleware/maintenance.middleware.mjs +2 -1
- package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
- package/esm/http/request.d.mts +9 -2
- package/esm/http/request.d.mts.map +1 -1
- package/esm/http/request.mjs +15 -3
- package/esm/http/request.mjs.map +1 -1
- package/esm/http/response.d.mts +12 -0
- package/esm/http/response.d.mts.map +1 -1
- package/esm/http/response.mjs +19 -2
- package/esm/http/response.mjs.map +1 -1
- package/esm/http/server.d.mts.map +1 -1
- package/esm/http/server.mjs +1 -1
- package/esm/http/server.mjs.map +1 -1
- package/esm/index.d.mts +6 -2
- package/esm/index.mjs +5 -1
- package/esm/node_modules/langfuse/lib/index.mjs +1827 -0
- package/esm/node_modules/langfuse/lib/index.mjs.map +1 -0
- package/esm/node_modules/langfuse-core/lib/index.mjs +1770 -0
- package/esm/node_modules/langfuse-core/lib/index.mjs.map +1 -0
- package/esm/node_modules/mustache/mustache.mjs +587 -0
- package/esm/node_modules/mustache/mustache.mjs.map +1 -0
- package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs +180 -0
- package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs.map +1 -0
- package/esm/node_modules/openai/auth/workload-identity-auth.mjs +80 -0
- package/esm/node_modules/openai/auth/workload-identity-auth.mjs.map +1 -0
- package/esm/node_modules/openai/azure.mjs +82 -0
- package/esm/node_modules/openai/azure.mjs.map +1 -0
- package/esm/node_modules/openai/client.mjs +638 -0
- package/esm/node_modules/openai/client.mjs.map +1 -0
- package/esm/node_modules/openai/core/api-promise.mjs +75 -0
- package/esm/node_modules/openai/core/api-promise.mjs.map +1 -0
- package/esm/node_modules/openai/core/error.mjs +110 -0
- package/esm/node_modules/openai/core/error.mjs.map +1 -0
- package/esm/node_modules/openai/core/pagination.mjs +160 -0
- package/esm/node_modules/openai/core/pagination.mjs.map +1 -0
- package/esm/node_modules/openai/core/resource.mjs +10 -0
- package/esm/node_modules/openai/core/resource.mjs.map +1 -0
- package/esm/node_modules/openai/core/streaming.mjs +238 -0
- package/esm/node_modules/openai/core/streaming.mjs.map +1 -0
- package/esm/node_modules/openai/index.mjs +8 -0
- package/esm/node_modules/openai/internal/decoders/line.mjs +91 -0
- package/esm/node_modules/openai/internal/decoders/line.mjs.map +1 -0
- package/esm/node_modules/openai/internal/detect-platform.mjs +123 -0
- package/esm/node_modules/openai/internal/detect-platform.mjs.map +1 -0
- package/esm/node_modules/openai/internal/errors.mjs +26 -0
- package/esm/node_modules/openai/internal/errors.mjs.map +1 -0
- package/esm/node_modules/openai/internal/headers.mjs +65 -0
- package/esm/node_modules/openai/internal/headers.mjs.map +1 -0
- package/esm/node_modules/openai/internal/parse.mjs +41 -0
- package/esm/node_modules/openai/internal/parse.mjs.map +1 -0
- package/esm/node_modules/openai/internal/qs/formats.mjs +12 -0
- package/esm/node_modules/openai/internal/qs/formats.mjs.map +1 -0
- package/esm/node_modules/openai/internal/qs/stringify.mjs +179 -0
- package/esm/node_modules/openai/internal/qs/stringify.mjs.map +1 -0
- package/esm/node_modules/openai/internal/qs/utils.mjs +65 -0
- package/esm/node_modules/openai/internal/qs/utils.mjs.map +1 -0
- package/esm/node_modules/openai/internal/request-options.mjs +11 -0
- package/esm/node_modules/openai/internal/request-options.mjs.map +1 -0
- package/esm/node_modules/openai/internal/shims.mjs +77 -0
- package/esm/node_modules/openai/internal/shims.mjs.map +1 -0
- package/esm/node_modules/openai/internal/to-file.mjs +63 -0
- package/esm/node_modules/openai/internal/to-file.mjs.map +1 -0
- package/esm/node_modules/openai/internal/tslib.mjs +16 -0
- package/esm/node_modules/openai/internal/tslib.mjs.map +1 -0
- package/esm/node_modules/openai/internal/uploads.mjs +94 -0
- package/esm/node_modules/openai/internal/uploads.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/base64.mjs +22 -0
- package/esm/node_modules/openai/internal/utils/base64.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/bytes.mjs +26 -0
- package/esm/node_modules/openai/internal/utils/bytes.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/env.mjs +16 -0
- package/esm/node_modules/openai/internal/utils/env.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/log.mjs +58 -0
- package/esm/node_modules/openai/internal/utils/log.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/path.mjs +62 -0
- package/esm/node_modules/openai/internal/utils/path.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/query.mjs +10 -0
- package/esm/node_modules/openai/internal/utils/query.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/sleep.mjs +6 -0
- package/esm/node_modules/openai/internal/utils/sleep.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/uuid.mjs +18 -0
- package/esm/node_modules/openai/internal/utils/uuid.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/values.mjs +41 -0
- package/esm/node_modules/openai/internal/utils/values.mjs.map +1 -0
- package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs +247 -0
- package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs.map +1 -0
- package/esm/node_modules/openai/lib/AssistantStream.mjs +472 -0
- package/esm/node_modules/openai/lib/AssistantStream.mjs.map +1 -0
- package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs +26 -0
- package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs.map +1 -0
- package/esm/node_modules/openai/lib/ChatCompletionStream.mjs +423 -0
- package/esm/node_modules/openai/lib/ChatCompletionStream.mjs.map +1 -0
- package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs +26 -0
- package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs.map +1 -0
- package/esm/node_modules/openai/lib/EventStream.mjs +163 -0
- package/esm/node_modules/openai/lib/EventStream.mjs.map +1 -0
- package/esm/node_modules/openai/lib/ResponsesParser.mjs +94 -0
- package/esm/node_modules/openai/lib/ResponsesParser.mjs.map +1 -0
- package/esm/node_modules/openai/lib/RunnableFunction.mjs +8 -0
- package/esm/node_modules/openai/lib/RunnableFunction.mjs.map +1 -0
- package/esm/node_modules/openai/lib/Util.mjs +19 -0
- package/esm/node_modules/openai/lib/Util.mjs.map +1 -0
- package/esm/node_modules/openai/lib/chatCompletionUtils.mjs +11 -0
- package/esm/node_modules/openai/lib/chatCompletionUtils.mjs.map +1 -0
- package/esm/node_modules/openai/lib/parser.mjs +88 -0
- package/esm/node_modules/openai/lib/parser.mjs.map +1 -0
- package/esm/node_modules/openai/lib/responses/ResponseStream.mjs +231 -0
- package/esm/node_modules/openai/lib/responses/ResponseStream.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/admin.mjs +15 -0
- package/esm/node_modules/openai/resources/admin/admin.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs +81 -0
- package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs +31 -0
- package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/certificates.mjs +153 -0
- package/esm/node_modules/openai/resources/admin/organization/certificates.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs +42 -0
- package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs +106 -0
- package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs +88 -0
- package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs +88 -0
- package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/invites.mjs +83 -0
- package/esm/node_modules/openai/resources/admin/organization/invites.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/organization.mjs +45 -0
- package/esm/node_modules/openai/resources/admin/organization/organization.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs +72 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs +78 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs +46 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs +95 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs +91 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs +45 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs +63 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs +137 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs +51 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs +108 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs +112 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs +106 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs +91 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs +118 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/roles.mjs +96 -0
- package/esm/node_modules/openai/resources/admin/organization/roles.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs +97 -0
- package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/usage.mjs +207 -0
- package/esm/node_modules/openai/resources/admin/organization/usage.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs +88 -0
- package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/users/users.mjs +82 -0
- package/esm/node_modules/openai/resources/admin/organization/users/users.mjs.map +1 -0
- package/esm/node_modules/openai/resources/audio/audio.mjs +21 -0
- package/esm/node_modules/openai/resources/audio/audio.mjs.map +1 -0
- package/esm/node_modules/openai/resources/audio/speech.mjs +39 -0
- package/esm/node_modules/openai/resources/audio/speech.mjs.map +1 -0
- package/esm/node_modules/openai/resources/audio/transcriptions.mjs +22 -0
- package/esm/node_modules/openai/resources/audio/transcriptions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/audio/translations.mjs +21 -0
- package/esm/node_modules/openai/resources/audio/translations.mjs.map +1 -0
- package/esm/node_modules/openai/resources/batches.mjs +54 -0
- package/esm/node_modules/openai/resources/batches.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/assistants.mjs +78 -0
- package/esm/node_modules/openai/resources/beta/assistants.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/beta.mjs +24 -0
- package/esm/node_modules/openai/resources/beta/beta.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs +18 -0
- package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs +49 -0
- package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs +85 -0
- package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs +21 -0
- package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs +33 -0
- package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs +33 -0
- package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/threads/messages.mjs +83 -0
- package/esm/node_modules/openai/resources/beta/threads/messages.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs +183 -0
- package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs +45 -0
- package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/threads/threads.mjs +101 -0
- package/esm/node_modules/openai/resources/beta/threads/threads.mjs.map +1 -0
- package/esm/node_modules/openai/resources/chat/chat.mjs +15 -0
- package/esm/node_modules/openai/resources/chat/chat.mjs.map +1 -0
- package/esm/node_modules/openai/resources/chat/completions/completions.mjs +123 -0
- package/esm/node_modules/openai/resources/chat/completions/completions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/chat/completions/index.mjs +7 -0
- package/esm/node_modules/openai/resources/chat/completions/messages.mjs +35 -0
- package/esm/node_modules/openai/resources/chat/completions/messages.mjs.map +1 -0
- package/esm/node_modules/openai/resources/chat/index.mjs +5 -0
- package/esm/node_modules/openai/resources/completions.mjs +20 -0
- package/esm/node_modules/openai/resources/completions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/containers/containers.mjs +57 -0
- package/esm/node_modules/openai/resources/containers/containers.mjs.map +1 -0
- package/esm/node_modules/openai/resources/containers/files/content.mjs +23 -0
- package/esm/node_modules/openai/resources/containers/files/content.mjs.map +1 -0
- package/esm/node_modules/openai/resources/containers/files/files.mjs +63 -0
- package/esm/node_modules/openai/resources/containers/files/files.mjs.map +1 -0
- package/esm/node_modules/openai/resources/conversations/conversations.mjs +57 -0
- package/esm/node_modules/openai/resources/conversations/conversations.mjs.map +1 -0
- package/esm/node_modules/openai/resources/conversations/items.mjs +57 -0
- package/esm/node_modules/openai/resources/conversations/items.mjs.map +1 -0
- package/esm/node_modules/openai/resources/embeddings.mjs +48 -0
- package/esm/node_modules/openai/resources/embeddings.mjs.map +1 -0
- package/esm/node_modules/openai/resources/evals/evals.mjs +73 -0
- package/esm/node_modules/openai/resources/evals/evals.mjs.map +1 -0
- package/esm/node_modules/openai/resources/evals/runs/output-items.mjs +35 -0
- package/esm/node_modules/openai/resources/evals/runs/output-items.mjs.map +1 -0
- package/esm/node_modules/openai/resources/evals/runs/runs.mjs +72 -0
- package/esm/node_modules/openai/resources/evals/runs/runs.mjs.map +1 -0
- package/esm/node_modules/openai/resources/files.mjs +111 -0
- package/esm/node_modules/openai/resources/files.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs +15 -0
- package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs +60 -0
- package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs +15 -0
- package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs +102 -0
- package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs +24 -0
- package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs +34 -0
- package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs +148 -0
- package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/methods.mjs +8 -0
- package/esm/node_modules/openai/resources/fine-tuning/methods.mjs.map +1 -0
- package/esm/node_modules/openai/resources/graders/grader-models.mjs +8 -0
- package/esm/node_modules/openai/resources/graders/grader-models.mjs.map +1 -0
- package/esm/node_modules/openai/resources/graders/graders.mjs +15 -0
- package/esm/node_modules/openai/resources/graders/graders.mjs.map +1 -0
- package/esm/node_modules/openai/resources/images.mjs +46 -0
- package/esm/node_modules/openai/resources/images.mjs.map +1 -0
- package/esm/node_modules/openai/resources/index.mjs +27 -0
- package/esm/node_modules/openai/resources/models.mjs +44 -0
- package/esm/node_modules/openai/resources/models.mjs.map +1 -0
- package/esm/node_modules/openai/resources/moderations.mjs +23 -0
- package/esm/node_modules/openai/resources/moderations.mjs.map +1 -0
- package/esm/node_modules/openai/resources/realtime/calls.mjs +79 -0
- package/esm/node_modules/openai/resources/realtime/calls.mjs.map +1 -0
- package/esm/node_modules/openai/resources/realtime/client-secrets.mjs +39 -0
- package/esm/node_modules/openai/resources/realtime/client-secrets.mjs.map +1 -0
- package/esm/node_modules/openai/resources/realtime/realtime.mjs +18 -0
- package/esm/node_modules/openai/resources/realtime/realtime.mjs.map +1 -0
- package/esm/node_modules/openai/resources/responses/input-items.mjs +31 -0
- package/esm/node_modules/openai/resources/responses/input-items.mjs.map +1 -0
- package/esm/node_modules/openai/resources/responses/input-tokens.mjs +27 -0
- package/esm/node_modules/openai/resources/responses/input-tokens.mjs.map +1 -0
- package/esm/node_modules/openai/resources/responses/responses.mjs +110 -0
- package/esm/node_modules/openai/resources/responses/responses.mjs.map +1 -0
- package/esm/node_modules/openai/resources/skills/content.mjs +22 -0
- package/esm/node_modules/openai/resources/skills/content.mjs.map +1 -0
- package/esm/node_modules/openai/resources/skills/skills.mjs +69 -0
- package/esm/node_modules/openai/resources/skills/skills.mjs.map +1 -0
- package/esm/node_modules/openai/resources/skills/versions/content.mjs +23 -0
- package/esm/node_modules/openai/resources/skills/versions/content.mjs.map +1 -0
- package/esm/node_modules/openai/resources/skills/versions/versions.mjs +58 -0
- package/esm/node_modules/openai/resources/skills/versions/versions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/uploads/parts.mjs +34 -0
- package/esm/node_modules/openai/resources/uploads/parts.mjs.map +1 -0
- package/esm/node_modules/openai/resources/uploads/uploads.mjs +84 -0
- package/esm/node_modules/openai/resources/uploads/uploads.mjs.map +1 -0
- package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs +126 -0
- package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs.map +1 -0
- package/esm/node_modules/openai/resources/vector-stores/files.mjs +147 -0
- package/esm/node_modules/openai/resources/vector-stores/files.mjs.map +1 -0
- package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs +87 -0
- package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs.map +1 -0
- package/esm/node_modules/openai/resources/videos.mjs +115 -0
- package/esm/node_modules/openai/resources/videos.mjs.map +1 -0
- package/esm/node_modules/openai/resources/webhooks/index.mjs +3 -0
- package/esm/node_modules/openai/resources/webhooks/webhooks.mjs +69 -0
- package/esm/node_modules/openai/resources/webhooks/webhooks.mjs.map +1 -0
- package/esm/node_modules/openai/resources/webhooks.mjs +4 -0
- package/esm/node_modules/openai/streaming.mjs +3 -0
- package/esm/node_modules/openai/version.mjs +6 -0
- package/esm/node_modules/openai/version.mjs.map +1 -0
- package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +9 -0
- package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +32 -5
- package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
- package/esm/repositories/adapters/cascade/filter-applicator.mjs +17 -3
- package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
- package/esm/repositories/repository.manager.d.mts +11 -1
- package/esm/repositories/repository.manager.d.mts.map +1 -1
- package/esm/repositories/repository.manager.mjs +79 -25
- package/esm/repositories/repository.manager.mjs.map +1 -1
- package/esm/router/route-registry.mjs +19 -10
- package/esm/router/route-registry.mjs.map +1 -1
- package/esm/router/router.d.mts.map +1 -1
- package/esm/router/router.mjs +7 -4
- package/esm/router/router.mjs.map +1 -1
- package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
- package/esm/storage/drivers/cloud-driver.mjs +48 -12
- package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
- package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
- package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
- package/esm/storage/drivers/local-driver.d.mts +8 -0
- package/esm/storage/drivers/local-driver.d.mts.map +1 -1
- package/esm/storage/drivers/local-driver.mjs +19 -4
- package/esm/storage/drivers/local-driver.mjs.map +1 -1
- package/esm/storage/drivers/r2-driver.mjs +1 -1
- package/esm/storage/drivers/r2-driver.mjs.map +1 -1
- package/esm/storage/drivers/s3-driver.mjs +1 -1
- package/esm/storage/drivers/s3-driver.mjs.map +1 -1
- package/esm/storage/index.d.mts +4 -1
- package/esm/storage/index.mjs +3 -0
- package/esm/storage/scoped-storage.d.mts +8 -4
- package/esm/storage/scoped-storage.d.mts.map +1 -1
- package/esm/storage/scoped-storage.mjs +21 -6
- package/esm/storage/scoped-storage.mjs.map +1 -1
- package/esm/storage/storage.d.mts +12 -4
- package/esm/storage/storage.d.mts.map +1 -1
- package/esm/storage/storage.mjs +23 -9
- package/esm/storage/storage.mjs.map +1 -1
- package/esm/storage/types.d.mts +33 -5
- package/esm/storage/types.d.mts.map +1 -1
- package/esm/storage/utils/contain-path.d.mts +23 -0
- package/esm/storage/utils/contain-path.d.mts.map +1 -0
- package/esm/storage/utils/contain-path.mjs +35 -0
- package/esm/storage/utils/contain-path.mjs.map +1 -0
- package/esm/storage/utils/safe-fetch.d.mts +68 -0
- package/esm/storage/utils/safe-fetch.d.mts.map +1 -0
- package/esm/storage/utils/safe-fetch.mjs +205 -0
- package/esm/storage/utils/safe-fetch.mjs.map +1 -0
- package/esm/storage/utils/storage-error.d.mts +35 -0
- package/esm/storage/utils/storage-error.d.mts.map +1 -0
- package/esm/storage/utils/storage-error.mjs +17 -0
- package/esm/storage/utils/storage-error.mjs.map +1 -0
- package/esm/use-cases/use-case-pipeline.mjs +4 -1
- package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
- package/esm/use-cases/use-case.mjs +12 -4
- package/esm/use-cases/use-case.mjs.map +1 -1
- package/esm/use-cases/use-cases-registry.d.mts +12 -4
- package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
- package/esm/use-cases/use-cases-registry.mjs +13 -3
- package/esm/use-cases/use-cases-registry.mjs.map +1 -1
- package/esm/utils/npm-registry.d.mts +1 -1
- package/esm/utils/npm-registry.mjs +2 -2
- package/esm/utils/npm-registry.mjs.map +1 -1
- package/llms-full.txt +29 -1
- package/package.json +9 -9
- package/skills/add-connector/SKILL.md +6 -1
- package/skills/configure-app/SKILL.md +23 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { buildCatalog, loadRecord, renderCatalogPrompt, semanticPreselect } from "./catalog.mjs";
|
|
2
|
+
import { loadSkillTool } from "./load-skill-tool.mjs";
|
|
3
|
+
import { saveSkillTool } from "./save-skill-tool.mjs";
|
|
4
|
+
import { resolveSource } from "./sources/index.mjs";
|
|
5
|
+
|
|
6
|
+
//#region ../@warlock.js/ai/src/skills/skills.ts
|
|
7
|
+
const DEFAULT_MAX_LOADS_PER_RUN = 5;
|
|
8
|
+
/**
|
|
9
|
+
* Create a runtime skills library — the **mechanism** behind the
|
|
10
|
+
* first-class `skills` agent option.
|
|
11
|
+
*
|
|
12
|
+
* The returned {@link SkillsContract} produces the agent-facing wiring:
|
|
13
|
+
* - `catalog` / `catalogPrompt` — the always-injected cheap metadata block
|
|
14
|
+
* (one line per in-scope, non-candidate skill).
|
|
15
|
+
* - `preload` — the bodies to inject up front per `inject` (`[]` when
|
|
16
|
+
* `inject` is omitted — the default catalog-only progressive disclosure).
|
|
17
|
+
* - `tools(runId)` — the `loadSkill` tool always; plus `saveSkill` ONLY
|
|
18
|
+
* when a `review` gate is configured (otherwise self-authoring is inert).
|
|
19
|
+
*
|
|
20
|
+
* Sources are merged in order; a later source wins on a name collision.
|
|
21
|
+
* `maxLoadsPerRun` (default 5) caps `loadSkill` calls per run; exhaustion
|
|
22
|
+
* is an error RESULT the model self-corrects from, never a throw.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* const lib = skills({
|
|
26
|
+
* name: "build-skills",
|
|
27
|
+
* sources: [{ type: "directory", path: "./agent-skills" }],
|
|
28
|
+
* inject: { select: "semantic", topK: 2, embedder },
|
|
29
|
+
* maxLoadsPerRun: 4,
|
|
30
|
+
* scope: { tags: ["frontend"] },
|
|
31
|
+
* });
|
|
32
|
+
*/
|
|
33
|
+
function skills(config) {
|
|
34
|
+
if (!config.sources || config.sources.length === 0) throw new Error(`skills("${config.name}"): at least one source is required (directory / url / store)`);
|
|
35
|
+
const stores = config.sources.map(resolveSource);
|
|
36
|
+
const scope = config.scope;
|
|
37
|
+
const maxLoadsPerRun = config.maxLoadsPerRun ?? DEFAULT_MAX_LOADS_PER_RUN;
|
|
38
|
+
const reviewExposed = config.review !== void 0;
|
|
39
|
+
/** Fire an analytics event, swallowing any sink error (mirrors agent hooks). */
|
|
40
|
+
const emit = (event) => {
|
|
41
|
+
if (!config.analytics) return;
|
|
42
|
+
try {
|
|
43
|
+
Promise.resolve(config.analytics(event)).catch(() => void 0);
|
|
44
|
+
} catch {}
|
|
45
|
+
};
|
|
46
|
+
const catalog = async () => {
|
|
47
|
+
const entries = await buildCatalog(stores, scope);
|
|
48
|
+
for (const entry of entries) emit({
|
|
49
|
+
type: "catalogued",
|
|
50
|
+
skill: entry.name,
|
|
51
|
+
version: entry.version
|
|
52
|
+
});
|
|
53
|
+
return entries;
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
name: config.name,
|
|
57
|
+
catalog,
|
|
58
|
+
async catalogPrompt() {
|
|
59
|
+
const entries = await catalog();
|
|
60
|
+
return renderCatalogPrompt(config.name, entries);
|
|
61
|
+
},
|
|
62
|
+
async preload(input) {
|
|
63
|
+
if (!config.inject) return [];
|
|
64
|
+
if (config.inject === "all") {
|
|
65
|
+
const entries = await buildCatalog(stores, scope);
|
|
66
|
+
const records = [];
|
|
67
|
+
for (const entry of entries) {
|
|
68
|
+
const record = await loadRecord(stores, entry.name, entry.version);
|
|
69
|
+
if (record) records.push(record);
|
|
70
|
+
}
|
|
71
|
+
return records;
|
|
72
|
+
}
|
|
73
|
+
return semanticPreselect(stores, input, config.inject.topK, {
|
|
74
|
+
embedder: config.inject.embedder,
|
|
75
|
+
threshold: config.inject.threshold,
|
|
76
|
+
scope
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
tools(runId) {
|
|
80
|
+
const entries = [loadSkillTool({
|
|
81
|
+
load: (name, version) => loadRecord(stores, name, version),
|
|
82
|
+
maxLoadsPerRun,
|
|
83
|
+
onLoaded: (record) => emit({
|
|
84
|
+
type: "loaded",
|
|
85
|
+
skill: record.name,
|
|
86
|
+
version: record.version,
|
|
87
|
+
runId
|
|
88
|
+
})
|
|
89
|
+
})];
|
|
90
|
+
if (reviewExposed && config.review) {
|
|
91
|
+
const reviewStore = config.review.store;
|
|
92
|
+
entries.push(saveSkillTool({
|
|
93
|
+
saveCandidate: (record) => reviewStore.saveCandidate(record),
|
|
94
|
+
onSaved: (record) => emit({
|
|
95
|
+
type: "saved",
|
|
96
|
+
skill: record.name,
|
|
97
|
+
version: record.version,
|
|
98
|
+
runId
|
|
99
|
+
})
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
return entries;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
//#endregion
|
|
108
|
+
export { skills };
|
|
109
|
+
//# sourceMappingURL=skills.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/skills/skills.ts"],"sourcesContent":["import type { AgentToolEntry } from \"../tool/executable-as-tool\";\nimport {\n buildCatalog,\n loadRecord,\n renderCatalogPrompt,\n semanticPreselect,\n} from \"./catalog\";\nimport type {\n SkillAnalyticsEvent,\n SkillsConfig,\n} from \"./contracts/skills-config.type\";\nimport type {\n SkillCatalogEntry,\n SkillRecord,\n} from \"./contracts/skill-record.type\";\nimport type { SkillsContract } from \"./contracts/skills.contract\";\nimport type { SkillsStoreContract } from \"./contracts/skills-store.contract\";\nimport { loadSkillTool } from \"./load-skill-tool\";\nimport { saveSkillTool } from \"./save-skill-tool\";\nimport { resolveSource } from \"./sources\";\n\nconst DEFAULT_MAX_LOADS_PER_RUN = 5;\n\n/**\n * Create a runtime skills library — the **mechanism** behind the\n * first-class `skills` agent option.\n *\n * The returned {@link SkillsContract} produces the agent-facing wiring:\n * - `catalog` / `catalogPrompt` — the always-injected cheap metadata block\n * (one line per in-scope, non-candidate skill).\n * - `preload` — the bodies to inject up front per `inject` (`[]` when\n * `inject` is omitted — the default catalog-only progressive disclosure).\n * - `tools(runId)` — the `loadSkill` tool always; plus `saveSkill` ONLY\n * when a `review` gate is configured (otherwise self-authoring is inert).\n *\n * Sources are merged in order; a later source wins on a name collision.\n * `maxLoadsPerRun` (default 5) caps `loadSkill` calls per run; exhaustion\n * is an error RESULT the model self-corrects from, never a throw.\n *\n * @example\n * const lib = skills({\n * name: \"build-skills\",\n * sources: [{ type: \"directory\", path: \"./agent-skills\" }],\n * inject: { select: \"semantic\", topK: 2, embedder },\n * maxLoadsPerRun: 4,\n * scope: { tags: [\"frontend\"] },\n * });\n */\nexport function skills(config: SkillsConfig): SkillsContract {\n if (!config.sources || config.sources.length === 0) {\n throw new Error(\n `skills(\"${config.name}\"): at least one source is required (directory / url / store)`,\n );\n }\n\n const stores: SkillsStoreContract[] = config.sources.map(resolveSource);\n const scope = config.scope;\n const maxLoadsPerRun = config.maxLoadsPerRun ?? DEFAULT_MAX_LOADS_PER_RUN;\n const reviewExposed = config.review !== undefined;\n\n /** Fire an analytics event, swallowing any sink error (mirrors agent hooks). */\n const emit = (event: SkillAnalyticsEvent): void => {\n if (!config.analytics) {\n return;\n }\n\n try {\n void Promise.resolve(config.analytics(event)).catch(() => undefined);\n } catch {\n // Sink threw synchronously — swallowed; analytics never crash a run.\n }\n };\n\n const catalog = async (): Promise<SkillCatalogEntry[]> => {\n const entries = await buildCatalog(stores, scope);\n\n for (const entry of entries) {\n emit({ type: \"catalogued\", skill: entry.name, version: entry.version });\n }\n\n return entries;\n };\n\n return {\n name: config.name,\n\n catalog,\n\n async catalogPrompt(): Promise<string> {\n const entries = await catalog();\n\n return renderCatalogPrompt(config.name, entries);\n },\n\n async preload(input: string): Promise<SkillRecord[]> {\n if (!config.inject) {\n return [];\n }\n\n if (config.inject === \"all\") {\n const entries = await buildCatalog(stores, scope);\n const records: SkillRecord[] = [];\n\n for (const entry of entries) {\n const record = await loadRecord(stores, entry.name, entry.version);\n\n if (record) {\n records.push(record);\n }\n }\n\n return records;\n }\n\n // `{ select: \"semantic\", topK }`\n return semanticPreselect(stores, input, config.inject.topK, {\n embedder: config.inject.embedder,\n threshold: config.inject.threshold,\n scope,\n });\n },\n\n tools(runId?: string): AgentToolEntry<any, any>[] {\n const entries: AgentToolEntry<any, any>[] = [\n loadSkillTool({\n load: (name, version) => loadRecord(stores, name, version),\n maxLoadsPerRun,\n onLoaded: (record) =>\n emit({ type: \"loaded\", skill: record.name, version: record.version, runId }),\n }),\n ];\n\n // Phase 2 — `saveSkill` is exposed ONLY when a review gate is wired.\n // Absent gate ⇒ self-authoring is inert: the tool is never registered\n // and a candidate can never be written, let alone injected.\n if (reviewExposed && config.review) {\n const reviewStore = config.review.store;\n\n entries.push(\n saveSkillTool({\n saveCandidate: (record) => reviewStore.saveCandidate(record),\n onSaved: (record) =>\n emit({ type: \"saved\", skill: record.name, version: record.version, runId }),\n }),\n );\n }\n\n return entries;\n },\n };\n}\n"],"mappings":";;;;;;AAqBA,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BlC,SAAgB,OAAO,QAAsC;CAC3D,IAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,WAAW,GAC/C,MAAM,IAAI,MACR,WAAW,OAAO,KAAK,8DACzB;CAGF,MAAM,SAAgC,OAAO,QAAQ,IAAI,aAAa;CACtE,MAAM,QAAQ,OAAO;CACrB,MAAM,iBAAiB,OAAO,kBAAkB;CAChD,MAAM,gBAAgB,OAAO,WAAW;;CAGxC,MAAM,QAAQ,UAAqC;EACjD,IAAI,CAAC,OAAO,WACV;EAGF,IAAI;GACF,AAAK,QAAQ,QAAQ,OAAO,UAAU,KAAK,CAAC,CAAC,CAAC,YAAY,MAAS;EACrE,QAAQ,CAER;CACF;CAEA,MAAM,UAAU,YAA0C;EACxD,MAAM,UAAU,MAAM,aAAa,QAAQ,KAAK;EAEhD,KAAK,MAAM,SAAS,SAClB,KAAK;GAAE,MAAM;GAAc,OAAO,MAAM;GAAM,SAAS,MAAM;EAAQ,CAAC;EAGxE,OAAO;CACT;CAEA,OAAO;EACL,MAAM,OAAO;EAEb;EAEA,MAAM,gBAAiC;GACrC,MAAM,UAAU,MAAM,QAAQ;GAE9B,OAAO,oBAAoB,OAAO,MAAM,OAAO;EACjD;EAEA,MAAM,QAAQ,OAAuC;GACnD,IAAI,CAAC,OAAO,QACV,OAAO,CAAC;GAGV,IAAI,OAAO,WAAW,OAAO;IAC3B,MAAM,UAAU,MAAM,aAAa,QAAQ,KAAK;IAChD,MAAM,UAAyB,CAAC;IAEhC,KAAK,MAAM,SAAS,SAAS;KAC3B,MAAM,SAAS,MAAM,WAAW,QAAQ,MAAM,MAAM,MAAM,OAAO;KAEjE,IAAI,QACF,QAAQ,KAAK,MAAM;IAEvB;IAEA,OAAO;GACT;GAGA,OAAO,kBAAkB,QAAQ,OAAO,OAAO,OAAO,MAAM;IAC1D,UAAU,OAAO,OAAO;IACxB,WAAW,OAAO,OAAO;IACzB;GACF,CAAC;EACH;EAEA,MAAM,OAA4C;GAChD,MAAM,UAAsC,CAC1C,cAAc;IACZ,OAAO,MAAM,YAAY,WAAW,QAAQ,MAAM,OAAO;IACzD;IACA,WAAW,WACT,KAAK;KAAE,MAAM;KAAU,OAAO,OAAO;KAAM,SAAS,OAAO;KAAS;IAAM,CAAC;GAC/E,CAAC,CACH;GAKA,IAAI,iBAAiB,OAAO,QAAQ;IAClC,MAAM,cAAc,OAAO,OAAO;IAElC,QAAQ,KACN,cAAc;KACZ,gBAAgB,WAAW,YAAY,cAAc,MAAM;KAC3D,UAAU,WACR,KAAK;MAAE,MAAM;MAAS,OAAO,OAAO;MAAM,SAAS,OAAO;MAAS;KAAM,CAAC;IAC9E,CAAC,CACH;GACF;GAEA,OAAO;EACT;CACF;AACF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { parseFrontmatter, parseTags } from "./parse-frontmatter.mjs";
|
|
2
|
+
|
|
3
|
+
//#region ../@warlock.js/ai/src/skills/sources/directory-source.ts
|
|
4
|
+
/**
|
|
5
|
+
* Lazily-loaded `node:fs/promises`. Core takes no new filesystem
|
|
6
|
+
* dependency — a `store`-only or `url`-only consumer never touches the
|
|
7
|
+
* filesystem because the module is imported on first read, not at module
|
|
8
|
+
* load. Settled once and cached.
|
|
9
|
+
*/
|
|
10
|
+
let fsMod;
|
|
11
|
+
let pathMod;
|
|
12
|
+
async function loadFs() {
|
|
13
|
+
if (!fsMod) fsMod = await import("node:fs/promises");
|
|
14
|
+
if (!pathMod) pathMod = await import("node:path");
|
|
15
|
+
return {
|
|
16
|
+
fs: fsMod,
|
|
17
|
+
path: pathMod
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Read `path/<folder>/SKILL.md` into {@link SkillRecord}s, parsing the
|
|
22
|
+
* same `key: value` front-matter as `scripts/generate-llms.mjs`. Each
|
|
23
|
+
* direct sub-directory holding a `SKILL.md` becomes one skill named after
|
|
24
|
+
* the folder; the `description` comes from front-matter, `tags` from a
|
|
25
|
+
* comma-separated `tags:` line, and the body is everything after the
|
|
26
|
+
* closing `---`. Files at the root (e.g. `README.md`) are ignored.
|
|
27
|
+
*
|
|
28
|
+
* Reads are a snapshot at first call and cached for the source's lifetime
|
|
29
|
+
* (a single agent run reads the catalog and bodies from one consistent
|
|
30
|
+
* view). A missing directory yields an empty library, not a throw.
|
|
31
|
+
*/
|
|
32
|
+
function directorySource(dirPath) {
|
|
33
|
+
let cache;
|
|
34
|
+
const records = () => {
|
|
35
|
+
if (!cache) cache = readDirectory(dirPath);
|
|
36
|
+
return cache;
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
async list(scope) {
|
|
40
|
+
const all = await records();
|
|
41
|
+
const wanted = scope?.tags;
|
|
42
|
+
return [...all.values()].filter((record) => intersects(record.tags, wanted)).map(toCatalogEntry);
|
|
43
|
+
},
|
|
44
|
+
async load(name, version) {
|
|
45
|
+
const record = (await records()).get(name);
|
|
46
|
+
if (!record) return;
|
|
47
|
+
if (version !== void 0 && record.version !== version) return;
|
|
48
|
+
return record;
|
|
49
|
+
},
|
|
50
|
+
async saveCandidate() {
|
|
51
|
+
throw new Error("directory source is read-only — saveCandidate requires a writable store (set `review.store`)");
|
|
52
|
+
},
|
|
53
|
+
async promote() {
|
|
54
|
+
throw new Error("directory source is read-only — promote requires a writable store (set `review.store`)");
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Walk the directory once, parsing every `<folder>/SKILL.md` into a record. */
|
|
59
|
+
async function readDirectory(dirPath) {
|
|
60
|
+
const { fs, path } = await loadFs();
|
|
61
|
+
const records = /* @__PURE__ */ new Map();
|
|
62
|
+
let entries;
|
|
63
|
+
try {
|
|
64
|
+
entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
65
|
+
} catch {
|
|
66
|
+
return records;
|
|
67
|
+
}
|
|
68
|
+
for (const entry of entries) {
|
|
69
|
+
if (!entry.isDirectory()) continue;
|
|
70
|
+
const skillFile = path.join(dirPath, entry.name, "SKILL.md");
|
|
71
|
+
let text;
|
|
72
|
+
try {
|
|
73
|
+
text = await fs.readFile(skillFile, "utf8");
|
|
74
|
+
} catch {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const { meta, body } = parseFrontmatter(text);
|
|
78
|
+
records.set(entry.name, {
|
|
79
|
+
name: entry.name,
|
|
80
|
+
description: meta.description ?? "(no description)",
|
|
81
|
+
version: 1,
|
|
82
|
+
body: body.trim(),
|
|
83
|
+
tags: parseTags(meta.tags),
|
|
84
|
+
type: "authored"
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return records;
|
|
88
|
+
}
|
|
89
|
+
/** Project a full record down to its catalog entry (body omitted). */
|
|
90
|
+
function toCatalogEntry(record) {
|
|
91
|
+
return {
|
|
92
|
+
name: record.name,
|
|
93
|
+
description: record.description,
|
|
94
|
+
version: record.version,
|
|
95
|
+
tags: record.tags,
|
|
96
|
+
type: record.type
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** True when no filter is requested or the record shares a requested tag. */
|
|
100
|
+
function intersects(recordTags, wanted) {
|
|
101
|
+
if (!wanted || wanted.length === 0) return true;
|
|
102
|
+
if (!recordTags || recordTags.length === 0) return false;
|
|
103
|
+
return recordTags.some((tag) => wanted.includes(tag));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
//#endregion
|
|
107
|
+
export { directorySource };
|
|
108
|
+
//# sourceMappingURL=directory-source.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-source.mjs","names":[],"sources":["../../../../../../../../../../@warlock.js/ai/src/skills/sources/directory-source.ts"],"sourcesContent":["import type {\n SkillCatalogEntry,\n SkillRecord,\n} from \"../contracts/skill-record.type\";\nimport type { SkillsStoreContract } from \"../contracts/skills-store.contract\";\nimport { parseFrontmatter, parseTags } from \"./parse-frontmatter\";\n\n/**\n * Lazily-loaded `node:fs/promises`. Core takes no new filesystem\n * dependency — a `store`-only or `url`-only consumer never touches the\n * filesystem because the module is imported on first read, not at module\n * load. Settled once and cached.\n */\nlet fsMod: typeof import(\"node:fs/promises\") | undefined;\nlet pathMod: typeof import(\"node:path\") | undefined;\n\nasync function loadFs(): Promise<{\n fs: typeof import(\"node:fs/promises\");\n path: typeof import(\"node:path\");\n}> {\n if (!fsMod) {\n fsMod = await import(\"node:fs/promises\");\n }\n\n if (!pathMod) {\n pathMod = await import(\"node:path\");\n }\n\n return { fs: fsMod, path: pathMod };\n}\n\n/**\n * Read `path/<folder>/SKILL.md` into {@link SkillRecord}s, parsing the\n * same `key: value` front-matter as `scripts/generate-llms.mjs`. Each\n * direct sub-directory holding a `SKILL.md` becomes one skill named after\n * the folder; the `description` comes from front-matter, `tags` from a\n * comma-separated `tags:` line, and the body is everything after the\n * closing `---`. Files at the root (e.g. `README.md`) are ignored.\n *\n * Reads are a snapshot at first call and cached for the source's lifetime\n * (a single agent run reads the catalog and bodies from one consistent\n * view). A missing directory yields an empty library, not a throw.\n */\nexport function directorySource(dirPath: string): SkillsStoreContract {\n let cache: Promise<Map<string, SkillRecord>> | undefined;\n\n const records = (): Promise<Map<string, SkillRecord>> => {\n if (!cache) {\n cache = readDirectory(dirPath);\n }\n\n return cache;\n };\n\n return {\n async list(scope?: { tags?: string[] }): Promise<SkillCatalogEntry[]> {\n const all = await records();\n const wanted = scope?.tags;\n\n return [...all.values()]\n .filter((record) => intersects(record.tags, wanted))\n .map(toCatalogEntry);\n },\n async load(name: string, version?: number): Promise<SkillRecord | undefined> {\n const all = await records();\n const record = all.get(name);\n\n if (!record) {\n return undefined;\n }\n\n if (version !== undefined && record.version !== version) {\n return undefined;\n }\n\n return record;\n },\n async saveCandidate(): Promise<SkillRecord> {\n throw new Error(\n \"directory source is read-only — saveCandidate requires a writable store (set `review.store`)\",\n );\n },\n async promote(): Promise<SkillRecord> {\n throw new Error(\n \"directory source is read-only — promote requires a writable store (set `review.store`)\",\n );\n },\n };\n}\n\n/** Walk the directory once, parsing every `<folder>/SKILL.md` into a record. */\nasync function readDirectory(dirPath: string): Promise<Map<string, SkillRecord>> {\n const { fs, path } = await loadFs();\n const records = new Map<string, SkillRecord>();\n\n let entries: Array<{ name: string; isDirectory(): boolean }>;\n\n try {\n entries = await fs.readdir(dirPath, { withFileTypes: true });\n } catch {\n // Missing directory ⇒ empty library; the catalog simply omits it.\n return records;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const skillFile = path.join(dirPath, entry.name, \"SKILL.md\");\n\n let text: string;\n\n try {\n text = await fs.readFile(skillFile, \"utf8\");\n } catch {\n // A sub-directory without a SKILL.md is not a skill — skip it.\n continue;\n }\n\n const { meta, body } = parseFrontmatter(text);\n\n records.set(entry.name, {\n name: entry.name,\n description: meta.description ?? \"(no description)\",\n version: 1,\n body: body.trim(),\n tags: parseTags(meta.tags),\n type: \"authored\",\n });\n }\n\n return records;\n}\n\n/** Project a full record down to its catalog entry (body omitted). */\nfunction toCatalogEntry(record: SkillRecord): SkillCatalogEntry {\n return {\n name: record.name,\n description: record.description,\n version: record.version,\n tags: record.tags,\n type: record.type,\n };\n}\n\n/** True when no filter is requested or the record shares a requested tag. */\nfunction intersects(recordTags: string[] | undefined, wanted: string[] | undefined): boolean {\n if (!wanted || wanted.length === 0) {\n return true;\n }\n\n if (!recordTags || recordTags.length === 0) {\n return false;\n }\n\n return recordTags.some((tag) => wanted.includes(tag));\n}\n"],"mappings":";;;;;;;;;AAaA,IAAI;AACJ,IAAI;AAEJ,eAAe,SAGZ;CACD,IAAI,CAAC,OACH,QAAQ,MAAM,OAAO;CAGvB,IAAI,CAAC,SACH,UAAU,MAAM,OAAO;CAGzB,OAAO;EAAE,IAAI;EAAO,MAAM;CAAQ;AACpC;;;;;;;;;;;;;AAcA,SAAgB,gBAAgB,SAAsC;CACpE,IAAI;CAEJ,MAAM,gBAAmD;EACvD,IAAI,CAAC,OACH,QAAQ,cAAc,OAAO;EAG/B,OAAO;CACT;CAEA,OAAO;EACL,MAAM,KAAK,OAA2D;GACpE,MAAM,MAAM,MAAM,QAAQ;GAC1B,MAAM,SAAS,OAAO;GAEtB,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CACrB,QAAQ,WAAW,WAAW,OAAO,MAAM,MAAM,CAAC,CAAC,CACnD,IAAI,cAAc;EACvB;EACA,MAAM,KAAK,MAAc,SAAoD;GAE3E,MAAM,UAAS,MADG,QAAQ,EACR,CAAC,IAAI,IAAI;GAE3B,IAAI,CAAC,QACH;GAGF,IAAI,YAAY,UAAa,OAAO,YAAY,SAC9C;GAGF,OAAO;EACT;EACA,MAAM,gBAAsC;GAC1C,MAAM,IAAI,MACR,8FACF;EACF;EACA,MAAM,UAAgC;GACpC,MAAM,IAAI,MACR,wFACF;EACF;CACF;AACF;;AAGA,eAAe,cAAc,SAAoD;CAC/E,MAAM,EAAE,IAAI,SAAS,MAAM,OAAO;CAClC,MAAM,0BAAU,IAAI,IAAyB;CAE7C,IAAI;CAEJ,IAAI;EACF,UAAU,MAAM,GAAG,QAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;CAC7D,QAAQ;EAEN,OAAO;CACT;CAEA,KAAK,MAAM,SAAS,SAAS;EAC3B,IAAI,CAAC,MAAM,YAAY,GACrB;EAGF,MAAM,YAAY,KAAK,KAAK,SAAS,MAAM,MAAM,UAAU;EAE3D,IAAI;EAEJ,IAAI;GACF,OAAO,MAAM,GAAG,SAAS,WAAW,MAAM;EAC5C,QAAQ;GAEN;EACF;EAEA,MAAM,EAAE,MAAM,SAAS,iBAAiB,IAAI;EAE5C,QAAQ,IAAI,MAAM,MAAM;GACtB,MAAM,MAAM;GACZ,aAAa,KAAK,eAAe;GACjC,SAAS;GACT,MAAM,KAAK,KAAK;GAChB,MAAM,UAAU,KAAK,IAAI;GACzB,MAAM;EACR,CAAC;CACH;CAEA,OAAO;AACT;;AAGA,SAAS,eAAe,QAAwC;CAC9D,OAAO;EACL,MAAM,OAAO;EACb,aAAa,OAAO;EACpB,SAAS,OAAO;EAChB,MAAM,OAAO;EACb,MAAM,OAAO;CACf;AACF;;AAGA,SAAS,WAAW,YAAkC,QAAuC;CAC3F,IAAI,CAAC,UAAU,OAAO,WAAW,GAC/B,OAAO;CAGT,IAAI,CAAC,cAAc,WAAW,WAAW,GACvC,OAAO;CAGT,OAAO,WAAW,MAAM,QAAQ,OAAO,SAAS,GAAG,CAAC;AACtD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { parseFrontmatter, parseTags } from "./parse-frontmatter.mjs";
|
|
2
|
+
import { directorySource } from "./directory-source.mjs";
|
|
3
|
+
import { storeSource } from "./store-source.mjs";
|
|
4
|
+
import { urlSource } from "./url-source.mjs";
|
|
5
|
+
|
|
6
|
+
//#region ../@warlock.js/ai/src/skills/sources/index.ts
|
|
7
|
+
/**
|
|
8
|
+
* Resolve a declarative {@link SkillSource} into a concrete
|
|
9
|
+
* {@link SkillsStoreContract} reader. Discriminated by `type` (never
|
|
10
|
+
* `kind`): `directory` reads the filesystem, `url` fetches a manifest,
|
|
11
|
+
* `store` passes a store through verbatim.
|
|
12
|
+
*/
|
|
13
|
+
function resolveSource(source) {
|
|
14
|
+
switch (source.type) {
|
|
15
|
+
case "directory": return directorySource(source.path);
|
|
16
|
+
case "url": return urlSource(source.url, {
|
|
17
|
+
headers: source.headers,
|
|
18
|
+
policy: source.policy,
|
|
19
|
+
cacheTtlMs: source.cacheTtlMs
|
|
20
|
+
});
|
|
21
|
+
case "store": return storeSource(source.store);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
export { resolveSource };
|
|
27
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../../../../../../../@warlock.js/ai/src/skills/sources/index.ts"],"sourcesContent":["import type { SkillSource } from \"../contracts/skills-config.type\";\nimport type { SkillsStoreContract } from \"../contracts/skills-store.contract\";\nimport { directorySource } from \"./directory-source\";\nimport { storeSource } from \"./store-source\";\nimport { urlSource } from \"./url-source\";\n\nexport { directorySource } from \"./directory-source\";\nexport { urlSource } from \"./url-source\";\nexport { storeSource } from \"./store-source\";\nexport { parseFrontmatter, parseTags } from \"./parse-frontmatter\";\nexport type { ParsedFrontmatter } from \"./parse-frontmatter\";\n\n/**\n * Resolve a declarative {@link SkillSource} into a concrete\n * {@link SkillsStoreContract} reader. Discriminated by `type` (never\n * `kind`): `directory` reads the filesystem, `url` fetches a manifest,\n * `store` passes a store through verbatim.\n */\nexport function resolveSource(source: SkillSource): SkillsStoreContract {\n switch (source.type) {\n case \"directory\":\n return directorySource(source.path);\n case \"url\":\n return urlSource(source.url, {\n headers: source.headers,\n policy: source.policy,\n cacheTtlMs: source.cacheTtlMs,\n });\n case \"store\":\n return storeSource(source.store);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAkBA,SAAgB,cAAc,QAA0C;CACtE,QAAQ,OAAO,MAAf;EACE,KAAK,aACH,OAAO,gBAAgB,OAAO,IAAI;EACpC,KAAK,OACH,OAAO,UAAU,OAAO,KAAK;GAC3B,SAAS,OAAO;GAChB,QAAQ,OAAO;GACf,YAAY,OAAO;EACrB,CAAC;EACH,KAAK,SACH,OAAO,YAAY,OAAO,KAAK;CACnC;AACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region ../@warlock.js/ai/src/skills/sources/parse-frontmatter.ts
|
|
2
|
+
/**
|
|
3
|
+
* Parse simple `key: value` YAML front-matter — the only form `SKILL.md`
|
|
4
|
+
* uses (no nested objects, no block arrays). Ported verbatim from the
|
|
5
|
+
* package's `scripts/generate-llms.mjs` `parseFrontmatter()` so the
|
|
6
|
+
* runtime catalog and the docs `llms.txt` index agree byte-for-byte on
|
|
7
|
+
* what a skill's `description` is.
|
|
8
|
+
*
|
|
9
|
+
* When the text has no `---`-delimited front-matter block, returns an
|
|
10
|
+
* empty `meta` and the full text as `body`.
|
|
11
|
+
*/
|
|
12
|
+
function parseFrontmatter(text) {
|
|
13
|
+
const match = text.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
14
|
+
if (!match) return {
|
|
15
|
+
meta: {},
|
|
16
|
+
body: text
|
|
17
|
+
};
|
|
18
|
+
const meta = {};
|
|
19
|
+
for (const line of match[1].split("\n")) {
|
|
20
|
+
const colon = line.indexOf(":");
|
|
21
|
+
if (colon === -1) continue;
|
|
22
|
+
const key = line.slice(0, colon).trim();
|
|
23
|
+
let value = line.slice(colon + 1).trim();
|
|
24
|
+
if (value.startsWith("'") && value.endsWith("'") || value.startsWith("\"") && value.endsWith("\"")) value = value.slice(1, -1).replace(/''/g, "'").replace(/\\"/g, "\"");
|
|
25
|
+
meta[key] = value;
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
meta,
|
|
29
|
+
body: match[2]
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Split a front-matter `tags:` value into a string array. Accepts a
|
|
34
|
+
* comma-separated inline list (`tags: frontend, react`) — the simple
|
|
35
|
+
* inline form that fits the `key: value` parser. Returns `undefined` when
|
|
36
|
+
* the value is absent or blank so a tagless skill stays `tags: undefined`.
|
|
37
|
+
*/
|
|
38
|
+
function parseTags(value) {
|
|
39
|
+
if (!value) return;
|
|
40
|
+
const tags = value.split(",").map((tag) => tag.trim()).filter((tag) => tag.length > 0);
|
|
41
|
+
return tags.length > 0 ? tags : void 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { parseFrontmatter, parseTags };
|
|
46
|
+
//# sourceMappingURL=parse-frontmatter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-frontmatter.mjs","names":[],"sources":["../../../../../../../../../../@warlock.js/ai/src/skills/sources/parse-frontmatter.ts"],"sourcesContent":["/** The parsed front-matter (cheap metadata) plus the stripped body. */\nexport type ParsedFrontmatter = {\n /** Every `key: value` line from the front-matter block, values quote-stripped. */\n meta: Record<string, string>;\n /** Everything after the closing `---`, verbatim (the skill body). */\n body: string;\n};\n\n/**\n * Parse simple `key: value` YAML front-matter — the only form `SKILL.md`\n * uses (no nested objects, no block arrays). Ported verbatim from the\n * package's `scripts/generate-llms.mjs` `parseFrontmatter()` so the\n * runtime catalog and the docs `llms.txt` index agree byte-for-byte on\n * what a skill's `description` is.\n *\n * When the text has no `---`-delimited front-matter block, returns an\n * empty `meta` and the full text as `body`.\n */\nexport function parseFrontmatter(text: string): ParsedFrontmatter {\n const match = text.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\n if (!match) {\n return { meta: {}, body: text };\n }\n\n const meta: Record<string, string> = {};\n\n for (const line of match[1].split(\"\\n\")) {\n const colon = line.indexOf(\":\");\n\n if (colon === -1) {\n continue;\n }\n\n const key = line.slice(0, colon).trim();\n let value = line.slice(colon + 1).trim();\n\n if (\n (value.startsWith(\"'\") && value.endsWith(\"'\")) ||\n (value.startsWith('\"') && value.endsWith('\"'))\n ) {\n value = value.slice(1, -1).replace(/''/g, \"'\").replace(/\\\\\"/g, '\"');\n }\n\n meta[key] = value;\n }\n\n return { meta, body: match[2] };\n}\n\n/**\n * Split a front-matter `tags:` value into a string array. Accepts a\n * comma-separated inline list (`tags: frontend, react`) — the simple\n * inline form that fits the `key: value` parser. Returns `undefined` when\n * the value is absent or blank so a tagless skill stays `tags: undefined`.\n */\nexport function parseTags(value: string | undefined): string[] | undefined {\n if (!value) {\n return undefined;\n }\n\n const tags = value\n .split(\",\")\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0);\n\n return tags.length > 0 ? tags : undefined;\n}\n"],"mappings":";;;;;;;;;;;AAkBA,SAAgB,iBAAiB,MAAiC;CAChE,MAAM,QAAQ,KAAK,MAAM,mCAAmC;CAE5D,IAAI,CAAC,OACH,OAAO;EAAE,MAAM,CAAC;EAAG,MAAM;CAAK;CAGhC,MAAM,OAA+B,CAAC;CAEtC,KAAK,MAAM,QAAQ,MAAM,EAAE,CAAC,MAAM,IAAI,GAAG;EACvC,MAAM,QAAQ,KAAK,QAAQ,GAAG;EAE9B,IAAI,UAAU,IACZ;EAGF,MAAM,MAAM,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK;EACtC,IAAI,QAAQ,KAAK,MAAM,QAAQ,CAAC,CAAC,CAAC,KAAK;EAEvC,IACG,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,IAAG,KAAK,MAAM,SAAS,IAAG,GAE5C,QAAQ,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,QAAQ,IAAG;EAGpE,KAAK,OAAO;CACd;CAEA,OAAO;EAAE;EAAM,MAAM,MAAM;CAAG;AAChC;;;;;;;AAQA,SAAgB,UAAU,OAAiD;CACzE,IAAI,CAAC,OACH;CAGF,MAAM,OAAO,MACV,MAAM,GAAG,CAAC,CACV,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CACxB,QAAQ,QAAQ,IAAI,SAAS,CAAC;CAEjC,OAAO,KAAK,SAAS,IAAI,OAAO;AAClC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region ../@warlock.js/ai/src/skills/sources/store-source.ts
|
|
2
|
+
/**
|
|
3
|
+
* Adapt a `{ type: "store", store }` source — a pass-through to any
|
|
4
|
+
* {@link SkillsStoreContract} (e.g. `MockSkillsStore`, or the Phase-2
|
|
5
|
+
* `ProceduralSkillStore`). The store already implements every reader
|
|
6
|
+
* method, so this is identity; it exists for symmetry with the directory
|
|
7
|
+
* and url sources and to keep `resolveSource` a single dispatch table.
|
|
8
|
+
*/
|
|
9
|
+
function storeSource(store) {
|
|
10
|
+
return store;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
//#endregion
|
|
14
|
+
export { storeSource };
|
|
15
|
+
//# sourceMappingURL=store-source.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-source.mjs","names":[],"sources":["../../../../../../../../../../@warlock.js/ai/src/skills/sources/store-source.ts"],"sourcesContent":["import type { SkillsStoreContract } from \"../contracts/skills-store.contract\";\n\n/**\n * Adapt a `{ type: \"store\", store }` source — a pass-through to any\n * {@link SkillsStoreContract} (e.g. `MockSkillsStore`, or the Phase-2\n * `ProceduralSkillStore`). The store already implements every reader\n * method, so this is identity; it exists for symmetry with the directory\n * and url sources and to keep `resolveSource` a single dispatch table.\n */\nexport function storeSource(store: SkillsStoreContract): SkillsStoreContract {\n return store;\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,YAAY,OAAiD;CAC3E,OAAO;AACT"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { fetchTextWithPolicy } from "../../security/outbound-policy.mjs";
|
|
2
|
+
|
|
3
|
+
//#region ../@warlock.js/ai/src/skills/sources/url-source.ts
|
|
4
|
+
/**
|
|
5
|
+
* Read skills from a remote JSON manifest at `url`. The manifest is a flat
|
|
6
|
+
* array of {@link SkillRecord}s (bodies inline).
|
|
7
|
+
*
|
|
8
|
+
* **Trust boundary (S3).** A remote skill source is a prompt supply chain —
|
|
9
|
+
* its bodies flow straight into model context — so the manifest fetch runs
|
|
10
|
+
* through the shared `OutboundPolicy` (scheme + host allowlist, post-DNS
|
|
11
|
+
* private-IP deny, max bytes, timeout) and **every record is runtime-
|
|
12
|
+
* validated** before it can be served. A malformed record fails loudly
|
|
13
|
+
* rather than being cast blindly into a `SkillRecord`.
|
|
14
|
+
*
|
|
15
|
+
* The request is made lazily on the first `list()` / `load()`. The result
|
|
16
|
+
* is cached for the source's lifetime, or for `cacheTtlMs` when set
|
|
17
|
+
* (a stale cache refetches on next access).
|
|
18
|
+
*/
|
|
19
|
+
function urlSource(url, options = {}) {
|
|
20
|
+
const { headers, policy, cacheTtlMs } = options;
|
|
21
|
+
let cache;
|
|
22
|
+
let cachedAtMs;
|
|
23
|
+
const records = () => {
|
|
24
|
+
const expired = cacheTtlMs !== void 0 && cachedAtMs !== void 0 && Date.now() - cachedAtMs > cacheTtlMs;
|
|
25
|
+
if (!cache || expired) {
|
|
26
|
+
cachedAtMs = Date.now();
|
|
27
|
+
cache = fetchManifest(url, headers, policy);
|
|
28
|
+
}
|
|
29
|
+
return cache;
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
async list(scope) {
|
|
33
|
+
const all = await records();
|
|
34
|
+
const wanted = scope?.tags;
|
|
35
|
+
return [...all.values()].filter((record) => record.type !== "candidate").filter((record) => intersects(record.tags, wanted)).map(toCatalogEntry);
|
|
36
|
+
},
|
|
37
|
+
async load(name, version) {
|
|
38
|
+
const record = (await records()).get(name);
|
|
39
|
+
if (!record || record.type === "candidate") return;
|
|
40
|
+
if (version !== void 0 && record.version !== version) return;
|
|
41
|
+
return record;
|
|
42
|
+
},
|
|
43
|
+
async saveCandidate() {
|
|
44
|
+
throw new Error("url source is read-only — saveCandidate requires a writable store (set `review.store`)");
|
|
45
|
+
},
|
|
46
|
+
async promote() {
|
|
47
|
+
throw new Error("url source is read-only — promote requires a writable store (set `review.store`)");
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Fetch + validate + parse the manifest once into a name → record map. */
|
|
52
|
+
async function fetchManifest(url, headers, policy) {
|
|
53
|
+
const result = await fetchTextWithPolicy(url, policy ?? {}, headers ? { headers } : void 0);
|
|
54
|
+
if (!result.ok) throw new Error(`url skill source failed: ${result.status} ${result.statusText} for ${url}`);
|
|
55
|
+
let parsed;
|
|
56
|
+
try {
|
|
57
|
+
parsed = JSON.parse(result.text);
|
|
58
|
+
} catch (cause) {
|
|
59
|
+
throw new Error(`url skill source returned invalid JSON from ${url}`, { cause });
|
|
60
|
+
}
|
|
61
|
+
if (!Array.isArray(parsed)) throw new Error(`url skill source at ${url} must return a JSON array of skill records`);
|
|
62
|
+
const records = /* @__PURE__ */ new Map();
|
|
63
|
+
parsed.forEach((raw, index) => {
|
|
64
|
+
const record = validateManifestRecord(raw, url, index);
|
|
65
|
+
records.set(record.name, record);
|
|
66
|
+
});
|
|
67
|
+
return records;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Runtime-validate one manifest record before it is trusted as a
|
|
71
|
+
* {@link SkillRecord}. Untyped remote JSON cast blindly into the context
|
|
72
|
+
* is both an injection surface and a correctness bug; this rejects a
|
|
73
|
+
* record missing the required `name` / `description` / `body` strings, and
|
|
74
|
+
* fills `version` / `type` defaults for a thin record.
|
|
75
|
+
*/
|
|
76
|
+
function validateManifestRecord(raw, url, index) {
|
|
77
|
+
if (!raw || typeof raw !== "object") throw new Error(`url skill source at ${url}: record #${index} is not an object`);
|
|
78
|
+
const r = raw;
|
|
79
|
+
const requireString = (field) => {
|
|
80
|
+
const value = r[field];
|
|
81
|
+
if (typeof value !== "string" || value.length === 0) throw new Error(`url skill source at ${url}: record #${index} is missing a string "${field}"`);
|
|
82
|
+
return value;
|
|
83
|
+
};
|
|
84
|
+
const name = requireString("name");
|
|
85
|
+
const description = requireString("description");
|
|
86
|
+
const body = requireString("body");
|
|
87
|
+
const type = r.type === "authored" || r.type === "promoted" || r.type === "candidate" ? r.type : "authored";
|
|
88
|
+
return {
|
|
89
|
+
name,
|
|
90
|
+
description,
|
|
91
|
+
body,
|
|
92
|
+
version: typeof r.version === "number" ? r.version : 1,
|
|
93
|
+
type,
|
|
94
|
+
tags: Array.isArray(r.tags) ? r.tags.filter((t) => typeof t === "string") : void 0,
|
|
95
|
+
metadata: r.metadata && typeof r.metadata === "object" ? r.metadata : void 0
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Project a full record down to its catalog entry (body omitted). */
|
|
99
|
+
function toCatalogEntry(record) {
|
|
100
|
+
return {
|
|
101
|
+
name: record.name,
|
|
102
|
+
description: record.description,
|
|
103
|
+
version: record.version,
|
|
104
|
+
tags: record.tags,
|
|
105
|
+
type: record.type
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** True when no filter is requested or the record shares a requested tag. */
|
|
109
|
+
function intersects(recordTags, wanted) {
|
|
110
|
+
if (!wanted || wanted.length === 0) return true;
|
|
111
|
+
if (!recordTags || recordTags.length === 0) return false;
|
|
112
|
+
return recordTags.some((tag) => wanted.includes(tag));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
//#endregion
|
|
116
|
+
export { urlSource };
|
|
117
|
+
//# sourceMappingURL=url-source.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-source.mjs","names":[],"sources":["../../../../../../../../../../@warlock.js/ai/src/skills/sources/url-source.ts"],"sourcesContent":["import { fetchTextWithPolicy } from \"../../security/outbound-policy\";\nimport type { OutboundPolicy } from \"../../security/outbound-policy.type\";\nimport type {\n SkillCatalogEntry,\n SkillRecord,\n} from \"../contracts/skill-record.type\";\nimport type { SkillsStoreContract } from \"../contracts/skills-store.contract\";\n\n/**\n * The JSON manifest shape a `url` source fetches — a flat array of skill\n * records. Bodies travel inline; the catalog projection drops them so the\n * always-injected metadata block stays cheap.\n */\ntype SkillManifest = SkillRecord[];\n\n/** Options for {@link urlSource} (S3). */\nexport type UrlSourceOptions = {\n headers?: Record<string, string>;\n /** Fetch hardening for the manifest request. */\n policy?: OutboundPolicy;\n /** Cache the manifest for this many ms; omit to cache for the source's lifetime. */\n cacheTtlMs?: number;\n};\n\n/**\n * Read skills from a remote JSON manifest at `url`. The manifest is a flat\n * array of {@link SkillRecord}s (bodies inline).\n *\n * **Trust boundary (S3).** A remote skill source is a prompt supply chain —\n * its bodies flow straight into model context — so the manifest fetch runs\n * through the shared `OutboundPolicy` (scheme + host allowlist, post-DNS\n * private-IP deny, max bytes, timeout) and **every record is runtime-\n * validated** before it can be served. A malformed record fails loudly\n * rather than being cast blindly into a `SkillRecord`.\n *\n * The request is made lazily on the first `list()` / `load()`. The result\n * is cached for the source's lifetime, or for `cacheTtlMs` when set\n * (a stale cache refetches on next access).\n */\nexport function urlSource(\n url: string,\n options: UrlSourceOptions = {},\n): SkillsStoreContract {\n const { headers, policy, cacheTtlMs } = options;\n\n let cache: Promise<Map<string, SkillRecord>> | undefined;\n let cachedAtMs: number | undefined;\n\n const records = (): Promise<Map<string, SkillRecord>> => {\n const expired =\n cacheTtlMs !== undefined &&\n cachedAtMs !== undefined &&\n Date.now() - cachedAtMs > cacheTtlMs;\n\n if (!cache || expired) {\n cachedAtMs = Date.now();\n cache = fetchManifest(url, headers, policy);\n }\n\n return cache;\n };\n\n return {\n async list(scope?: { tags?: string[] }): Promise<SkillCatalogEntry[]> {\n const all = await records();\n const wanted = scope?.tags;\n\n return [...all.values()]\n .filter(record => record.type !== \"candidate\")\n .filter(record => intersects(record.tags, wanted))\n .map(toCatalogEntry);\n },\n async load(name: string, version?: number): Promise<SkillRecord | undefined> {\n const all = await records();\n const record = all.get(name);\n\n if (!record || record.type === \"candidate\") {\n return undefined;\n }\n\n if (version !== undefined && record.version !== version) {\n return undefined;\n }\n\n return record;\n },\n async saveCandidate(): Promise<SkillRecord> {\n throw new Error(\n \"url source is read-only — saveCandidate requires a writable store (set `review.store`)\",\n );\n },\n async promote(): Promise<SkillRecord> {\n throw new Error(\n \"url source is read-only — promote requires a writable store (set `review.store`)\",\n );\n },\n };\n}\n\n/** Fetch + validate + parse the manifest once into a name → record map. */\nasync function fetchManifest(\n url: string,\n headers: Record<string, string> | undefined,\n policy: OutboundPolicy | undefined,\n): Promise<Map<string, SkillRecord>> {\n const result = await fetchTextWithPolicy(\n url,\n policy ?? {},\n headers ? { headers } : undefined,\n );\n\n if (!result.ok) {\n throw new Error(\n `url skill source failed: ${result.status} ${result.statusText} for ${url}`,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(result.text);\n } catch (cause) {\n throw new Error(`url skill source returned invalid JSON from ${url}`, {\n cause,\n });\n }\n\n if (!Array.isArray(parsed)) {\n throw new Error(\n `url skill source at ${url} must return a JSON array of skill records`,\n );\n }\n\n const records = new Map<string, SkillRecord>();\n\n (parsed as SkillManifest).forEach((raw, index) => {\n const record = validateManifestRecord(raw, url, index);\n records.set(record.name, record);\n });\n\n return records;\n}\n\n/**\n * Runtime-validate one manifest record before it is trusted as a\n * {@link SkillRecord}. Untyped remote JSON cast blindly into the context\n * is both an injection surface and a correctness bug; this rejects a\n * record missing the required `name` / `description` / `body` strings, and\n * fills `version` / `type` defaults for a thin record.\n */\nfunction validateManifestRecord(\n raw: unknown,\n url: string,\n index: number,\n): SkillRecord {\n if (!raw || typeof raw !== \"object\") {\n throw new Error(`url skill source at ${url}: record #${index} is not an object`);\n }\n\n const r = raw as Record<string, unknown>;\n const requireString = (field: string): string => {\n const value = r[field];\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(\n `url skill source at ${url}: record #${index} is missing a string \"${field}\"`,\n );\n }\n return value;\n };\n\n const name = requireString(\"name\");\n const description = requireString(\"description\");\n const body = requireString(\"body\");\n\n const type =\n r.type === \"authored\" || r.type === \"promoted\" || r.type === \"candidate\"\n ? r.type\n : \"authored\";\n const version = typeof r.version === \"number\" ? r.version : 1;\n const tags = Array.isArray(r.tags)\n ? r.tags.filter((t): t is string => typeof t === \"string\")\n : undefined;\n const metadata =\n r.metadata && typeof r.metadata === \"object\"\n ? (r.metadata as Record<string, unknown>)\n : undefined;\n\n return { name, description, body, version, type, tags, metadata };\n}\n\n/** Project a full record down to its catalog entry (body omitted). */\nfunction toCatalogEntry(record: SkillRecord): SkillCatalogEntry {\n return {\n name: record.name,\n description: record.description,\n version: record.version,\n tags: record.tags,\n type: record.type,\n };\n}\n\n/** True when no filter is requested or the record shares a requested tag. */\nfunction intersects(recordTags: string[] | undefined, wanted: string[] | undefined): boolean {\n if (!wanted || wanted.length === 0) {\n return true;\n }\n\n if (!recordTags || recordTags.length === 0) {\n return false;\n }\n\n return recordTags.some(tag => wanted.includes(tag));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAuCA,SAAgB,UACd,KACA,UAA4B,CAAC,GACR;CACrB,MAAM,EAAE,SAAS,QAAQ,eAAe;CAExC,IAAI;CACJ,IAAI;CAEJ,MAAM,gBAAmD;EACvD,MAAM,UACJ,eAAe,UACf,eAAe,UACf,KAAK,IAAI,IAAI,aAAa;EAE5B,IAAI,CAAC,SAAS,SAAS;GACrB,aAAa,KAAK,IAAI;GACtB,QAAQ,cAAc,KAAK,SAAS,MAAM;EAC5C;EAEA,OAAO;CACT;CAEA,OAAO;EACL,MAAM,KAAK,OAA2D;GACpE,MAAM,MAAM,MAAM,QAAQ;GAC1B,MAAM,SAAS,OAAO;GAEtB,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CACrB,QAAO,WAAU,OAAO,SAAS,WAAW,CAAC,CAC7C,QAAO,WAAU,WAAW,OAAO,MAAM,MAAM,CAAC,CAAC,CACjD,IAAI,cAAc;EACvB;EACA,MAAM,KAAK,MAAc,SAAoD;GAE3E,MAAM,UAAS,MADG,QAAQ,EACR,CAAC,IAAI,IAAI;GAE3B,IAAI,CAAC,UAAU,OAAO,SAAS,aAC7B;GAGF,IAAI,YAAY,UAAa,OAAO,YAAY,SAC9C;GAGF,OAAO;EACT;EACA,MAAM,gBAAsC;GAC1C,MAAM,IAAI,MACR,wFACF;EACF;EACA,MAAM,UAAgC;GACpC,MAAM,IAAI,MACR,kFACF;EACF;CACF;AACF;;AAGA,eAAe,cACb,KACA,SACA,QACmC;CACnC,MAAM,SAAS,MAAM,oBACnB,KACA,UAAU,CAAC,GACX,UAAU,EAAE,QAAQ,IAAI,MAC1B;CAEA,IAAI,CAAC,OAAO,IACV,MAAM,IAAI,MACR,4BAA4B,OAAO,OAAO,GAAG,OAAO,WAAW,OAAO,KACxE;CAGF,IAAI;CACJ,IAAI;EACF,SAAS,KAAK,MAAM,OAAO,IAAI;CACjC,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,+CAA+C,OAAO,EACpE,MACF,CAAC;CACH;CAEA,IAAI,CAAC,MAAM,QAAQ,MAAM,GACvB,MAAM,IAAI,MACR,uBAAuB,IAAI,2CAC7B;CAGF,MAAM,0BAAU,IAAI,IAAyB;CAE7C,AAAC,OAAyB,SAAS,KAAK,UAAU;EAChD,MAAM,SAAS,uBAAuB,KAAK,KAAK,KAAK;EACrD,QAAQ,IAAI,OAAO,MAAM,MAAM;CACjC,CAAC;CAED,OAAO;AACT;;;;;;;;AASA,SAAS,uBACP,KACA,KACA,OACa;CACb,IAAI,CAAC,OAAO,OAAO,QAAQ,UACzB,MAAM,IAAI,MAAM,uBAAuB,IAAI,YAAY,MAAM,kBAAkB;CAGjF,MAAM,IAAI;CACV,MAAM,iBAAiB,UAA0B;EAC/C,MAAM,QAAQ,EAAE;EAChB,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAChD,MAAM,IAAI,MACR,uBAAuB,IAAI,YAAY,MAAM,wBAAwB,MAAM,EAC7E;EAEF,OAAO;CACT;CAEA,MAAM,OAAO,cAAc,MAAM;CACjC,MAAM,cAAc,cAAc,aAAa;CAC/C,MAAM,OAAO,cAAc,MAAM;CAEjC,MAAM,OACJ,EAAE,SAAS,cAAc,EAAE,SAAS,cAAc,EAAE,SAAS,cACzD,EAAE,OACF;CAUN,OAAO;EAAE;EAAM;EAAa;EAAM,SATlB,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU;EASjB;EAAM,MARpC,MAAM,QAAQ,EAAE,IAAI,IAC7B,EAAE,KAAK,QAAQ,MAAmB,OAAO,MAAM,QAAQ,IACvD;EAMmD,UAJrD,EAAE,YAAY,OAAO,EAAE,aAAa,WAC/B,EAAE,WACH;CAE0D;AAClE;;AAGA,SAAS,eAAe,QAAwC;CAC9D,OAAO;EACL,MAAM,OAAO;EACb,aAAa,OAAO;EACpB,SAAS,OAAO;EAChB,MAAM,OAAO;EACb,MAAM,OAAO;CACf;AACF;;AAGA,SAAS,WAAW,YAAkC,QAAuC;CAC3F,IAAI,CAAC,UAAU,OAAO,WAAW,GAC/B,OAAO;CAGT,IAAI,CAAC,cAAc,WAAW,WAAW,GACvC,OAAO;CAGT,OAAO,WAAW,MAAK,QAAO,OAAO,SAAS,GAAG,CAAC;AACpD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
//#region ../@warlock.js/ai/src/snapshot/memory.ts
|
|
2
|
+
/**
|
|
3
|
+
* In-memory {@link SnapshotStore} — supervisor run snapshots held in a
|
|
4
|
+
* process-local `Map`, keyed by `runId`, never persisted to disk.
|
|
5
|
+
*
|
|
6
|
+
* Owns: the `runId` → {@link SupervisorSnapshot} mapping for
|
|
7
|
+
* `iterate: true` mid-turn resume. Does NOT own: durability,
|
|
8
|
+
* cross-process sharing, or TTL eviction — it is the zero-config
|
|
9
|
+
* default for dev, tests, and single-process apps. Reach for
|
|
10
|
+
* `ai.snapshot.pg()` / `ai.snapshot.redis()` (Phase 2) when a crashed
|
|
11
|
+
* process must resume an in-flight turn.
|
|
12
|
+
*
|
|
13
|
+
* Front it with the {@link memory} factory — callers never `new` it.
|
|
14
|
+
*/
|
|
15
|
+
var MemorySnapshotStore = class {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.snapshots = /* @__PURE__ */ new Map();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Return the snapshot for a `runId`, or `undefined` when no in-flight
|
|
21
|
+
* run is recorded.
|
|
22
|
+
*/
|
|
23
|
+
async load(runId) {
|
|
24
|
+
return this.snapshots.get(runId);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Persist a snapshot, keyed by its own `runId`. Overwrites any prior
|
|
28
|
+
* snapshot for the same run — a run has exactly one live snapshot.
|
|
29
|
+
*/
|
|
30
|
+
async save(snapshot) {
|
|
31
|
+
this.snapshots.set(snapshot.runId, snapshot);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Drop the snapshot for a `runId`.
|
|
35
|
+
*/
|
|
36
|
+
async delete(runId) {
|
|
37
|
+
this.snapshots.delete(runId);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* List the known run ids, optionally filtered by a prefix.
|
|
41
|
+
*/
|
|
42
|
+
async list(prefix) {
|
|
43
|
+
const runIds = [];
|
|
44
|
+
for (const runId of this.snapshots.keys()) {
|
|
45
|
+
if (prefix !== void 0 && !runId.startsWith(prefix)) continue;
|
|
46
|
+
runIds.push(runId);
|
|
47
|
+
}
|
|
48
|
+
return runIds;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The memory store has no backing table — there is nothing to
|
|
52
|
+
* migrate. Returns an empty string so callers can treat `schema()`
|
|
53
|
+
* uniformly across drivers.
|
|
54
|
+
*/
|
|
55
|
+
schema() {
|
|
56
|
+
return "";
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Create an in-memory {@link SnapshotStore}. Zero-config — no client,
|
|
61
|
+
* no connection. Suitable for dev, tests, and single-process apps that
|
|
62
|
+
* don't need to resume an interrupted `iterate: true` turn across
|
|
63
|
+
* restarts.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* import { ai } from "@warlock.js/ai";
|
|
67
|
+
*
|
|
68
|
+
* const orchestrator = ai.orchestrator({
|
|
69
|
+
* name: "support",
|
|
70
|
+
* intents: { ... },
|
|
71
|
+
* iterate: true,
|
|
72
|
+
* snapshotStore: ai.snapshot.memory(),
|
|
73
|
+
* });
|
|
74
|
+
*/
|
|
75
|
+
function memory() {
|
|
76
|
+
return new MemorySnapshotStore();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
//#endregion
|
|
80
|
+
export { memory };
|
|
81
|
+
//# sourceMappingURL=memory.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/snapshot/memory.ts"],"sourcesContent":["import type { SnapshotStore } from \"../contracts/orchestrator/snapshot-store.contract\";\nimport type { SupervisorSnapshot } from \"../contracts/supervisor/supervisor-snapshot.type\";\n\n/**\n * In-memory {@link SnapshotStore} — supervisor run snapshots held in a\n * process-local `Map`, keyed by `runId`, never persisted to disk.\n *\n * Owns: the `runId` → {@link SupervisorSnapshot} mapping for\n * `iterate: true` mid-turn resume. Does NOT own: durability,\n * cross-process sharing, or TTL eviction — it is the zero-config\n * default for dev, tests, and single-process apps. Reach for\n * `ai.snapshot.pg()` / `ai.snapshot.redis()` (Phase 2) when a crashed\n * process must resume an in-flight turn.\n *\n * Front it with the {@link memory} factory — callers never `new` it.\n */\nclass MemorySnapshotStore<TSnapshot extends { runId: string }>\n implements SnapshotStore<TSnapshot>\n{\n /** Snapshots keyed by `runId`. */\n private readonly snapshots = new Map<string, TSnapshot>();\n\n /**\n * Return the snapshot for a `runId`, or `undefined` when no in-flight\n * run is recorded.\n */\n public async load(runId: string): Promise<TSnapshot | undefined> {\n return this.snapshots.get(runId);\n }\n\n /**\n * Persist a snapshot, keyed by its own `runId`. Overwrites any prior\n * snapshot for the same run — a run has exactly one live snapshot.\n */\n public async save(snapshot: TSnapshot): Promise<void> {\n this.snapshots.set(snapshot.runId, snapshot);\n }\n\n /**\n * Drop the snapshot for a `runId`.\n */\n public async delete(runId: string): Promise<void> {\n this.snapshots.delete(runId);\n }\n\n /**\n * List the known run ids, optionally filtered by a prefix.\n */\n public async list(prefix?: string): Promise<string[]> {\n const runIds: string[] = [];\n\n for (const runId of this.snapshots.keys()) {\n if (prefix !== undefined && !runId.startsWith(prefix)) {\n continue;\n }\n\n runIds.push(runId);\n }\n\n return runIds;\n }\n\n /**\n * The memory store has no backing table — there is nothing to\n * migrate. Returns an empty string so callers can treat `schema()`\n * uniformly across drivers.\n */\n public schema(): string {\n return \"\";\n }\n}\n\n/**\n * Create an in-memory {@link SnapshotStore}. Zero-config — no client,\n * no connection. Suitable for dev, tests, and single-process apps that\n * don't need to resume an interrupted `iterate: true` turn across\n * restarts.\n *\n * @example\n * import { ai } from \"@warlock.js/ai\";\n *\n * const orchestrator = ai.orchestrator({\n * name: \"support\",\n * intents: { ... },\n * iterate: true,\n * snapshotStore: ai.snapshot.memory(),\n * });\n */\nexport function memory<\n TSnapshot extends { runId: string } = SupervisorSnapshot,\n>(): SnapshotStore<TSnapshot> {\n return new MemorySnapshotStore<TSnapshot>();\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,IAAM,sBAAN,MAEA;;mCAE+B,IAAI,IAAuB;;;;;;CAMxD,MAAa,KAAK,OAA+C;EAC/D,OAAO,KAAK,UAAU,IAAI,KAAK;CACjC;;;;;CAMA,MAAa,KAAK,UAAoC;EACpD,KAAK,UAAU,IAAI,SAAS,OAAO,QAAQ;CAC7C;;;;CAKA,MAAa,OAAO,OAA8B;EAChD,KAAK,UAAU,OAAO,KAAK;CAC7B;;;;CAKA,MAAa,KAAK,QAAoC;EACpD,MAAM,SAAmB,CAAC;EAE1B,KAAK,MAAM,SAAS,KAAK,UAAU,KAAK,GAAG;GACzC,IAAI,WAAW,UAAa,CAAC,MAAM,WAAW,MAAM,GAClD;GAGF,OAAO,KAAK,KAAK;EACnB;EAEA,OAAO;CACT;;;;;;CAOA,AAAO,SAAiB;EACtB,OAAO;CACT;AACF;;;;;;;;;;;;;;;;;AAkBA,SAAgB,SAEc;CAC5B,OAAO,IAAI,oBAA+B;AAC5C"}
|