@loopstack/github-oauth-example 0.1.1 → 0.2.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.
Files changed (29) hide show
  1. package/dist/tools/authenticate-github-task.tool.d.ts +9 -8
  2. package/dist/tools/authenticate-github-task.tool.d.ts.map +1 -1
  3. package/dist/tools/authenticate-github-task.tool.js +30 -62
  4. package/dist/tools/authenticate-github-task.tool.js.map +1 -1
  5. package/dist/workflows/github-agent.ui.yaml +16 -0
  6. package/dist/workflows/github-agent.workflow.d.ts +14 -13
  7. package/dist/workflows/github-agent.workflow.d.ts.map +1 -1
  8. package/dist/workflows/github-agent.workflow.js +155 -71
  9. package/dist/workflows/github-agent.workflow.js.map +1 -1
  10. package/dist/workflows/github-repos-overview.ui.yaml +17 -0
  11. package/dist/workflows/github-repos-overview.workflow.d.ts +77 -87
  12. package/dist/workflows/github-repos-overview.workflow.d.ts.map +1 -1
  13. package/dist/workflows/github-repos-overview.workflow.js +177 -228
  14. package/dist/workflows/github-repos-overview.workflow.js.map +1 -1
  15. package/dist/workflows/templates/repoOverview.md +81 -0
  16. package/dist/workflows/templates/systemMessage.md +23 -0
  17. package/package.json +7 -7
  18. package/src/tools/authenticate-github-task.tool.ts +34 -82
  19. package/src/workflows/__tests__/github-repos-overview-workflow.spec.ts +105 -249
  20. package/src/workflows/github-agent.ui.yaml +16 -0
  21. package/src/workflows/github-agent.workflow.ts +109 -27
  22. package/src/workflows/github-repos-overview.ui.yaml +17 -0
  23. package/src/workflows/github-repos-overview.workflow.ts +257 -215
  24. package/src/workflows/templates/repoOverview.md +81 -0
  25. package/src/workflows/templates/systemMessage.md +23 -0
  26. package/dist/workflows/github-agent.workflow.yaml +0 -154
  27. package/dist/workflows/github-repos-overview.workflow.yaml +0 -249
  28. package/src/workflows/github-agent.workflow.yaml +0 -154
  29. package/src/workflows/github-repos-overview.workflow.yaml +0 -249
@@ -1,21 +1,22 @@
1
- import { Injectable } from '@nestjs/common';
2
1
  import { z } from 'zod';
3
2
  import {
4
3
  ClaudeGenerateText,
4
+ ClaudeGenerateTextResult,
5
5
  ClaudeMessageDocument,
6
6
  DelegateToolCalls,
7
+ DelegateToolCallsResult,
7
8
  UpdateToolResult,
8
9
  } from '@loopstack/claude-module';
9
10
  import {
10
- InjectDocument,
11
+ BaseWorkflow,
12
+ Guard,
13
+ Initial,
11
14
  InjectTool,
12
15
  InjectWorkflow,
13
- Runtime,
14
- State,
16
+ ToolResult,
17
+ Transition,
15
18
  Workflow,
16
- WorkflowInterface,
17
19
  } from '@loopstack/common';
18
- import { CreateDocument, LinkDocument, Task } from '@loopstack/core';
19
20
  import {
20
21
  GitHubCreateIssueCommentTool,
21
22
  GitHubCreateIssueTool,
@@ -46,21 +47,15 @@ import {
46
47
  import { OAuthWorkflow } from '@loopstack/oauth-module';
47
48
  import { AuthenticateGitHubTask } from '../tools/authenticate-github-task.tool';
48
49
 
49
- @Injectable()
50
50
  @Workflow({
51
- configFile: __dirname + '/github-agent.workflow.yaml',
51
+ uiConfig: __dirname + '/github-agent.ui.yaml',
52
52
  })
53
- export class GitHubAgentWorkflow implements WorkflowInterface {
54
- @InjectTool() createDocument: CreateDocument;
53
+ export class GitHubAgentWorkflow extends BaseWorkflow {
55
54
  @InjectTool() claudeGenerateText: ClaudeGenerateText;
56
55
  @InjectTool() delegateToolCalls: DelegateToolCalls;
57
56
  @InjectTool() updateToolResult: UpdateToolResult;
58
- @InjectTool() task: Task;
59
57
  @InjectTool() authenticateGitHub: AuthenticateGitHubTask;
60
58
 
61
- @InjectDocument() claudeMessageDocument: ClaudeMessageDocument;
62
- @InjectDocument() linkDocument: LinkDocument;
63
-
64
59
  // GitHub Repos tools
65
60
  @InjectTool() gitHubListRepos: GitHubListReposTool;
66
61
  @InjectTool() gitHubGetRepo: GitHubGetRepoTool;
@@ -102,17 +97,104 @@ export class GitHubAgentWorkflow implements WorkflowInterface {
102
97
 
103
98
  @InjectWorkflow() oAuth: OAuthWorkflow;
104
99
 
105
- @State({
106
- schema: z.object({
107
- llmResult: z.any().optional(),
108
- delegateResult: z.any().optional(),
109
- }),
110
- })
111
- state: {
112
- llmResult?: any;
113
- delegateResult?: any;
114
- };
115
-
116
- @Runtime()
117
- runtime: any;
100
+ llmResult?: ClaudeGenerateTextResult;
101
+ delegateResult?: DelegateToolCallsResult;
102
+
103
+ @Initial({ to: 'waiting_for_user' })
104
+ async setup() {
105
+ await this.repository.save(
106
+ ClaudeMessageDocument,
107
+ {
108
+ role: 'user',
109
+ content: this.render(__dirname + '/templates/systemMessage.md'),
110
+ },
111
+ { meta: { hidden: true } },
112
+ );
113
+ }
114
+
115
+ @Transition({ from: 'waiting_for_user', to: 'ready', wait: true, schema: z.string() })
116
+ async userMessage(payload: string) {
117
+ await this.repository.save(ClaudeMessageDocument, {
118
+ role: 'user',
119
+ content: payload,
120
+ });
121
+ }
122
+
123
+ @Transition({ from: 'ready', to: 'prompt_executed' })
124
+ async llmTurn() {
125
+ const result: ToolResult<ClaudeGenerateTextResult> = await this.claudeGenerateText.call({
126
+ system: `You are a helpful GitHub assistant with access to repository, issue, PR, code, actions,
127
+ and search tools. When a tool returns an unauthorized error, use authenticateGitHub
128
+ to let the user sign in, then retry. Be concise and format results using markdown.`,
129
+ claude: { model: 'claude-sonnet-4-6' },
130
+ messagesSearchTag: 'message',
131
+ tools: [
132
+ 'gitHubListRepos',
133
+ 'gitHubGetRepo',
134
+ 'gitHubCreateRepo',
135
+ 'gitHubListBranches',
136
+ 'gitHubListIssues',
137
+ 'gitHubGetIssue',
138
+ 'gitHubCreateIssue',
139
+ 'gitHubCreateIssueComment',
140
+ 'gitHubListPullRequests',
141
+ 'gitHubGetPullRequest',
142
+ 'gitHubCreatePullRequest',
143
+ 'gitHubMergePullRequest',
144
+ 'gitHubListPrReviews',
145
+ 'gitHubGetFileContent',
146
+ 'gitHubCreateOrUpdateFile',
147
+ 'gitHubListDirectory',
148
+ 'gitHubGetCommit',
149
+ 'gitHubListWorkflowRuns',
150
+ 'gitHubTriggerWorkflow',
151
+ 'gitHubGetWorkflowRun',
152
+ 'gitHubSearchCode',
153
+ 'gitHubSearchRepos',
154
+ 'gitHubSearchIssues',
155
+ 'gitHubGetAuthenticatedUser',
156
+ 'gitHubListUserOrgs',
157
+ 'authenticateGitHub',
158
+ ],
159
+ });
160
+ this.llmResult = result.data;
161
+ }
162
+
163
+ @Transition({ from: 'prompt_executed', to: 'awaiting_tools', priority: 10 })
164
+ @Guard('hasToolCalls')
165
+ async executeToolCalls() {
166
+ const result: ToolResult<DelegateToolCallsResult> = await this.delegateToolCalls.call({
167
+ message: this.llmResult!,
168
+ document: ClaudeMessageDocument,
169
+ callback: { transition: 'toolResultReceived' },
170
+ });
171
+ this.delegateResult = result.data;
172
+ }
173
+
174
+ hasToolCalls(): boolean {
175
+ return this.llmResult?.stop_reason === 'tool_use';
176
+ }
177
+
178
+ @Transition({ from: 'awaiting_tools', to: 'awaiting_tools', wait: true, schema: z.record(z.string(), z.unknown()) })
179
+ async toolResultReceived(payload: Record<string, unknown>) {
180
+ const result: ToolResult<DelegateToolCallsResult> = await this.updateToolResult.call({
181
+ delegateResult: this.delegateResult!,
182
+ completedTool: payload,
183
+ document: ClaudeMessageDocument,
184
+ });
185
+ this.delegateResult = result.data;
186
+ }
187
+
188
+ @Transition({ from: 'awaiting_tools', to: 'ready' })
189
+ @Guard('allToolsComplete')
190
+ allToolsCompleteTransition() {}
191
+
192
+ allToolsComplete(): boolean {
193
+ return this.delegateResult?.allCompleted ?? false;
194
+ }
195
+
196
+ @Transition({ from: 'prompt_executed', to: 'waiting_for_user' })
197
+ async respond() {
198
+ await this.repository.save(ClaudeMessageDocument, this.llmResult!, { id: this.llmResult!.id });
199
+ }
118
200
  }
@@ -0,0 +1,17 @@
1
+ title: 'GitHub Repository Overview'
2
+
3
+ description: |
4
+ Comprehensive GitHub example that exercises every GitHub tool.
5
+ Fetches user info, repository details, issues, pull requests, branches,
6
+ directory contents, workflow runs, and search results for a given repository.
7
+ If not authenticated, launches the OAuth sub-workflow and retries.
8
+
9
+ ui:
10
+ form:
11
+ properties:
12
+ owner:
13
+ title: 'Repository Owner'
14
+ placeholder: 'octocat'
15
+ repo:
16
+ title: 'Repository Name'
17
+ placeholder: 'Hello-World'