@kvman/kvcoder 0.1.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/LICENSE +21 -0
- package/README.md +9 -0
- package/dist/api.d.ts +386 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +2 -0
- package/dist/api.js.map +1 -0
- package/dist/artifacts/artifact-format.d.ts +9 -0
- package/dist/artifacts/artifact-format.d.ts.map +1 -0
- package/dist/artifacts/artifact-format.js +32 -0
- package/dist/artifacts/artifact-format.js.map +1 -0
- package/dist/artifacts/artifact-records.d.ts +12 -0
- package/dist/artifacts/artifact-records.d.ts.map +1 -0
- package/dist/artifacts/artifact-records.js +17 -0
- package/dist/artifacts/artifact-records.js.map +1 -0
- package/dist/artifacts/register-artifacts.d.ts +3 -0
- package/dist/artifacts/register-artifacts.d.ts.map +1 -0
- package/dist/artifacts/register-artifacts.js +37 -0
- package/dist/artifacts/register-artifacts.js.map +1 -0
- package/dist/calls/binary-checks.d.ts +8 -0
- package/dist/calls/binary-checks.d.ts.map +1 -0
- package/dist/calls/binary-checks.js +12 -0
- package/dist/calls/binary-checks.js.map +1 -0
- package/dist/calls/connector-help.d.ts +3 -0
- package/dist/calls/connector-help.d.ts.map +1 -0
- package/dist/calls/connector-help.js +73 -0
- package/dist/calls/connector-help.js.map +1 -0
- package/dist/calls/help-text.d.ts +19 -0
- package/dist/calls/help-text.d.ts.map +1 -0
- package/dist/calls/help-text.js +22 -0
- package/dist/calls/help-text.js.map +1 -0
- package/dist/calls/line-run.d.ts +33 -0
- package/dist/calls/line-run.d.ts.map +1 -0
- package/dist/calls/line-run.js +56 -0
- package/dist/calls/line-run.js.map +1 -0
- package/dist/calls/run-shell.d.ts +12 -0
- package/dist/calls/run-shell.d.ts.map +1 -0
- package/dist/calls/run-shell.js +88 -0
- package/dist/calls/run-shell.js.map +1 -0
- package/dist/calls/run-tool.d.ts +49 -0
- package/dist/calls/run-tool.d.ts.map +1 -0
- package/dist/calls/run-tool.js +66 -0
- package/dist/calls/run-tool.js.map +1 -0
- package/dist/calls/shell-command.d.ts +25 -0
- package/dist/calls/shell-command.d.ts.map +1 -0
- package/dist/calls/shell-command.js +31 -0
- package/dist/calls/shell-command.js.map +1 -0
- package/dist/calls/shell-program.d.ts +5 -0
- package/dist/calls/shell-program.d.ts.map +1 -0
- package/dist/calls/shell-program.js +8 -0
- package/dist/calls/shell-program.js.map +1 -0
- package/dist/connector-call.d.ts +66 -0
- package/dist/connector-call.d.ts.map +1 -0
- package/dist/connector-call.js +133 -0
- package/dist/connector-call.js.map +1 -0
- package/dist/connectors/artifact.d.ts +51 -0
- package/dist/connectors/artifact.d.ts.map +1 -0
- package/dist/connectors/artifact.js +101 -0
- package/dist/connectors/artifact.js.map +1 -0
- package/dist/connectors/ask.d.ts +58 -0
- package/dist/connectors/ask.d.ts.map +1 -0
- package/dist/connectors/ask.js +85 -0
- package/dist/connectors/ask.js.map +1 -0
- package/dist/connectors/background.d.ts +29 -0
- package/dist/connectors/background.d.ts.map +1 -0
- package/dist/connectors/background.js +56 -0
- package/dist/connectors/background.js.map +1 -0
- package/dist/connectors/binary.d.ts +5 -0
- package/dist/connectors/binary.d.ts.map +1 -0
- package/dist/connectors/binary.js +27 -0
- package/dist/connectors/binary.js.map +1 -0
- package/dist/connectors/builtin-connectors.d.ts +217 -0
- package/dist/connectors/builtin-connectors.d.ts.map +1 -0
- package/dist/connectors/builtin-connectors.js +49 -0
- package/dist/connectors/builtin-connectors.js.map +1 -0
- package/dist/connectors/connector-command.d.ts +26 -0
- package/dist/connectors/connector-command.d.ts.map +1 -0
- package/dist/connectors/connector-command.js +17 -0
- package/dist/connectors/connector-command.js.map +1 -0
- package/dist/connectors/delegate.d.ts +32 -0
- package/dist/connectors/delegate.d.ts.map +1 -0
- package/dist/connectors/delegate.js +82 -0
- package/dist/connectors/delegate.js.map +1 -0
- package/dist/connectors/fs.d.ts +60 -0
- package/dist/connectors/fs.d.ts.map +1 -0
- package/dist/connectors/fs.js +132 -0
- package/dist/connectors/fs.js.map +1 -0
- package/dist/connectors/mcp.d.ts +37 -0
- package/dist/connectors/mcp.d.ts.map +1 -0
- package/dist/connectors/mcp.js +69 -0
- package/dist/connectors/mcp.js.map +1 -0
- package/dist/connectors/payload-fields.d.ts +9 -0
- package/dist/connectors/payload-fields.d.ts.map +1 -0
- package/dist/connectors/payload-fields.js +13 -0
- package/dist/connectors/payload-fields.js.map +1 -0
- package/dist/connectors/shell.d.ts +19 -0
- package/dist/connectors/shell.d.ts.map +1 -0
- package/dist/connectors/shell.js +22 -0
- package/dist/connectors/shell.js.map +1 -0
- package/dist/delay.d.ts +3 -0
- package/dist/delay.d.ts.map +1 -0
- package/dist/delay.js +11 -0
- package/dist/delay.js.map +1 -0
- package/dist/delegate/approved-run.d.ts +13 -0
- package/dist/delegate/approved-run.d.ts.map +1 -0
- package/dist/delegate/approved-run.js +54 -0
- package/dist/delegate/approved-run.js.map +1 -0
- package/dist/delegate/programs.d.ts +32 -0
- package/dist/delegate/programs.d.ts.map +1 -0
- package/dist/delegate/programs.js +67 -0
- package/dist/delegate/programs.js.map +1 -0
- package/dist/delegate/register-worker-run.d.ts +9 -0
- package/dist/delegate/register-worker-run.d.ts.map +1 -0
- package/dist/delegate/register-worker-run.js +70 -0
- package/dist/delegate/register-worker-run.js.map +1 -0
- package/dist/delegate/run-program.d.ts +9 -0
- package/dist/delegate/run-program.d.ts.map +1 -0
- package/dist/delegate/run-program.js +59 -0
- package/dist/delegate/run-program.js.map +1 -0
- package/dist/delegate/runs.d.ts +27 -0
- package/dist/delegate/runs.d.ts.map +1 -0
- package/dist/delegate/runs.js +68 -0
- package/dist/delegate/runs.js.map +1 -0
- package/dist/delegate/workers.d.ts +266 -0
- package/dist/delegate/workers.d.ts.map +1 -0
- package/dist/delegate/workers.js +80 -0
- package/dist/delegate/workers.js.map +1 -0
- package/dist/docs.d.ts +14 -0
- package/dist/docs.d.ts.map +1 -0
- package/dist/docs.js +59 -0
- package/dist/docs.js.map +1 -0
- package/dist/files/edit-text.d.ts +13 -0
- package/dist/files/edit-text.d.ts.map +1 -0
- package/dist/files/edit-text.js +46 -0
- package/dist/files/edit-text.js.map +1 -0
- package/dist/files/file-queue.d.ts +3 -0
- package/dist/files/file-queue.d.ts.map +1 -0
- package/dist/files/file-queue.js +17 -0
- package/dist/files/file-queue.js.map +1 -0
- package/dist/files/list-entries.d.ts +14 -0
- package/dist/files/list-entries.d.ts.map +1 -0
- package/dist/files/list-entries.js +40 -0
- package/dist/files/list-entries.js.map +1 -0
- package/dist/files/read-file.d.ts +17 -0
- package/dist/files/read-file.d.ts.map +1 -0
- package/dist/files/read-file.js +53 -0
- package/dist/files/read-file.js.map +1 -0
- package/dist/files/search-text.d.ts +14 -0
- package/dist/files/search-text.d.ts.map +1 -0
- package/dist/files/search-text.js +62 -0
- package/dist/files/search-text.js.map +1 -0
- package/dist/files/workspace-path.d.ts +5 -0
- package/dist/files/workspace-path.d.ts.map +1 -0
- package/dist/files/workspace-path.js +37 -0
- package/dist/files/workspace-path.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/job-rows.d.ts +24 -0
- package/dist/jobs/job-rows.d.ts.map +1 -0
- package/dist/jobs/job-rows.js +74 -0
- package/dist/jobs/job-rows.js.map +1 -0
- package/dist/jobs/process-handlers.d.ts +8 -0
- package/dist/jobs/process-handlers.d.ts.map +1 -0
- package/dist/jobs/process-handlers.js +43 -0
- package/dist/jobs/process-handlers.js.map +1 -0
- package/dist/jobs/process-records.d.ts +15 -0
- package/dist/jobs/process-records.d.ts.map +1 -0
- package/dist/jobs/process-records.js +30 -0
- package/dist/jobs/process-records.js.map +1 -0
- package/dist/jobs/process-report.d.ts +8 -0
- package/dist/jobs/process-report.d.ts.map +1 -0
- package/dist/jobs/process-report.js +44 -0
- package/dist/jobs/process-report.js.map +1 -0
- package/dist/jobs/process-run.d.ts +26 -0
- package/dist/jobs/process-run.d.ts.map +1 -0
- package/dist/jobs/process-run.js +70 -0
- package/dist/jobs/process-run.js.map +1 -0
- package/dist/jobs/process-text.d.ts +5 -0
- package/dist/jobs/process-text.d.ts.map +1 -0
- package/dist/jobs/process-text.js +11 -0
- package/dist/jobs/process-text.js.map +1 -0
- package/dist/jobs/register-jobs.d.ts +3 -0
- package/dist/jobs/register-jobs.d.ts.map +1 -0
- package/dist/jobs/register-jobs.js +61 -0
- package/dist/jobs/register-jobs.js.map +1 -0
- package/dist/mcp/command-transport.d.ts +17 -0
- package/dist/mcp/command-transport.d.ts.map +1 -0
- package/dist/mcp/command-transport.js +60 -0
- package/dist/mcp/command-transport.js.map +1 -0
- package/dist/mcp/connect.d.ts +12 -0
- package/dist/mcp/connect.d.ts.map +1 -0
- package/dist/mcp/connect.js +54 -0
- package/dist/mcp/connect.js.map +1 -0
- package/dist/mcp/oauth-provider.d.ts +25 -0
- package/dist/mcp/oauth-provider.d.ts.map +1 -0
- package/dist/mcp/oauth-provider.js +59 -0
- package/dist/mcp/oauth-provider.js.map +1 -0
- package/dist/mcp/register-mcp.d.ts +3 -0
- package/dist/mcp/register-mcp.d.ts.map +1 -0
- package/dist/mcp/register-mcp.js +61 -0
- package/dist/mcp/register-mcp.js.map +1 -0
- package/dist/mcp/secrets.d.ts +7 -0
- package/dist/mcp/secrets.d.ts.map +1 -0
- package/dist/mcp/secrets.js +20 -0
- package/dist/mcp/secrets.js.map +1 -0
- package/dist/mcp/servers.d.ts +33 -0
- package/dist/mcp/servers.d.ts.map +1 -0
- package/dist/mcp/servers.js +31 -0
- package/dist/mcp/servers.js.map +1 -0
- package/dist/mcp/sign-in-record.d.ts +10 -0
- package/dist/mcp/sign-in-record.d.ts.map +1 -0
- package/dist/mcp/sign-in-record.js +4 -0
- package/dist/mcp/sign-in-record.js.map +1 -0
- package/dist/mcp/sign-in.d.ts +12 -0
- package/dist/mcp/sign-in.d.ts.map +1 -0
- package/dist/mcp/sign-in.js +75 -0
- package/dist/mcp/sign-in.js.map +1 -0
- package/dist/mcp/tools.d.ts +19 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +31 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/messages/attachments.d.ts +8 -0
- package/dist/messages/attachments.d.ts.map +1 -0
- package/dist/messages/attachments.js +48 -0
- package/dist/messages/attachments.js.map +1 -0
- package/dist/messages/receive-message.d.ts +15 -0
- package/dist/messages/receive-message.d.ts.map +1 -0
- package/dist/messages/receive-message.js +60 -0
- package/dist/messages/receive-message.js.map +1 -0
- package/dist/messages/register-messages.d.ts +3 -0
- package/dist/messages/register-messages.d.ts.map +1 -0
- package/dist/messages/register-messages.js +63 -0
- package/dist/messages/register-messages.js.map +1 -0
- package/dist/problems.d.ts +8 -0
- package/dist/problems.d.ts.map +1 -0
- package/dist/problems.js +14 -0
- package/dist/problems.js.map +1 -0
- package/dist/prompt/build-prompt.d.ts +29 -0
- package/dist/prompt/build-prompt.d.ts.map +1 -0
- package/dist/prompt/build-prompt.js +60 -0
- package/dist/prompt/build-prompt.js.map +1 -0
- package/dist/prompt/register-prompt.d.ts +3 -0
- package/dist/prompt/register-prompt.d.ts.map +1 -0
- package/dist/prompt/register-prompt.js +29 -0
- package/dist/prompt/register-prompt.js.map +1 -0
- package/dist/prompt/session-prompt.d.ts +24 -0
- package/dist/prompt/session-prompt.d.ts.map +1 -0
- package/dist/prompt/session-prompt.js +50 -0
- package/dist/prompt/session-prompt.js.map +1 -0
- package/dist/prompt/working-method.d.ts +7 -0
- package/dist/prompt/working-method.d.ts.map +1 -0
- package/dist/prompt/working-method.js +51 -0
- package/dist/prompt/working-method.js.map +1 -0
- package/dist/register-settings.d.ts +142 -0
- package/dist/register-settings.d.ts.map +1 -0
- package/dist/register-settings.js +51 -0
- package/dist/register-settings.js.map +1 -0
- package/dist/registry/loaded.d.ts +32 -0
- package/dist/registry/loaded.d.ts.map +1 -0
- package/dist/registry/loaded.js +41 -0
- package/dist/registry/loaded.js.map +1 -0
- package/dist/registry/register-connectors.d.ts +32 -0
- package/dist/registry/register-connectors.d.ts.map +1 -0
- package/dist/registry/register-connectors.js +126 -0
- package/dist/registry/register-connectors.js.map +1 -0
- package/dist/registry/register-sections.d.ts +18 -0
- package/dist/registry/register-sections.d.ts.map +1 -0
- package/dist/registry/register-sections.js +99 -0
- package/dist/registry/register-sections.js.map +1 -0
- package/dist/registry/session-points.d.ts +11 -0
- package/dist/registry/session-points.d.ts.map +1 -0
- package/dist/registry/session-points.js +89 -0
- package/dist/registry/session-points.js.map +1 -0
- package/dist/result-text.d.ts +11 -0
- package/dist/result-text.d.ts.map +1 -0
- package/dist/result-text.js +21 -0
- package/dist/result-text.js.map +1 -0
- package/dist/schemas/records.d.ts +357 -0
- package/dist/schemas/records.d.ts.map +1 -0
- package/dist/schemas/records.js +159 -0
- package/dist/schemas/records.js.map +1 -0
- package/dist/schemas/registry.d.ts +160 -0
- package/dist/schemas/registry.d.ts.map +1 -0
- package/dist/schemas/registry.js +37 -0
- package/dist/schemas/registry.js.map +1 -0
- package/dist/sessions/new-session.d.ts +6 -0
- package/dist/sessions/new-session.d.ts.map +1 -0
- package/dist/sessions/new-session.js +52 -0
- package/dist/sessions/new-session.js.map +1 -0
- package/dist/sessions/register-fork-export.d.ts +5 -0
- package/dist/sessions/register-fork-export.d.ts.map +1 -0
- package/dist/sessions/register-fork-export.js +62 -0
- package/dist/sessions/register-fork-export.js.map +1 -0
- package/dist/sessions/register-lifecycle.d.ts +3 -0
- package/dist/sessions/register-lifecycle.d.ts.map +1 -0
- package/dist/sessions/register-lifecycle.js +59 -0
- package/dist/sessions/register-lifecycle.js.map +1 -0
- package/dist/sessions/register-sessions.d.ts +3 -0
- package/dist/sessions/register-sessions.d.ts.map +1 -0
- package/dist/sessions/register-sessions.js +93 -0
- package/dist/sessions/register-sessions.js.map +1 -0
- package/dist/sessions/session-lookup.d.ts +10 -0
- package/dist/sessions/session-lookup.d.ts.map +1 -0
- package/dist/sessions/session-lookup.js +25 -0
- package/dist/sessions/session-lookup.js.map +1 -0
- package/dist/sessions/session-view.d.ts +118 -0
- package/dist/sessions/session-view.d.ts.map +1 -0
- package/dist/sessions/session-view.js +105 -0
- package/dist/sessions/session-view.js.map +1 -0
- package/dist/store/collections.d.ts +471 -0
- package/dist/store/collections.d.ts.map +1 -0
- package/dist/store/collections.js +46 -0
- package/dist/store/collections.js.map +1 -0
- package/dist/turns/background.d.ts +6 -0
- package/dist/turns/background.d.ts.map +1 -0
- package/dist/turns/background.js +27 -0
- package/dist/turns/background.js.map +1 -0
- package/dist/turns/cancel-turn.d.ts +3 -0
- package/dist/turns/cancel-turn.d.ts.map +1 -0
- package/dist/turns/cancel-turn.js +31 -0
- package/dist/turns/cancel-turn.js.map +1 -0
- package/dist/turns/compaction.d.ts +12 -0
- package/dist/turns/compaction.d.ts.map +1 -0
- package/dist/turns/compaction.js +55 -0
- package/dist/turns/compaction.js.map +1 -0
- package/dist/turns/end-turn.d.ts +15 -0
- package/dist/turns/end-turn.d.ts.map +1 -0
- package/dist/turns/end-turn.js +67 -0
- package/dist/turns/end-turn.js.map +1 -0
- package/dist/turns/history.d.ts +28 -0
- package/dist/turns/history.d.ts.map +1 -0
- package/dist/turns/history.js +47 -0
- package/dist/turns/history.js.map +1 -0
- package/dist/turns/lost-reply.d.ts +31 -0
- package/dist/turns/lost-reply.d.ts.map +1 -0
- package/dist/turns/lost-reply.js +43 -0
- package/dist/turns/lost-reply.js.map +1 -0
- package/dist/turns/message-blocks.d.ts +9 -0
- package/dist/turns/message-blocks.d.ts.map +1 -0
- package/dist/turns/message-blocks.js +25 -0
- package/dist/turns/message-blocks.js.map +1 -0
- package/dist/turns/model-context.d.ts +81 -0
- package/dist/turns/model-context.d.ts.map +1 -0
- package/dist/turns/model-context.js +46 -0
- package/dist/turns/model-context.js.map +1 -0
- package/dist/turns/model-info.d.ts +7 -0
- package/dist/turns/model-info.d.ts.map +1 -0
- package/dist/turns/model-info.js +10 -0
- package/dist/turns/model-info.js.map +1 -0
- package/dist/turns/model-retry.d.ts +3 -0
- package/dist/turns/model-retry.d.ts.map +1 -0
- package/dist/turns/model-retry.js +23 -0
- package/dist/turns/model-retry.js.map +1 -0
- package/dist/turns/register-interruptions.d.ts +3 -0
- package/dist/turns/register-interruptions.d.ts.map +1 -0
- package/dist/turns/register-interruptions.js +31 -0
- package/dist/turns/register-interruptions.js.map +1 -0
- package/dist/turns/register-turns.d.ts +3 -0
- package/dist/turns/register-turns.d.ts.map +1 -0
- package/dist/turns/register-turns.js +66 -0
- package/dist/turns/register-turns.js.map +1 -0
- package/dist/turns/resolve.d.ts +7 -0
- package/dist/turns/resolve.d.ts.map +1 -0
- package/dist/turns/resolve.js +29 -0
- package/dist/turns/resolve.js.map +1 -0
- package/dist/turns/run-calls.d.ts +34 -0
- package/dist/turns/run-calls.d.ts.map +1 -0
- package/dist/turns/run-calls.js +99 -0
- package/dist/turns/run-calls.js.map +1 -0
- package/dist/turns/run-command.d.ts +26 -0
- package/dist/turns/run-command.d.ts.map +1 -0
- package/dist/turns/run-command.js +118 -0
- package/dist/turns/run-command.js.map +1 -0
- package/dist/turns/settle-calls.d.ts +17 -0
- package/dist/turns/settle-calls.d.ts.map +1 -0
- package/dist/turns/settle-calls.js +98 -0
- package/dist/turns/settle-calls.js.map +1 -0
- package/dist/turns/start-turn.d.ts +87 -0
- package/dist/turns/start-turn.d.ts.map +1 -0
- package/dist/turns/start-turn.js +40 -0
- package/dist/turns/start-turn.js.map +1 -0
- package/dist/turns/step.d.ts +8 -0
- package/dist/turns/step.d.ts.map +1 -0
- package/dist/turns/step.js +168 -0
- package/dist/turns/step.js.map +1 -0
- package/dist/ui/register-ui.d.ts +3 -0
- package/dist/ui/register-ui.d.ts.map +1 -0
- package/dist/ui/register-ui.js +75 -0
- package/dist/ui/register-ui.js.map +1 -0
- package/dist/web/components/call.css +2 -0
- package/dist/web/components/call.js +386 -0
- package/dist/web/components/connectors.css +2 -0
- package/dist/web/components/connectors.js +2403 -0
- package/dist/web/components/conversation.css +2 -0
- package/dist/web/components/conversation.js +4319 -0
- package/dist/web/components/mcp-sign-in.css +2 -0
- package/dist/web/components/mcp-sign-in.js +265 -0
- package/dist/web/components/model.css +2 -0
- package/dist/web/components/model.js +545 -0
- package/dist/web/components/question.css +2 -0
- package/dist/web/components/question.js +321 -0
- package/dist/web/components/sessions.css +2 -0
- package/dist/web/components/sessions.js +264 -0
- package/docs/connectors.md +86 -0
- package/docs/sections.md +27 -0
- package/locales/ar.json +418 -0
- package/locales/en.json +418 -0
- package/package.json +70 -0
package/dist/docs.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Ctx } from '@kvman/sdk';
|
|
2
|
+
/** Lists the documentation pages, sorted by topic. */
|
|
3
|
+
export declare function listDocs(): {
|
|
4
|
+
topic: string;
|
|
5
|
+
title: string;
|
|
6
|
+
}[];
|
|
7
|
+
/** Gives one documentation page; an unknown or invalid topic is `NOT_FOUND`. */
|
|
8
|
+
export declare function getDoc(topic: string): {
|
|
9
|
+
topic: string;
|
|
10
|
+
title: string;
|
|
11
|
+
markdown: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function registerDocs(ctx: Ctx): void;
|
|
14
|
+
//# sourceMappingURL=docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAoBvD,sDAAsD;AACtD,wBAAgB,QAAQ,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAO7D;AAED,gFAAgF;AAChF,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAUxF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAgB3C"}
|
package/dist/docs.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { ProblemError, z } from '@kvman/sdk';
|
|
5
|
+
// kvcoder's documentation pages (plan 08 §8.8, plan 09 §9.5): the Markdown files in `docs/`, served by
|
|
6
|
+
// `kvcoder.docs.list` and `kvcoder.docs.get`. The folder sits next to this module, from `src/` and from `dist/`.
|
|
7
|
+
const pagesFolder = fileURLToPath(new URL('../docs/', import.meta.url));
|
|
8
|
+
const topicPattern = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
9
|
+
function notFound(topic) {
|
|
10
|
+
return new ProblemError({ code: 'NOT_FOUND', message: `There is no documentation page ${topic}.` });
|
|
11
|
+
}
|
|
12
|
+
function titleOf(topic, markdown) {
|
|
13
|
+
for (const line of markdown.split('\n')) {
|
|
14
|
+
if (line.startsWith('# '))
|
|
15
|
+
return line.slice('# '.length);
|
|
16
|
+
}
|
|
17
|
+
return topic;
|
|
18
|
+
}
|
|
19
|
+
/** Lists the documentation pages, sorted by topic. */
|
|
20
|
+
export function listDocs() {
|
|
21
|
+
return readdirSync(pagesFolder)
|
|
22
|
+
.filter((entry) => entry.endsWith('.md'))
|
|
23
|
+
.map((entry) => entry.slice(0, -'.md'.length))
|
|
24
|
+
.filter((topic) => topicPattern.test(topic))
|
|
25
|
+
.sort()
|
|
26
|
+
.map((topic) => ({ topic, title: titleOf(topic, readFileSync(path.join(pagesFolder, `${topic}.md`), 'utf8')) }));
|
|
27
|
+
}
|
|
28
|
+
/** Gives one documentation page; an unknown or invalid topic is `NOT_FOUND`. */
|
|
29
|
+
export function getDoc(topic) {
|
|
30
|
+
if (!topicPattern.test(topic))
|
|
31
|
+
throw notFound(topic);
|
|
32
|
+
let markdown;
|
|
33
|
+
try {
|
|
34
|
+
markdown = readFileSync(path.join(pagesFolder, `${topic}.md`), 'utf8');
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT')
|
|
38
|
+
throw notFound(topic);
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
return { topic, title: titleOf(topic, markdown), markdown };
|
|
42
|
+
}
|
|
43
|
+
export function registerDocs(ctx) {
|
|
44
|
+
ctx.registerQuery('kvcoder.docs.list', {
|
|
45
|
+
description: 'Lists the documentation pages of kvcoder.',
|
|
46
|
+
public: true,
|
|
47
|
+
input: z.object({}),
|
|
48
|
+
output: z.array(z.object({ topic: z.string(), title: z.string() })),
|
|
49
|
+
handle: () => listDocs(),
|
|
50
|
+
});
|
|
51
|
+
ctx.registerQuery('kvcoder.docs.get', {
|
|
52
|
+
description: 'Gives one documentation page of kvcoder.',
|
|
53
|
+
public: true,
|
|
54
|
+
input: z.object({ topic: z.string().describe('The page topic: connectors or sections.') }),
|
|
55
|
+
output: z.object({ topic: z.string(), title: z.string(), markdown: z.string() }),
|
|
56
|
+
handle: (input) => getDoc(input.topic),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=docs.js.map
|
package/dist/docs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type TextEdit = {
|
|
2
|
+
oldText: string;
|
|
3
|
+
newText: string;
|
|
4
|
+
};
|
|
5
|
+
/** The edited file's text, how many replacements were made, and the line of the first one. */
|
|
6
|
+
export type EditedText = {
|
|
7
|
+
text: string;
|
|
8
|
+
replacements: number;
|
|
9
|
+
firstChangedLine: number;
|
|
10
|
+
};
|
|
11
|
+
/** Applies the edits to a file's text, or throws a `VALIDATION_FAILED` Problem that names the edit and why. */
|
|
12
|
+
export declare function applyEdits(original: string, edits: readonly TextEdit[]): EditedText;
|
|
13
|
+
//# sourceMappingURL=edit-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-text.d.ts","sourceRoot":"","sources":["../../src/files/edit-text.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,8FAA8F;AAC9F,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC;AAiC1F,+GAA+G;AAC/G,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,UAAU,CAYnF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { invalid } from "../problems.js";
|
|
2
|
+
const byteOrderMark = '';
|
|
3
|
+
const withLineFeeds = (text) => text.replaceAll('\r\n', '\n');
|
|
4
|
+
// Counts every place `needle` occurs, overlapping ones included, so text that could match two ways is refused.
|
|
5
|
+
function occurrences(content, needle) {
|
|
6
|
+
const found = [];
|
|
7
|
+
for (let index = content.indexOf(needle); index >= 0; index = content.indexOf(needle, index + 1))
|
|
8
|
+
found.push(index);
|
|
9
|
+
return found;
|
|
10
|
+
}
|
|
11
|
+
function locate(content, edit, editIndex) {
|
|
12
|
+
const oldText = withLineFeeds(edit.oldText);
|
|
13
|
+
if (oldText === '')
|
|
14
|
+
throw invalid(`edits[${editIndex}].oldText is empty.`);
|
|
15
|
+
const found = occurrences(content, oldText);
|
|
16
|
+
const [index] = found;
|
|
17
|
+
if (index === undefined)
|
|
18
|
+
throw invalid(`edits[${editIndex}] was not found; oldText must match the file exactly, including whitespace and line breaks.`);
|
|
19
|
+
if (found.length > 1)
|
|
20
|
+
throw invalid(`edits[${editIndex}] was found ${found.length} times; add more surrounding text so it matches once.`);
|
|
21
|
+
return { index, length: oldText.length, edit: editIndex, newText: withLineFeeds(edit.newText) };
|
|
22
|
+
}
|
|
23
|
+
function checkDisjoint(matches) {
|
|
24
|
+
for (let position = 1; position < matches.length; position += 1) {
|
|
25
|
+
const before = matches[position - 1];
|
|
26
|
+
const after = matches[position];
|
|
27
|
+
if (before !== undefined && after !== undefined && before.index + before.length > after.index)
|
|
28
|
+
throw invalid(`edits[${before.edit}] and edits[${after.edit}] overlap; merge them into one edit.`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Applies the edits to a file's text, or throws a `VALIDATION_FAILED` Problem that names the edit and why. */
|
|
32
|
+
export function applyEdits(original, edits) {
|
|
33
|
+
const hasMark = original.startsWith(byteOrderMark);
|
|
34
|
+
const body = hasMark ? original.slice(1) : original;
|
|
35
|
+
const crlf = body.indexOf('\r\n') >= 0 && body.indexOf('\r\n') === body.indexOf('\n') - 1;
|
|
36
|
+
const content = withLineFeeds(body);
|
|
37
|
+
const matches = edits.map((edit, editIndex) => locate(content, edit, editIndex)).sort((first, second) => first.index - second.index);
|
|
38
|
+
checkDisjoint(matches);
|
|
39
|
+
const edited = matches.reduceRight((text, match) => text.slice(0, match.index) + match.newText + text.slice(match.index + match.length), content);
|
|
40
|
+
if (edited === content)
|
|
41
|
+
throw invalid('The edits change nothing in the file.');
|
|
42
|
+
const first = matches[0]?.index ?? 0;
|
|
43
|
+
const lines = content.slice(0, first).split('\n').length;
|
|
44
|
+
return { text: (hasMark ? byteOrderMark : '') + (crlf ? edited.replaceAll('\n', '\r\n') : edited), replacements: matches.length, firstChangedLine: lines };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=edit-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-text.js","sourceRoot":"","sources":["../../src/files/edit-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-queue.d.ts","sourceRoot":"","sources":["../../src/files/file-queue.ts"],"names":[],"mappings":"AAKA,uGAAuG;AACvG,wBAAsB,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAY9F"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Runs the changes to one file one after another (plan 08 §8.5, ADR 0009, 160): the calls of a reply start together, and
|
|
2
|
+
// two edits that each read the original would lose the first one's write. The queue lives as long as its callers wait.
|
|
3
|
+
const tails = new Map();
|
|
4
|
+
/** Runs `run` after every earlier call with the same key has finished, whether it succeeded or not. */
|
|
5
|
+
export async function inOrder(key, run) {
|
|
6
|
+
const turn = (tails.get(key) ?? Promise.resolve()).then(run);
|
|
7
|
+
const tail = turn.then(() => undefined, () => undefined);
|
|
8
|
+
tails.set(key, tail);
|
|
9
|
+
try {
|
|
10
|
+
return await turn;
|
|
11
|
+
}
|
|
12
|
+
finally {
|
|
13
|
+
if (tails.get(key) === tail)
|
|
14
|
+
tails.delete(key);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=file-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-queue.js","sourceRoot":"","sources":["../../src/files/file-queue.ts"],"names":[],"mappings":"AAAA,yHAAyH;AACzH,uHAAuH;AAEvH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;AAE/C,uGAAuG;AACvG,MAAM,CAAC,KAAK,UAAU,OAAO,CAAS,GAAW,EAAE,GAA0B;IAC3E,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CACpB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACF,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI;YAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type Entry = {
|
|
2
|
+
name: string;
|
|
3
|
+
kind: 'file' | 'folder';
|
|
4
|
+
bytes: number;
|
|
5
|
+
};
|
|
6
|
+
export type Listing = {
|
|
7
|
+
path: string;
|
|
8
|
+
entries: Entry[];
|
|
9
|
+
truncated: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare function listEntries(workspace: string, input: {
|
|
12
|
+
path?: string | undefined;
|
|
13
|
+
}): Promise<Listing>;
|
|
14
|
+
//# sourceMappingURL=list-entries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-entries.d.ts","sourceRoot":"","sources":["../../src/files/list-entries.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAW7E,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB3G"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { invalid, notFound } from "../problems.js";
|
|
4
|
+
import { isMissing } from "./read-file.js";
|
|
5
|
+
import { resolveInWorkspace } from "./workspace-path.js";
|
|
6
|
+
// `fs list` (plan 08 §8.5, ADR 0011, 8): the files and folders of one folder inside the workspace folder, by name, at
|
|
7
|
+
// most 1000. A symlink is listed as what it points to, and one that points nowhere is left out.
|
|
8
|
+
const entriesLimit = 1000;
|
|
9
|
+
async function entryOf(folder, name) {
|
|
10
|
+
const found = await stat(path.join(folder, name)).catch((error) => {
|
|
11
|
+
if (isMissing(error))
|
|
12
|
+
return undefined;
|
|
13
|
+
throw error;
|
|
14
|
+
});
|
|
15
|
+
if (found?.isDirectory() === true)
|
|
16
|
+
return { name, kind: 'folder', bytes: 0 };
|
|
17
|
+
return found?.isFile() === true ? { name, kind: 'file', bytes: found.size } : undefined;
|
|
18
|
+
}
|
|
19
|
+
export async function listEntries(workspace, input) {
|
|
20
|
+
const requested = input.path === undefined || input.path === '' ? '.' : input.path;
|
|
21
|
+
const folder = await resolveInWorkspace(workspace, requested);
|
|
22
|
+
const names = await readdir(folder).catch((error) => {
|
|
23
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOTDIR')
|
|
24
|
+
throw invalid(`${requested} is a file; read it with fs read.`, { path: requested });
|
|
25
|
+
if (isMissing(error))
|
|
26
|
+
throw notFound(`${requested} doesn't exist.`, { path: requested });
|
|
27
|
+
throw error;
|
|
28
|
+
});
|
|
29
|
+
const entries = [];
|
|
30
|
+
for (const name of names.sort()) {
|
|
31
|
+
const entry = await entryOf(folder, name);
|
|
32
|
+
if (entry === undefined)
|
|
33
|
+
continue;
|
|
34
|
+
if (entries.length === entriesLimit)
|
|
35
|
+
return { path: requested, entries, truncated: true };
|
|
36
|
+
entries.push(entry);
|
|
37
|
+
}
|
|
38
|
+
return { path: requested, entries, truncated: false };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=list-entries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-entries.js","sourceRoot":"","sources":["../../src/files/list-entries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,sHAAsH;AACtH,gGAAgG;AAEhG,MAAM,YAAY,GAAG,IAAI,CAAC;AAM1B,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,IAAY;IACjD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACzE,IAAI,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACvC,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IACH,IAAI,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,KAAoC;IACvF,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IACnF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC3D,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,OAAO,CAAC,GAAG,SAAS,mCAAmC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/J,IAAI,SAAS,CAAC,KAAK,CAAC;YAAE,MAAM,QAAQ,CAAC,GAAG,SAAS,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACzF,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** The most lines one read returns, and the default. */
|
|
2
|
+
export declare const readLinesLimit = 2000;
|
|
3
|
+
export declare const isMissing: (error: unknown) => boolean;
|
|
4
|
+
/** A file's bytes as text, without a leading BOM; `undefined` when they aren't valid UTF-8. */
|
|
5
|
+
export declare function decodeText(bytes: Uint8Array): string | undefined;
|
|
6
|
+
export type FileRead = {
|
|
7
|
+
path: string;
|
|
8
|
+
fromLine: number;
|
|
9
|
+
totalLines: number;
|
|
10
|
+
content: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function readLines(workspace: string, input: {
|
|
13
|
+
path: string;
|
|
14
|
+
fromLine?: number | undefined;
|
|
15
|
+
lines?: number | undefined;
|
|
16
|
+
}): Promise<FileRead>;
|
|
17
|
+
//# sourceMappingURL=read-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/files/read-file.ts"],"names":[],"mappings":"AAOA,wDAAwD;AACxD,eAAO,MAAM,cAAc,OAAO,CAAC;AAMnC,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,OAA6G,CAAC;AAEzJ,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAOhE;AAOD,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/F,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsBxJ"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { invalid, notFound } from "../problems.js";
|
|
3
|
+
import { resolveInWorkspace } from "./workspace-path.js";
|
|
4
|
+
// `fs read` (plan 08 §8.5, ADR 0011, 8): whole lines of a text file inside the workspace folder, at most 2000 of them
|
|
5
|
+
// and 30 KB, with the file's line count so the agent can go on from `fromLine`.
|
|
6
|
+
/** The most lines one read returns, and the default. */
|
|
7
|
+
export const readLinesLimit = 2000;
|
|
8
|
+
const contentLimit = 30 * 1024;
|
|
9
|
+
const text = new TextDecoder('utf-8', { fatal: true });
|
|
10
|
+
export const isMissing = (error) => error instanceof Error && 'code' in error && (error.code === 'ENOENT' || error.code === 'ENOTDIR');
|
|
11
|
+
/** A file's bytes as text, without a leading BOM; `undefined` when they aren't valid UTF-8. */
|
|
12
|
+
export function decodeText(bytes) {
|
|
13
|
+
try {
|
|
14
|
+
return text.decode(bytes);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error instanceof TypeError)
|
|
18
|
+
return undefined;
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// The start of a line that alone passes the limit, cut where a character ends.
|
|
23
|
+
function cutLine(line) {
|
|
24
|
+
return new TextDecoder('utf-8').decode(Buffer.from(line, 'utf8').subarray(0, contentLimit)).replace(/�+$/, '');
|
|
25
|
+
}
|
|
26
|
+
export async function readLines(workspace, input) {
|
|
27
|
+
const target = await resolveInWorkspace(workspace, input.path);
|
|
28
|
+
const found = await stat(target).catch((error) => {
|
|
29
|
+
if (isMissing(error))
|
|
30
|
+
throw notFound(`${input.path} doesn't exist.`, { path: input.path });
|
|
31
|
+
throw error;
|
|
32
|
+
});
|
|
33
|
+
if (found.isDirectory())
|
|
34
|
+
throw invalid(`${input.path} is a folder; list it with fs list.`, { path: input.path });
|
|
35
|
+
const decoded = decodeText(await readFile(target));
|
|
36
|
+
if (decoded === undefined)
|
|
37
|
+
throw invalid(`${input.path} isn't valid UTF-8 text, so it isn't read.`, { path: input.path });
|
|
38
|
+
const all = decoded.match(/[^\n]*\n|[^\n]+$/g) ?? [];
|
|
39
|
+
const fromLine = input.fromLine ?? 1;
|
|
40
|
+
const wanted = all.slice(fromLine - 1, fromLine - 1 + (input.lines ?? readLinesLimit));
|
|
41
|
+
const kept = [];
|
|
42
|
+
let bytes = 0;
|
|
43
|
+
for (const line of wanted) {
|
|
44
|
+
bytes += Buffer.byteLength(line);
|
|
45
|
+
if (bytes > contentLimit)
|
|
46
|
+
break;
|
|
47
|
+
kept.push(line);
|
|
48
|
+
}
|
|
49
|
+
const [first] = wanted;
|
|
50
|
+
const content = kept.length === 0 && first !== undefined ? cutLine(first) : kept.join('');
|
|
51
|
+
return { path: input.path, fromLine, totalLines: all.length, content };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=read-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/files/read-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type Match = {
|
|
2
|
+
path: string;
|
|
3
|
+
line: number;
|
|
4
|
+
text: string;
|
|
5
|
+
};
|
|
6
|
+
export type SearchResult = {
|
|
7
|
+
matches: Match[];
|
|
8
|
+
truncated: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function searchText(workspace: string, input: {
|
|
11
|
+
pattern: string;
|
|
12
|
+
path?: string | undefined;
|
|
13
|
+
}, signal: AbortSignal): Promise<SearchResult>;
|
|
14
|
+
//# sourceMappingURL=search-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-text.d.ts","sourceRoot":"","sources":["../../src/files/search-text.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAwBpE,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAsBrJ"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { readdir, readFile, realpath, stat } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { invalid, notFound } from "../problems.js";
|
|
4
|
+
import { decodeText, isMissing } from "./read-file.js";
|
|
5
|
+
import { resolveInWorkspace } from "./workspace-path.js";
|
|
6
|
+
// `fs search` (plan 08 §8.5, ADR 0011, 8): the lines that match a regular expression, in a file or under a folder
|
|
7
|
+
// inside the workspace folder, in path order. Dependency and dot folders are skipped, and so is anything that isn't
|
|
8
|
+
// UTF-8 text; a symlink is never followed, so the walk can't leave the workspace or loop.
|
|
9
|
+
const matchesLimit = 200;
|
|
10
|
+
const lineLimit = 500;
|
|
11
|
+
const skipped = (name) => name === 'node_modules' || name.startsWith('.');
|
|
12
|
+
function expression(pattern) {
|
|
13
|
+
try {
|
|
14
|
+
return new RegExp(pattern);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error instanceof SyntaxError)
|
|
18
|
+
throw invalid(`The pattern isn't a regular expression: ${error.message}`, { pattern });
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Every file under `folder`, in path order.
|
|
23
|
+
async function* filesUnder(folder, signal) {
|
|
24
|
+
for (const entry of (await readdir(folder, { withFileTypes: true })).sort((first, second) => (first.name < second.name ? -1 : 1))) {
|
|
25
|
+
signal.throwIfAborted();
|
|
26
|
+
const child = path.join(folder, entry.name);
|
|
27
|
+
if (skipped(entry.name))
|
|
28
|
+
continue;
|
|
29
|
+
if (entry.isDirectory())
|
|
30
|
+
yield* filesUnder(child, signal);
|
|
31
|
+
else if (entry.isFile())
|
|
32
|
+
yield child;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function searchText(workspace, input, signal) {
|
|
36
|
+
const pattern = expression(input.pattern);
|
|
37
|
+
const requested = input.path === undefined || input.path === '' ? '.' : input.path;
|
|
38
|
+
const target = await resolveInWorkspace(workspace, requested);
|
|
39
|
+
const found = await stat(target).catch((error) => {
|
|
40
|
+
if (isMissing(error))
|
|
41
|
+
throw notFound(`${requested} doesn't exist.`, { path: requested });
|
|
42
|
+
throw error;
|
|
43
|
+
});
|
|
44
|
+
const base = await realpath(workspace);
|
|
45
|
+
const files = found.isDirectory() ? filesUnder(target, signal) : [target];
|
|
46
|
+
const matches = [];
|
|
47
|
+
for await (const file of files) {
|
|
48
|
+
const text = decodeText(await readFile(file));
|
|
49
|
+
if (text === undefined)
|
|
50
|
+
continue;
|
|
51
|
+
const shown = path.relative(base, file).split(path.sep).join('/');
|
|
52
|
+
for (const [index, line] of text.split(/\r?\n/).entries()) {
|
|
53
|
+
if (!pattern.test(line))
|
|
54
|
+
continue;
|
|
55
|
+
if (matches.length === matchesLimit)
|
|
56
|
+
return { matches, truncated: true };
|
|
57
|
+
matches.push({ path: shown, line: index + 1, text: line.slice(0, lineLimit) });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { matches, truncated: false };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=search-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-text.js","sourceRoot":"","sources":["../../src/files/search-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The lexical path of `requested` in the workspace folder: the key calls on one file are ordered by. */
|
|
2
|
+
export declare const lexicalPath: (workspace: string, requested: string) => string;
|
|
3
|
+
/** The real path of `requested` when it is inside the workspace folder; otherwise a `VALIDATION_FAILED` Problem. */
|
|
4
|
+
export declare function resolveInWorkspace(workspace: string, requested: string): Promise<string>;
|
|
5
|
+
//# sourceMappingURL=workspace-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-path.d.ts","sourceRoot":"","sources":["../../src/files/workspace-path.ts"],"names":[],"mappings":"AAyBA,yGAAyG;AACzG,eAAO,MAAM,WAAW,GAAI,WAAW,MAAM,EAAE,WAAW,MAAM,KAAG,MAA4C,CAAC;AAEhH,oHAAoH;AACpH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM9F"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { lstat, realpath } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { invalid } from "../problems.js";
|
|
4
|
+
// Where `fs` may write (plan 08 §8.5, ADR 0009, 158): inside the workspace folder, after symlinks are resolved. A
|
|
5
|
+
// path that doesn't exist yet is resolved on its nearest existing ancestor.
|
|
6
|
+
const isMissing = (error) => error instanceof Error && 'code' in error && (error.code === 'ENOENT' || error.code === 'ENOTDIR');
|
|
7
|
+
// The real path of `target`, resolving the nearest ancestor that exists and appending what doesn't exist yet.
|
|
8
|
+
async function realPathOf(target, requested) {
|
|
9
|
+
const missing = [];
|
|
10
|
+
for (let existing = target;; existing = path.dirname(existing)) {
|
|
11
|
+
try {
|
|
12
|
+
return path.join(await realpath(existing), ...missing.reverse());
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (!isMissing(error))
|
|
16
|
+
throw error;
|
|
17
|
+
// A symlink to nothing would make a write create its target, wherever that is.
|
|
18
|
+
if ((await lstat(existing).catch(() => undefined))?.isSymbolicLink() === true)
|
|
19
|
+
throw invalid(`${requested} goes through a symlink that points nowhere.`, { path: requested });
|
|
20
|
+
if (path.dirname(existing) === existing)
|
|
21
|
+
throw error;
|
|
22
|
+
missing.push(path.basename(existing));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** The lexical path of `requested` in the workspace folder: the key calls on one file are ordered by. */
|
|
27
|
+
export const lexicalPath = (workspace, requested) => path.resolve(workspace, requested);
|
|
28
|
+
/** The real path of `requested` when it is inside the workspace folder; otherwise a `VALIDATION_FAILED` Problem. */
|
|
29
|
+
export async function resolveInWorkspace(workspace, requested) {
|
|
30
|
+
const base = await realpath(workspace);
|
|
31
|
+
const target = await realPathOf(lexicalPath(workspace, requested), requested);
|
|
32
|
+
const relative = path.relative(base, target);
|
|
33
|
+
if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))
|
|
34
|
+
throw invalid(`${requested} is outside the workspace folder.`, { path: requested });
|
|
35
|
+
return target;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=workspace-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-path.js","sourceRoot":"","sources":["../../src/files/workspace-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,kHAAkH;AAClH,4EAA4E;AAE5E,MAAM,SAAS,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;AAElJ,8GAA8G;AAC9G,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,SAAiB;IACzD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,QAAQ,GAAG,MAAM,GAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YACnC,+EAA+E;YAC/E,IAAI,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,IAAI;gBAAE,MAAM,OAAO,CAAC,GAAG,SAAS,8CAA8C,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAC9K,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC;AAED,yGAAyG;AACzG,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAEhH,oHAAoH;AACpH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,SAAiB;IAC3E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,MAAM,OAAO,CAAC,GAAG,SAAS,mCAAmC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAChL,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AA8BtC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AACzE,YAAY,EAAE,MAAM,UAAU,CAAC;yBAGf,KAAK,GAAG,KAAG,IAAI;AAA/B,wBAqCE"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { registerArtifacts } from "./artifacts/register-artifacts.js";
|
|
2
|
+
import { registerConnectorHelp } from "./calls/connector-help.js";
|
|
3
|
+
import { registerArtifactConnector } from "./connectors/artifact.js";
|
|
4
|
+
import { registerAskConnector } from "./connectors/ask.js";
|
|
5
|
+
import { registerBackgroundConnector } from "./connectors/background.js";
|
|
6
|
+
import { registerBinaryConnector } from "./connectors/binary.js";
|
|
7
|
+
import { registerFsConnector } from "./connectors/fs.js";
|
|
8
|
+
import { registerMcpConnector } from "./connectors/mcp.js";
|
|
9
|
+
import { registerShellConnector } from "./connectors/shell.js";
|
|
10
|
+
import { registerDelegateConnector } from "./connectors/delegate.js";
|
|
11
|
+
import { registerWorkerRun } from "./delegate/register-worker-run.js";
|
|
12
|
+
import { registerDocs } from "./docs.js";
|
|
13
|
+
import { registerProcessHandlers, interruptLeftovers } from "./jobs/process-handlers.js";
|
|
14
|
+
import { registerJobs } from "./jobs/register-jobs.js";
|
|
15
|
+
import { registerMcp } from "./mcp/register-mcp.js";
|
|
16
|
+
import { registerMessages } from "./messages/register-messages.js";
|
|
17
|
+
import { registerPrompt } from "./prompt/register-prompt.js";
|
|
18
|
+
import { clearConnectors, registerConnectors } from "./registry/register-connectors.js";
|
|
19
|
+
import { registerSections } from "./registry/register-sections.js";
|
|
20
|
+
import { clearSessionPoints, registerSessionPoints } from "./registry/session-points.js";
|
|
21
|
+
import { registerSettings } from "./register-settings.js";
|
|
22
|
+
import { registerForkExport } from "./sessions/register-fork-export.js";
|
|
23
|
+
import { registerLifecycle } from "./sessions/register-lifecycle.js";
|
|
24
|
+
import { registerSessions } from "./sessions/register-sessions.js";
|
|
25
|
+
import { registerInterruptions } from "./turns/register-interruptions.js";
|
|
26
|
+
import { registerTurns } from "./turns/register-turns.js";
|
|
27
|
+
import { registerStep } from "./turns/step.js";
|
|
28
|
+
import { registerUi } from "./ui/register-ui.js";
|
|
29
|
+
// kvcoder (plan 08): the app-building harness, with one `run` tool over connectors, sections, and its conversation UI.
|
|
30
|
+
export default (ctx) => {
|
|
31
|
+
registerSettings(ctx);
|
|
32
|
+
registerSessions(ctx);
|
|
33
|
+
registerForkExport(ctx);
|
|
34
|
+
registerLifecycle(ctx);
|
|
35
|
+
registerMessages(ctx);
|
|
36
|
+
registerTurns(ctx);
|
|
37
|
+
registerStep(ctx);
|
|
38
|
+
registerShellConnector(ctx);
|
|
39
|
+
registerBinaryConnector(ctx);
|
|
40
|
+
registerFsConnector(ctx);
|
|
41
|
+
registerArtifactConnector(ctx);
|
|
42
|
+
registerBackgroundConnector(ctx);
|
|
43
|
+
registerAskConnector(ctx);
|
|
44
|
+
registerDelegateConnector(ctx);
|
|
45
|
+
registerWorkerRun(ctx);
|
|
46
|
+
registerMcpConnector(ctx);
|
|
47
|
+
registerMcp(ctx);
|
|
48
|
+
registerConnectorHelp(ctx);
|
|
49
|
+
registerInterruptions(ctx);
|
|
50
|
+
registerJobs(ctx);
|
|
51
|
+
registerArtifacts(ctx);
|
|
52
|
+
registerProcessHandlers(ctx);
|
|
53
|
+
registerConnectors(ctx);
|
|
54
|
+
registerSections(ctx);
|
|
55
|
+
registerDocs(ctx);
|
|
56
|
+
registerSessionPoints(ctx);
|
|
57
|
+
registerPrompt(ctx);
|
|
58
|
+
registerUi(ctx);
|
|
59
|
+
ctx.registerHandler('kernel.started', {
|
|
60
|
+
description: 'Clears the connectors and session handlers, which extensions register again at each start, and marks the processes that no longer run.',
|
|
61
|
+
handle: async () => {
|
|
62
|
+
await clearConnectors(ctx);
|
|
63
|
+
await clearSessionPoints(ctx);
|
|
64
|
+
await interruptLeftovers(ctx);
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKjD,uHAAuH;AACvH,eAAe,CAAC,GAAQ,EAAQ,EAAE;IAChC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,aAAa,CAAC,GAAG,CAAC,CAAC;IACnB,YAAY,CAAC,GAAG,CAAC,CAAC;IAClB,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC5B,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC7B,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACzB,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAC/B,2BAA2B,CAAC,GAAG,CAAC,CAAC;IACjC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1B,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAC/B,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvB,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1B,WAAW,CAAC,GAAG,CAAC,CAAC;IACjB,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3B,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3B,YAAY,CAAC,GAAG,CAAC,CAAC;IAClB,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvB,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC7B,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,YAAY,CAAC,GAAG,CAAC,CAAC;IAClB,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3B,cAAc,CAAC,GAAG,CAAC,CAAC;IACpB,UAAU,CAAC,GAAG,CAAC,CAAC;IAChB,GAAG,CAAC,eAAe,CAAC,gBAAgB,EAAE;QACpC,WAAW,EAAE,wIAAwI;QACrJ,MAAM,EAAE,KAAK,IAAI,EAAE;YACjB,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Ctx, Json } from '@kvman/sdk';
|
|
2
|
+
export type JobRow = {
|
|
3
|
+
id: string;
|
|
4
|
+
kind: 'process' | 'subagent' | 'worker';
|
|
5
|
+
title: string;
|
|
6
|
+
call: string;
|
|
7
|
+
status: string;
|
|
8
|
+
startedAt: string;
|
|
9
|
+
endedAt?: string;
|
|
10
|
+
exitCode?: number;
|
|
11
|
+
};
|
|
12
|
+
export type JobDetail = {
|
|
13
|
+
row: JobRow;
|
|
14
|
+
detail: Record<string, Json>;
|
|
15
|
+
};
|
|
16
|
+
/** One job of the session by its id, with its output or problem; `undefined` when the session started no such job. */
|
|
17
|
+
export declare function jobDetail(ctx: Ctx, sessionId: string, id: string): Promise<JobDetail | undefined>;
|
|
18
|
+
/** The session's newest 50 jobs, newest first. */
|
|
19
|
+
export declare function jobRows(ctx: Ctx, sessionId: string): Promise<JobRow[]>;
|
|
20
|
+
/** What the person's list adds to a row: the localhost links in a process's output. */
|
|
21
|
+
export declare function linksOf(ctx: Ctx, sessionId: string, row: JobRow): Promise<string[]>;
|
|
22
|
+
/** Stops a process or a run, or cancels a subagent and tells the session; `false` for a process or a run that had ended already. */
|
|
23
|
+
export declare function cancelJob(ctx: Ctx, sessionId: string, row: JobRow, by: 'agent' | 'person'): Promise<boolean>;
|
|
24
|
+
//# sourceMappingURL=job-rows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-rows.d.ts","sourceRoot":"","sources":["../../src/jobs/job-rows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAU,MAAM,YAAY,CAAC;AAepD,MAAM,MAAM,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAClL,MAAM,MAAM,SAAS,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;CAAE,CAAC;AA2BtE,sHAAsH;AACtH,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAOvG;AAED,kDAAkD;AAClD,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAM5E;AAED,uFAAuF;AACvF,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIzF;AAED,oIAAoI;AACpI,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAclH"}
|