( ctx context.Context, scope toolspkg.Scope, req toolspkg.CallRequest, )
| 1424 | } |
| 1425 | |
| 1426 | func (n *daemonNativeTools) networkSend( |
| 1427 | ctx context.Context, |
| 1428 | scope toolspkg.Scope, |
| 1429 | req toolspkg.CallRequest, |
| 1430 | ) (toolspkg.ToolResult, error) { |
| 1431 | var input networkSendInput |
| 1432 | if err := decodeNativeInput(req, &input); err != nil { |
| 1433 | return toolspkg.ToolResult{}, err |
| 1434 | } |
| 1435 | bound, err := n.nativeBoundSession(ctx, scope) |
| 1436 | if err != nil { |
| 1437 | return toolspkg.ToolResult{}, err |
| 1438 | } |
| 1439 | channel := strings.TrimSpace(input.Channel) |
| 1440 | if !nativeBoundSessionAllowsChannel(bound, channel) { |
| 1441 | return toolspkg.ToolResult{}, nativeBoundChannelDenied(req.ToolID, channel) |
| 1442 | } |
| 1443 | sessionID := nativeBoundSessionID(bound, input.SessionID, req.SessionID, scope.SessionID) |
| 1444 | resolved, err := n.nativeResolvedWorkspace( |
| 1445 | ctx, |
| 1446 | req.ToolID, |
| 1447 | nativeBoundWorkspaceRef(bound, input.WorkspaceID), |
| 1448 | scope, |
| 1449 | ) |
| 1450 | if err != nil { |
| 1451 | return toolspkg.ToolResult{}, err |
| 1452 | } |
| 1453 | workspaceID, err := nativeResolvedNetworkWorkspaceID(&resolved) |
| 1454 | if err != nil { |
| 1455 | return toolspkg.ToolResult{}, nativeNetworkInputError(req.ToolID, err) |
| 1456 | } |
| 1457 | sessionWorkspaceID, err := nativeResolvedRegistryWorkspaceID(&resolved) |
| 1458 | if err != nil { |
| 1459 | return toolspkg.ToolResult{}, nativeNetworkInputError(req.ToolID, err) |
| 1460 | } |
| 1461 | if err := n.requireNativeSessionWorkspace(ctx, req.ToolID, sessionWorkspaceID, sessionID); err != nil { |
| 1462 | return toolspkg.ToolResult{}, err |
| 1463 | } |
| 1464 | sendReq, err := core.NetworkSendRequestFromPayload(contract.NetworkSendRequest{ |
| 1465 | WorkspaceID: workspaceID, |
| 1466 | SessionID: sessionID, |
| 1467 | Channel: channel, |
| 1468 | Surface: strings.TrimSpace(input.Surface), |
| 1469 | ThreadID: strings.TrimSpace(input.ThreadID), |
| 1470 | DirectID: strings.TrimSpace(input.DirectID), |
| 1471 | Kind: strings.TrimSpace(input.Kind), |
| 1472 | To: strings.TrimSpace(input.To), |
| 1473 | Mentions: cloneTrimmedStrings(input.Mentions), |
| 1474 | Body: cloneJSON(input.Body), |
| 1475 | WorkID: strings.TrimSpace(input.WorkID), |
| 1476 | ReplyTo: strings.TrimSpace(input.ReplyTo), |
| 1477 | TraceID: strings.TrimSpace(input.TraceID), |
| 1478 | CausationID: strings.TrimSpace(input.CausationID), |
| 1479 | ExpiresAt: input.ExpiresAt, |
| 1480 | ID: strings.TrimSpace(input.ID), |
| 1481 | Ext: map[string]json.RawMessage(cloneExtensionMap(input.Ext)), |
| 1482 | }) |
| 1483 | if err != nil { |
nothing calls this directly
no test coverage detected