@geminixiang/mikan 1.0.0-beta.2 → 1.0.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +354 -0
- package/README.md +42 -16
- package/dist/adapter.d.ts +1 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +1 -0
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +36 -67
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +17 -42
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +148 -0
- package/dist/adapters/github/bot.d.ts.map +1 -0
- package/dist/adapters/github/bot.js +1031 -0
- package/dist/adapters/github/bot.js.map +1 -0
- package/dist/adapters/github/client.d.ts +118 -0
- package/dist/adapters/github/client.d.ts.map +1 -0
- package/dist/adapters/github/client.js +309 -0
- package/dist/adapters/github/client.js.map +1 -0
- package/dist/adapters/github/cloudbuild.d.ts +24 -0
- package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
- package/dist/adapters/github/cloudbuild.js +71 -0
- package/dist/adapters/github/cloudbuild.js.map +1 -0
- package/dist/adapters/github/context.d.ts +9 -0
- package/dist/adapters/github/context.d.ts.map +1 -0
- package/dist/adapters/github/context.js +175 -0
- package/dist/adapters/github/context.js.map +1 -0
- package/dist/adapters/github/gcp-auth.d.ts +31 -0
- package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
- package/dist/adapters/github/gcp-auth.js +196 -0
- package/dist/adapters/github/gcp-auth.js.map +1 -0
- package/dist/adapters/github/ids.d.ts +34 -0
- package/dist/adapters/github/ids.d.ts.map +1 -0
- package/dist/adapters/github/ids.js +53 -0
- package/dist/adapters/github/ids.js.map +1 -0
- package/dist/adapters/github/repo.d.ts +30 -0
- package/dist/adapters/github/repo.d.ts.map +1 -0
- package/dist/adapters/github/repo.js +136 -0
- package/dist/adapters/github/repo.js.map +1 -0
- package/dist/adapters/github/tool-pack.d.ts +14 -0
- package/dist/adapters/github/tool-pack.d.ts.map +1 -0
- package/dist/adapters/github/tool-pack.js +56 -0
- package/dist/adapters/github/tool-pack.js.map +1 -0
- package/dist/adapters/github/tools/checks.d.ts +24 -0
- package/dist/adapters/github/tools/checks.d.ts.map +1 -0
- package/dist/adapters/github/tools/checks.js +116 -0
- package/dist/adapters/github/tools/checks.js.map +1 -0
- package/dist/adapters/github/tools/issue.d.ts +22 -0
- package/dist/adapters/github/tools/issue.d.ts.map +1 -0
- package/dist/adapters/github/tools/issue.js +59 -0
- package/dist/adapters/github/tools/issue.js.map +1 -0
- package/dist/adapters/github/tools/pr.d.ts +22 -0
- package/dist/adapters/github/tools/pr.d.ts.map +1 -0
- package/dist/adapters/github/tools/pr.js +59 -0
- package/dist/adapters/github/tools/pr.js.map +1 -0
- package/dist/adapters/github/tools/read.d.ts +22 -0
- package/dist/adapters/github/tools/read.d.ts.map +1 -0
- package/dist/adapters/github/tools/read.js +152 -0
- package/dist/adapters/github/tools/read.js.map +1 -0
- package/dist/adapters/github/tools/review-reply.d.ts +19 -0
- package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
- package/dist/adapters/github/tools/review-reply.js +49 -0
- package/dist/adapters/github/tools/review-reply.js.map +1 -0
- package/dist/adapters/github/tools/sync.d.ts +17 -0
- package/dist/adapters/github/tools/sync.d.ts.map +1 -0
- package/dist/adapters/github/tools/sync.js +45 -0
- package/dist/adapters/github/tools/sync.js.map +1 -0
- package/dist/adapters/github/types.d.ts +350 -0
- package/dist/adapters/github/types.d.ts.map +1 -0
- package/dist/adapters/github/types.js +2 -0
- package/dist/adapters/github/types.js.map +1 -0
- package/dist/adapters/intake.d.ts +16 -5
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +79 -22
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +8 -6
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +81 -133
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +3 -14
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +14 -17
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/session.d.ts.map +1 -1
- package/dist/adapters/slack/session.js +5 -8
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/streaming.d.ts +4 -0
- package/dist/adapters/streaming.d.ts.map +1 -1
- package/dist/adapters/streaming.js +11 -0
- package/dist/adapters/streaming.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +1 -2
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +27 -62
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +8 -27
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +28 -2
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent.d.ts +38 -14
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +358 -224
- package/dist/agent.js.map +1 -1
- package/dist/cli/download.d.ts.map +1 -0
- package/dist/cli/download.js.map +1 -0
- package/dist/cli/ext-git.d.ts +22 -0
- package/dist/cli/ext-git.d.ts.map +1 -0
- package/dist/cli/ext-git.js +76 -0
- package/dist/cli/ext-git.js.map +1 -0
- package/dist/cli/ext.d.ts +2 -0
- package/dist/cli/ext.d.ts.map +1 -0
- package/dist/cli/ext.js +217 -0
- package/dist/cli/ext.js.map +1 -0
- package/dist/commands/admin.d.ts.map +1 -1
- package/dist/commands/admin.js +2 -1
- package/dist/commands/admin.js.map +1 -1
- package/dist/commands/auto-reply.d.ts.map +1 -1
- package/dist/commands/auto-reply.js +2 -6
- package/dist/commands/auto-reply.js.map +1 -1
- package/dist/commands/extensions.d.ts.map +1 -1
- package/dist/commands/extensions.js +16 -6
- package/dist/commands/extensions.js.map +1 -1
- package/dist/commands/login.d.ts +2 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +30 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/manifest.d.ts +72 -0
- package/dist/commands/manifest.d.ts.map +1 -0
- package/dist/commands/manifest.js +121 -0
- package/dist/commands/manifest.js.map +1 -0
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +3 -1
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +2 -1
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +16 -12
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/text.d.ts +2 -0
- package/dist/commands/text.d.ts.map +1 -0
- package/dist/commands/text.js +16 -0
- package/dist/commands/text.js.map +1 -0
- package/dist/commands/types.d.ts +14 -1
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +90 -54
- package/dist/config.js.map +1 -1
- package/dist/events.d.ts +10 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +14 -5
- package/dist/events.js.map +1 -1
- package/dist/execution-resolver.d.ts +3 -2
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +28 -12
- package/dist/execution-resolver.js.map +1 -1
- package/dist/harness/extensions/loader.d.ts +39 -9
- package/dist/harness/extensions/loader.d.ts.map +1 -1
- package/dist/harness/extensions/loader.js +258 -54
- package/dist/harness/extensions/loader.js.map +1 -1
- package/dist/harness/extensions/registry.d.ts +48 -1
- package/dist/harness/extensions/registry.d.ts.map +1 -1
- package/dist/harness/extensions/registry.js +146 -0
- package/dist/harness/extensions/registry.js.map +1 -1
- package/dist/harness/extensions/types.d.ts +161 -14
- package/dist/harness/extensions/types.d.ts.map +1 -1
- package/dist/harness/extensions/types.js.map +1 -1
- package/dist/harness/index.d.ts +5 -5
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +2 -2
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/models.d.ts +5 -0
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +10 -0
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/runner.d.ts +21 -2
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +80 -22
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session-store.d.ts +4 -1
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +11 -2
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/subagent-runner.d.ts +17 -0
- package/dist/harness/subagent-runner.d.ts.map +1 -0
- package/dist/harness/subagent-runner.js +307 -0
- package/dist/harness/subagent-runner.js.map +1 -0
- package/dist/harness/types.d.ts +53 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.js +232 -29
- package/dist/main.js.map +1 -1
- package/dist/provisioner.d.ts.map +1 -1
- package/dist/provisioner.js +2 -5
- package/dist/provisioner.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +264 -41
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +32 -5
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts +2 -0
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +7 -0
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts +3 -0
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +8 -2
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/firecracker.d.ts +2 -0
- package/dist/sandbox/firecracker.d.ts.map +1 -1
- package/dist/sandbox/firecracker.js +7 -1
- package/dist/sandbox/firecracker.js.map +1 -1
- package/dist/sandbox/gondolin-fleet.d.ts +104 -0
- package/dist/sandbox/gondolin-fleet.d.ts.map +1 -0
- package/dist/sandbox/gondolin-fleet.js +330 -0
- package/dist/sandbox/gondolin-fleet.js.map +1 -0
- package/dist/sandbox/gondolin-gateway.d.ts +85 -0
- package/dist/sandbox/gondolin-gateway.d.ts.map +1 -0
- package/dist/sandbox/gondolin-gateway.js +400 -0
- package/dist/sandbox/gondolin-gateway.js.map +1 -0
- package/dist/sandbox/gondolin-inventory.d.ts +89 -0
- package/dist/sandbox/gondolin-inventory.d.ts.map +1 -0
- package/dist/sandbox/gondolin-inventory.js +267 -0
- package/dist/sandbox/gondolin-inventory.js.map +1 -0
- package/dist/sandbox/gondolin-join.d.ts +62 -0
- package/dist/sandbox/gondolin-join.d.ts.map +1 -0
- package/dist/sandbox/gondolin-join.js +261 -0
- package/dist/sandbox/gondolin-join.js.map +1 -0
- package/dist/sandbox/gondolin-nfs-advisory.d.ts +15 -0
- package/dist/sandbox/gondolin-nfs-advisory.d.ts.map +1 -0
- package/dist/sandbox/gondolin-nfs-advisory.js +60 -0
- package/dist/sandbox/gondolin-nfs-advisory.js.map +1 -0
- package/dist/sandbox/gondolin-placement.d.ts +32 -0
- package/dist/sandbox/gondolin-placement.d.ts.map +1 -0
- package/dist/sandbox/gondolin-placement.js +83 -0
- package/dist/sandbox/gondolin-placement.js.map +1 -0
- package/dist/sandbox/gondolin-remote.d.ts +73 -0
- package/dist/sandbox/gondolin-remote.d.ts.map +1 -0
- package/dist/sandbox/gondolin-remote.js +352 -0
- package/dist/sandbox/gondolin-remote.js.map +1 -0
- package/dist/sandbox/gondolin-worker-client.d.ts +139 -0
- package/dist/sandbox/gondolin-worker-client.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker-client.js +325 -0
- package/dist/sandbox/gondolin-worker-client.js.map +1 -0
- package/dist/sandbox/gondolin-worker-main.d.ts +2 -0
- package/dist/sandbox/gondolin-worker-main.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker-main.js +22 -0
- package/dist/sandbox/gondolin-worker-main.js.map +1 -0
- package/dist/sandbox/gondolin-worker.d.ts +55 -0
- package/dist/sandbox/gondolin-worker.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker.js +201 -0
- package/dist/sandbox/gondolin-worker.js.map +1 -0
- package/dist/sandbox/gondolin.d.ts +52 -0
- package/dist/sandbox/gondolin.d.ts.map +1 -0
- package/dist/sandbox/gondolin.js +425 -0
- package/dist/sandbox/gondolin.js.map +1 -0
- package/dist/sandbox/host.d.ts +2 -0
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +11 -0
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +21 -0
- package/dist/sandbox/identity.d.ts.map +1 -0
- package/dist/sandbox/identity.js +36 -0
- package/dist/sandbox/identity.js.map +1 -0
- package/dist/sandbox/index.d.ts +4 -3
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +5 -3
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/types.d.ts +26 -1
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +11 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +35 -0
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/agent-memory-file-manager.d.ts.map +1 -1
- package/dist/sessions/agent-memory-file-manager.js +16 -30
- package/dist/sessions/agent-memory-file-manager.js.map +1 -1
- package/dist/sessions/history-line.d.ts +20 -0
- package/dist/sessions/history-line.d.ts.map +1 -0
- package/dist/sessions/history-line.js +24 -0
- package/dist/sessions/history-line.js.map +1 -0
- package/dist/sessions/policy.d.ts.map +1 -1
- package/dist/sessions/policy.js +5 -3
- package/dist/sessions/policy.js.map +1 -1
- package/dist/sessions/session-key.d.ts +31 -0
- package/dist/sessions/session-key.d.ts.map +1 -0
- package/dist/sessions/session-key.js +44 -0
- package/dist/sessions/session-key.js.map +1 -0
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +2 -2
- package/dist/sessions/store.js.map +1 -1
- package/dist/tools/bash.d.ts +3 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +24 -17
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +9 -12
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/event.d.ts +1 -1
- package/dist/tools/event.d.ts.map +1 -1
- package/dist/tools/event.js +33 -4
- package/dist/tools/event.js.map +1 -1
- package/dist/tools/generate-image.d.ts +17 -0
- package/dist/tools/generate-image.d.ts.map +1 -0
- package/dist/tools/generate-image.js +63 -0
- package/dist/tools/generate-image.js.map +1 -0
- package/dist/tools/index.d.ts +16 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +27 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/react.d.ts +15 -0
- package/dist/tools/react.d.ts.map +1 -0
- package/dist/tools/react.js +40 -0
- package/dist/tools/react.js.map +1 -0
- package/dist/tools/sandbox.d.ts +2 -2
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +8 -7
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/tools/subagent.d.ts +69 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +286 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/types.d.ts +34 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +1 -8
- package/dist/tools/write.js.map +1 -1
- package/dist/trigger.d.ts.map +1 -1
- package/dist/trigger.js +1 -2
- package/dist/trigger.js.map +1 -1
- package/dist/types.d.ts +139 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/disabled.d.ts +9 -0
- package/dist/vault/disabled.d.ts.map +1 -0
- package/dist/vault/disabled.js +23 -0
- package/dist/vault/disabled.js.map +1 -0
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +3 -24
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/policy.d.ts +20 -0
- package/dist/vault/policy.d.ts.map +1 -0
- package/dist/vault/policy.js +20 -0
- package/dist/vault/policy.js.map +1 -0
- package/dist/vault/routing.d.ts +1 -0
- package/dist/vault/routing.d.ts.map +1 -1
- package/dist/vault/routing.js +3 -10
- package/dist/vault/routing.js.map +1 -1
- package/dist/web/admin/portal.d.ts +27 -0
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +91 -130
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/types.d.ts +3 -0
- package/dist/web/admin/types.d.ts.map +1 -1
- package/dist/web/admin/types.js.map +1 -1
- package/dist/web/login/oauth.d.ts +2 -3
- package/dist/web/login/oauth.d.ts.map +1 -1
- package/dist/web/login/oauth.js +0 -31
- package/dist/web/login/oauth.js.map +1 -1
- package/dist/web/login/portal.js +1 -1
- package/dist/web/login/portal.js.map +1 -1
- package/dist/web/login/types.d.ts +0 -11
- package/dist/web/login/types.d.ts.map +1 -1
- package/dist/web/login/types.js.map +1 -1
- package/dist/web/portal-shell.d.ts +4 -0
- package/dist/web/portal-shell.d.ts.map +1 -0
- package/dist/{portal-shell.js → web/portal-shell.js} +2 -2
- package/dist/web/portal-shell.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +7 -0
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-view/command.d.ts.map +1 -1
- package/dist/web/session-view/command.js +4 -1
- package/dist/web/session-view/command.js.map +1 -1
- package/dist/web/session-view/portal.d.ts.map +1 -1
- package/dist/web/session-view/portal.js +4 -3
- package/dist/web/session-view/portal.js.map +1 -1
- package/dist/web/session-view/service.d.ts.map +1 -1
- package/dist/web/session-view/service.js +2 -1
- package/dist/web/session-view/service.js.map +1 -1
- package/dist/web/session-view/types.d.ts +2 -1
- package/dist/web/session-view/types.d.ts.map +1 -1
- package/dist/web/session-view/types.js.map +1 -1
- package/package.json +7 -4
- package/dist/download.d.ts.map +0 -1
- package/dist/download.js.map +0 -1
- package/dist/model-registry.d.ts +0 -4
- package/dist/model-registry.d.ts.map +0 -1
- package/dist/model-registry.js +0 -7
- package/dist/model-registry.js.map +0 -1
- package/dist/portal-shell.d.ts +0 -4
- package/dist/portal-shell.d.ts.map +0 -1
- package/dist/portal-shell.js.map +0 -1
- package/dist/runtime/agent-run-controller.d.ts +0 -31
- package/dist/runtime/agent-run-controller.d.ts.map +0 -1
- package/dist/runtime/agent-run-controller.js +0 -195
- package/dist/runtime/agent-run-controller.js.map +0 -1
- /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
- /package/dist/{download.js → cli/download.js} +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { GithubReadRequest, GithubReadResult } from "../types.js";
|
|
3
|
+
declare const githubReadSchema: import("@sinclair/typebox").TObject<{
|
|
4
|
+
action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"pr">, import("@sinclair/typebox").TLiteral<"pr_files">, import("@sinclair/typebox").TLiteral<"pr_reviews">, import("@sinclair/typebox").TLiteral<"issue">, import("@sinclair/typebox").TLiteral<"comments">, import("@sinclair/typebox").TLiteral<"list">]>;
|
|
5
|
+
number: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
6
|
+
state: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
7
|
+
labels: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
8
|
+
creator: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
9
|
+
}>;
|
|
10
|
+
export type GithubReadFn = (request: GithubReadRequest) => Promise<GithubReadResult>;
|
|
11
|
+
/**
|
|
12
|
+
* The `github_read` tool reads what the ./repo clone cannot show: PR diff
|
|
13
|
+
* stats and changed files, review state with open inline threads, and other
|
|
14
|
+
* issues/PRs in this repo for triage. Read-only, host-side, same-repo by
|
|
15
|
+
* construction; wired per run and only for GitHub conversations.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createGithubReadTool(): {
|
|
18
|
+
tool: AgentTool<typeof githubReadSchema>;
|
|
19
|
+
setGithubReadFunction: (fn: GithubReadFn | null) => void;
|
|
20
|
+
};
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../../src/adapters/github/tools/read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEvE,QAAA,MAAM,gBAAgB;;;;;;EA8BpB,CAAC;AAoGH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAErF;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI;IACtC,IAAI,EAAE,SAAS,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACzC,qBAAqB,EAAE,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;CAC1D,CAiCA"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
const githubReadSchema = Type.Object({
|
|
3
|
+
action: Type.Union([
|
|
4
|
+
Type.Literal("pr"),
|
|
5
|
+
Type.Literal("pr_files"),
|
|
6
|
+
Type.Literal("pr_reviews"),
|
|
7
|
+
Type.Literal("issue"),
|
|
8
|
+
Type.Literal("comments"),
|
|
9
|
+
Type.Literal("list"),
|
|
10
|
+
], {
|
|
11
|
+
description: "pr: PR metadata (state, base/head, diff stats). pr_files: changed files. " +
|
|
12
|
+
"pr_reviews: submitted reviews + open inline threads (with rc- ids for " +
|
|
13
|
+
"github_review_reply). issue: issue metadata. comments: recent conversation " +
|
|
14
|
+
"comments. list: issues/PRs in this repo.",
|
|
15
|
+
}),
|
|
16
|
+
number: Type.Optional(Type.Number({
|
|
17
|
+
description: "Issue/PR number to read; omit for this conversation's own.",
|
|
18
|
+
})),
|
|
19
|
+
state: Type.Optional(Type.String({ description: "list only: open | closed | all (default open)." })),
|
|
20
|
+
labels: Type.Optional(Type.String({ description: "list only: comma-separated label names to filter by." })),
|
|
21
|
+
creator: Type.Optional(Type.String({ description: "list only: filter by author login." })),
|
|
22
|
+
});
|
|
23
|
+
const MAX_BODY_CHARS = 1000;
|
|
24
|
+
const MAX_COMMENT_CHARS = 500;
|
|
25
|
+
const MAX_REVIEW_BODY_CHARS = 300;
|
|
26
|
+
function truncate(text, max) {
|
|
27
|
+
return text.length > max ? `${text.slice(0, max)}…` : text;
|
|
28
|
+
}
|
|
29
|
+
function formatResult(result) {
|
|
30
|
+
switch (result.kind) {
|
|
31
|
+
case "pr": {
|
|
32
|
+
const pr = result.pr;
|
|
33
|
+
const flags = [
|
|
34
|
+
pr.state ?? "unknown",
|
|
35
|
+
pr.draft ? "draft" : null,
|
|
36
|
+
pr.merged ? "merged" : null,
|
|
37
|
+
pr.mergeable_state ? `mergeable_state: ${pr.mergeable_state}` : null,
|
|
38
|
+
].filter(Boolean);
|
|
39
|
+
return [
|
|
40
|
+
`PR #${pr.number}: ${pr.title ?? ""} [${flags.join(", ")}]`,
|
|
41
|
+
`${pr.head?.ref ?? "?"} → ${pr.base?.ref ?? "?"} | ${pr.changed_files ?? "?"} files, +${pr.additions ?? "?"} -${pr.deletions ?? "?"}`,
|
|
42
|
+
pr.user ? `author: @${pr.user.login}` : null,
|
|
43
|
+
pr.body ? truncate(pr.body, MAX_BODY_CHARS) : "(no description)",
|
|
44
|
+
]
|
|
45
|
+
.filter(Boolean)
|
|
46
|
+
.join("\n");
|
|
47
|
+
}
|
|
48
|
+
case "pr_files": {
|
|
49
|
+
if (result.files.length === 0)
|
|
50
|
+
return "No changed files.";
|
|
51
|
+
const lines = result.files.map((file) => `${file.status.padEnd(8)} ${file.filename} +${file.additions} -${file.deletions}`);
|
|
52
|
+
return [`${result.files.length} changed file(s):`, ...lines].join("\n");
|
|
53
|
+
}
|
|
54
|
+
case "pr_reviews": {
|
|
55
|
+
const reviewLines = result.reviews
|
|
56
|
+
.filter((review) => review.state !== "PENDING")
|
|
57
|
+
.map((review) => {
|
|
58
|
+
const body = review.body?.trim()
|
|
59
|
+
? ` — ${truncate(review.body, MAX_REVIEW_BODY_CHARS)}`
|
|
60
|
+
: "";
|
|
61
|
+
return `@${review.user.login}: ${review.state}${body}`;
|
|
62
|
+
});
|
|
63
|
+
// Thread roots only: replies belong to their root's thread. The rc- id
|
|
64
|
+
// is what github_review_reply takes.
|
|
65
|
+
const rootThreads = result.threads.filter((comment) => comment.in_reply_to_id === undefined);
|
|
66
|
+
const threadLines = rootThreads.map((comment) => {
|
|
67
|
+
const location = comment.line !== null ? `${comment.path}:${comment.line}` : comment.path;
|
|
68
|
+
const replies = result.threads.filter((reply) => reply.in_reply_to_id === comment.id);
|
|
69
|
+
const replyNote = replies.length > 0
|
|
70
|
+
? ` (${replies.length} repl${replies.length === 1 ? "y" : "ies"})`
|
|
71
|
+
: "";
|
|
72
|
+
return `rc-${comment.id} ${location} @${comment.user.login}${replyNote}: ${truncate(comment.body, MAX_REVIEW_BODY_CHARS)}`;
|
|
73
|
+
});
|
|
74
|
+
return [
|
|
75
|
+
reviewLines.length > 0 ? `Reviews:\n${reviewLines.join("\n")}` : "No submitted reviews.",
|
|
76
|
+
threadLines.length > 0
|
|
77
|
+
? `Inline threads (reply with github_review_reply):\n${threadLines.join("\n")}`
|
|
78
|
+
: "No inline review threads.",
|
|
79
|
+
].join("\n\n");
|
|
80
|
+
}
|
|
81
|
+
case "issue": {
|
|
82
|
+
const issue = result.issue;
|
|
83
|
+
const labels = (issue.labels ?? []).map((label) => label.name).join(", ");
|
|
84
|
+
const assignees = (issue.assignees ?? []).map((assignee) => `@${assignee.login}`).join(", ");
|
|
85
|
+
return [
|
|
86
|
+
`#${issue.number}: ${issue.title} [${issue.state ?? "unknown"}${issue.pull_request ? ", PR" : ""}]`,
|
|
87
|
+
labels ? `labels: ${labels}` : null,
|
|
88
|
+
assignees ? `assignees: ${assignees}` : null,
|
|
89
|
+
`author: @${issue.user.login}`,
|
|
90
|
+
issue.body ? truncate(issue.body, MAX_BODY_CHARS) : "(no body)",
|
|
91
|
+
]
|
|
92
|
+
.filter(Boolean)
|
|
93
|
+
.join("\n");
|
|
94
|
+
}
|
|
95
|
+
case "comments": {
|
|
96
|
+
if (result.comments.length === 0)
|
|
97
|
+
return "No comments.";
|
|
98
|
+
return result.comments
|
|
99
|
+
.map((comment) => `@${comment.user.login} (${comment.created_at}): ${truncate(comment.body, MAX_COMMENT_CHARS)}`)
|
|
100
|
+
.join("\n");
|
|
101
|
+
}
|
|
102
|
+
case "list": {
|
|
103
|
+
if (result.issues.length === 0)
|
|
104
|
+
return "No matching issues.";
|
|
105
|
+
return result.issues
|
|
106
|
+
.map((issue) => {
|
|
107
|
+
const labels = (issue.labels ?? []).map((label) => label.name).join(", ");
|
|
108
|
+
const kind = issue.pull_request ? "PR" : "issue";
|
|
109
|
+
return `#${issue.number} [${issue.state ?? "?"} ${kind}] ${issue.title}${labels ? ` (${labels})` : ""}`;
|
|
110
|
+
})
|
|
111
|
+
.join("\n");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* The `github_read` tool reads what the ./repo clone cannot show: PR diff
|
|
117
|
+
* stats and changed files, review state with open inline threads, and other
|
|
118
|
+
* issues/PRs in this repo for triage. Read-only, host-side, same-repo by
|
|
119
|
+
* construction; wired per run and only for GitHub conversations.
|
|
120
|
+
*/
|
|
121
|
+
export function createGithubReadTool() {
|
|
122
|
+
let readFn = null;
|
|
123
|
+
const tool = {
|
|
124
|
+
name: "github_read",
|
|
125
|
+
label: "github_read",
|
|
126
|
+
description: "Read GitHub metadata for this repo: PR state/diff stats (pr), changed files " +
|
|
127
|
+
"(pr_files), reviews and open inline threads (pr_reviews), issue metadata (issue), " +
|
|
128
|
+
"recent comments (comments), or a filtered issue/PR listing (list). number defaults " +
|
|
129
|
+
"to this conversation's issue/PR. Only available in GitHub conversations.",
|
|
130
|
+
parameters: githubReadSchema,
|
|
131
|
+
execute: async (_toolCallId, args, signal) => {
|
|
132
|
+
if (!readFn) {
|
|
133
|
+
throw new Error("github_read is only available in GitHub conversations.");
|
|
134
|
+
}
|
|
135
|
+
if (signal?.aborted) {
|
|
136
|
+
throw new Error("Operation aborted");
|
|
137
|
+
}
|
|
138
|
+
const result = await readFn(args);
|
|
139
|
+
return {
|
|
140
|
+
content: [{ type: "text", text: formatResult(result) }],
|
|
141
|
+
details: undefined,
|
|
142
|
+
};
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
return {
|
|
146
|
+
tool,
|
|
147
|
+
setGithubReadFunction: (fn) => {
|
|
148
|
+
readFn = fn;
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../../../src/adapters/github/tools/read.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { Type } from \"@sinclair/typebox\";\nimport type { GithubReadRequest, GithubReadResult } from \"../types.js\";\n\nconst githubReadSchema = Type.Object({\n action: Type.Union(\n [\n Type.Literal(\"pr\"),\n Type.Literal(\"pr_files\"),\n Type.Literal(\"pr_reviews\"),\n Type.Literal(\"issue\"),\n Type.Literal(\"comments\"),\n Type.Literal(\"list\"),\n ],\n {\n description:\n \"pr: PR metadata (state, base/head, diff stats). pr_files: changed files. \" +\n \"pr_reviews: submitted reviews + open inline threads (with rc- ids for \" +\n \"github_review_reply). issue: issue metadata. comments: recent conversation \" +\n \"comments. list: issues/PRs in this repo.\",\n },\n ),\n number: Type.Optional(\n Type.Number({\n description: \"Issue/PR number to read; omit for this conversation's own.\",\n }),\n ),\n state: Type.Optional(\n Type.String({ description: \"list only: open | closed | all (default open).\" }),\n ),\n labels: Type.Optional(\n Type.String({ description: \"list only: comma-separated label names to filter by.\" }),\n ),\n creator: Type.Optional(Type.String({ description: \"list only: filter by author login.\" })),\n});\n\nconst MAX_BODY_CHARS = 1000;\nconst MAX_COMMENT_CHARS = 500;\nconst MAX_REVIEW_BODY_CHARS = 300;\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max)}…` : text;\n}\n\nfunction formatResult(result: GithubReadResult): string {\n switch (result.kind) {\n case \"pr\": {\n const pr = result.pr;\n const flags = [\n pr.state ?? \"unknown\",\n pr.draft ? \"draft\" : null,\n pr.merged ? \"merged\" : null,\n pr.mergeable_state ? `mergeable_state: ${pr.mergeable_state}` : null,\n ].filter(Boolean);\n return [\n `PR #${pr.number}: ${pr.title ?? \"\"} [${flags.join(\", \")}]`,\n `${pr.head?.ref ?? \"?\"} → ${pr.base?.ref ?? \"?\"} | ${pr.changed_files ?? \"?\"} files, +${pr.additions ?? \"?\"} -${pr.deletions ?? \"?\"}`,\n pr.user ? `author: @${pr.user.login}` : null,\n pr.body ? truncate(pr.body, MAX_BODY_CHARS) : \"(no description)\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n }\n case \"pr_files\": {\n if (result.files.length === 0) return \"No changed files.\";\n const lines = result.files.map(\n (file) => `${file.status.padEnd(8)} ${file.filename} +${file.additions} -${file.deletions}`,\n );\n return [`${result.files.length} changed file(s):`, ...lines].join(\"\\n\");\n }\n case \"pr_reviews\": {\n const reviewLines = result.reviews\n .filter((review) => review.state !== \"PENDING\")\n .map((review) => {\n const body = review.body?.trim()\n ? ` — ${truncate(review.body, MAX_REVIEW_BODY_CHARS)}`\n : \"\";\n return `@${review.user.login}: ${review.state}${body}`;\n });\n // Thread roots only: replies belong to their root's thread. The rc- id\n // is what github_review_reply takes.\n const rootThreads = result.threads.filter((comment) => comment.in_reply_to_id === undefined);\n const threadLines = rootThreads.map((comment) => {\n const location = comment.line !== null ? `${comment.path}:${comment.line}` : comment.path;\n const replies = result.threads.filter((reply) => reply.in_reply_to_id === comment.id);\n const replyNote =\n replies.length > 0\n ? ` (${replies.length} repl${replies.length === 1 ? \"y\" : \"ies\"})`\n : \"\";\n return `rc-${comment.id} ${location} @${comment.user.login}${replyNote}: ${truncate(comment.body, MAX_REVIEW_BODY_CHARS)}`;\n });\n return [\n reviewLines.length > 0 ? `Reviews:\\n${reviewLines.join(\"\\n\")}` : \"No submitted reviews.\",\n threadLines.length > 0\n ? `Inline threads (reply with github_review_reply):\\n${threadLines.join(\"\\n\")}`\n : \"No inline review threads.\",\n ].join(\"\\n\\n\");\n }\n case \"issue\": {\n const issue = result.issue;\n const labels = (issue.labels ?? []).map((label) => label.name).join(\", \");\n const assignees = (issue.assignees ?? []).map((assignee) => `@${assignee.login}`).join(\", \");\n return [\n `#${issue.number}: ${issue.title} [${issue.state ?? \"unknown\"}${issue.pull_request ? \", PR\" : \"\"}]`,\n labels ? `labels: ${labels}` : null,\n assignees ? `assignees: ${assignees}` : null,\n `author: @${issue.user.login}`,\n issue.body ? truncate(issue.body, MAX_BODY_CHARS) : \"(no body)\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n }\n case \"comments\": {\n if (result.comments.length === 0) return \"No comments.\";\n return result.comments\n .map(\n (comment) =>\n `@${comment.user.login} (${comment.created_at}): ${truncate(comment.body, MAX_COMMENT_CHARS)}`,\n )\n .join(\"\\n\");\n }\n case \"list\": {\n if (result.issues.length === 0) return \"No matching issues.\";\n return result.issues\n .map((issue) => {\n const labels = (issue.labels ?? []).map((label) => label.name).join(\", \");\n const kind = issue.pull_request ? \"PR\" : \"issue\";\n return `#${issue.number} [${issue.state ?? \"?\"} ${kind}] ${issue.title}${labels ? ` (${labels})` : \"\"}`;\n })\n .join(\"\\n\");\n }\n }\n}\n\nexport type GithubReadFn = (request: GithubReadRequest) => Promise<GithubReadResult>;\n\n/**\n * The `github_read` tool reads what the ./repo clone cannot show: PR diff\n * stats and changed files, review state with open inline threads, and other\n * issues/PRs in this repo for triage. Read-only, host-side, same-repo by\n * construction; wired per run and only for GitHub conversations.\n */\nexport function createGithubReadTool(): {\n tool: AgentTool<typeof githubReadSchema>;\n setGithubReadFunction: (fn: GithubReadFn | null) => void;\n} {\n let readFn: GithubReadFn | null = null;\n\n const tool: AgentTool<typeof githubReadSchema> = {\n name: \"github_read\",\n label: \"github_read\",\n description:\n \"Read GitHub metadata for this repo: PR state/diff stats (pr), changed files \" +\n \"(pr_files), reviews and open inline threads (pr_reviews), issue metadata (issue), \" +\n \"recent comments (comments), or a filtered issue/PR listing (list). number defaults \" +\n \"to this conversation's issue/PR. Only available in GitHub conversations.\",\n parameters: githubReadSchema,\n execute: async (_toolCallId: string, args: GithubReadRequest, signal?: AbortSignal) => {\n if (!readFn) {\n throw new Error(\"github_read is only available in GitHub conversations.\");\n }\n if (signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n const result = await readFn(args);\n return {\n content: [{ type: \"text\" as const, text: formatResult(result) }],\n details: undefined,\n };\n },\n };\n\n return {\n tool,\n setGithubReadFunction: (fn) => {\n readFn = fn;\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
2
|
+
declare const githubReviewReplySchema: import("@sinclair/typebox").TObject<{
|
|
3
|
+
comment_id: import("@sinclair/typebox").TNumber;
|
|
4
|
+
body: import("@sinclair/typebox").TString;
|
|
5
|
+
}>;
|
|
6
|
+
export type GithubReviewReplyFn = (commentId: number, body: string) => Promise<{
|
|
7
|
+
url: string;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* The `github_review_reply` tool answers inside one inline PR review thread
|
|
11
|
+
* (the responder's normal replies post as plain PR comments instead). Runs
|
|
12
|
+
* host-side as the App; wired per run and only for GitHub conversations.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createGithubReviewReplyTool(): {
|
|
15
|
+
tool: AgentTool<typeof githubReviewReplySchema>;
|
|
16
|
+
setGithubReviewReplyFunction: (fn: GithubReviewReplyFn | null) => void;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=review-reply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-reply.d.ts","sourceRoot":"","sources":["../../../../src/adapters/github/tools/review-reply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,QAAA,MAAM,uBAAuB;;;EAO3B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEhG;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI;IAC7C,IAAI,EAAE,SAAS,CAAC,OAAO,uBAAuB,CAAC,CAAC;IAChD,4BAA4B,EAAE,CAAC,EAAE,EAAE,mBAAmB,GAAG,IAAI,KAAK,IAAI,CAAC;CACxE,CAyCA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
const githubReviewReplySchema = Type.Object({
|
|
3
|
+
comment_id: Type.Number({
|
|
4
|
+
description: "Numeric id from an [PR review comment rc-<id> …] message in this conversation " +
|
|
5
|
+
"(e.g. 8001 for rc-8001). The reply lands inside that comment's thread.",
|
|
6
|
+
}),
|
|
7
|
+
body: Type.String({ description: "Reply text (Markdown)." }),
|
|
8
|
+
});
|
|
9
|
+
/**
|
|
10
|
+
* The `github_review_reply` tool answers inside one inline PR review thread
|
|
11
|
+
* (the responder's normal replies post as plain PR comments instead). Runs
|
|
12
|
+
* host-side as the App; wired per run and only for GitHub conversations.
|
|
13
|
+
*/
|
|
14
|
+
export function createGithubReviewReplyTool() {
|
|
15
|
+
let replyFn = null;
|
|
16
|
+
const tool = {
|
|
17
|
+
name: "github_review_reply",
|
|
18
|
+
label: "github_review_reply",
|
|
19
|
+
description: "Reply inside a specific PR review thread. Use the numeric id from an " +
|
|
20
|
+
"[PR review comment rc-<id> …] message as comment_id; a plain response would post " +
|
|
21
|
+
"as a normal PR comment instead of in-thread. Only available in GitHub PR conversations.",
|
|
22
|
+
parameters: githubReviewReplySchema,
|
|
23
|
+
execute: async (_toolCallId, args, signal) => {
|
|
24
|
+
if (!replyFn) {
|
|
25
|
+
throw new Error("github_review_reply is only available in GitHub conversations.");
|
|
26
|
+
}
|
|
27
|
+
if (signal?.aborted) {
|
|
28
|
+
throw new Error("Operation aborted");
|
|
29
|
+
}
|
|
30
|
+
const result = await replyFn(args.comment_id, args.body);
|
|
31
|
+
return {
|
|
32
|
+
content: [
|
|
33
|
+
{
|
|
34
|
+
type: "text",
|
|
35
|
+
text: `Replied in review thread rc-${args.comment_id}: ${result.url}`,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
details: undefined,
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
return {
|
|
43
|
+
tool,
|
|
44
|
+
setGithubReviewReplyFunction: (fn) => {
|
|
45
|
+
replyFn = fn;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=review-reply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-reply.js","sourceRoot":"","sources":["../../../../src/adapters/github/tools/review-reply.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,MAAM,uBAAuB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;QACtB,WAAW,EACT,gFAAgF;YAChF,wEAAwE;KAC3E,CAAC;IACF,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;CAC7D,CAAC,CAAC;AAIH;;;;GAIG;AACH,MAAM,UAAU,2BAA2B;IAIzC,IAAI,OAAO,GAA+B,IAAI,CAAC;IAE/C,MAAM,IAAI,GAA8C;QACtD,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,uEAAuE;YACvE,mFAAmF;YACnF,yFAAyF;QAC3F,UAAU,EAAE,uBAAuB;QACnC,OAAO,EAAE,KAAK,EACZ,WAAmB,EACnB,IAA0C,EAC1C,MAAoB,EACpB,EAAE;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;YACpF,CAAC;YACD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,+BAA+B,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,GAAG,EAAE;qBACtE;iBACF;gBACD,OAAO,EAAE,SAAS;aACnB,CAAC;QACJ,CAAC;KACF,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,4BAA4B,EAAE,CAAC,EAAE,EAAE,EAAE;YACnC,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { Type } from \"@sinclair/typebox\";\n\nconst githubReviewReplySchema = Type.Object({\n comment_id: Type.Number({\n description:\n \"Numeric id from an [PR review comment rc-<id> …] message in this conversation \" +\n \"(e.g. 8001 for rc-8001). The reply lands inside that comment's thread.\",\n }),\n body: Type.String({ description: \"Reply text (Markdown).\" }),\n});\n\nexport type GithubReviewReplyFn = (commentId: number, body: string) => Promise<{ url: string }>;\n\n/**\n * The `github_review_reply` tool answers inside one inline PR review thread\n * (the responder's normal replies post as plain PR comments instead). Runs\n * host-side as the App; wired per run and only for GitHub conversations.\n */\nexport function createGithubReviewReplyTool(): {\n tool: AgentTool<typeof githubReviewReplySchema>;\n setGithubReviewReplyFunction: (fn: GithubReviewReplyFn | null) => void;\n} {\n let replyFn: GithubReviewReplyFn | null = null;\n\n const tool: AgentTool<typeof githubReviewReplySchema> = {\n name: \"github_review_reply\",\n label: \"github_review_reply\",\n description:\n \"Reply inside a specific PR review thread. Use the numeric id from an \" +\n \"[PR review comment rc-<id> …] message as comment_id; a plain response would post \" +\n \"as a normal PR comment instead of in-thread. Only available in GitHub PR conversations.\",\n parameters: githubReviewReplySchema,\n execute: async (\n _toolCallId: string,\n args: { comment_id: number; body: string },\n signal?: AbortSignal,\n ) => {\n if (!replyFn) {\n throw new Error(\"github_review_reply is only available in GitHub conversations.\");\n }\n if (signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n const result = await replyFn(args.comment_id, args.body);\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Replied in review thread rc-${args.comment_id}: ${result.url}`,\n },\n ],\n details: undefined,\n };\n },\n };\n\n return {\n tool,\n setGithubReviewReplyFunction: (fn) => {\n replyFn = fn;\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
2
|
+
declare const githubSyncSchema: import("@sinclair/typebox").TObject<{
|
|
3
|
+
branch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
4
|
+
}>;
|
|
5
|
+
export type GithubSyncFn = (branch?: string) => Promise<string>;
|
|
6
|
+
/**
|
|
7
|
+
* The `github_sync` tool refreshes the conversation's ./repo clone — a
|
|
8
|
+
* first-contact snapshot the sandbox cannot update itself (no credentials).
|
|
9
|
+
* Host-side fetch with an ephemeral read token; it reports instead of moving
|
|
10
|
+
* the checkout whenever that could lose the agent's local work.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createGithubSyncTool(): {
|
|
13
|
+
tool: AgentTool<typeof githubSyncSchema>;
|
|
14
|
+
setGithubSyncFunction: (fn: GithubSyncFn | null) => void;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../../src/adapters/github/tools/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,QAAA,MAAM,gBAAgB;;EAQpB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEhE;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI;IACtC,IAAI,EAAE,SAAS,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACzC,qBAAqB,EAAE,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;CAC1D,CAiCA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
const githubSyncSchema = Type.Object({
|
|
3
|
+
branch: Type.Optional(Type.String({
|
|
4
|
+
description: "Remote branch to fetch. Omit to fetch this PR's latest head (or the default " +
|
|
5
|
+
"branch in a plain-issue conversation).",
|
|
6
|
+
})),
|
|
7
|
+
});
|
|
8
|
+
/**
|
|
9
|
+
* The `github_sync` tool refreshes the conversation's ./repo clone — a
|
|
10
|
+
* first-contact snapshot the sandbox cannot update itself (no credentials).
|
|
11
|
+
* Host-side fetch with an ephemeral read token; it reports instead of moving
|
|
12
|
+
* the checkout whenever that could lose the agent's local work.
|
|
13
|
+
*/
|
|
14
|
+
export function createGithubSyncTool() {
|
|
15
|
+
let syncFn = null;
|
|
16
|
+
const tool = {
|
|
17
|
+
name: "github_sync",
|
|
18
|
+
label: "github_sync",
|
|
19
|
+
description: "Update ./repo from GitHub: fetches this PR's latest head (or the default branch, " +
|
|
20
|
+
"or a named branch) and fast-forwards the checkout when that cannot lose your work; " +
|
|
21
|
+
"otherwise it fetches to FETCH_HEAD and reports so you can merge or rebase yourself. " +
|
|
22
|
+
"Only available in GitHub conversations.",
|
|
23
|
+
parameters: githubSyncSchema,
|
|
24
|
+
execute: async (_toolCallId, args, signal) => {
|
|
25
|
+
if (!syncFn) {
|
|
26
|
+
throw new Error("github_sync is only available in GitHub conversations.");
|
|
27
|
+
}
|
|
28
|
+
if (signal?.aborted) {
|
|
29
|
+
throw new Error("Operation aborted");
|
|
30
|
+
}
|
|
31
|
+
const report = await syncFn(args.branch);
|
|
32
|
+
return {
|
|
33
|
+
content: [{ type: "text", text: report }],
|
|
34
|
+
details: undefined,
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
tool,
|
|
40
|
+
setGithubSyncFunction: (fn) => {
|
|
41
|
+
syncFn = fn;
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../../src/adapters/github/tools/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,IAAI,CAAC,QAAQ,CACnB,IAAI,CAAC,MAAM,CAAC;QACV,WAAW,EACT,8EAA8E;YAC9E,wCAAwC;KAC3C,CAAC,CACH;CACF,CAAC,CAAC;AAIH;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB;IAIlC,IAAI,MAAM,GAAwB,IAAI,CAAC;IAEvC,MAAM,IAAI,GAAuC;QAC/C,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,mFAAmF;YACnF,qFAAqF;YACrF,sFAAsF;YACtF,yCAAyC;QAC3C,UAAU,EAAE,gBAAgB;QAC5B,OAAO,EAAE,KAAK,EAAE,WAAmB,EAAE,IAAyB,EAAE,MAAoB,EAAE,EAAE;YACtF,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YAC5E,CAAC;YACD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBAClD,OAAO,EAAE,SAAS;aACnB,CAAC;QACJ,CAAC;KACF,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,qBAAqB,EAAE,CAAC,EAAE,EAAE,EAAE;YAC5B,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { Type } from \"@sinclair/typebox\";\n\nconst githubSyncSchema = Type.Object({\n branch: Type.Optional(\n Type.String({\n description:\n \"Remote branch to fetch. Omit to fetch this PR's latest head (or the default \" +\n \"branch in a plain-issue conversation).\",\n }),\n ),\n});\n\nexport type GithubSyncFn = (branch?: string) => Promise<string>;\n\n/**\n * The `github_sync` tool refreshes the conversation's ./repo clone — a\n * first-contact snapshot the sandbox cannot update itself (no credentials).\n * Host-side fetch with an ephemeral read token; it reports instead of moving\n * the checkout whenever that could lose the agent's local work.\n */\nexport function createGithubSyncTool(): {\n tool: AgentTool<typeof githubSyncSchema>;\n setGithubSyncFunction: (fn: GithubSyncFn | null) => void;\n} {\n let syncFn: GithubSyncFn | null = null;\n\n const tool: AgentTool<typeof githubSyncSchema> = {\n name: \"github_sync\",\n label: \"github_sync\",\n description:\n \"Update ./repo from GitHub: fetches this PR's latest head (or the default branch, \" +\n \"or a named branch) and fast-forwards the checkout when that cannot lose your work; \" +\n \"otherwise it fetches to FETCH_HEAD and reports so you can merge or rebase yourself. \" +\n \"Only available in GitHub conversations.\",\n parameters: githubSyncSchema,\n execute: async (_toolCallId: string, args: { branch?: string }, signal?: AbortSignal) => {\n if (!syncFn) {\n throw new Error(\"github_sync is only available in GitHub conversations.\");\n }\n if (signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n const report = await syncFn(args.branch);\n return {\n content: [{ type: \"text\" as const, text: report }],\n details: undefined,\n };\n },\n };\n\n return {\n tool,\n setGithubSyncFunction: (fn) => {\n syncFn = fn;\n },\n };\n}\n"]}
|