@gholl-studio/pier-connector 0.7.10 → 0.7.11

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/dist/inbound.d.ts CHANGED
@@ -3,12 +3,5 @@
3
3
  * @description Manages inbound message processing, agent routing resolution, and session context propagation.
4
4
  */
5
5
  import type { InboundMessage } from './types.js';
6
- import type { PierRobot } from './robot.js';
7
- /**
8
- * Handle incoming messages from NATS (Core or JetStream).
9
- * @param ctx The plugin runtime context
10
- * @param inbound The normalized inbound message payload
11
- * @param jobId The associated Job or Group ID
12
- * @param robot The active PierRobot instance
13
- */
14
- export declare function handleInbound(ctx: any, inbound: InboundMessage, jobId: string, robot: PierRobot, plugin: any): Promise<void>;
6
+ export declare function handleInbound(ctx: any, // Gateway Context
7
+ inbound: InboundMessage, jobId: string, robot: any, pierPlugin: any): Promise<void>;
package/dist/inbound.js CHANGED
@@ -2,21 +2,19 @@
2
2
  * @file inbound.ts
3
3
  * @description Manages inbound message processing, agent routing resolution, and session context propagation.
4
4
  */
5
- /**
6
- * Handle incoming messages from NATS (Core or JetStream).
7
- * @param ctx The plugin runtime context
8
- * @param inbound The normalized inbound message payload
9
- * @param jobId The associated Job or Group ID
10
- * @param robot The active PierRobot instance
11
- */
12
- export async function handleInbound(ctx, inbound, jobId, robot, plugin) {
5
+ export async function handleInbound(ctx, // Gateway Context
6
+ inbound, jobId, robot, pierPlugin) {
13
7
  const logger = ctx.log || console;
14
8
  const channelRuntime = ctx.channelRuntime;
15
- // 1. Prepare Scoped Config
9
+ if (!channelRuntime?.reply) {
10
+ console.error(`[pier-connector][${robot.accountId}] SDK Error: channelRuntime.reply is not available.`);
11
+ return;
12
+ }
13
+ // 1. Resolve Account-Scoped Configuration
16
14
  const rootConfig = ctx.cfg || {};
17
15
  const accountScopedCfg = rootConfig;
18
16
  // 2. Resolve Agent Route
19
- // A message is part of a workspace if it has a workspace prefix or matches known patterns.
17
+ // A message is part of a workspace if it has a workspace prefix or is explicitly marked.
20
18
  const isWorkspace = !!inbound.jobId && (inbound.jobId.startsWith('job-') || inbound.isWorkspace === true);
21
19
  const peerId = jobId;
22
20
  const chatType = isWorkspace ? 'group' : 'direct';
@@ -77,14 +75,15 @@ export async function handleInbound(ctx, inbound, jobId, robot, plugin) {
77
75
  isWorkspace ? `BOARD INDEX: ${boardIndex}` : "",
78
76
  "-----------------------------------------",
79
77
  isWorkspace ? "SWARM COORDINATION & PM PROTOCOL:" : "",
80
- isWorkspace ? "1. PROJECT MANAGER (PM) ROLE: If you are acting as a lead/PM, use `tasks.[id]` keys to assign sub-tasks and monitor progress. Only the PM should mark tasks as 'VALIDATED'." : "",
81
- isWorkspace ? "2. CONFLICT PROTECTION: In a multi-agent environment, you MUST provide 'expectedRevision' when calling `pier_update_board_item` to prevent overwriting others' work." : "",
82
- isWorkspace ? "3. STATE MACHINE: Use standard statuses: TODO -> DOING -> DONE -> VALIDATED." : "",
78
+ isWorkspace ? "1. The 'PRIMARY MISSION GOAL' is your source of truth and long-term memory. It defines your purpose in this workspace." : "",
79
+ isWorkspace ? "2. PROJECT MANAGER (PM) ROLE: If you are acting as a lead/PM, use `tasks.[id]` keys to assign sub-tasks and monitor progress. Only the PM should mark tasks as 'VALIDATED'." : "",
80
+ isWorkspace ? "3. CONFLICT PROTECTION: In a multi-agent environment, you MUST provide 'expectedRevision' when calling `pier_update_board_item` to prevent overwriting others' work." : "",
83
81
  isWorkspace ? "4. Use the groupId exactly as provided. DO NOT add 'pierWorkspace:' prefixes." : "",
82
+ isWorkspace ? "5. Use `pier_read_board_item` to fetch technical details for any key listed in the BOARD INDEX." : "",
84
83
  "-----------------------------------------",
85
- "5. You MUST USE the `pier_finish_task` tool to submit the final result when the mission objectives are fully met.",
86
- "6. If requirements are unclear, use `pier_chat` to consult the employer.",
87
- "7. Do not remain idle if the goal is clear. Act, update the board, and coordinate."
84
+ "6. You MUST USE the `pier_finish_task` tool to submit the final result when the mission objectives are fully met.",
85
+ "7. If requirements are unclear, use `pier_chat` to consult the employer.",
86
+ "8. Do not remain idle if the goal is clear. Act, update the board, and coordinate."
88
87
  ].filter(Boolean).join('\n');
89
88
  }
90
89
  // 3. Finalize Context
@@ -102,18 +101,71 @@ export async function handleInbound(ctx, inbound, jobId, robot, plugin) {
102
101
  WasMentioned: inbound.WasMentioned,
103
102
  InjectedSystemPrompt: injectedPrompt,
104
103
  Metadata: {
105
- jobId: jobId,
106
- pierJobId: metadata?.pierJobId,
104
+ ...metadata,
105
+ accountId: robot.accountId,
106
+ agentId: finalAgentId,
107
+ pierJobId: jobId,
108
+ routingSource: routingSource,
107
109
  workspace: isWorkspace,
108
110
  boardKeys: boardIndex
109
111
  }
110
112
  });
111
- // 4. Dispatch to Agent
113
+ // 4. Create Dispatcher
114
+ const { dispatcher, replyOptions, markDispatchIdle, markRunComplete } = channelRuntime.reply.createReplyDispatcherWithTyping({
115
+ deliver: async (payload, info) => {
116
+ const currentMeta = robot.activeNodeJobs.get(jobId);
117
+ const resAgent = payload.agentId || finalAgentId;
118
+ logger.info(`[pier-connector:trace] Outbound delivery for ${jobId}. Responder: ${resAgent}.`);
119
+ if (payload.text && payload.text.length > 0) {
120
+ await pierPlugin.outbound.sendText({
121
+ text: payload.text,
122
+ to: `pier:${jobId}`,
123
+ accountId: robot.accountId,
124
+ metadata: {
125
+ ...currentMeta,
126
+ accountId: robot.accountId,
127
+ pierJobId: jobId,
128
+ respondingAgentId: resAgent,
129
+ workspace: isWorkspace
130
+ },
131
+ });
132
+ }
133
+ }
134
+ });
135
+ // 5. Session Recording
136
+ if (channelRuntime.session?.recordSessionMetaFromInbound) {
137
+ try {
138
+ const storePath = channelRuntime.session.resolveStorePath(dynamicSessionKey);
139
+ await channelRuntime.session.recordSessionMetaFromInbound({
140
+ storePath, sessionKey: dynamicSessionKey, ctx: ctxPayload
141
+ });
142
+ }
143
+ catch (err) {
144
+ logger.error(`[pier-connector] ✖ Failed to record session metadata: ${err.message}`);
145
+ }
146
+ }
147
+ // 6. Dispatch
112
148
  try {
113
- await channelRuntime.reply.dispatchInbound(ctxPayload);
149
+ const { queuedFinal, counts } = await channelRuntime.reply.dispatchReplyFromConfig({
150
+ ctx: ctxPayload,
151
+ cfg: accountScopedCfg,
152
+ dispatcher,
153
+ replyOptions: {
154
+ ...replyOptions,
155
+ onModelSelected: (mCtx) => {
156
+ logger.info(`[pier-connector:debug] Model selected for ${jobId}: ${mCtx.provider}/${mCtx.model}`);
157
+ }
158
+ }
159
+ });
160
+ await dispatcher.waitForIdle();
161
+ logger.info(`[pier-connector] Dispatch complete for ${jobId}. queuedFinal=${queuedFinal}, counts=${JSON.stringify(counts)}`);
114
162
  }
115
163
  catch (err) {
116
- logger.error(`[pier-connector] Dispatch failed: ${err.message}`);
164
+ logger.error(`[pier-connector] Dispatch error for job ${jobId}: ${err.message}`);
165
+ }
166
+ finally {
167
+ markRunComplete?.();
168
+ markDispatchIdle?.();
117
169
  }
118
170
  }
119
171
  //# sourceMappingURL=inbound.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"inbound.js","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inbound.js","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gholl-studio/pier-connector",
3
3
  "author": "gholl",
4
- "version": "0.7.10",
4
+ "version": "0.7.11",
5
5
  "description": "OpenClaw plugin that connects to the Pier job marketplace. Automatically fetches, executes, and reports distributed tasks for rewards.",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
package/src/inbound.ts CHANGED
@@ -5,31 +5,28 @@
5
5
 
6
6
  import type { InboundMessage } from './types.js';
7
7
  import { truncate } from './job-handler.js';
8
- import type { PierRobot } from './robot.js';
9
8
 
10
- /**
11
- * Handle incoming messages from NATS (Core or JetStream).
12
- * @param ctx The plugin runtime context
13
- * @param inbound The normalized inbound message payload
14
- * @param jobId The associated Job or Group ID
15
- * @param robot The active PierRobot instance
16
- */
17
9
  export async function handleInbound(
18
- ctx: any,
19
- inbound: InboundMessage,
20
- jobId: string,
21
- robot: PierRobot,
22
- plugin: any
10
+ ctx: any, // Gateway Context
11
+ inbound: InboundMessage,
12
+ jobId: string,
13
+ robot: any,
14
+ pierPlugin: any
23
15
  ) {
24
16
  const logger = ctx.log || console;
25
17
  const channelRuntime = ctx.channelRuntime;
18
+
19
+ if (!channelRuntime?.reply) {
20
+ console.error(`[pier-connector][${robot.accountId}] SDK Error: channelRuntime.reply is not available.`);
21
+ return;
22
+ }
26
23
 
27
- // 1. Prepare Scoped Config
24
+ // 1. Resolve Account-Scoped Configuration
28
25
  const rootConfig = ctx.cfg || {};
29
26
  const accountScopedCfg = rootConfig;
30
27
 
31
28
  // 2. Resolve Agent Route
32
- // A message is part of a workspace if it has a workspace prefix or matches known patterns.
29
+ // A message is part of a workspace if it has a workspace prefix or is explicitly marked.
33
30
  const isWorkspace = !!inbound.jobId && (inbound.jobId.startsWith('job-') || (inbound as any).isWorkspace === true);
34
31
  const peerId = jobId;
35
32
  const chatType = isWorkspace ? 'group' : 'direct';
@@ -94,14 +91,15 @@ export async function handleInbound(
94
91
  isWorkspace ? `BOARD INDEX: ${boardIndex}` : "",
95
92
  "-----------------------------------------",
96
93
  isWorkspace ? "SWARM COORDINATION & PM PROTOCOL:" : "",
97
- isWorkspace ? "1. PROJECT MANAGER (PM) ROLE: If you are acting as a lead/PM, use `tasks.[id]` keys to assign sub-tasks and monitor progress. Only the PM should mark tasks as 'VALIDATED'." : "",
98
- isWorkspace ? "2. CONFLICT PROTECTION: In a multi-agent environment, you MUST provide 'expectedRevision' when calling `pier_update_board_item` to prevent overwriting others' work." : "",
99
- isWorkspace ? "3. STATE MACHINE: Use standard statuses: TODO -> DOING -> DONE -> VALIDATED." : "",
94
+ isWorkspace ? "1. The 'PRIMARY MISSION GOAL' is your source of truth and long-term memory. It defines your purpose in this workspace." : "",
95
+ isWorkspace ? "2. PROJECT MANAGER (PM) ROLE: If you are acting as a lead/PM, use `tasks.[id]` keys to assign sub-tasks and monitor progress. Only the PM should mark tasks as 'VALIDATED'." : "",
96
+ isWorkspace ? "3. CONFLICT PROTECTION: In a multi-agent environment, you MUST provide 'expectedRevision' when calling `pier_update_board_item` to prevent overwriting others' work." : "",
100
97
  isWorkspace ? "4. Use the groupId exactly as provided. DO NOT add 'pierWorkspace:' prefixes." : "",
98
+ isWorkspace ? "5. Use `pier_read_board_item` to fetch technical details for any key listed in the BOARD INDEX." : "",
101
99
  "-----------------------------------------",
102
- "5. You MUST USE the `pier_finish_task` tool to submit the final result when the mission objectives are fully met.",
103
- "6. If requirements are unclear, use `pier_chat` to consult the employer.",
104
- "7. Do not remain idle if the goal is clear. Act, update the board, and coordinate."
100
+ "6. You MUST USE the `pier_finish_task` tool to submit the final result when the mission objectives are fully met.",
101
+ "7. If requirements are unclear, use `pier_chat` to consult the employer.",
102
+ "8. Do not remain idle if the goal is clear. Act, update the board, and coordinate."
105
103
  ].filter(Boolean).join('\n');
106
104
  }
107
105
 
@@ -119,18 +117,74 @@ export async function handleInbound(
119
117
  SenderName: inbound.senderId,
120
118
  WasMentioned: inbound.WasMentioned,
121
119
  InjectedSystemPrompt: injectedPrompt,
122
- Metadata: {
123
- jobId: jobId,
124
- pierJobId: metadata?.pierJobId,
120
+ Metadata: {
121
+ ...metadata,
122
+ accountId: robot.accountId,
123
+ agentId: finalAgentId,
124
+ pierJobId: jobId,
125
+ routingSource: routingSource,
125
126
  workspace: isWorkspace,
126
127
  boardKeys: boardIndex
127
128
  }
128
129
  });
129
130
 
130
- // 4. Dispatch to Agent
131
+ // 4. Create Dispatcher
132
+ const { dispatcher, replyOptions, markDispatchIdle, markRunComplete } = channelRuntime.reply.createReplyDispatcherWithTyping({
133
+ deliver: async (payload: any, info: any) => {
134
+ const currentMeta = robot.activeNodeJobs.get(jobId);
135
+ const resAgent = payload.agentId || finalAgentId;
136
+
137
+ logger.info(`[pier-connector:trace] Outbound delivery for ${jobId}. Responder: ${resAgent}.`);
138
+
139
+ if (payload.text && payload.text.length > 0) {
140
+ await pierPlugin.outbound.sendText({
141
+ text: payload.text,
142
+ to: `pier:${jobId}`,
143
+ accountId: robot.accountId,
144
+ metadata: {
145
+ ...currentMeta,
146
+ accountId: robot.accountId,
147
+ pierJobId: jobId,
148
+ respondingAgentId: resAgent,
149
+ workspace: isWorkspace
150
+ },
151
+ });
152
+ }
153
+ }
154
+ });
155
+
156
+ // 5. Session Recording
157
+ if (channelRuntime.session?.recordSessionMetaFromInbound) {
158
+ try {
159
+ const storePath = channelRuntime.session.resolveStorePath(dynamicSessionKey);
160
+ await channelRuntime.session.recordSessionMetaFromInbound({
161
+ storePath, sessionKey: dynamicSessionKey, ctx: ctxPayload
162
+ });
163
+ } catch (err: any) {
164
+ logger.error(`[pier-connector] ✖ Failed to record session metadata: ${err.message}`);
165
+ }
166
+ }
167
+
168
+ // 6. Dispatch
131
169
  try {
132
- await channelRuntime.reply.dispatchInbound(ctxPayload);
170
+ const { queuedFinal, counts } = await channelRuntime.reply.dispatchReplyFromConfig({
171
+ ctx: ctxPayload,
172
+ cfg: accountScopedCfg,
173
+ dispatcher,
174
+ replyOptions: {
175
+ ...replyOptions,
176
+ onModelSelected: (mCtx: any) => {
177
+ logger.info(`[pier-connector:debug] Model selected for ${jobId}: ${mCtx.provider}/${mCtx.model}`);
178
+ }
179
+ }
180
+ });
181
+
182
+ await dispatcher.waitForIdle();
183
+ logger.info(`[pier-connector] Dispatch complete for ${jobId}. queuedFinal=${queuedFinal}, counts=${JSON.stringify(counts)}`);
133
184
  } catch (err: any) {
134
- logger.error(`[pier-connector] Dispatch failed: ${err.message}`);
185
+ logger.error(`[pier-connector] Dispatch error for job ${jobId}: ${err.message}`);
186
+ } finally {
187
+ markRunComplete?.();
188
+ markDispatchIdle?.();
135
189
  }
136
190
  }