@orgloop/connector-openclaw 0.1.8 → 0.1.9

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/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@orgloop/connector-openclaw",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "description": "OrgLoop OpenClaw connector — webhook target for agent waking",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "dependencies": {
9
- "@orgloop/sdk": "0.1.8"
9
+ "@orgloop/sdk": "0.1.9"
10
10
  },
11
11
  "orgloop": {
12
12
  "type": "connector",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=detector.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detector.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/detector.test.ts"],"names":[],"mappings":""}
@@ -1,62 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { OpenClawServiceDetector } from '../detector.js';
3
- describe('OpenClawServiceDetector', () => {
4
- let detector;
5
- let fetchMock;
6
- beforeEach(() => {
7
- detector = new OpenClawServiceDetector('http://localhost:18789');
8
- fetchMock = vi.fn();
9
- vi.stubGlobal('fetch', fetchMock);
10
- });
11
- afterEach(() => {
12
- vi.restoreAllMocks();
13
- });
14
- it('returns running when service responds', async () => {
15
- fetchMock.mockResolvedValueOnce({
16
- ok: true,
17
- status: 200,
18
- headers: new Headers({ server: 'openclaw/1.2.3' }),
19
- });
20
- const result = await detector.detect();
21
- expect(result.running).toBe(true);
22
- expect(result.endpoint).toBe('http://localhost:18789');
23
- expect(result.details?.status).toBe(200);
24
- expect(result.details?.server).toBe('openclaw/1.2.3');
25
- });
26
- it('returns running even on 404 (service is there)', async () => {
27
- fetchMock.mockResolvedValueOnce({
28
- ok: false,
29
- status: 404,
30
- headers: new Headers({}),
31
- });
32
- const result = await detector.detect();
33
- expect(result.running).toBe(true);
34
- expect(result.details?.status).toBe(404);
35
- });
36
- it('returns not running on connection refused', async () => {
37
- fetchMock.mockRejectedValueOnce(new Error('connect ECONNREFUSED 127.0.0.1:18789'));
38
- const result = await detector.detect();
39
- expect(result.running).toBe(false);
40
- expect(result.endpoint).toBe('http://localhost:18789');
41
- expect(result.details?.error).toContain('ECONNREFUSED');
42
- });
43
- it('returns not running on timeout', async () => {
44
- const abortError = new DOMException('The operation was aborted', 'AbortError');
45
- fetchMock.mockRejectedValueOnce(abortError);
46
- const result = await detector.detect();
47
- expect(result.running).toBe(false);
48
- expect(result.details?.error).toContain('timed out');
49
- });
50
- it('uses default base URL', () => {
51
- const defaultDetector = new OpenClawServiceDetector();
52
- // The constructor sets the URL; we verify by calling detect
53
- fetchMock.mockResolvedValueOnce({
54
- ok: true,
55
- status: 200,
56
- headers: new Headers({}),
57
- });
58
- defaultDetector.detect();
59
- expect(fetchMock).toHaveBeenCalledWith('http://127.0.0.1:18789', expect.anything());
60
- });
61
- });
62
- //# sourceMappingURL=detector.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detector.test.js","sourceRoot":"","sources":["../../src/__tests__/detector.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=target.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"target.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/target.test.ts"],"names":[],"mappings":""}
@@ -1,161 +0,0 @@
1
- import { createTestEvent } from '@orgloop/sdk';
2
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
- import { OpenClawTarget } from '../target.js';
4
- describe('OpenClawTarget', () => {
5
- let target;
6
- let fetchMock;
7
- beforeEach(async () => {
8
- target = new OpenClawTarget();
9
- await target.init({
10
- id: 'openclaw-engineering-agent',
11
- connector: '@orgloop/connector-openclaw',
12
- config: {
13
- base_url: 'http://localhost:18789',
14
- agent_id: 'test-agent',
15
- },
16
- });
17
- fetchMock = vi.fn().mockResolvedValue({
18
- ok: true,
19
- status: 200,
20
- statusText: 'OK',
21
- });
22
- vi.stubGlobal('fetch', fetchMock);
23
- });
24
- afterEach(() => {
25
- vi.restoreAllMocks();
26
- });
27
- it('sends correct OpenClaw payload shape', async () => {
28
- const event = createTestEvent({
29
- source: 'github',
30
- type: 'resource.changed',
31
- provenance: {
32
- platform: 'github',
33
- platform_event: 'pull_request.review_submitted',
34
- author: 'alice',
35
- author_type: 'team_member',
36
- },
37
- payload: { pr_number: 42 },
38
- });
39
- const routeConfig = {
40
- session_key: 'hook:github:pr-review:engineering',
41
- wake_mode: 'now',
42
- deliver: true,
43
- launch_prompt: 'Review this PR',
44
- };
45
- const result = await target.deliver(event, routeConfig);
46
- expect(result.status).toBe('delivered');
47
- expect(fetchMock).toHaveBeenCalledOnce();
48
- const [url, opts] = fetchMock.mock.calls[0];
49
- expect(url).toBe('http://localhost:18789/hooks/agent');
50
- const body = JSON.parse(opts.body);
51
- // Assert correct fields present
52
- expect(body).toHaveProperty('message');
53
- expect(body).toHaveProperty('sessionKey', 'hook:github:pr-review:engineering');
54
- expect(body).toHaveProperty('agentId', 'test-agent');
55
- expect(body).toHaveProperty('wakeMode', 'now');
56
- expect(body).toHaveProperty('deliver', true);
57
- // Assert old fields are NOT present
58
- expect(body).not.toHaveProperty('event');
59
- expect(body).not.toHaveProperty('launch_prompt');
60
- expect(body).not.toHaveProperty('agent_id');
61
- // Assert message contains event context and payload values
62
- expect(body.message).toContain('github');
63
- expect(body.message).toContain('resource.changed');
64
- expect(body.message).toContain('Review this PR');
65
- expect(body.message).toContain('pr_number: 42');
66
- expect(body.message).toContain('Instructions:');
67
- });
68
- it('generates fallback sessionKey from event', async () => {
69
- const event = createTestEvent({
70
- source: 'linear',
71
- type: 'resource.changed',
72
- });
73
- const routeConfig = {};
74
- await target.deliver(event, routeConfig);
75
- const body = JSON.parse(fetchMock.mock.calls[0][1].body);
76
- expect(body.sessionKey).toBe('orgloop:linear:resource.changed');
77
- });
78
- it('includes platform_event and author in message', async () => {
79
- const event = createTestEvent({
80
- source: 'github',
81
- type: 'resource.changed',
82
- provenance: {
83
- platform: 'github',
84
- platform_event: 'pull_request.merged',
85
- author: 'bob',
86
- author_type: 'team_member',
87
- },
88
- });
89
- await target.deliver(event, {});
90
- const body = JSON.parse(fetchMock.mock.calls[0][1].body);
91
- expect(body.message).toContain('pull_request.merged');
92
- expect(body.message).toContain('bob');
93
- });
94
- it('includes full payload values and provenance context in message', async () => {
95
- const event = createTestEvent({
96
- source: 'linear',
97
- type: 'resource.changed',
98
- provenance: {
99
- platform: 'linear',
100
- platform_event: 'comment.created',
101
- author: 'Alice',
102
- author_type: 'team_member',
103
- issue_id: 'ENG-42',
104
- url: 'https://linear.app/team/issue/ENG-42#comment-abc',
105
- },
106
- payload: {
107
- action: 'comment_created',
108
- issue_id: 'ENG-42',
109
- issue_title: 'Fix the widget',
110
- comment_body: 'This needs a different approach — see the RFC.',
111
- },
112
- });
113
- await target.deliver(event, { launch_prompt: 'Handle this Linear activity' });
114
- const body = JSON.parse(fetchMock.mock.calls[0][1].body);
115
- const msg = body.message;
116
- // Header
117
- expect(msg).toContain('[linear] resource.changed (comment.created) by Alice');
118
- // Provenance context (url, issue_id — not platform/author which are in header)
119
- expect(msg).toContain('issue_id: ENG-42');
120
- expect(msg).toContain('url: https://linear.app/team/issue/ENG-42#comment-abc');
121
- // Payload values — the actual data the LLM needs
122
- expect(msg).toContain('issue_title: Fix the widget');
123
- expect(msg).toContain('comment_body: This needs a different approach — see the RFC.');
124
- // Instructions
125
- expect(msg).toContain('Handle this Linear activity');
126
- });
127
- it('defaults wakeMode to "now"', async () => {
128
- const event = createTestEvent();
129
- await target.deliver(event, {});
130
- const body = JSON.parse(fetchMock.mock.calls[0][1].body);
131
- expect(body.wakeMode).toBe('now');
132
- });
133
- it('defaults deliver to false', async () => {
134
- const event = createTestEvent();
135
- await target.deliver(event, {});
136
- const body = JSON.parse(fetchMock.mock.calls[0][1].body);
137
- expect(body.deliver).toBe(false);
138
- });
139
- it('handles 429 rate limit', async () => {
140
- fetchMock.mockResolvedValueOnce({
141
- ok: false,
142
- status: 429,
143
- statusText: 'Too Many Requests',
144
- });
145
- const event = createTestEvent();
146
- const result = await target.deliver(event, {});
147
- expect(result.status).toBe('error');
148
- expect(result.error?.message).toContain('429');
149
- });
150
- it('handles 4xx rejection', async () => {
151
- fetchMock.mockResolvedValueOnce({
152
- ok: false,
153
- status: 400,
154
- statusText: 'Bad Request',
155
- });
156
- const event = createTestEvent();
157
- const result = await target.deliver(event, {});
158
- expect(result.status).toBe('rejected');
159
- });
160
- });
161
- //# sourceMappingURL=target.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"target.test.js","sourceRoot":"","sources":["../../src/__tests__/target.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=validator.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validator.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/validator.test.ts"],"names":[],"mappings":""}
@@ -1,72 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { OpenClawCredentialValidator } from '../validator.js';
3
- describe('OpenClawCredentialValidator', () => {
4
- let validator;
5
- let fetchMock;
6
- beforeEach(() => {
7
- validator = new OpenClawCredentialValidator('http://localhost:18789');
8
- fetchMock = vi.fn();
9
- vi.stubGlobal('fetch', fetchMock);
10
- });
11
- afterEach(() => {
12
- vi.restoreAllMocks();
13
- });
14
- it('returns valid on successful response', async () => {
15
- fetchMock.mockResolvedValueOnce({
16
- ok: true,
17
- status: 200,
18
- });
19
- const result = await validator.validate('test-token');
20
- expect(result.valid).toBe(true);
21
- expect(fetchMock).toHaveBeenCalledWith('http://localhost:18789/hooks/agent', expect.objectContaining({
22
- method: 'POST',
23
- headers: expect.objectContaining({
24
- Authorization: 'Bearer test-token',
25
- }),
26
- }));
27
- });
28
- it('returns invalid on 401', async () => {
29
- fetchMock.mockResolvedValueOnce({
30
- ok: false,
31
- status: 401,
32
- statusText: 'Unauthorized',
33
- });
34
- const result = await validator.validate('bad-token');
35
- expect(result.valid).toBe(false);
36
- expect(result.error).toContain('401');
37
- });
38
- it('returns invalid on 403', async () => {
39
- fetchMock.mockResolvedValueOnce({
40
- ok: false,
41
- status: 403,
42
- statusText: 'Forbidden',
43
- });
44
- const result = await validator.validate('bad-token');
45
- expect(result.valid).toBe(false);
46
- expect(result.error).toContain('403');
47
- });
48
- it('returns valid on other errors (token accepted but other issue)', async () => {
49
- fetchMock.mockResolvedValueOnce({
50
- ok: false,
51
- status: 400,
52
- statusText: 'Bad Request',
53
- });
54
- const result = await validator.validate('good-token');
55
- // Not a 401/403, so the token was accepted
56
- expect(result.valid).toBe(true);
57
- });
58
- it('fails open on network error', async () => {
59
- fetchMock.mockRejectedValueOnce(new Error('connect ECONNREFUSED'));
60
- const result = await validator.validate('any-token');
61
- expect(result.valid).toBe(true);
62
- expect(result.error).toContain('Could not reach OpenClaw');
63
- });
64
- it('fails open on timeout', async () => {
65
- const abortError = new DOMException('The operation was aborted', 'AbortError');
66
- fetchMock.mockRejectedValueOnce(abortError);
67
- const result = await validator.validate('any-token');
68
- expect(result.valid).toBe(true);
69
- expect(result.error).toContain('timed out');
70
- });
71
- });
72
- //# sourceMappingURL=validator.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validator.test.js","sourceRoot":"","sources":["../../src/__tests__/validator.test.ts"],"names":[],"mappings":"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"}